我有两种类型的钣金 CAD 模型面;ModelFace(PLANAR 面)和 ModelBend(NON-PLANAR,存在于 ModelFace 之间,表示钣金件的折弯)。这些人脸存储在单独的向量中。我想要做的是找到每个弯曲连接到的面。每个面和弯曲都分配有一个正的非零整数 ID。所需的输出是这样的:
F1----B1-----F2 Angle : 90 Radius : 4
F2----B2-----F3 Angle : 90 Radius : 4
这意味着半径为 4mm 的弯曲 1 以 90 度角连接面 1 和面 2,依此类推。但是,对于大多数模型,无论其格式如何(步骤/igs),我都会得到如下所示的结果:
F1---B1---F2 Angle : 90 Radius : 4
F3---B2---F0 Angle : 0 Radius : 4
F4---B3---F5 Angle : 90 Radius : 1
F0---B4---F0 Angle : 0 Radius : 1
类似的结果F3---B2---F0
意味着程序检测到 B2 连接到面 3,但无法识别另一个连接的面,因此 F0 值。同样对于某些模型,输出可能是F0---B2---F0
这意味着没有找到连接到弯曲 2 的面。
似乎由面和弯曲共享的边缘没有被检测为相似边缘,即边缘线的端点不相同或由大于公差的空间隔开。我使用 Autodesk Inventor 和 SolidWorks 绘制了模型。我什至在 FreeCad 中也看过它们,无论我放大多少,边缘都是连接的。
弯曲有两条直线边连接到面,如下图所示:
这是我最初的解决方案,但它没有捕获所有连接,例如我得到的信息是一些弯曲连接到一个边缘而不是另一边缘的面:
for (auto& bend: mModelBends){
for (auto& edge: bend.getFaceEdges()){
if (edge.getEdgeType() == EdgeType::LINE) {
TopoDS_Edge anEdge = edge.getTModelEdge(); // returns a TopoDS_Edge from the edge object
for (auto& face: mModelFaces)
{
if (face.getFaceType() == FaceType::NONE) {
TopoDS_Face aFace = face.getTModelFace(); // returns a TopoDS_Face from the face object
for( TopExp_Explorer anExp(aFace, TopAbs_EDGE); anExp.More(); anExp.Next()) {
if(anExp.Current().IsSame(anEdge)) {
// Do something.........
}
}
}
}
}
}
}
在OpenCascade 论坛上找到的另一个解决方案:
TopTools_IndexedDataMapOfShapeListOfShape edgeFaceMap;
// mModelShape is a TopoDS_Shape with the entire model
TopExp::MapShapesAndAncestors(mModelShape, TopAbs_EDGE, TopAbs_FACE, edgeFaceMap);
for (auto& bend: mModelBends){
for (auto& edge: bend.getFaceEdges()){
if (edge.getEdgeType() == EdgeType::LINE) {
TopoDS_Edge anEdge = edge.getTModelEdge();
TopoDS_Shape anAdjFaceObj;
// Find adjacent face
for (auto& a : mModelFaces)
{
bool faceFound = TopOpeBRepBuild_Tools::GetAdjacentFace(a.getTModelFace(), anEdge,
edgeFaceMap, anAdjFaceObj);
if (faceFound)
{
// Do something.........
}
}
}
}
}
第二个解决方案在第一次执行 GetAdjacentFace() 后崩溃。
问题可能是因为我不理解文档对 MapShapesAndUniqueAncestors() 和 GetAdjacentFace() 的看法:
TopExp::MapShapesAndUniqueAncestors(const TopoDS_Shape &S,
const TopAbs_ShapeEnum TS,
const TopAbs_ShapeEnum TA,
TopTools_IndexedDataMapOfShapeListOfShape &M,
const Standard_Boolean useOrientation = Standard_False
)
将所有类型为 TS 的 S 的子形状存储在映射 M 中,每个子形状都将所有类型为 TA 的唯一祖先附加到列表中。例如,映射所有边并绑定面列表。useOrientation = True :考虑祖先方向警告:地图最初没有被清除。
在文档上需要更正或更好的解决方案和/或清晰度方面的帮助。提前致谢。