論文盲審結果要出來了,渣渣超沒有心情繼續寫了,過一段時間再說吧,今天宣布五一結束,哈哈哈。寫完這篇博客開始搞科研了,有時間再進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;