获取一组面的边界

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

 

 

那么使用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就可以了。

...

 

更多精彩请关注公众号

posted @ 2021-03-03 22:13  YiShan-CADCAM  阅读(1184)  评论(0)    收藏  举报