請問如何讓lisp中的選集透過座標重新排序呢?
2 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
請問如何讓lisp中的選集透過座標重新排序呢?
以下是小弟正嘗試寫出來的新標註型態但因框選的時候選擇集內的排序沒辦法固定
導致最終cplo cple plo ple 4點會因為圖面修改而變動設為區域變數也沒辦法改善
例:
圖塊排列為 a b c d
如將圖塊移動為 a b d c
則設定得始末點cplo cple plo ple 會跟著 a d 位移造成佈線不正常
(defun LM:getdynprops (blk)
(mapcar '(lambda (x)
(cons (vla-get-propertyname x) (vlax-get x 'value))
)
(vlax-invoke blk 'getdynamicblockproperties)
)
)
(defun c:dpi (/)
(setq s 0)
(prompt "請框選同排管段且管為BLOCK單選成選集會異常")
(setq group (ssget '((0 . "insert"))))
(setq n (sslength group))
(while (< s n)
(setq name (ssname group s))
(setq dlist (LM:getdynprops (vlax-ename->vla-object name)))
(setq a (strcat "%%C " (rtos (cdr (assoc "A" dlist))) "A "))
(if (= s 0)
(setq dim a)
(setq dim (strcat dim a))
)
(setq ddi (cdr (assoc "直徑1" dlist)))
(if (= s 0)
(setq mind ddi)
(setq mind (min mind ddi))
)
(setq o (/ ddi 4))
(setq cp (cdr (assoc 10 (entget name))))
(setq cple (polar (polar cp 0 (* 3 o)) (* pi 0.5) (/ mind 4)))
(setq cplo (polar (polar cp pi (* 3 o)) (* pi 0.5) (/ mind 4)))
(command "line" cplo cple "")
(if (= s 0)
(progn (setq ple cple) (setq plo cplo))
)
(setq s (+ s 1))
)
(initget "L R")
(SETQ Q (GETKWORD "選擇方向OR"))
(command "line" cplo (getpoint) "")
(command "line" cple (getpoint) "")
(command "line" plo (getpoint) "")
(command "line" ple (getpoint) "")
)
導致最終cplo cple plo ple 4點會因為圖面修改而變動設為區域變數也沒辦法改善
例:
圖塊排列為 a b c d
如將圖塊移動為 a b d c
則設定得始末點cplo cple plo ple 會跟著 a d 位移造成佈線不正常
(defun LM:getdynprops (blk)
(mapcar '(lambda (x)
(cons (vla-get-propertyname x) (vlax-get x 'value))
)
(vlax-invoke blk 'getdynamicblockproperties)
)
)
(defun c:dpi (/)
(setq s 0)
(prompt "請框選同排管段且管為BLOCK單選成選集會異常")
(setq group (ssget '((0 . "insert"))))
(setq n (sslength group))
(while (< s n)
(setq name (ssname group s))
(setq dlist (LM:getdynprops (vlax-ename->vla-object name)))
(setq a (strcat "%%C " (rtos (cdr (assoc "A" dlist))) "A "))
(if (= s 0)
(setq dim a)
(setq dim (strcat dim a))
)
(setq ddi (cdr (assoc "直徑1" dlist)))
(if (= s 0)
(setq mind ddi)
(setq mind (min mind ddi))
)
(setq o (/ ddi 4))
(setq cp (cdr (assoc 10 (entget name))))
(setq cple (polar (polar cp 0 (* 3 o)) (* pi 0.5) (/ mind 4)))
(setq cplo (polar (polar cp pi (* 3 o)) (* pi 0.5) (/ mind 4)))
(command "line" cplo cple "")
(if (= s 0)
(progn (setq ple cple) (setq plo cplo))
)
(setq s (+ s 1))
)
(initget "L R")
(SETQ Q (GETKWORD "選擇方向
(command "line" cplo (getpoint) "")
(command "line" cple (getpoint) "")
(command "line" plo (getpoint) "")
(command "line" ple (getpoint) "")
)
a6666262000- 一般會員
- 文章總數 : 25
年齡 : 32
來自 : 台南
職業 : 機械,空間套圖
愛好 : 電影、電玩、
個性 : 喜好研究
使用年資 : 10
使用版本 : 2014-2018
經驗值 : 1998
威望值 : 42
注冊日期 : 2019-11-07
回復: 請問如何讓lisp中的選集透過座標重新排序呢?
最後四項為(command)是我測試點位移用的無須理會
a6666262000- 一般會員
- 文章總數 : 25
年齡 : 32
來自 : 台南
職業 : 機械,空間套圖
愛好 : 電影、電玩、
個性 : 喜好研究
使用年資 : 10
使用版本 : 2014-2018
經驗值 : 1998
威望值 : 42
注冊日期 : 2019-11-07
回復: 請問如何讓lisp中的選集透過座標重新排序呢?
你可以換個角度去想
不要去排列選集
而是把所有圖塊座標製作成串列
這樣不就簡單多了
因為你要的是座標而不是去綁定圖塊
如果需要你可以連同圖塊名稱也加入串列中隨時調用
不要去排列選集
而是把所有圖塊座標製作成串列
這樣不就簡單多了
因為你要的是座標而不是去綁定圖塊
如果需要你可以連同圖塊名稱也加入串列中隨時調用
bin1111- 一般會員
- 文章總數 : 23
年齡 : 38
來自 : Taipei
職業 : 鋼筋撿料
愛好 : AutoLISP
個性 : 沉穩
使用年資 : 2006年起
使用版本 : 2018
經驗值 : 5979
威望值 : 36
注冊日期 : 2008-11-04
回復: 請問如何讓lisp中的選集透過座標重新排序呢?
其實~我找到解決方案了~
手法是將圖塊名稱跟x座標做成串在利用x去做排序
最終在調用圖元名稱做成處理過的新選集
來執行後端處理
手法是將圖塊名稱跟x座標做成串在利用x去做排序
最終在調用圖元名稱做成處理過的新選集
來執行後端處理
a6666262000- 一般會員
- 文章總數 : 25
年齡 : 32
來自 : 台南
職業 : 機械,空間套圖
愛好 : 電影、電玩、
個性 : 喜好研究
使用年資 : 10
使用版本 : 2014-2018
經驗值 : 1998
威望值 : 42
注冊日期 : 2019-11-07
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章