Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何从CATIA API';s_Vba_Api_C# 4.0_Catia - Fatal编程技术网

Vba 如何从CATIA API';s

Vba 如何从CATIA API';s,vba,api,c#-4.0,catia,Vba,Api,C# 4.0,Catia,我能够编写循环遍历所有几何集和有序几何集的递归子程序,没有问题,因为每个GS和OGS下分别有一个集合,用于HybridBody和OrderedGeometricalSets。但是,当我找到零件级(根级)实体时,其中没有实体集合。因此,当一个模型中有多个聚合布尔运算实体时,我在VBA、C#.net或VB.net中的标准集合操作中找不到它们 我怎样才能在一具尸体里找到这些尸体呢?这花了一段时间才弄清楚,我肯定会把它发布在网上,因为它几乎没有文档记录 Body自动化的问题在于所有Body都存储在零件级

我能够编写循环遍历所有几何集和有序几何集的递归子程序,没有问题,因为每个GS和OGS下分别有一个集合,用于HybridBody和OrderedGeometricalSets。但是,当我找到零件级(根级)实体时,其中没有实体集合。因此,当一个模型中有多个聚合布尔运算实体时,我在VBA、C#.net或VB.net中的标准集合操作中找不到它们


我怎样才能在一具尸体里找到这些尸体呢?

这花了一段时间才弄清楚,我肯定会把它发布在网上,因为它几乎没有文档记录

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

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

我尝试使用选择对象搜索来查找聚合的实体,但这太麻烦了,弄不清楚

确定一个实体是否在另一个实体中通过布尔实体运算聚合的最佳解决方案是使用“InBooleanOperation”方法。这是不是很好的记录,这就是为什么我张贴在这里

它返回一个简单的true或false。像这样:

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

至于查找嵌套实体的父对象,我还没有弄明白,但一旦弄明白了,我会发布它

您是对的,所有实体都被视为位于规范树的根。在VBA中,可以选择实体,然后在其中搜索实体。因此,首先使用.InBooleanOperation属性查看主体是否位于树的根目录下……如果位于树的根目录下,请选择它,然后使用下面的代码搜索其中的其他主体

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)…将它们添加到多维数组的0元素,大小类似(1,NumberOfRootBodys)2。现在在根实体及其形状集合中循环,查找像Add、Trim等布尔形状。然后使用BooleanShape.Bodys属性获取内部实体(这可能是一个递归函数)3。现在将所有这些实体存储在一个数组中,该数组存储在第一个数组的1元素中