AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~
[討論]讀取X座標並組成一個list及append使用 Oo-2-110 [討論]讀取X座標並組成一個list及append使用 Ia15010 [討論]讀取X座標並組成一個list及append使用 Ziao1510 [討論]讀取X座標並組成一個list及append使用 BPl3tjj [討論]讀取X座標並組成一個list及append使用 Uos15010 [討論]讀取X座標並組成一個list及append使用 Uos15011

[討論]讀取X座標並組成一個list及append使用

向下

[討論]讀取X座標並組成一個list及append使用 Empty [討論]讀取X座標並組成一個list及append使用

發表 由 immortal20092 于 2019-02-17, 15:24

各位先進你好,小弟開始學習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)
)
immortal20092
immortal20092
一般會員
一般會員

文章總數 : 4
年齡 : 27
來自 : 台南
職業 : 土木
愛好 : 桌球
個性 : 好相處
使用年資 : 5
使用版本 : 2016
經驗值 : 310
威望值 : 6
注冊日期 : 2018-08-13
男 天秤座 羊

回頂端 向下

[討論]讀取X座標並組成一個list及append使用 Empty 回復: [討論]讀取X座標並組成一個list及append使用

發表 由 naruto018 于 2019-02-17, 17:07

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
naruto018
中級會員
中級會員

文章總數 : 147
年齡 : 27
來自 : 高雄
職業 : 學習中(CAD,Revit,Excel VBA)
愛好 : 當個懶熊
個性 : 內向
使用年資 : 新手
使用版本 : 2015
AutoCAD基礎篇等級 : 10星級
積分 : 5
經驗值 : 1902
威望值 : 299
注冊日期 : 2016-11-29
藍鵲726號
男 摩羯座 羊

回頂端 向下

回頂端


 
這個論壇的權限:
無法 在這個版面回復文章
[討論]讀取X座標並組成一個list及append使用 Uos15011 [討論]讀取X座標並組成一個list及append使用 Uos15010 [討論]讀取X座標並組成一個list及append使用 BPl3tjj [討論]讀取X座標並組成一個list及append使用 Ziao1510 [討論]讀取X座標並組成一個list及append使用 Ia15010 [討論]讀取X座標並組成一個list及append使用 Oo-2-110