[討論]讀取X座標並組成一個list及append使用
2 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
[討論]讀取X座標並組成一個list及append使用
各位先進你好,小弟開始學習lisp約1個月,目前還在嘗試寫一些簡單的指令,目前遇到一個問題
以下分為一主程式及副程式,主程式用來將該聚合線的各端座標取出,並利用append將其組合成一個list
eg. (10 point1X值座標 point1Y值座標 10 point2X值座標 point2Y值座標.....)
副程式將其各點的X值座標取出,並讓其比其最大或最小值
目前程式調試發現主程式應無太大的問題,但跑副程式卻只能跑出1次,而不會循環,不知道問題出在哪邊,因為寫法是一模一樣的
會一直出現 "損壞的引數類型:lisp"
即程式中紅色的代碼位置
在寫法上可能多了很多冗贅語法,可能有其他本來就有寫好的內建語法,暫時先試著寫寫看,再麻煩各位指正了
(defun C:Ee()
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setvar "CMDECHO" 1)
;(setq pt (getpoint "\n選擇插入點:"))
;(setq el (getreal "\n輸入底部高程:"))
(setq ss (ssget ":L" (list (cons 0 "LWPOLYLINE"))))
(setq ii 0)
;;;
(setq cc (sslength ss))
(setq i 1 A nil)
(repeat cc
(setq co_name (ssname ss ii))
(setq co_data (entget co_name))
(setq co (length (entget co_name)))
(while (< i co)
(if (< i co)
(progn
(setq d10 (nth i (entget co_name)))
(if (= (car d10) 10)
(progn
(setq A (append A d10));A為所有端點之XYZ集合
)
)
)
)
(setq i (1+ i))
)
(setq i 1);i r 重置
)
;;;
(findmax-x)
;(command "TEXT" "MC" pt h 0 (strcat "el"))
(setvar "OSMODE" 4263)
(setvar "CMDECHO" 1)
)
;;;以下為副程式
(defun findmax-x()
(setq ptx nil)
(repeat cc
(setq coX (length A))
(while (< i (/ coX 3))
(if (< i co)
(progn
(setq ci (+ 1 (* 3 (- i 1))))
(setq XX1 (nth ci A));從A取得其座標表列
(setq ptX (append ptX XX1 ));X為所有端點之X集合
(setq ptxmax (MAX ptX))
)
)
(setq i (1+ i))
)
(setq i 1);i r 重置
)
(setq ii 0)
)
以下分為一主程式及副程式,主程式用來將該聚合線的各端座標取出,並利用append將其組合成一個list
eg. (10 point1X值座標 point1Y值座標 10 point2X值座標 point2Y值座標.....)
副程式將其各點的X值座標取出,並讓其比其最大或最小值
目前程式調試發現主程式應無太大的問題,但跑副程式卻只能跑出1次,而不會循環,不知道問題出在哪邊,因為寫法是一模一樣的
會一直出現 "損壞的引數類型:lisp"
即程式中紅色的代碼位置
在寫法上可能多了很多冗贅語法,可能有其他本來就有寫好的內建語法,暫時先試著寫寫看,再麻煩各位指正了
(defun C:Ee()
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setvar "CMDECHO" 1)
;(setq pt (getpoint "\n選擇插入點:"))
;(setq el (getreal "\n輸入底部高程:"))
(setq ss (ssget ":L" (list (cons 0 "LWPOLYLINE"))))
(setq ii 0)
;;;
(setq cc (sslength ss))
(setq i 1 A nil)
(repeat cc
(setq co_name (ssname ss ii))
(setq co_data (entget co_name))
(setq co (length (entget co_name)))
(while (< i co)
(if (< i co)
(progn
(setq d10 (nth i (entget co_name)))
(if (= (car d10) 10)
(progn
(setq A (append A d10));A為所有端點之XYZ集合
)
)
)
)
(setq i (1+ i))
)
(setq i 1);i r 重置
)
;;;
(findmax-x)
;(command "TEXT" "MC" pt h 0 (strcat "el"))
(setvar "OSMODE" 4263)
(setvar "CMDECHO" 1)
)
;;;以下為副程式
(defun findmax-x()
(setq ptx nil)
(repeat cc
(setq coX (length A))
(while (< i (/ coX 3))
(if (< i co)
(progn
(setq ci (+ 1 (* 3 (- i 1))))
(setq XX1 (nth ci A));從A取得其座標表列
(setq ptX (append ptX XX1 ));X為所有端點之X集合
(setq ptxmax (MAX ptX))
)
)
(setq i (1+ i))
)
(setq i 1);i r 重置
)
(setq ii 0)
)
immortal20092- 一般會員
- 文章總數 : 9
年齡 : 33
來自 : 台南
職業 : 土木
愛好 : 桌球
個性 : 好相處
使用年資 : 5
使用版本 : 2016
經驗值 : 2359
威望值 : 6
注冊日期 : 2018-08-13
回復: [討論]讀取X座標並組成一個list及append使用
immortal20092 寫到:各位先進你好,小弟開始學習lisp約1個月,目前還在嘗試寫一些簡單的指令,目前遇到一個問題
以下分為一主程式及副程式,主程式用來將該聚合線的各端座標取出,並利用append將其組合成一個list
eg. (10 point1X值座標 point1Y值座標 10 point2X值座標 point2Y值座標.....)
副程式將其各點的X值座標取出,並讓其比其最大或最小值
目前程式調試發現主程式應無太大的問題,但跑副程式卻只能跑出1次,而不會循環,不知道問題出在哪邊,因為寫法是一模一樣的
會一直出現 "損壞的引數類型:lisp"
即程式中紅色的代碼位置
在寫法上可能多了很多冗贅語法,可能有其他本來就有寫好的內建語法,暫時先試著寫寫看,再麻煩各位指正了
(defun C:Ee()
....
(setq ci (+ 1 (* 3 (- i 1))))
(setq XX1 (nth ci A));從A取得其座標表列
(setq ptX (append ptX XX1 ));X為所有端點之X集合
(setq ptxmax (MAX ptX))
...
)
紅色那段改成
- 代碼:
(setq ptX (append ptX (list XX1)))
- 代碼:
(setq ptxmax (apply 'MAX ptX))
因為不清楚你要做什麼
我稍微寫個一個聚合線座標範例,給你參考
- 代碼:
(defun tt( / lw p-list x-list x-max)
(setq lw (entget(car(entsel "\n選取一個聚合線:"))))
;;點列表
(setq p-list (mapcar 'cdr
(vl-remove-if-not
'(lambda (x) (= 10 (car x)))
lw)
))
;;X列表
(setq x-list (mapcar 'car p-list))
;;X最大
(setq x-max (apply 'MAX x-list))
;;打印出來
(princ "\n點列表:")
(princ p-list)
(princ "\nX列表:")
(princ x-list)
(princ "\nX最大:")
(princ x-max)
(princ)
);_結束
naruto018- 中級會員
- 文章總數 : 226
年齡 : 32
來自 : 高雄
職業 : 學習中(CAD,Revit,Excel VBA)
愛好 : 當個懶熊
個性 : 內向
使用年資 : 新手
使用版本 : 2015
AutoCAD基礎篇等級 : 10星級
積分 : 5
經驗值 : 4542
威望值 : 564
注冊日期 : 2016-11-29
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章