在之前的入门教程中有提到,有时候我们要获得装配体下的某一个零件的某一个特征的数据。比如,我们想找到子零件下的特征对象,然后添加约束。那么一种实现方法是,对装配下的所有零件进行遍历操作,然后根据特定属性(零件名、类型等)找到特定对象。
这篇教程就介绍一下如何遍历装配体下的零件树,主要用的知识点是程序语言中递归的运用。
以下的代码可能不是很优雅,算是抛砖引玉。供大家参考使用。
建立装配体
为了测试代码,先建了一个下面结构的装配体CATProduct
。大家在用CATIA的时候也发现了,CATIA的装配层级关系是可以无限(大概)嵌套的,也就是Product
装配体可以作为另一个Product
下的子零件,也就形成了一个树形结构。
上面图中的结构涵盖了常见的节点形式
- 直接子零件CATPart
- 多级CATProduct嵌套
有了例子,下面让我们看一下分析思路
递归实现
我们在遇到一个装配树上的节点Node时,需要判断两个事情
- 节点是否是最后一个节点?如果是,则循环结束,返回父节点
- 节点是否是装配体?如果是,则需要以该节点为父节点,再次建立的一个循环
用流程图表达整个搜索过程如下图,其中红框内的部分,当层级level+1时(找到新的子装配体),就会创建一个新的循环体去搜索零件,当循环结束level-1,循环体又回到了上一层level下继续循环(重新回到上一级装配继续搜索),直到最顶层level=0对应的循环体结束,表示整个遍历过程完结,程序结束。
大家可以结合下面的代码进行理解
/// <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/
。
有同学要问了,这个函数怎么用呢?
很简单,利用之前入门教程中3和6,找到第一级装配体对象CATProduct,然后将它的Products属性、Name属性作为第一、二个参数代入到函数中就可以了。如果还有疑问,可以后台留言。
对应上面我们新建的那个装配体,函数运行后tree
对象里存的数据就是
有了这个List
对象,BOM什么的就不是问题了。而如果你想通过递归获得更多每一层子零件的信息,那可以将你要的信息封装成一个类CATIATreeNode
,然后替换List
里的string
类,即List<CATIATreeNode>
, 然后在函数内,将零件信息保存到CATIATreeNode
对象中即可。
(如果你看上面一段描述有点吃力,那可能你需要补一下C#、VB的编程知识先)
总结
ok, 遍历零件树实现的方法就介绍到这。
之前后台有同学留言问了一些问题,由于一些原因没有在后台进行信息的回复,所以今天在这片文章后面单独追加了一片问答篇,大家可以去看一下。
下一篇可能是CAA的开发环境的搭建教程,至于为什么跳到了CAA?答案在问答篇里,大家去看吧
版权属于:CraZyMoNk
本文链接:https://blog.peacharc.com/archives/291.html
转载时须注明出处及本声明