// Gmsh - Copyright (C) 1997-2009 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // bugs and problems to <gmsh@geuz.org>. #include <FL/Fl_Tabs.H> #include <FL/Fl_Return_Button.H> #include "GUI.h" #include "Draw.h" #include "contextWindow.h" #include "dialogWindow.h" #include "GModel.h" #include "GeoStringInterface.h" #include "OpenFile.h" #include "Context.h" extern Context_T CTX; static void con_geometry_define_parameter_cb(Fl_Widget *w, void *data) { add_param(GUI::instance()->geoContext->input[0]->value(), GUI::instance()->geoContext->input[1]->value(), CTX.filename); GUI::instance()->resetVisibility(); } static void con_geometry_define_point_cb(Fl_Widget *w, void *data) { add_point(CTX.filename, GUI::instance()->geoContext->input[2]->value(), GUI::instance()->geoContext->input[3]->value(), GUI::instance()->geoContext->input[4]->value(), GUI::instance()->geoContext->input[5]->value()); GUI::instance()->resetVisibility(); GModel::current()->setSelection(0); SetBoundingBox(); Draw(); } static void con_geometry_snap_cb(Fl_Widget *w, void *data) { CTX.geom.snap[0] = GUI::instance()->geoContext->value[0]->value(); CTX.geom.snap[1] = GUI::instance()->geoContext->value[1]->value(); CTX.geom.snap[2] = GUI::instance()->geoContext->value[2]->value(); } geometryContextWindow::geometryContextWindow(int deltaFontSize) { FL_NORMAL_SIZE -= deltaFontSize; int width = 31 * FL_NORMAL_SIZE; int height = 5 * WB + 9 * BH; win = new dialogWindow (width, height, CTX.non_modal_windows, "Contextual Geometry Definitions"); win->box(GMSH_WINDOW_BOX); { Fl_Tabs *o = new Fl_Tabs(WB, WB, width - 2 * WB, height - 3 * WB - BH); // 0: Parameter { group[0] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Parameter"); input[0] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Name"); input[0]->value("lc"); input[1] = new Fl_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Value"); input[1]->value("0.1"); for(int i = 0; i < 2; i++) { input[i]->align(FL_ALIGN_RIGHT); } { Fl_Return_Button *o = new Fl_Return_Button (width - BB - 2 * WB, 2 * WB + 7 * BH, BB, BH, "Add"); o->callback(con_geometry_define_parameter_cb); } group[0]->end(); } // 1: Point { group[1] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Point"); input[2] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "X coordinate"); input[2]->value("0"); input[3] = new Fl_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Y coordinate"); input[3]->value("0"); input[4] = new Fl_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Z coordinate"); input[4]->value("0"); input[5] = new Fl_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Characteristic length"); input[5]->value(""); for(int i = 2; i < 6; i++) { input[i]->align(FL_ALIGN_RIGHT); } value[0] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW/3, BH); value[1] = new Fl_Value_Input(2 * WB + IW/3, 2 * WB + 5 * BH, IW/3, BH); value[2] = new Fl_Value_Input(2 * WB + 2*IW/3, 2 * WB + 5 * BH, IW/3, BH, "Snapping grid spacing"); for(int i = 0; i < 3; i++) { value[i]->align(FL_ALIGN_RIGHT); value[i]->callback(con_geometry_snap_cb); } { Fl_Return_Button *o = new Fl_Return_Button (width - BB - 2 * WB, 2 * WB + 7 * BH, BB, BH, "Add"); o->callback(con_geometry_define_point_cb); } group[1]->end(); } // 2: Translation { group[2] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Translation"); input[6] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "X component"); input[6]->value("0"); input[7] = new Fl_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Y component"); input[7]->value("0"); input[8] = new Fl_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Z component"); input[8]->value("1"); for(int i = 6; i < 9; i++) { input[i]->align(FL_ALIGN_RIGHT); } group[2]->end(); } // 3: Rotation { group[3] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Rotation"); input[9] = new Fl_Input (2 * WB, 2 * WB + 1 * BH, IW, BH, "X coordinate of an axis point"); input[9]->value("0"); input[10] = new Fl_Input (2 * WB, 2 * WB + 2 * BH, IW, BH, "Y coordinate of an axis point"); input[10]->value("0"); input[11] = new Fl_Input (2 * WB, 2 * WB + 3 * BH, IW, BH, "Z coordinate of an axis point"); input[11]->value("0"); input[12] = new Fl_Input (2 * WB, 2 * WB + 4 * BH, IW, BH, "X component of axis direction"); input[12]->value("0"); input[13] = new Fl_Input (2 * WB, 2 * WB + 5 * BH, IW, BH, "Y component of axis direction"); input[13]->value("1"); input[14] = new Fl_Input (2 * WB, 2 * WB + 6 * BH, IW, BH, "Z component of axis direction"); input[14]->value("0"); input[15] = new Fl_Input (2 * WB, 2 * WB + 7 * BH, IW, BH, "Angle in radians"); input[15]->value("Pi/4"); for(int i = 9; i < 16; i++) { input[i]->align(FL_ALIGN_RIGHT); } group[3]->end(); } // 4: Scale { group[4] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Scale"); input[16] = new Fl_Input (2 * WB, 2 * WB + 1 * BH, IW, BH, "X component of direction"); input[16]->value("0"); input[17] = new Fl_Input (2 * WB, 2 * WB + 2 * BH, IW, BH, "Y component of direction"); input[17]->value("0"); input[18] = new Fl_Input (2 * WB, 2 * WB + 3 * BH, IW, BH, "Z component of direction"); input[18]->value("0"); input[19] = new Fl_Input (2 * WB, 2 * WB + 4 * BH, IW, BH, "Factor"); input[19]->value("0.5"); for(int i = 16; i < 20; i++) { input[i]->align(FL_ALIGN_RIGHT); } group[4]->end(); } // 5: Symmetry { group[5] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Symmetry"); input[20] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "A"); input[20]->value("1"); input[21] = new Fl_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "B"); input[21]->value("0"); input[22] = new Fl_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "C"); input[22]->value("0"); input[23] = new Fl_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "D"); input[23]->value("1"); for(int i = 20; i < 24; i++) { input[i]->align(FL_ALIGN_RIGHT); } group[5]->end(); } o->end(); } { Fl_Button *o = new Fl_Button (width - BB - WB, height - BH - WB, BB, BH, "Cancel"); o->callback(hide_cb, (void *)win); } win->position(CTX.ctx_position[0], CTX.ctx_position[1]); win->end(); FL_NORMAL_SIZE += deltaFontSize; } void geometryContextWindow::show(int pane) { for(int i = 0; i < 6; i++) group[i]->hide(); group[pane]->show(); win->show(); } meshContextWindow::meshContextWindow(int deltaFontSize) { FL_NORMAL_SIZE -= deltaFontSize; static Fl_Menu menu_transfinite_dir[] = { {"Left", 0, 0, 0}, {"Right", 0, 0, 0}, {"Alternated", 0, 0, 0}, {0} }; int width = 29 * FL_NORMAL_SIZE; int height = 5 * WB + 5 * BH; win = new dialogWindow (width, height, CTX.non_modal_windows, "Contextual Mesh Definitions"); win->box(GMSH_WINDOW_BOX); { Fl_Tabs *o = new Fl_Tabs(WB, WB, width - 2 * WB, height - 3 * WB - BH); // 0: Characteristic length { group[0] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Characteristic Length"); input[0] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Value"); input[0]->value("0.1"); input[0]->align(FL_ALIGN_RIGHT); group[0]->end(); } // 1: Transfinite line { group[1] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Transfinite Line"); input[1] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Number of points"); input[1]->value("10"); input[2] = new Fl_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Parameter"); input[2]->value("1"); for(int i = 1; i < 3; i++) { input[i]->align(FL_ALIGN_RIGHT); } static Fl_Menu_Item menu_trsf_mesh[] = { {"Progression", 0, 0, 0}, {"Bump", 0, 0, 0}, {0} }; choice[0] = new Fl_Choice(2 * WB, 2 * WB + 2 * BH, IW, BH, "Type"); choice[0]->menu(menu_trsf_mesh); choice[0]->align(FL_ALIGN_RIGHT); group[1]->end(); } // 2: Transfinite surface { group[2] = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Transfinite Surface"); choice[1] = new Fl_Choice (2 * WB, 2 * WB + 1 * BH, IW, BH, "Transfinite Arrangement"); choice[1]->menu(menu_transfinite_dir); choice[1]->align(FL_ALIGN_RIGHT); group[2]->end(); } o->end(); } { Fl_Button *o = new Fl_Button (width - BB - WB, height - BH - WB, BB, BH, "Cancel"); o->callback(hide_cb, (void *)win); } win->position(CTX.ctx_position[0], CTX.ctx_position[1]); win->end(); FL_NORMAL_SIZE += deltaFontSize; } void meshContextWindow::show(int pane) { for(int i = 0; i < 3; i++) group[i]->hide(); group[pane]->show(); win->show(); }