1. 程式人生 > 實用技巧 >NX二次開發-遍歷當前顯示部件裡的所有體(過濾掉裝配元件上的體)

NX二次開發-遍歷當前顯示部件裡的所有體(過濾掉裝配元件上的體)

書到用時方恨少,平時覺得自己積累的知識不少,實際真刀真槍的去幹一下子,發現自己不夠用了。才疏學淺,華而不實。

開發需求:

當前有個顯示部件,裡面有建立的體,也有裝配進來的體。

現在需要過濾掉裝配的體,把當前顯示部件裡建立的體設定顏色。

答案:

我到目前只想到了三種方法,

方法1:遍歷到每個裝配元件,設定成工作部件,然後遍歷當前工作部件裡的所有體tag,存下來,後期做過濾對比。(這種方法反覆設定工作部件,反覆遍歷,速度太慢)

方法2:遍歷到每個裝配元件的MODEL引用集,得到所有體tag,存下來,後期做過濾對比。(這種方法,會比第一種方法快一點)

方法3:遍歷每個裝配元件,直接隱藏(體也跟著隱藏了),然後遍歷當前顯示部件裡的所有體,做個過濾判斷(判斷體的顯示狀態,不顯示的過濾掉。(這種方法,用到了三個遍歷,感覺也是很快)

上述三種方法,功能都可以實現,但都不是最優質的方案。

最優質,速度最快的方案,暫時還沒想到。

這裡前兩個方法,以前在公司做開發的時候用過。沒寫過例子。

今天只寫了方法3的例子。

NX9+VS2012

#include <uf.h>
#include <uf_part.h>
#include <uf_obj.h>
#include <uf_modl.h>
#include <uf_disp.h>


UF_initialize();

//隱藏所有裝配體
tag_t componentTag = NULL_TAG;
UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_component_type, 
&componentTag); while (componentTag != NULL_TAG) { UF_OBJ_set_blank_status(componentTag, UF_OBJ_BLANKED); UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_component_type, &componentTag); } //遍歷所有體 tag_t BodyTag = NULL_TAG; UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_solid_type,
&BodyTag); while (BodyTag != NULL_TAG) { //獲取物件的顯示屬性(圖層,顏色,空白狀態,線寬,字型,高亮狀態) UF_OBJ_disp_props_t DispProps; UF_OBJ_ask_display_properties(BodyTag, &DispProps); if (DispProps.blank_status == false) { //設定顏色 UF_OBJ_set_color(BodyTag,186); } UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_solid_type, &BodyTag); } //顯示所有裝配體 UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_component_type, &componentTag); while (componentTag != NULL_TAG) { UF_OBJ_set_blank_status(componentTag, UF_OBJ_NOT_BLANKED); UF_OBJ_cycle_objs_in_part(UF_PART_ask_display_part(), UF_component_type, &componentTag); } UF_terminate(); Caesar盧尚宇 2020年9月12日