在之前的入门教程中有提到,有时候我们要获得装配体下的某一个零件的某一个特征的数据。比如,我们想找到子零件下的特征对象,然后添加约束。那么一种实现方法是,对装配下的所有零件进行遍历操作,然后根据特定属性(零件名、类型等)找到特定对象。

这篇教程就介绍一下如何遍历装配体下的零件树,主要用的知识点是程序语言中递归的运用。
以下的代码可能不是很优雅,算是抛砖引玉。供大家参考使用。

建立装配体

为了测试代码,先建了一个下面结构的装配体CATProduct。大家在用CATIA的时候也发现了,CATIA的装配层级关系是可以无限(大概)嵌套的,也就是Product装配体可以作为另一个Product下的子零件,也就形成了一个树形结构。

上面图中的结构涵盖了常见的节点形式

  1. 直接子零件CATPart
  2. 多级CATProduct嵌套

有了例子,下面让我们看一下分析思路

递归实现

我们在遇到一个装配树上的节点Node时,需要判断两个事情

  1. 节点是否是最后一个节点?如果是,则循环结束,返回父节点
  2. 节点是否是装配体?如果是,则需要以该节点为父节点,再次建立的一个循环

用流程图表达整个搜索过程如下图,其中红框内的部分,当层级level+1时(找到新的子装配体),就会创建一个新的循环体去搜索零件,当循环结束level-1,循环体又回到了上一层level下继续循环(重新回到上一级装配继续搜索),直到最顶层level=0对应的循环体结束,表示整个遍历过程完结,程序结束。
18-58-22.jpg
19-39-17.jpg

大家可以结合下面的代码进行理解

/// <summary>
/// 递归查找
/// </summary>
/// <param name="parentProds">父节点下子对象列表</param>
/// <param name="parentPath">父节点名称</param>
/// <param name="str">名称路径字符串</param>
/// <param name="level">节点等级,从0开始</param>
/// <param name="tree">节点路径队列,用来保存遍历结果</param>
private static void FindFinalProductionsNameFroDemo(Products parentProds, string parentPath, ref string str, ref int level, ref List<string> tree)
{
    foreach (Product item in parentProds)
    {
        str = parentPath + item.ReferenceProduct.get_Name() + @"/";
        tree.Add(str);
        //如果还有子节点
        if (item.Products.Count > 0)
        {
            level++;
            parentPath = str;
            FindFinalProductionsNameFroDemo(item.Products, parentPath, ref str, ref level, ref tree);
        }
    }
    level--;
}

其中,List<string> tree用来保存获得的所有节点的传递路径字符串,这是个什么东西呢?就是这种Product1/Product2/Product3/Part3/
有同学要问了,这个函数怎么用呢?
19-38-14.jpg
很简单,利用之前入门教程中3和6,找到第一级装配体对象CATProduct,然后将它的Products属性、Name属性作为第一、二个参数代入到函数中就可以了。如果还有疑问,可以后台留言。

对应上面我们新建的那个装配体,函数运行后tree对象里存的数据就是

19-48-36.jpg 19-18-48.jpg

有了这个List对象,BOM什么的就不是问题了。而如果你想通过递归获得更多每一层子零件的信息,那可以将你要的信息封装成一个类CATIATreeNode,然后替换List里的string类,即List<CATIATreeNode>, 然后在函数内,将零件信息保存到CATIATreeNode对象中即可。
(如果你看上面一段描述有点吃力,那可能你需要补一下C#、VB的编程知识先)
19-37-45.jpg

总结

ok, 遍历零件树实现的方法就介绍到这。

之前后台有同学留言问了一些问题,由于一些原因没有在后台进行信息的回复,所以今天在这片文章后面单独追加了一片问答篇,大家可以去看一下。

下一篇可能是CAA的开发环境的搭建教程,至于为什么跳到了CAA?答案在问答篇里,大家去看吧

Last modification:March 10, 2019
如果觉得文章对你有用,请随意赞赏