PView *GMSH_ExtractEdgesPlugin::execute(PView *v) { std::vector<MTriangle *> elements; for(GModel::fiter it = GModel::current()->firstFace(); it != GModel::current()->lastFace(); ++it) elements.insert(elements.end(), (*it)->triangles.begin(), (*it)->triangles.end()); if(elements.empty()) { Msg::Error("No triangles in mesh to extract edges from"); return 0; } PView *v2 = new PView(); PViewDataList *data2 = getDataList(v2); e2t_cont adj; buildEdgeToTriangle(elements, adj); std::vector<edge_angle> edges_detected, edges_lonly; buildListOfEdgeAngle(adj, edges_detected, edges_lonly); double threshold = ExtractEdgesOptions_Number[0].def / 180. * M_PI; for(std::size_t i = 0; i < edges_detected.size(); i++) { if(edges_detected[i].angle <= threshold) break; add_edge(edges_detected[i], data2); } if(ExtractEdgesOptions_Number[1].def) { for(std::size_t i = 0; i < edges_lonly.size(); i++) { add_edge(edges_lonly[i], data2); } } data2->setName("ExtractEdges"); data2->setFileName("ExtractEdges.pos"); data2->finalize(); return v2; }
static void select_elements_cb(Fl_Widget *w, void *data) { classificationEditor *e = (classificationEditor*)data; bool all = (w == e->buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS]); // allocate discrete edge to hold the selected mesh segments if(!e->selected){ e->selected = new discreteEdge (GModel::current(), GModel::current()->getMaxElementaryNumber(1) + 1, 0, 0); GModel::current()->add(e->selected); } if(all){ for(GModel::fiter it = GModel::current()->firstFace(); it != GModel::current()->lastFace(); ++it){ e->elements.insert(e->elements.end(), (*it)->triangles.begin(), (*it)->triangles.end()); e->elements.insert(e->elements.end(), (*it)->quadrangles.begin(), (*it)->quadrangles.end()); } } else{ CTX::instance()->pickElements = 1; while(1) { CTX::instance()->mesh.changed = ENT_ALL; drawContext::global()->draw(); Msg::StatusGl("Select elements\n" "[Press 'e' to end selection or 'q' to abort]"); char ib = FlGui::instance()->selectEntity(ENT_ALL); if(ib == 'l') { for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){ MElement *me = FlGui::instance()->selectedElements[i]; if(me->getDim() == 2 && me->getVisibility() != 2){ me->setVisibility(2); e->elements.push_back(me); } } } if(ib == 'r') { for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){ MElement *me = FlGui::instance()->selectedElements[i]; if(me->getVisibility() == 2) e->elements.erase(std::find(e->elements.begin(), e->elements.end(), me)); me->setVisibility(1); } } if(ib == 'e') { // ok, compute the edges GModel::current()->setSelection(0); break; } if(ib == 'q') { // do nothing GModel::current()->setSelection(0); e->elements.clear(); break; } } CTX::instance()->pickElements = 0; } e2t_cont adj; buildEdgeToElements(e->elements, adj); buildListOfEdgeAngle(adj, e->edges_detected, e->edges_lonly); ElementsSelectedMode(e); update_edges_cb(0, data); Msg::StatusGl(""); }