[案例四] 智能填写属性工具(支持装配组件还有建模实体属性的批量创建、编辑)
论文盲审结果要出来了,渣渣超没有心情继续写了,过一段时间再说吧,今天宣布五一结束,哈哈哈。写完这篇博客开始搞科研了,有时间再进NX开发学习。本次案例主要是对上次导出自动导出BOM的一个前处理,要想导出属性,首先的有属性。于是本着学习的态度进行制作,可能有些功能有点别扭(支持装配环境下组件属性的批量填写,支持建模环境下的实体(不包括装配组件实体)——为了减负我把其过滤掉了,一般没人会往装配体里添加进行建模吧,但是不免有奇葩,哈哈哈)。历时3天半,基本实现了该模型的功能。期间翻阅大量的历史学习记录,和大量其他UP主的博客。个人认为想要在技能上有所进行,必须进行综合练习。只有这样才能提升独立思考能力,而不是创建一个块,图个颜色一些简单的功能。再次感谢各位NX二次开发的大佬,让后辈站在巨人的肩膀上进行更好的探索。
目录
一、Block UI分析
二、开发思路
2.1主界面的开发
2.1.1按钮1——初始化属性
2.1.2按钮2——读取所有对象的属性
2.1.3按钮3——读取选择对象的属性
2.1.4按钮4——更新属性
2.1.5树列表——显示对象属性
2.1.6枚举控件——进行树列表显示对象的选择
2.2子界面1的开发
2.2.1枚举控件——对象的选择类型
2.2.2对象选择器——进行对象收集
2.2.3字符串控件——显示对象属性
2.3子界面2的开发
2.3.1枚举控件——对象的选择类型
2.3.2对象选择器——进行对象收集
三、运行结果
一、Block UI分析
主要用到了三个Block UI,具体如下:
1、主界面:包括四个Button按钮控件,一个树列表控件,一个枚举控件。
2、子界面1,初始化属性对话框
3、子界面2,读取选择对象的属性
二、开发思路
2.1主界面的开发
2.1.1按钮1——初始化属性
主要是对对象属性的赋值,包括装配下的组件和建模下的实体(不包括组件实体)。采用弹出子对话框的形式,参考:NX二次开发——BlockUI 弹出另一个BlockUI对话框-CSDN博客。同时支持填写单个或者框选最多的物料编号相同的对象,这样做的目的是快速填写。(部分关键代码)
.cpp中:
update_cb相应按钮的位置添加以下代码
//初始化对话框
NXOpen_AttributeToolChild1 *dialogintNXOpen_AttributeToolChild1 = new NXOpen_AttributeToolChild1();
dialogintNXOpen_AttributeToolChild1->Show();//第二个对话框显示
2.1.2按钮2——读取所有对象的属性
对所有对象的属性读取时,会根据枚举控件选择的实体或者时组件进行分别显示。主要是通过遍历得到的组件Component或者实体的TAG,通过树列表进行显示。(部分关键代码)
在相应的按钮下添加以下代码DeleteALLNodes();
//判断组件还是实体,获取枚举类型当中的位置
NXOpen::BlockStyler::PropertyList *enumProps = enum0->GetProperties();
int index = enumProps->GetEnum("Value");
delete enumProps;
enumProps = NULL;
if (index == 0)
{//实体不包含组件实体CycleComponent();vector<tag_t> SoildTag = cyclesoildTag(1);vector<vector<string>> SoildAttributeTXT = GetSoildAttribute(SoildTag);GetTreeNodeAndTxt(SoildAttributeTXT);
}
else
{//组件CycleComponent();vector<vector<string>> ComponentAttributeTXT = GetComponentAttribute(ThechildComponent);ThechildComponent.clear();GetTreeNodeAndTxt(ComponentAttributeTXT);
}
2.1.3按钮3——读取选择对象的属性
主要是通过对选择的对象进行属性读取。会通过子对话框2中的枚举控件选择的实体或者时组件返回所选组件Component或者实体的TAG,然后用树列表进行显示。(部分关键代码)
DeleteALLNodes();
//初始化对话框
NXOpen_BOMSetObj2 *dialogintNXOpen_BOMSetObj2 = new NXOpen_BOMSetObj2();
dialogintNXOpen_BOMSetObj2->Show();//第二个对话框显示
vector<NXOpen::TaggedObject *> selectionAssembliesobj = dialogintNXOpen_BOMSetObj2->selCompTags;
int selectionAssembliesobjindex = dialogintNXOpen_BOMSetObj2->index1;
if (selectionAssembliesobjindex == 0)
{vector<tag_t> SoildTag;for (int i = 0; i < (int)selectionAssembliesobj.size(); i++){SoildTag.push_back(selectionAssembliesobj[i]->Tag());} vector<vector<string>> SoildAttributeTXT = GetSoildAttribute(SoildTag);GetTreeNodeAndTxt(SoildAttributeTXT);
}
else if (selectionAssembliesobjindex == 1)
{vector<NXOpen::Assemblies::Component *> selectionAssembliescomponent;