获取一组面的边界
三维激光切割曲面模型时,要先提取一组面的边界,如下图。

那么使用OpenCASCADE如何查找这些边界呢?
一.当这一组面是属于一个shape时,这些边有一个共同点,就是只属于一个面。
代码如下:
TopoDS_Shape S=...; Handle(TopTools_HSequenceOfShape) edges = new TopTools_HSequenceOfShape(); //获取所有边 TopTools_IndexedDataMapOfShapeListOfShape M; TopExp::MapShapesAndAncestors(S, TopAbs_EDGE, TopAbs_FACE, M); //遍历每一个边 for (Standard_Integer i = 1; i <= M.Extent(); i++) { //是否只属于一个面 if (M.FindFromIndex(i).Extent() == 1) { TopoDS_Edge iEdge = TopoDS::Edge(M.FindKey(i)); edges->Append(iEdge); } } //由边组成wire就可以了。 ...
二.有时会遇到导入的模型是很多碎面组成的,并不是一个shape,iges格式经常会遇到这种情况,由该如何处理呢?
首先这些面是相接的,然后把重合边去掉,剩下的就是边界了。
代码如下:
std::vector<TopoDS_Face> FS=...; Handle(TopTools_HSequenceOfShape) edges = new TopTools_HSequenceOfShape(); //遍历所有面 for (size_t i = 0; i < FS.size(); i++) { const TopoDS_Face& aFace = FS[i]; //获取面的所有wire TopTools_IndexedMapOfShape M; TopExp::MapShapes(aFace, TopAbs_WIRE, M); //遍历这些wire for (Standard_Integer j = 1; j <= M.Extent(); j++) { const TopoDS_Wire &aWire = TopoDS::Wire(M.FindKey(j)); //获取wire中所有edge TopTools_IndexedMapOfShape MM; TopExp::MapShapes(aWire, TopAbs_EDGE, MM); //遍历这些edge for (Standard_Integer ej = 1; ej <= MM.Extent(); ej++) { const TopoDS_Edge &aEdge = TopoDS::Edge(MM.FindKey(ej)); //获取边的中点,此处比较两个边的中点是否相同可以认定两个边重合 gp_Pnt jsp, jep, jmp; Standard_Real jsparam(0), jeparam(0); MOCC_ComFuns::GetEndPnts(aEdge, jsp, jep, jsparam, jeparam); MOCC_ComFuns::GetPnt(aEdge, jsparam + (jeparam - jsparam) / 2, jmp); bool isExited = false; //与已有的边比较是否重合 for (int k = 1; k <= edges->Length(); k++) { const TopoDS_Edge &aExitEdge = TopoDS::Edge(edges->Value(k)); gp_Pnt ksp, kep, kmp; Standard_Real ksparam(0), keparam(0); MOCC_ComFuns::GetEndPnts(aExitEdge, ksp, kep, ksparam, keparam); MOCC_ComFuns::GetPnt(aExitEdge, ksparam + (keparam - ksparam) / 2, kmp); //重合时,移除已存储的边 if (jmp.IsEqual(kmp, Precision::Confusion())) { isExited = true; edges->Remove(k); break; } } //不重合时,将该边加入列表 if (!isExited) { edges->Append(aEdge); } } } } //由边组成wire就可以了。 ...
更多精彩请关注公众号

浙公网安备 33010602011771号