請問 AutoCad 有方法用 Lisp 取得 圖塊內使用者輸入的屬性資料嗎 ?
因為圖框要更新,而舊圖檔有一大堆,
想知道有沒有方法將圖框內使用者輸入的屬性資料,
取出存入變數中,
如果取得到資料,接下來的我就會處理了,
因為試了各種方法無法取得,
所以上來問看看有沒有高手會處理
( 請不要用 vba 的方法, 因為 vba 我不大熟,
而最近沒法子花太多時間去瞭解 )
2006-12-12 05:39:05 · 1 個解答 · 發問者 青楓 2 in 電腦與網際網路 ➔ 軟體
圖塊的屬性資料是以物件的型態緊接在圖塊物件之後的
所以主要是要利用entnext函數
常用的處理程式如下:
---------------------------------------------------------------------------
;|這是用選的,你可以ssget去撈符合特定條件的圖塊|;
(setq ent (car (entsel)))
;|做一個暫存的圖元(假定你的ent尚有他用)|;
(if (/= tmpent (setq nextent ;|確保不是最後一個圖元|; (entnext ent)))(setq tmpent entnext)(setq tmpent nil))
;|如果類型等於圖塊屬性|;
(while (and tmpent (= "ATTRIB" (cdr (assoc 0 (setq tmpdata (entget tmpent))))));start while 1.0
;|抓屬性值|;
(setq value (cdr (assoc 1 ;|1代表值|; tmpdata))
;|抓屬性標籤|;
(setq tag (cdr (assoc 2 ;|2是標籤|; tmpdata))
;|其他資料自己觀察類推|;
;|-----
這處通常會放一些組合屬性資料的程式(例如:append之類的)
或者是要置換值也在這裡比對然後處理(然後要追加entmod等必要措施)
----|;
;|驗證並shift暫存物件的定義|;
(if (/= tmpent (setq nextent (entnext tmpent)))(setq tmpent entnext)(setq tmpent nil))
);end while 1.0
-----------------------------------------------------------------------
最終需要清掉的暫存變數: nextent tmpent
至於 ent 清除與否則視您的使用情況而定
順便提一下:資料的更新也建議用上述方法,
可以避免command的寫法動不動就因為圖塊屬性輸入順序變化而導致必須修改程式碼(反過來說就是程式碼綁死圖塊屬性順序)
2006-12-19 19:17:59 補充:
P.S.上次游標那一題因為LISP不支援多執行緒所以是辦不到的
(就算是VBA我也沒啥把握),這陣子忙所以一直沒回...
2006-12-19 14:16:49 · answer #1 · answered by ? 3 · 0⤊ 0⤋