[討論]lisp--vl-sort與lambda這2個函數的用法
5 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
[討論]lisp--vl-sort與lambda這2個函數的用法
(setq a1 '(0 0)
a2 '(630 0)
a3 '(1260 0)
a4 '(1890 0)
a5 '(2520 0)
a6 '(3150 0)
a7 '(0 500)
a8 '(630 500)
a9 '(1260 500)
a10 '(1890 500)
a11 '(2520 500)
a12 '(3150 500)
a13 '(0 1000)
a14 '(630 1000)
a15 '(1260 1000)
a16 '(1890 1000)
a17 '(2520 1000)
a18 '(3150 1000)
)
(setq aa(list a10 a14 a7 a8 a3 a13 a2 a18 a6 a12 a1 a16 a4 a15 a9 a11 a5 a17))
(setq aa(vl-sort aa
(function (lambda (e1 e2)
(< (car e1) (car e2)))))
)
如上面所示,我把18個坐標分成6x3排列,如果它是某圖塊的插入點坐標,我將它加入一個屬性標籤,並利用程式要幫它們先左→右,再上↓下的編碼,要如何寫呢?
a2 '(630 0)
a3 '(1260 0)
a4 '(1890 0)
a5 '(2520 0)
a6 '(3150 0)
a7 '(0 500)
a8 '(630 500)
a9 '(1260 500)
a10 '(1890 500)
a11 '(2520 500)
a12 '(3150 500)
a13 '(0 1000)
a14 '(630 1000)
a15 '(1260 1000)
a16 '(1890 1000)
a17 '(2520 1000)
a18 '(3150 1000)
)
(setq aa(list a10 a14 a7 a8 a3 a13 a2 a18 a6 a12 a1 a16 a4 a15 a9 a11 a5 a17))
(setq aa(vl-sort aa
(function (lambda (e1 e2)
(< (car e1) (car e2)))))
)
如上面所示,我把18個坐標分成6x3排列,如果它是某圖塊的插入點坐標,我將它加入一個屬性標籤,並利用程式要幫它們先左→右,再上↓下的編碼,要如何寫呢?
蔣秉澔- 初級會員
- 文章總數 : 211
年齡 : 47
來自 : 嘉義市
職業 : 大電力系統設計、製程、檢測
愛好 : 電腦相關,出遊踏青
個性 : 待人隨和,對事執著
使用年資 : 8年
使用版本 : 2011 Electrical,2014
積分 : 4
經驗值 : 5357
威望值 : 204
注冊日期 : 2013-08-31
judyyai- 管理顧問
- 文章總數 : 7786
年齡 : 47
來自 : 台南
職業 : 機械製圖
愛好 : 電腦相關
個性 : think too much...
使用年資 : 10↑
使用版本 : AC2019(開始於2019年底末月)
AutoCAD基礎篇等級 : 10星級
積分 : 393
最佳解答 : 1
經驗值 : 30397
威望值 : 3610
發帖精華 : 2
回帖精華 : 4
注冊日期 : 2008-11-19
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
judyyai姐,我也還是在學習階段,很多都不會
蔣秉澔- 初級會員
- 文章總數 : 211
年齡 : 47
來自 : 嘉義市
職業 : 大電力系統設計、製程、檢測
愛好 : 電腦相關,出遊踏青
個性 : 待人隨和,對事執著
使用年資 : 8年
使用版本 : 2011 Electrical,2014
積分 : 4
經驗值 : 5357
威望值 : 204
注冊日期 : 2013-08-31
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
先排x、再排y
…
(setq aa(vl-sort aa
(function (lambda (e1 e2)
(< (car e1) (car e2)))))
);X座標排序,由小->大(左->右)
(setq aa(vl-sort aa
(function (lambda (e1 e2)
(> (cadr e1) (cadr e2)))))
);Y座標排序,由大->小(上->下)
…
…
(setq aa(vl-sort aa
(function (lambda (e1 e2)
(< (car e1) (car e2)))))
);X座標排序,由小->大(左->右)
(setq aa(vl-sort aa
(function (lambda (e1 e2)
(> (cadr e1) (cadr e2)))))
);Y座標排序,由大->小(上->下)
…
Atsai- 中級會員
- 文章總數 : 167
年齡 : 49
來自 : 台中
職業 : 工程
愛好 : 看漫畫
個性 : 樂天
使用年資 : 10
使用版本 : 2010
AutoCAD基礎篇等級 : 10星級
積分 : 8
經驗值 : 5882
威望值 : 524
注冊日期 : 2012-04-06
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
Atsai哥,謝謝你的解說,我發現,有時候是一件簡單的事,我都把它想得複雜了
蔣秉澔- 初級會員
- 文章總數 : 211
年齡 : 47
來自 : 嘉義市
職業 : 大電力系統設計、製程、檢測
愛好 : 電腦相關,出遊踏青
個性 : 待人隨和,對事執著
使用年資 : 8年
使用版本 : 2011 Electrical,2014
積分 : 4
經驗值 : 5357
威望值 : 204
注冊日期 : 2013-08-31
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
好久沒關心這篇了~
自從Atsai哥解說後,我就立馬套進主程式使用,結果發現,如果抓的是圖元,雖然坐標有排好,但回饋給圖元,它又照圖元的號碼去排了
飯粒:
(setq sl nil
ii 0
ENTS(ssget '((0 . "TEXT"))))
(Repeat (sslength ENTS)
(setq sl (cons(ssname ENTS ii)sl)
ii(1+ ii)))
(setq sl (vl-sort sl
(function (lambda(a b)(<
(car(cdr(assoc 10(entget a))))
(car(cdr(assoc 10(entget b))))
))))) ;X座標排序,由小->大(左->右)
(setq sl (vl-sort sl
(function (lambda(a b)(>
(cadr(cdr(assoc 10(entget a))))
(cadr(cdr(assoc 10(entget b))))
))))) ;Y座標排序,由大->小(上->下)
自從Atsai哥解說後,我就立馬套進主程式使用,結果發現,如果抓的是圖元,雖然坐標有排好,但回饋給圖元,它又照圖元的號碼去排了
飯粒:
(setq sl nil
ii 0
ENTS(ssget '((0 . "TEXT"))))
(Repeat (sslength ENTS)
(setq sl (cons(ssname ENTS ii)sl)
ii(1+ ii)))
(setq sl (vl-sort sl
(function (lambda(a b)(<
(car(cdr(assoc 10(entget a))))
(car(cdr(assoc 10(entget b))))
))))) ;X座標排序,由小->大(左->右)
(setq sl (vl-sort sl
(function (lambda(a b)(>
(cadr(cdr(assoc 10(entget a))))
(cadr(cdr(assoc 10(entget b))))
))))) ;Y座標排序,由大->小(上->下)
蔣秉澔- 初級會員
- 文章總數 : 211
年齡 : 47
來自 : 嘉義市
職業 : 大電力系統設計、製程、檢測
愛好 : 電腦相關,出遊踏青
個性 : 待人隨和,對事執著
使用年資 : 8年
使用版本 : 2011 Electrical,2014
積分 : 4
經驗值 : 5357
威望值 : 204
注冊日期 : 2013-08-31
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
請問你是 希望座標排序好之後..再跟據座標.依序取得排好序的圖元.來做編輯嗎~?
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8024
威望值 : 1185
注冊日期 : 2009-06-03
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
shenhung哥,對ㄚ,我就是想這樣,我該如何做呢?
蔣秉澔- 初級會員
- 文章總數 : 211
年齡 : 47
來自 : 嘉義市
職業 : 大電力系統設計、製程、檢測
愛好 : 電腦相關,出遊踏青
個性 : 待人隨和,對事執著
使用年資 : 8年
使用版本 : 2011 Electrical,2014
積分 : 4
經驗值 : 5357
威望值 : 204
注冊日期 : 2013-08-31
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
取得圓心之後.在圓心依排序寫出序號.. 此處.利用 點對 (座標點 . 圖元碼) 做榜定排序
測試cad檔和 LISP檔.下載
載點1: https://db.tt/kuwBLEXn
載點2: https://app.box.com/s/71w05dd51tf9zqn84zke
- 代碼:
(defun c:tt ()
(setq ss nil pt_list '() i 0)
(setq ss (ssget '((0 . "CIRCLE"))))
(repeat (sslength ss)
(setq en (ssname ss i))
(setq en_10 (cdr (assoc 10 (entget en))))
(setq en_5 (cdr (assoc 5 (entget en)))) ;圖元HANDENT 碼
(setq en_list (cons en_10 en_5)) ; 建立點對 (點 . 圖元碼)
(setq pt_list (cons en_list pt_list)) ; 點對加入 pt_list 串列
(setq i (1+ i))
)
(setq pt_list_sort (sort_y pt_list)) ; 先對y排序
(setq pt_list_sort (sort_x pt_list_SORT)) ;再對x排序
(write-text)
)
(defun sort_x (lst) ;由小排到大
;此處改寫為 (nth 0 e1) 是 將點對 (點 . 圖元碼) 中的座標點.取出來排序.
(setq lst (vl-sort lst (function (lambda (e1 e2) (< (car (nth 0 e1)) (car (nth 0 e2)))))))
)
(defun sort_y (lst) ;由大排到小
;此處改寫為 (nth 0 e1) 是 將點對 (點 . 圖元碼) 中的座標點.取出來排序.
(setq lst (vl-sort lst (function (lambda (e1 e2) (> (cadr (nth 0 e1)) (cadr (nth 0 e2)))))));此處改寫為 (nth 0 e1) 是 將點對 (點 . 圖元碼) 中的座標點.取出來排序.
)
;;; write-text 在圓心寫序號)
(defun write-text()
(setq w 0 )
(setvar "cmdecho" 0)
(repeat (length pt_list_sort)
(setq en_inx (nth w pt_list_sort)) ; 取出點對.
(setq en_nth_0 (car en_inx)) ;取出點對中座標點 ;.(其實以這個圓心點寫字就可以)
(setq en_nth_1 (cdr en_inx)) ;取出點對中圖元碼
(setq en_handent (handent en_nth_1)) ; 以圖元碼重新取得圖元ent
(setq en_handent_10 (cdr (assoc 10 (entget en_handent)))) ; 取得圓心, (會跟en_nth_0 一樣)
(command "text" "J" "M" en_handent_10 "3.5" "0" (1+ w) )
(setq w (1+ w))
)
(setvar "cmdecho" 1)
(princ)
)
;刪除寫出的文字
(defun c:ee()
(setq ss (ssget '((0 . "TEXT"))))
(command "erase" ss "")
(princ)
)
(princ)
測試cad檔和 LISP檔.下載
載點1: https://db.tt/kuwBLEXn
載點2: https://app.box.com/s/71w05dd51tf9zqn84zke
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8024
威望值 : 1185
注冊日期 : 2009-06-03
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
shenhung哥,謝謝你,看來我又要好好消化一番了,然後看能不能套用到我寫的其他程式內
我是正在改良圖框內的頁碼跟檔號排序(之前寫好後是利用離選去順序跑)
我是正在改良圖框內的頁碼跟檔號排序(之前寫好後是利用離選去順序跑)
蔣秉澔- 初級會員
- 文章總數 : 211
年齡 : 47
來自 : 嘉義市
職業 : 大電力系統設計、製程、檢測
愛好 : 電腦相關,出遊踏青
個性 : 待人隨和,對事執著
使用年資 : 8年
使用版本 : 2011 Electrical,2014
積分 : 4
經驗值 : 5357
威望值 : 204
注冊日期 : 2013-08-31
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
如果樓主的想法是為了圖框的圖號順序的話,我是建立一個帶屬性(編號)的圖框,利用功能變數將編號指定到"CTAB"也就是配置名稱。如此一來圖框的屬性(編號)就會跟著配置名稱跑。進階的方式則是再搭配圖紙集,則圖名,圖目錄也會像word一樣可關連,連動。圖紙集的 路份可以參者蘋果爸的教學。
Atsai- 中級會員
- 文章總數 : 167
年齡 : 49
來自 : 台中
職業 : 工程
愛好 : 看漫畫
個性 : 樂天
使用年資 : 10
使用版本 : 2010
AutoCAD基礎篇等級 : 10星級
積分 : 8
經驗值 : 5882
威望值 : 524
注冊日期 : 2012-04-06
回復: [討論]lisp--vl-sort與lambda這2個函數的用法
不好意思!剛好在這裡看到順便請教,(setq a1 '(0,0).........,a1後的 ' 所代表的意思是什麼?謝謝!!
CHR- 一般會員
- 文章總數 : 15
年齡 : 37
來自 : 台北
職業 : 室內設計
愛好 : 古典音樂
個性 : 溫吞慢郎
使用年資 : 10
使用版本 : 2010
經驗值 : 3800
威望值 : 0
注冊日期 : 2014-07-11
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章