[案例三] 装配体下自动导出BOM表格
最近五一正好毕业论文盲审,抽时间研究一下装配体下的自动导出BOM表格的制作。起因是看到B站上边一位【怡宁塑胶模具设计】的UP主做了一个自动导出BOM表,感觉很有趣。感谢博主在B站上的视频,让我受益匪浅。于是本着学习的态度进行制作,并且根据自己的想法进行补充(增加选择组件导出BOM的功能)。历时3天,基本实现了该模型的功能。期间翻阅大量的历史学习记录,和大量其他UP主的博客。个人认为想要在技能上有所进行,必须进行综合练习。只有这样才能提升独立思考能力,而不是创建一个块,图个颜色一些简单的功能。再次感谢各位NX二次开发的大佬,让后辈站在巨人的肩膀上进行更好的探索。
目录
一、Block UI分析
二、开发思路
2.1主界面的开发
(1)按钮控件1,一键读取所有装配体BOM信息在树列表中显示
(2)点击按钮2,读取选择装配体对象进行读取BOM信息
(3)点击按钮3,删除选择列
(4)点击按钮4,删除所有列。
(5)点击按钮5,弹出编辑库文件
(6)点击按钮6,导出BOM表
(7)选择文件浏览器
2.2选择对象子界面的开发
2.3编辑库文件子界面的开发
三、运行结果
一、Block UI分析
主要用到了三个Block UI,具体如下:
1、主界面:包括六个Button按钮,一个树列表,一个浏览器文件位置选择按钮。
2、子界面1,选择对象对话框
3、子界面2,编辑库文件对话框。
二、开发思路
2.1主界面的开发
从上到下按钮依次为:
(1)按钮控件1,一键读取所有装配体BOM信息在树列表中显示
遍历装配导航器中所有节点,筛选出最底层没有子节点的组件的Component。可以写一个递归函数进行遍历,部分关键代码如下:
//定义全局变量ThechildComponent用来存放遍历出来的Component
vector<NXOpen::Assemblies::Component *> ThechildComponent;//遍历装配树
void NXopen_OutputBom::CycleComponent()
{//遍历装配多级节点BasePart* basedisplaypart;//定义顶层显示部件为全局变量basedisplaypart = theSession->Parts()->BaseDisplay();//获取顶层显示部件if (basedisplaypart != NULL){Assemblies::ComponentAssembly* componentassembly = basedisplaypart->ComponentAssembly();//获取装配底层(BaseWork为当前工作装配,BaseDisplay为当前显示的装配 两种结果是不一样的)Assemblies::Component* rootcomponent = componentassembly->RootComponent();//获取rootcomponentif (rootcomponent == NULL)//判断rootcomponent是否为空,空即提示当前不在装配环境或没有装配组件{theUI->NXMessageBox()->Show("提示", NXOpen::NXMessageBox::DialogTypeWarning, "当前不在装配环境或没有装配组件,请仔细检查!"); //弹出消息框提示}else if (rootcomponent != NULL)//不为空就遍历装配体的子组件{Cyclechildren(rootcomponent);}}
}//循环遍历组件得到组件的component
void NXopen_OutputBom::Cyclechildren(NXOpen::Assemblies::Component *component)
{//存放遍历到的装配树列表根节点下所有的子节点componentvector<NXOpen::Assemblies::Component *> childComponent = component->GetChildren();for (int i = 0; i < childComponent.size(); ++i){//获取组件的加载状态Part* resCurrentProtype = dynamic_cast<Part*>(childComponent[i]->Prototype());//获取组件是否被抑制bool GetComponentIsSuppressed = childComponent[i]->IsSuppressed();component->IsSuppressed();if (resCurrentProtype != NULL || GetComponentIsSuppressed != true){vector<NXOpen::Assemblies::Component *> thechildComponent1 = childComponent[i]->GetChildren();if ((int)thechildComponent1.size()==0){ThechildComponent.push_back(childComponent[i]);//收集已经加载不被抑制的组件component}}Cyclechildren(childComponent[i]);//递归遍历}
}
根据组件节点的Component进行属性的遍历,这里用到的是UF的函数,不是NXOPENC++,感觉代码有点累赘,我记得我以前写过类似的程序,但是死活想不起来,为了不影响整体的进度,因此我先实现功能,如果组件很多