[案例三] 装配体下自动导出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();//获取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++,感觉代码有点累赘,我记得我以前写过类似的程序,但是死活想不起来,为了不影响整体的进度,因此我先实现功能,如果组件很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白雪公主的后妈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值