2

我有两种类型的钣金 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 :考虑祖先方向警告:地图最初没有被清除。

在文档上需要更正或更好的解决方案和/或清晰度方面的帮助。提前致谢。

4

0 回答 0