论文盲审结果要出来了,渣渣超没有心情继续写了,过一段时间再说吧,今天宣布五一结束,哈哈哈。写完这篇博客开始搞科研了,有时间再进NX开发学习。本次案例主要是对上次导出自动导出BOM的一个前处理,要想导出属性,首先的有属性。于是本着学习的态度进行制作,可能有些功能有点别扭(支持装配环境下组件属性的批量填写,支持建模环境下的实体(不包括装配组件实体)——为了减负我把其过滤掉了,一般没人会往装配体里添加进行建模吧,但是不免有奇葩,哈哈哈)。历时3天半,基本实现了该模型的功能。期间翻阅大量的历史学习记录,和大量其他UP主的博客。个人认为想要在技能上有所进行,必须进行综合练习。只有这样才能提升独立思考能力,而不是创建一个块,图个颜色一些简单的功能。再次感谢各位NX二次开发的大佬,让后辈站在巨人的肩膀上进行更好的探索。
目录
一、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;