cad.net 獲取動態塊的可見性屬性及列表
本文章的目的是,在預先不知道一個塊是否有可見性選項的前提下,拿到它的可見性屬性和列表
由于這幾天突然有此需求,所以查找相應的方法,發現.net沒有提供直接的api,且未找到可靠的方法
一、錯誤方法
1. 通過名稱判斷
有朋友告訴我通過判斷PropertyName是否包含"可見性"來判斷,并且信誓旦旦的跟我說這個"可見性"是不能改的,是固定的。(沒錯就是你,飛詩)
但是其實塊的可見性名字在塊編輯界面可以通過特性欄來修改

2. 通過PropertyTypeCode和GetAllowedValues來判斷
我們知道DynamicBlockReferenceProperty有一個PropertyTypeCode屬性和GetAllowedValues方法,code==5時代表類型是string,有下拉列表時GetAllowedValues可以拿到一個字符串集合
我還想過通過夾點來輔助判斷,因為可見性會使動態塊增加一個夾點(點擊出現下拉列表那個),這個夾點的屬性HotGripInvokesRightClick==true(默認為false),那么這樣做是否完全可靠呢?
答案是否定的,因為在動態塊里面還有一個叫作"查詢"的東西

這個查詢的propertyCode同樣==5,并且GetAllowedValues同樣會拿到一個字符串列表,且同樣會增加一個和可見性一模一樣的夾點,無法區分出是查詢還是可見性
二、可靠方法
在我覺得反正沒什么人用這個查詢,就使用上述第二種方法湊合一下的時候
水友 @執著 給我提供了一段 Lee Mac 的lisp代碼,可以通過塊表記錄的擴展字典和組碼來獲取到
經過我的一番嘗試和測試,最終使用c#實現,代碼見下圖



代碼已提交至IFoxCad v0.9分支
具體流程為:
- 獲取動態塊的原塊表記錄
- 判斷塊表記錄是否有擴展字典
- 判斷擴展字典里是否有key為"ACAD_ENHANCEDBLOCK"的項,拿到對應的ObjectId1
- 對ObjectId1進行entget,拿到組碼列表1
- 遍歷組碼列表1中所有組碼為360的ObjectId,判斷是否有dxfName為"BLOCKVISIBILITYPARAMETER"的ObjectId2(只會有一個或沒有)
- 如果能找到ObjectId2那么說明此動態塊有可見性列表
- 對ObjectId2再次進行entget,拿到組碼列表2
- 遍歷組碼列表2,301組碼對應的值為可見性的名字(PropertyName),303組碼(可能有多個)對應的值為允許值(GetAllowedValues)
完

浙公網安備 33010602011771號