【问题标题】:How do I get the Aggregated Bodies from a CATPart in CATIA API's?如何从 CATIA API 中的 CATPart 获取聚合体?
【发布时间】:2014-11-24 19:11:51
【问题描述】:

我能够编写递归子例程循环遍历所有几何集和有序几何集而不会出现问题,因为在每个 GS 和 OGS 下分别有一个用于 HybridBodies 和 OrderedGeometricalSets 的集合。但是,当我找到 Part-Level (Root-Level) Bodies 时,里面没有 Bodies 集合。因此,当我的模型在主体内包含多个聚合布尔运算主体时,我无法在 VBA、C#.net 或 VB.net 的标准集合操作中找到它们。

如何在 Body 中找到这些 Body?

【问题讨论】:

    标签: vba api c#-4.0 catia


    【解决方案1】:

    这需要一段时间才能弄清楚,我肯定会在网络上发布它,因为它几乎没有记录。

    实体自动化的问题在于,所有实体都存储在零件级集合中。起初我没有看到,因为我在使用 CATIA 规范树导航时习惯了几何集和 OGS 递归。

    但是 所有 实体都存储在根级集合中这一事实实际上是一个障碍而不是好处,因为它不允许递归循环。

    我尝试使用选择对象搜索来查找聚合体,但它太麻烦且太麻烦了,无法弄清楚。

    确定一个 Body 是否通过另一个 Body 中的布尔实体操作聚合的最佳解决方案是使用“InBooleanOperation”方法。这没有很好的记录,这就是我在这里发布它的原因。

    它返回一个简单的真或假。像这样:

                Body CurB = MyBodies.Item(x);
                Boolean InBoolOpp = CurB.InBooleanOperation;
                if (InBoolOpp == false)
                {
                        // Code here
                }
    

    至于找到嵌套 Body 的父级,我还没有弄清楚,但我会发布它。

    【讨论】:

      【解决方案2】:

      你是对的,所有实体都被视为规范树的根。在 VBA 中,您可以选择一个主体,然后在其中搜索主体。所以先使用 .InBooleanOperation 属性来查看 body 是否在树的根部...如果是,选择它并使用下面的代码搜索里面的其他 body。

      Dim oPartDoc as PartDocument
      Set oPartDoc = CATIA.ActiveDocument
      
      Dim oPart as Part
      set oPart = oPartDoc.part
      
      Dim oSelection as Selection
      Set oSelection = oPartDoc.Selection
      
      Dim cBodies as New Collection
      
      Dim oBody As Body
      Set oBody = oPart.Bodies.Item(1)
      
      oSelection.Clear
      oSelection.Add oBody 'Add the body to the selection object
      oSelection.Search "Type=Body,sel" 'Search in the selected object
      'All bodies in the selected body are added to the selection object
      'Loop through selected bodies and add to collection
      For i = 1 to oSelection.Count
           cBodies.add oSelection.Item(i).Value
      Next
      

      【讨论】:

      • 强烈建议不要使用选择对象,除非绝对必要。它慢了 1000 倍,并且几乎使用了所有处理器。
      • 我完全同意,如果您找到其他解决方案,我很想知道。
      • 是的,我把它作为上面的答案发布了。
      • 这是一个想法:
      • 这里有一个想法: 1. 循环遍历身体并使用 InBooleanOperation 属性找到树根部的所有身体(如果它们在根部,它将返回 false)...添加将它们添加到大小为 (1, NumberOfRootBodies) 的多维数组的 0 元素 2. 现在循环遍历根主体及其 Shapes 集合,查找布尔形状,如 Add、Trim 等,然后使用 BooleanShape.Bodies 属性获取主体内部(这可能是一个递归函数) 3. 现在将所有这些主体存储在一个数组中,该数组存储在第一个数组的第一个元素中
      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      相关资源
      最近更新 更多