diff --git a/Fltk/GUI_Projection.cpp b/Fltk/GUI_Projection.cpp index db4a0f4c73aa187be786fc9ff2c6278da7f7fe71..c9838680b18ca31f780c3d7d9aa79f2b972ffce5 100644 --- a/Fltk/GUI_Projection.cpp +++ b/Fltk/GUI_Projection.cpp @@ -206,21 +206,29 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces) } int hard = 8; + int uvw = width - 2 * WB - 2 * hard - 3 * WB; + int uvh = height - 8 * WB - 14 * BH - 2 * hard; + hardEdges[0] = new Fl_Toggle_Button(WB, 3 * WB + 9 * BH + hard, - hard, height - 8 * WB - 14 * BH - 2 * hard); - hardEdges[1] = new Fl_Toggle_Button(width - WB - hard, 3 * WB + 9 * BH + hard, - hard, height - 8 * WB - 14 * BH - 2 * hard); + hard, uvh); + hardEdges[1] = new Fl_Toggle_Button(width - 4 * WB - hard, 3 * WB + 9 * BH + hard, + hard, uvh); hardEdges[2] = new Fl_Toggle_Button(WB + hard, 3 * WB + 9 * BH, - width - 2 * WB - 2 * hard, hard); - hardEdges[3] = new Fl_Toggle_Button(WB + hard, height - 5 * WB - 5 * BH - hard, - width - 2 * WB - 2 * hard, hard); - for(int i = 0; i < 4; i++){ + uvw, hard); + hardEdges[3] = new Fl_Toggle_Button(WB + hard, height - 5 * WB - 5 * BH - hard, + uvw, hard); + for(int i = 0; i < 4; i++) hardEdges[i]->tooltip("Push to mark edge as `hard'"); - } - _uvPlot = new uvPlot(WB + hard, 3 * WB + 9 * BH + hard, - width - 2 * WB - 2 * hard, height - 8 * WB - 14 * BH - 2 * hard); + _uvPlot = new uvPlot(WB + hard, 3 * WB + 9 * BH + hard, uvw, uvh); _uvPlot->end(); + + Fl_Slider *s = new Fl_Slider(width - 3 * WB, 3 * WB + 9 * BH + hard, 2 * WB, uvh); + s->minimum(1.); + s->maximum(0.); + s->value(1.); + s->callback(filter_cb, this); + s->tooltip("Filter selection by distance to projection surface"); modes[0] = new Fl_Value_Input(WB, height - 4 * WB - 5 * BH, BB / 2, BH); modes[0]->tooltip("Number of Fourier modes along u"); @@ -315,7 +323,7 @@ void browse_cb(Fl_Widget *w, void *data) p->group->show(); } - update_cb(w, data); + update_cb(0, data); } void update_cb(Fl_Widget *w, void *data) @@ -466,7 +474,7 @@ void select_cb(Fl_Widget *w, void *data) ent.clear(); break; } - update_cb(w, data); + update_cb(0, data); } CTX.mesh.changed = ENT_ALL; @@ -475,6 +483,35 @@ void select_cb(Fl_Widget *w, void *data) Msg(ONSCREEN, ""); } +void filter_cb(Fl_Widget *w, void *data) +{ + Fl_Slider *slider = (Fl_Slider*)w; + projectionEditor *e = (projectionEditor*)data; + projection *p = e->getCurrentProjection(); + if(p){ + SBoundingBox3d bbox = GMODEL->bounds(); + double lc = norm(SVector3(bbox.max(), bbox.min())); + double threshold = slider->value() * lc; + ProjectionSurface *ps = p->face->GetProjectionSurface(); + std::vector<GEntity*> &ent(e->getEntities()); + for(unsigned int i = 0; i < ent.size(); i++){ + GVertex *ve = dynamic_cast<GVertex*>(ent[i]); + if(ve){ + double uu, vv, p[3], n[3]; + ps->OrthoProjectionOnSurface(ve->x(),ve->y(),ve->z(),uu,vv); + ps->F(uu, vv, p[0], p[1], p[2]); + double dx = ve->x() - p[0], dy = ve->y() - p[1], dz = ve->z() - p[2]; + if(uu >= 0. && uu <= 1. && vv >= 0. && vv < 1. && + sqrt(dx * dx + dy * dy + dz * dz) < threshold) + ve->setSelection(true); + else + ve->setSelection(false); + } + } + } + update_cb(0, data); +} + void close_cb(Fl_Widget *w, void *data) { if(data) ((Fl_Window *) data)->hide(); diff --git a/Fltk/GUI_Projection.h b/Fltk/GUI_Projection.h index d2b23c637ee336254bbcf7617be93203dea5ce94..0145df66064dc2b3f420dda5af569392d72b6dcb 100644 --- a/Fltk/GUI_Projection.h +++ b/Fltk/GUI_Projection.h @@ -27,6 +27,7 @@ #include "FM_Reader.h" void select_cb(Fl_Widget *w, void *data); +void filter_cb(Fl_Widget *w, void *data); void browse_cb(Fl_Widget *w, void *data); void update_cb(Fl_Widget *w, void *data); void close_cb(Fl_Widget *w, void *data); @@ -50,6 +51,8 @@ class uvPlot : public Fl_Window { void get(std::vector<double> &u, std::vector<double> &v, std::vector<double> &dist, std::vector<std::complex<double> > &f) { u = _u; v = _v; dist = _dist; f = _f; } + double dmin() { return _dmin; } + double dmax() { return _dmax; } }; class projectionEditor;