最近五一正好毕业论文盲审,抽时间研究一下装配体下的自动导出BOM表格的制作。起因是看到B站上边一位【怡宁塑胶模具设计】的UP主做了一个自动导出BOM表,感觉很有趣。感谢博主在B站上的视频,让我受益匪浅。于是本着学习的态度进行制作,并且根据自己的想法进行补充(增加选择组件导出BOM的功能)。历时3天,基本实现了该模型的功能。期间翻阅大量的历史学习记录,和大量其他UP主的博客。个人认为想要在技能上有所进行,必须进行综合练习。只有这样才能提升独立思考能力,而不是创建一个块,图个颜色一些简单的功能。再次感谢各位NX二次开发的大佬,让后辈站在巨人的肩膀上进行更好的探索。
目录
(1)按钮控件1,一键读取所有装配体BOM信息在树列表中显示
一、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();//获取rootcomponent
if (rootcomponent == NULL)//判断rootcomponent是否为空,空即提示当前不在装配环境或没有装配组件
{
theUI->NXMessageBox()->Show("提示", NXOpen::NXMessageBox::DialogTypeWarning, "当前不在装配环境或没有装配组件,请仔细检查!"); //弹出消息框提示
}
else if (rootcomponent != NULL)//不为空就遍历装配体的子组件
{
Cyclechildren(rootcomponent);
}
}
}
//循环遍历组件得到组件的component
void NXopen_OutputBom::Cyclechildren(NXOpen::Assemblies::Component *component)
{
//存放遍历到的装配树列表根节点下所有的子节点component
vector<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++,感觉代码有点累赘,我记得我以前写过类似的程序,但是死活想不起来,为了不影响整体的进度,因此我先实现功能,如果组件很多