diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index 54c2ded3d0e77cacc0a209dcabdce70f10d07252..c5f643ff472513e0e97cf8dfff63f2e79221a319 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -538,7 +538,7 @@ StringXNumber GeneralOptions_Number[] = { "Second coefficient in equation for clipping plane 3" }, { F, "Clip3C" , opt_general_clip3c , 0.0 , "Third coefficient in equation for clipping plane 3" }, - { F, "Clip3D" , opt_general_clip3d , 0.0 , + { F, "Clip3D" , opt_general_clip3d , 1.0 , "Fourth coefficient in equation for clipping plane 3" }, { F, "Clip4A" , opt_general_clip4a , 0.0 , "First coefficient in equation for clipping plane 4" }, @@ -546,7 +546,7 @@ StringXNumber GeneralOptions_Number[] = { "Second coefficient in equation for clipping plane 4" }, { F, "Clip4C" , opt_general_clip4c , 0.0 , "Third coefficient in equation for clipping plane 4" }, - { F, "Clip4D" , opt_general_clip4d , 0.0 , + { F, "Clip4D" , opt_general_clip4d , 1.0 , "Fourth coefficient in equation for clipping plane 4" }, { F, "Clip5A" , opt_general_clip5a , 0.0 , "First coefficient in equation for clipping plane 5" }, @@ -554,7 +554,7 @@ StringXNumber GeneralOptions_Number[] = { "Second coefficient in equation for clipping plane 5" }, { F, "Clip5C" , opt_general_clip5c , -1.0 , "Third coefficient in equation for clipping plane 5" }, - { F, "Clip5D" , opt_general_clip5d , 0.0 , + { F, "Clip5D" , opt_general_clip5d , 1.0 , "Fourth coefficient in equation for clipping plane 5" }, { F, "ClipFactor" , opt_general_clip_factor , 5.0 , "Near and far clipping plane distance factor (decrease value for better " diff --git a/Fltk/clippingWindow.cpp b/Fltk/clippingWindow.cpp index 718bc67680c43ca0b88017e5c634dacf92bd18af..4c790b4ef3531c82fa782ab978e4970b04912ca1 100644 --- a/Fltk/clippingWindow.cpp +++ b/Fltk/clippingWindow.cpp @@ -26,7 +26,7 @@ static void clip_num_cb(Fl_Widget *w, void *data) static void clip_update_cb(Fl_Widget *w, void *data) { - if(FlGui::instance()->clipping->group[0]->visible()){ // clipping planes + if(FlGui::FlGui::instance()->clipping->group[0]->visible()){ // plane tab int idx = FlGui::instance()->clipping->choice->value(); CTX::instance()->geom.clip &= ~(1 << idx); CTX::instance()->mesh.clip &= ~(1 << idx); @@ -42,10 +42,11 @@ static void clip_update_cb(Fl_Widget *w, void *data) PView::list[i - 2]->getOptions()->clip |= (1 << idx); } } - for(int i = 0; i < 4; i++) - CTX::instance()->clipPlane[idx][i] = FlGui::instance()->clipping->value[i]->value(); + for(int j = 0; j < 4; j++) + CTX::instance()->clipPlane[idx][j] = FlGui::instance()->clipping->plane[j]->value(); + FlGui::instance()->clipping->fillBoxValuesFromPlaneValues(); } - else{ // clipping box + else{ // box tab CTX::instance()->geom.clip = 0; CTX::instance()->mesh.clip = 0; for(unsigned int i = 0; i < PView::list.size(); i++) @@ -62,44 +63,48 @@ static void clip_update_cb(Fl_Widget *w, void *data) } } } - double c[3] = {FlGui::instance()->clipping->value[4]->value(), - FlGui::instance()->clipping->value[5]->value(), - FlGui::instance()->clipping->value[6]->value()}; - double d[3] = {FlGui::instance()->clipping->value[7]->value(), - FlGui::instance()->clipping->value[8]->value(), - FlGui::instance()->clipping->value[9]->value()}; + double c[3] = {FlGui::instance()->clipping->box[0]->value(), + FlGui::instance()->clipping->box[1]->value(), + FlGui::instance()->clipping->box[2]->value()}; + double d[3] = {FlGui::instance()->clipping->box[3]->value(), + FlGui::instance()->clipping->box[4]->value(), + FlGui::instance()->clipping->box[5]->value()}; // left CTX::instance()->clipPlane[0][0] = 1.; CTX::instance()->clipPlane[0][1] = 0.; CTX::instance()->clipPlane[0][2] = 0.; - CTX::instance()->clipPlane[0][3] = -(c[0] - d[0] / 2.); - // right - CTX::instance()->clipPlane[1][0] = -1.; - CTX::instance()->clipPlane[1][1] = 0.; - CTX::instance()->clipPlane[1][2] = 0.; - CTX::instance()->clipPlane[1][3] = (c[0] + d[0] / 2.); + CTX::instance()->clipPlane[0][3] = -c[0] + d[0] / 2.; // top + CTX::instance()->clipPlane[1][0] = 0.; + CTX::instance()->clipPlane[1][1] = 1.; + CTX::instance()->clipPlane[1][2] = 0.; + CTX::instance()->clipPlane[1][3] = -c[1] + d[1] / 2.; + // near CTX::instance()->clipPlane[2][0] = 0.; - CTX::instance()->clipPlane[2][1] = 1.; - CTX::instance()->clipPlane[2][2] = 0.; - CTX::instance()->clipPlane[2][3] = -(c[1] - d[1] / 2.); - // bottom - CTX::instance()->clipPlane[3][0] = 0.; - CTX::instance()->clipPlane[3][1] = -1.; + CTX::instance()->clipPlane[2][1] = 0.; + CTX::instance()->clipPlane[2][2] = 1.; + CTX::instance()->clipPlane[2][3] = -c[2] + d[2] / 2.; + // right + CTX::instance()->clipPlane[3][0] = -1.; + CTX::instance()->clipPlane[3][1] = 0.; CTX::instance()->clipPlane[3][2] = 0.; - CTX::instance()->clipPlane[3][3] = (c[1] + d[1] / 2.); - // near + CTX::instance()->clipPlane[3][3] = c[0] + d[0] / 2.; + // bottom CTX::instance()->clipPlane[4][0] = 0.; - CTX::instance()->clipPlane[4][1] = 0.; - CTX::instance()->clipPlane[4][2] = 1.; - CTX::instance()->clipPlane[4][3] = -(c[2] - d[2] / 2.); + CTX::instance()->clipPlane[4][1] = -1.; + CTX::instance()->clipPlane[4][2] = 0.; + CTX::instance()->clipPlane[4][3] = c[1] + d[1] / 2.; // far CTX::instance()->clipPlane[5][0] = 0.; CTX::instance()->clipPlane[5][1] = 0.; CTX::instance()->clipPlane[5][2] = -1.; - CTX::instance()->clipPlane[5][3] = (c[2] + d[2] / 2.); - } + CTX::instance()->clipPlane[5][3] = c[2] + d[2] / 2.; + int idx = FlGui::instance()->clipping->choice->value(); + for(int j = 0; j < 4; j++) + FlGui::instance()->clipping->plane[j]->value(CTX::instance()->clipPlane[idx][j]); + } + if(CTX::instance()->clipWholeElements || CTX::instance()->clipWholeElements != FlGui::instance()->clipping->butt[0]->value()){ @@ -131,8 +136,8 @@ static void clip_update_cb(Fl_Widget *w, void *data) static void clip_invert_cb(Fl_Widget *w, void *data) { for(int i = 0; i < 4; i++) - FlGui::instance()->clipping->value[i]->value - (-FlGui::instance()->clipping->value[i]->value()); + FlGui::instance()->clipping->plane[i]->value + (-FlGui::instance()->clipping->plane[i]->value()); clip_update_cb(NULL, NULL); } @@ -143,11 +148,20 @@ static void clip_reset_cb(Fl_Widget *w, void *data) for(unsigned int index = 0; index < PView::list.size(); index++) PView::list[index]->getOptions()->clip = 0; - for(int i = 0; i < 6; i++){ - CTX::instance()->clipPlane[i][0] = 1.; - for(int j = 1; j < 4; j++) - CTX::instance()->clipPlane[i][j] = 0.; - } + // Warning: for consistency these reset values should match the + // default values for the associated options + for(int i = 0; i < 6; i++) + for(int j = 0; j < 4; j++) + CTX::instance()->clipPlane[0][0] = 0.; + CTX::instance()->clipPlane[0][0] = 1.; + CTX::instance()->clipPlane[1][1] = 1.; + CTX::instance()->clipPlane[2][2] = 1.; + CTX::instance()->clipPlane[3][0] = -1.; + CTX::instance()->clipPlane[4][1] = -1.; + CTX::instance()->clipPlane[5][2] = -1.; + CTX::instance()->clipPlane[3][3] = 1.; + CTX::instance()->clipPlane[4][3] = 1.; + CTX::instance()->clipPlane[5][3] = 1.; if(CTX::instance()->clipWholeElements){ CTX::instance()->mesh.changed |= (ENT_LINE | ENT_SURFACE | ENT_VOLUME); @@ -201,17 +215,17 @@ clippingWindow::clippingWindow(int deltaFontSize) invert->callback(clip_invert_cb); invert->tooltip("Invert orientation"); - value[0] = new Fl_Value_Input + plane[0] = new Fl_Value_Input (L + 2 * WB + FL_NORMAL_SIZE, 2 * WB + 2 * BH, BW - FL_NORMAL_SIZE, BH, "A"); - value[1] = new Fl_Value_Input + plane[1] = new Fl_Value_Input (L + 2 * WB + FL_NORMAL_SIZE, 2 * WB + 3 * BH, BW - FL_NORMAL_SIZE, BH, "B"); - value[2] = new Fl_Value_Input + plane[2] = new Fl_Value_Input (L + 2 * WB + FL_NORMAL_SIZE, 2 * WB + 4 * BH, BW - FL_NORMAL_SIZE, BH, "C"); - value[3] = new Fl_Value_Input + plane[3] = new Fl_Value_Input (L + 2 * WB + FL_NORMAL_SIZE, 2 * WB + 5 * BH, BW - FL_NORMAL_SIZE, BH, "D"); - for(int i = 0; i < 4; i++){ - value[i]->align(FL_ALIGN_RIGHT); - value[i]->callback(clip_update_cb); + for(int j = 0; j < 4; j++){ + plane[j]->align(FL_ALIGN_RIGHT); + plane[j]->callback(clip_update_cb); } group[0]->end(); @@ -223,20 +237,19 @@ clippingWindow::clippingWindow(int deltaFontSize) int w2 = (width - L - 4 * WB) / 2; int BW = w2 - 2 * FL_NORMAL_SIZE; - value[4] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 1 * BH, BW, BH, "Cx"); - value[5] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 2 * BH, BW, BH, "Cy"); - value[6] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 3 * BH, BW, BH, "Cz"); - value[7] = new Fl_Value_Input(L + 2 * WB + w2, 2 * WB + 1 * BH, BW, BH, "Wx"); - value[8] = new Fl_Value_Input(L + 2 * WB + w2, 2 * WB + 2 * BH, BW, BH, "Wy"); - value[9] = new Fl_Value_Input(L + 2 * WB + w2, 2 * WB + 3 * BH, BW, BH, "Wz"); - for(int i = 4; i < 10; i++){ - value[i]->align(FL_ALIGN_RIGHT); - value[i]->callback(clip_update_cb); + box[0] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 1 * BH, BW, BH, "Cx"); + box[1] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 2 * BH, BW, BH, "Cy"); + box[2] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 3 * BH, BW, BH, "Cz"); + box[3] = new Fl_Value_Input(L + 2 * WB + w2, 2 * WB + 1 * BH, BW, BH, "Wx"); + box[4] = new Fl_Value_Input(L + 2 * WB + w2, 2 * WB + 2 * BH, BW, BH, "Wy"); + box[5] = new Fl_Value_Input(L + 2 * WB + w2, 2 * WB + 3 * BH, BW, BH, "Wz"); + for(int i = 0; i < 6; i++){ + box[i]->align(FL_ALIGN_RIGHT); + box[i]->callback(clip_update_cb); } group[1]->end(); } - o->callback(clip_reset_cb); o->end(); butt[0] = new Fl_Check_Button @@ -279,7 +292,9 @@ void clippingWindow::resetBrowser() sprintf(str, "View [%d]", i); browser->add(str); } + int idx = choice->value(); + browser->deselect(); for(int i = 0; i < browser->size(); i++){ if((i == 0 && CTX::instance()->geom.clip & (1 << idx)) || @@ -288,29 +303,49 @@ void clippingWindow::resetBrowser() PView::list[i - 2]->getOptions()->clip & (1 << idx))) browser->select(i + 1); } - for(int i = 0; i < 4; i++) - value[i]->value(CTX::instance()->clipPlane[idx][i]); - for(int i = 4; i < 7; i++) - value[i]->value(0.); - for(int i = 7; i < 10; i++) - value[i]->value(1.); - - for(int i = 0; i < 3; i++) { - value[i]->step(0.01); - value[i]->minimum(-1.0); - value[i]->maximum(1.0); + + for(int j = 0; j < 4; j++) + plane[j]->value(CTX::instance()->clipPlane[idx][j]); + + for(int j = 0; j < 3; j++) { + plane[j]->step(0.01); + plane[j]->minimum(-1.0); + plane[j]->maximum(1.0); } double val1 = 0; for(int i = 0; i < 3; i++) val1 = std::max(val1, std::max(fabs(CTX::instance()->min[i]), fabs(CTX::instance()->max[i]))); val1 *= 1.5; - for(int i = 3; i < 10; i++){ - value[i]->step(val1 / 200.); - value[i]->minimum(-val1); - value[i]->maximum(val1); + + plane[3]->step(val1 / 200.); + plane[3]->minimum(-val1); + plane[3]->maximum(val1); + + fillBoxValuesFromPlaneValues(); + + for(int i = 0; i < 6; i++){ + box[i]->step(val1 / 200.); + box[i]->minimum(-val1); + box[i]->maximum(val1); } } + +void clippingWindow::fillBoxValuesFromPlaneValues() +{ + double c[3] = {(-CTX::instance()->clipPlane[0][3] + CTX::instance()->clipPlane[3][3]) / 2., + (-CTX::instance()->clipPlane[1][3] + CTX::instance()->clipPlane[4][3]) / 2., + (-CTX::instance()->clipPlane[2][3] + CTX::instance()->clipPlane[5][3]) / 2.}; + double d[3] = {CTX::instance()->clipPlane[0][3] + CTX::instance()->clipPlane[3][3], + CTX::instance()->clipPlane[1][3] + CTX::instance()->clipPlane[4][3], + CTX::instance()->clipPlane[2][3] + CTX::instance()->clipPlane[5][3]}; + box[0]->value(c[0]); + box[1]->value(c[1]); + box[2]->value(c[2]); + box[3]->value(d[0]); + box[4]->value(d[1]); + box[5]->value(d[2]); +} void clippingWindow::show() { diff --git a/Fltk/clippingWindow.h b/Fltk/clippingWindow.h index df527e3d44da09bc161f1c916f1e57fc146ed607..64d7de85a8870fe84073674f68dd288c7894dea3 100644 --- a/Fltk/clippingWindow.h +++ b/Fltk/clippingWindow.h @@ -18,9 +18,11 @@ class clippingWindow{ Fl_Window *win; Fl_Choice *choice; Fl_Multi_Browser *browser; - Fl_Value_Input *value[10]; + Fl_Value_Input *plane[4]; + Fl_Value_Input *box[6]; Fl_Check_Button *butt[3]; Fl_Group *group[2]; + void fillBoxValuesFromPlaneValues(); public: clippingWindow(int deltaFontSize=0); void resetBrowser();