/** Accumulate a list of TopoDS_Edge objects along with their lengths. We will use this repeatedly while we're rendering this text string. We don't want to re-aquire this information for every point of every character. Cache it here. This method should be called once before each rendering session for the text string. */ void COrientationModifier::InitializeFromSketch() { m_edges.clear(); m_total_edge_length = 0.0; if (GetNumChildren() > 0) { std::list<TopoDS_Shape> wires; if (::ConvertSketchToFaceOrWire( GetFirstChild(), wires, false)) { // Aggregate a list of TopoDS_Edge objects and each of their lengths. We can // use this list to skip through edges that we're not interested in. i.e. the // text won't sit on top of them. for (std::list<TopoDS_Shape>::iterator itWire = wires.begin(); itWire != wires.end(); itWire++) { TopoDS_Wire wire(TopoDS::Wire(*itWire)); for(BRepTools_WireExplorer expEdge(TopoDS::Wire(wire)); expEdge.More(); expEdge.Next()) { TopoDS_Edge edge(TopoDS_Edge(expEdge.Current())); BRepAdaptor_Curve curve(edge); double edge_length = GCPnts_AbscissaPoint::Length(curve); m_edges.push_back( std::make_pair(edge,edge_length) ); m_total_edge_length += edge_length; } // End for } // End for } // End if - then } // End if - then }
/* static */ std::vector<TopoDS_Edge> SimplifySketchTool::SortEdges( const TopoDS_Wire & wire ) { std::vector<TopoDS_Edge> edges; for(BRepTools_WireExplorer expEdge(TopoDS::Wire(wire)); expEdge.More(); expEdge.Next()) { edges.push_back( TopoDS_Edge(expEdge.Current()) ); } // End for for (std::vector<TopoDS_Edge>::iterator l_itEdge = edges.begin(); l_itEdge != edges.end(); l_itEdge++) { if (l_itEdge == edges.begin()) { // It's the first edge. Find the edge whose endpoint is closest to gp_Pnt(0,0,0) so that // the resutls of this sorting are consistent. When we just use the first edge in the // wire, we end up with different results every time. We want consistency so that, if we // use this Contour operation as a location for drilling a relief hole (one day), we want // to be sure the machining will begin from a consistently known location. std::vector<TopoDS_Edge>::iterator l_itStartingEdge = edges.begin(); gp_Pnt closest_point = GetStart(*l_itStartingEdge); if (GetEnd(*l_itStartingEdge).Distance(gp_Pnt(0,0,0)) < closest_point.Distance(gp_Pnt(0,0,0))) { closest_point = GetEnd(*l_itStartingEdge); } for (std::vector<TopoDS_Edge>::iterator l_itCheck = edges.begin(); l_itCheck != edges.end(); l_itCheck++) { if (GetStart(*l_itCheck).Distance(gp_Pnt(0,0,0)) < closest_point.Distance(gp_Pnt(0,0,0))) { closest_point = GetStart(*l_itCheck); l_itStartingEdge = l_itCheck; } if (GetEnd(*l_itCheck).Distance(gp_Pnt(0,0,0)) < closest_point.Distance(gp_Pnt(0,0,0))) { closest_point = GetEnd(*l_itCheck); l_itStartingEdge = l_itCheck; } } EdgeComparison compare( *l_itStartingEdge ); std::sort( edges.begin(), edges.end(), compare ); } // End if - then else { // We've already begun. Just sort based on the previous point's location. std::vector<TopoDS_Edge>::iterator l_itNextEdge = l_itEdge; l_itNextEdge++; if (l_itNextEdge != edges.end()) { EdgeComparison compare( *l_itEdge ); std::sort( l_itNextEdge, edges.end(), compare ); } // End if - then } // End if - else } // End for return(edges); } // End SortEdges() method
void CreateFacesAndEdges(TopoDS_Shape shape, CFaceList* faces, CEdgeList* edges, CVertexList* vertices) { // create index maps TopTools_IndexedMapOfShape faceMap; TopTools_IndexedMapOfShape edgeMap; TopTools_IndexedMapOfShape vertexMap; for (TopExp_Explorer explorer(shape, TopAbs_FACE); explorer.More(); explorer.Next()) { faceMap.Add(explorer.Current()); } for (TopExp_Explorer explorer(shape, TopAbs_EDGE); explorer.More(); explorer.Next()) { edgeMap.Add(explorer.Current()); } for (TopExp_Explorer explorer(shape, TopAbs_VERTEX); explorer.More(); explorer.Next()) { vertexMap.Add(explorer.Current()); } std::vector<CFace*> face_array; face_array.resize(faceMap.Extent() + 1); std::vector<CEdge*> edge_array; edge_array.resize(edgeMap.Extent() + 1); std::vector<CVertex*> vertex_array; vertex_array.resize(vertexMap.Extent() + 1); // create the edge objects for(int i = 1;i<=edgeMap.Extent();i++) { const TopoDS_Shape &s = edgeMap(i); CEdge* new_object = new CEdge(TopoDS::Edge(s)); edge_array[i] = new_object; } // create the vertex objects for(int i = 1;i<=vertexMap.Extent();i++) { const TopoDS_Shape &s = vertexMap(i); CVertex* new_object = new CVertex(TopoDS::Vertex(s)); vertex_array[i] = new_object; } // add the edges in their face loop order std::set<CEdge*> edges_added; std::set<CVertex*> vertices_added; // create the face objects for(int i = 1;i<=faceMap.Extent();i++) { const TopoDS_Shape &s = faceMap(i); CFace* new_face_object = new CFace(TopoDS::Face(s)); faces->Add(new_face_object, NULL); face_array[i] = new_face_object; // create the loop objects TopTools_IndexedMapOfShape loopMap; for (TopExp_Explorer explorer(s, TopAbs_WIRE); explorer.More(); explorer.Next()) { loopMap.Add(explorer.Current()); } TopoDS_Wire outerWire=BRepTools::OuterWire(new_face_object->Face()); int outer_index = loopMap.FindIndex(outerWire); for(int i = 1;i<=loopMap.Extent();i++) { const TopoDS_Shape &s = loopMap(i); CLoop* new_loop_object = new CLoop(TopoDS::Wire(s)); new_face_object->m_loops.push_back(new_loop_object); if(outer_index == i)new_loop_object->m_is_outer = true; new_loop_object->m_pface = new_face_object; // find the loop's edges for(BRepTools_WireExplorer explorer(TopoDS::Wire(s)); explorer.More(); explorer.Next()) { CEdge* e = edge_array[edgeMap.FindIndex(explorer.Current())]; new_loop_object->m_edges.push_back(e); // add the edge if(edges_added.find(e) == edges_added.end()) { edges->Add(e, NULL); edges_added.insert(e); } // add the vertex CVertex* v = vertex_array[vertexMap.FindIndex(explorer.CurrentVertex())]; if(vertices_added.find(v) == vertices_added.end()) { vertices->Add(v, NULL); vertices_added.insert(v); } } } } // find the vertices' edges for(unsigned int i = 1; i<vertex_array.size(); i++) { CVertex* v = vertex_array[i]; TopTools_IndexedMapOfShape vertexEdgeMap; for (TopExp_Explorer expEdge(v->Vertex(), TopAbs_EDGE); expEdge.More(); expEdge.Next()) { vertexEdgeMap.Add(expEdge.Current()); } for(int i = 1; i<=vertexEdgeMap.Extent(); i++) { const TopoDS_Shape &s = vertexEdgeMap(i); CEdge* e = edge_array[edgeMap.FindIndex(s)]; v->m_edges.push_back(e); } } // find the faces' edges for(unsigned int i = 1; i<face_array.size(); i++) { CFace* face = face_array[i]; TopTools_IndexedMapOfShape faceEdgeMap; for (TopExp_Explorer expEdge(face->Face(), TopAbs_EDGE); expEdge.More(); expEdge.Next()) { faceEdgeMap.Add(expEdge.Current()); } for(int i = 1; i<=faceEdgeMap.Extent(); i++) { const TopoDS_Shape &s = faceEdgeMap(i); CEdge* e = edge_array[edgeMap.FindIndex(s)]; face->m_edges.push_back(e); e->m_faces.push_back(face); bool sense = (s.IsEqual(e->Edge()) == Standard_True); e->m_face_senses.push_back(sense); } } }