請教一下關於 COND 的用法
2 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
請教一下關於 COND 的用法
請教各位先輩我的程式中
SelSub "A"
SelSub "B"
SelSub "C"
三組裡面的組成有共同的變數 X Y Z 但三組我所指定的值是不同的
(setq x 10)
(setq y 10)
(setq z 20)
三組裡面有共同的變數定義如下
我該如何將他們切割出來 放在COND外面或者其他地方只要想用這一段的定義就可以直接從SelSub "A" SelSub "B" SelSub "C" 把下面虛線內這一大段的參數拉來用
因為Cond 選了A就會跑A段裡面的程式碼 選B只會跑B裡面的 我想要把共用的部分移出該如何連接
謝謝各位
-----------------
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
-----------------
;(initget "A B C")
;(setq SelSub (getkword "\n 輸入A 輸入B 輸入C"))
(cond
((eq SelSub "A")
(setq x 10)
(setq y 10)
(setq z 20)
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
(command "line" p1 p2 p3 p4 p5"")
)
((eq SelSub "B")
(setq x 20)
(setq y 30)
(setq z 40)
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
(command "line" p1 p2 p3 p4 p5"")
)
((eq SelSub "C")
(setq x -28)
(setq y -38)
(setq z -40)
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
(command "line" p1 p2 p3 p4 p5"")
)
)
SelSub "A"
SelSub "B"
SelSub "C"
三組裡面的組成有共同的變數 X Y Z 但三組我所指定的值是不同的
(setq x 10)
(setq y 10)
(setq z 20)
三組裡面有共同的變數定義如下
我該如何將他們切割出來 放在COND外面或者其他地方只要想用這一段的定義就可以直接從SelSub "A" SelSub "B" SelSub "C" 把下面虛線內這一大段的參數拉來用
因為Cond 選了A就會跑A段裡面的程式碼 選B只會跑B裡面的 我想要把共用的部分移出該如何連接
謝謝各位
-----------------
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
-----------------
;(initget "A B C")
;(setq SelSub (getkword "\n 輸入A 輸入B 輸入C"))
(cond
((eq SelSub "A")
(setq x 10)
(setq y 10)
(setq z 20)
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
(command "line" p1 p2 p3 p4 p5"")
)
((eq SelSub "B")
(setq x 20)
(setq y 30)
(setq z 40)
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
(command "line" p1 p2 p3 p4 p5"")
)
((eq SelSub "C")
(setq x -28)
(setq y -38)
(setq z -40)
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
(command "line" p1 p2 p3 p4 p5"")
)
)
閃電俠- 一般會員
- 文章總數 : 42
年齡 : 41
來自 : 新竹
職業 : Package Design
愛好 : 玩電腦
個性 : 喜愛思考
使用年資 : N+5years
使用版本 : 初學
經驗值 : 1533
威望值 : 20
注冊日期 : 2021-04-19
回復: 請教一下關於 COND 的用法
;cond 單獨的做數值設定就好.
(cond
((eq SelSub "A")(setq x 10 y 10 z 20))
((eq SelSub "B")(setq x 20 y 30 z 40))
((eq SelSub "C")(setq x -28 y -38 z -40))
)
(pt-cal) ; <--執行共用副程式
(command "line" p1 p2 p3 p4 p5"") ;共同的部份也可以提出來.~
;;=============================================================
;;共用副程式
(defun pt-cal ()
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
)
(cond
((eq SelSub "A")(setq x 10 y 10 z 20))
((eq SelSub "B")(setq x 20 y 30 z 40))
((eq SelSub "C")(setq x -28 y -38 z -40))
)
(pt-cal) ; <--執行共用副程式
(command "line" p1 p2 p3 p4 p5"") ;共同的部份也可以提出來.~
;;=============================================================
;;共用副程式
(defun pt-cal ()
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
)
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8077
威望值 : 1188
注冊日期 : 2009-06-03
Tiger&蘋果爸 and 閃電俠 like this post
回復: 請教一下關於 COND 的用法
請教一下如果共用副程式
若有3組的話該怎麼 描述比較洽當
cond可以在做一層嗎?
(cond
((eq SelSub "A")(command XX))
((eq SelSub "B")(Command YY))
((eq SelSub "C")(Command ZZ))
)
(cond
((eq SelSub "XX")(setq x 10 y 10 z 20))
((eq SelSub "YY")(setq x 20 y 30 z 40))
((eq SelSub "ZZ")(setq x -28 y -38 z -40))
)
(pt-cal) ; <--執行共用副程式
(command "line" p1 p2 p3 p4 p5"") ;共同的部份也可以提出來.~
;;=============================================================
;;共用副程式
(defun pt-cal ()
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
)[/quote]
若有3組的話該怎麼 描述比較洽當
cond可以在做一層嗎?
(cond
((eq SelSub "A")(command XX))
((eq SelSub "B")(Command YY))
((eq SelSub "C")(Command ZZ))
)
(cond
((eq SelSub "XX")(setq x 10 y 10 z 20))
((eq SelSub "YY")(setq x 20 y 30 z 40))
((eq SelSub "ZZ")(setq x -28 y -38 z -40))
)
(pt-cal) ; <--執行共用副程式
(command "line" p1 p2 p3 p4 p5"") ;共同的部份也可以提出來.~
;;=============================================================
;;共用副程式
(defun pt-cal ()
(setq ll (+ L1 x))
(setq ww (+ W1 y))
(setq hh (+ H1 z))
(setq p2(list (+ (car p1) ll) (cadr p1))) ;
(setq p3(list (+ (car p2) ww) (cadr p2))) ;
(setq p4(list (+ (car p3) ll) (cadr p3)));
(setq p5(list (+ (car p4) (- ww 10)) (cadr p4))) ;
)[/quote]
閃電俠- 一般會員
- 文章總數 : 42
年齡 : 41
來自 : 新竹
職業 : Package Design
愛好 : 玩電腦
個性 : 喜愛思考
使用年資 : N+5years
使用版本 : 初學
經驗值 : 1533
威望值 : 20
注冊日期 : 2021-04-19
回復: 請教一下關於 COND 的用法
你能不能把完整LSP列出來.? 另外三組副程式..是什麼.我不太了解你的意思.~
cond 是可以做很多層.沒問題.~!!
cond 是可以做很多層.沒問題.~!!
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8077
威望值 : 1188
注冊日期 : 2009-06-03
回復: 請教一下關於 COND 的用法
感謝回復
程式如下
我要做的事情是選擇ABC三種繪圖的方式
而我的各個點位需要經過L1 W1 R1 的數值來推演相對點的位置(這些點位都是共用的)
而L1 W1 R1 需要輸入我要的數值 L W R 分別加上 三組 X Y Z 來產生
我想要做的就是先選A B C 在選S M L 再輸入L W R 最後繪圖
(defun c:q1( / oldlayer oldsnap oldpick SelSub) ;|程式開始-保存原有系統變數|;
(setq oldlayer (getvar "clayer")) ;目前圖層)
(setq oldsnap (getvar "osmode")) ;(儲存目前的抓點設定)
(setq oldpick (getvar "pickbox")) ;(儲存目前的選取框大小值)
(initget "A B C");ABC是繪圖的三種方式
(setq SelSub (getkword "\n 選擇程式:[A/B/C]"))
(setq p1 (getpoint "Enter Left/Low Point:選擇起始點"))
(setq L(getreal "輸入長:"))
(setq W (getreal "輸入寬:"))
(setq R (getreal "輸入半徑:"))
;副程式 三種SML是相關參數
(initget "S M L")
(setq SelSub (getkword "\n 選擇程式:[S/M/L]"))
(cond
((eq SelSub "S")(setq x 10 y 5 z 15))
((eq SelSub "M")(setq x 10 y 5 z 15))
((eq SelSub "L")(setq x 10 y 5 z 15))
)
;隨著選擇參數 S M L產生出 L1 W1 R1 各種對應數值產生我需要的L1 W1 R1 的相對位置
(setq L1 (+ L x))
(setq W1 (+ W y))
(setq R1 (+ R z))
(setq p2(list (+(car p1)L1) (cadr p1)))
(setq p3(list (car p2) (+(cadr p2)W1)))
(setq p4(list (car p1) (+(cadr p1)W1)))
(setq p5(list (car p2) (+(cadr p1)(/ W1 2))))
(setq p6(list (car p1) (+(cadr p1)(/ W1 2))))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(cond
((eq SelSub "A")
;執行程式A程式碼畫出方形+圓形
(command "LAYER" "M" "0" "");依照0圖層畫線
(command "line" p1 p2 p3 p4 "c");劃出長板四方
(command "_circle" p5 R1 "");以p2 p3 中心點為圓心劃出圓形
(princ "執行程式A程式碼")
);_end_SubA
((eq SelSub "B")
;執行程式B程式碼
(command "LAYER" "M" "1" "");依照1圖層畫線
(command "line" p1 p5 p4 "c");劃出三角形
(command "_circle" p5 R1 "");以p5 中心點為圓心劃出圓形
(princ "執行程式B程式碼")
);_end_SubB
((eq SelSub "C")
;執行程式C程式碼
(command "LAYER" "M" "1" "");依照1圖層畫線
(command "line" p1 p3 p2 p4 "c");劃出三角形
(command "_circle" p6 R1 "");以p5 中心點為圓心劃出圓形
(princ "執行程式C程式碼")
);_end_SubC
);_end_cond
;;;共同結尾程式碼
;(princ)
;);
(setvar "clayer" oldlayer)
(setvar "osmode" oldsnap)
(setvar "pickbox" oldpick)
(command "(gc)" )
;|程式結束-恢復原有系統變數|;
(princ)
)
程式如下
我要做的事情是選擇ABC三種繪圖的方式
而我的各個點位需要經過L1 W1 R1 的數值來推演相對點的位置(這些點位都是共用的)
而L1 W1 R1 需要輸入我要的數值 L W R 分別加上 三組 X Y Z 來產生
我想要做的就是先選A B C 在選S M L 再輸入L W R 最後繪圖
(defun c:q1( / oldlayer oldsnap oldpick SelSub) ;|程式開始-保存原有系統變數|;
(setq oldlayer (getvar "clayer")) ;目前圖層)
(setq oldsnap (getvar "osmode")) ;(儲存目前的抓點設定)
(setq oldpick (getvar "pickbox")) ;(儲存目前的選取框大小值)
(initget "A B C");ABC是繪圖的三種方式
(setq SelSub (getkword "\n 選擇程式:[A/B/C]"))
(setq p1 (getpoint "Enter Left/Low Point:選擇起始點"))
(setq L(getreal "輸入長:"))
(setq W (getreal "輸入寬:"))
(setq R (getreal "輸入半徑:"))
;副程式 三種SML是相關參數
(initget "S M L")
(setq SelSub (getkword "\n 選擇程式:[S/M/L]"))
(cond
((eq SelSub "S")(setq x 10 y 5 z 15))
((eq SelSub "M")(setq x 10 y 5 z 15))
((eq SelSub "L")(setq x 10 y 5 z 15))
)
;隨著選擇參數 S M L產生出 L1 W1 R1 各種對應數值產生我需要的L1 W1 R1 的相對位置
(setq L1 (+ L x))
(setq W1 (+ W y))
(setq R1 (+ R z))
(setq p2(list (+(car p1)L1) (cadr p1)))
(setq p3(list (car p2) (+(cadr p2)W1)))
(setq p4(list (car p1) (+(cadr p1)W1)))
(setq p5(list (car p2) (+(cadr p1)(/ W1 2))))
(setq p6(list (car p1) (+(cadr p1)(/ W1 2))))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(cond
((eq SelSub "A")
;執行程式A程式碼畫出方形+圓形
(command "LAYER" "M" "0" "");依照0圖層畫線
(command "line" p1 p2 p3 p4 "c");劃出長板四方
(command "_circle" p5 R1 "");以p2 p3 中心點為圓心劃出圓形
(princ "執行程式A程式碼")
);_end_SubA
((eq SelSub "B")
;執行程式B程式碼
(command "LAYER" "M" "1" "");依照1圖層畫線
(command "line" p1 p5 p4 "c");劃出三角形
(command "_circle" p5 R1 "");以p5 中心點為圓心劃出圓形
(princ "執行程式B程式碼")
);_end_SubB
((eq SelSub "C")
;執行程式C程式碼
(command "LAYER" "M" "1" "");依照1圖層畫線
(command "line" p1 p3 p2 p4 "c");劃出三角形
(command "_circle" p6 R1 "");以p5 中心點為圓心劃出圓形
(princ "執行程式C程式碼")
);_end_SubC
);_end_cond
;;;共同結尾程式碼
;(princ)
;);
(setvar "clayer" oldlayer)
(setvar "osmode" oldsnap)
(setvar "pickbox" oldpick)
(command "(gc)" )
;|程式結束-恢復原有系統變數|;
(princ)
)
閃電俠- 一般會員
- 文章總數 : 42
年齡 : 41
來自 : 新竹
職業 : Package Design
愛好 : 玩電腦
個性 : 喜愛思考
使用年資 : N+5years
使用版本 : 初學
經驗值 : 1533
威望值 : 20
注冊日期 : 2021-04-19
回復: 請教一下關於 COND 的用法
;副程式 三種SML是相關參數
(initget "S M L")
(setq SelSub1 (getkword "\n 選擇程式:[S/M/L]"))
; 變數名稱修改為 SelSub1 -因為跟上面A/B/C 的變數同名. 這理NG
(cond
((eq SelSub1 "S")(setq x 10 y 5 z 15))
((eq SelSub1 "M")(setq x 10 y 5 z 15))
((eq SelSub1 "L")(setq x 10 y 5 z 15))
)
(command "_circle" p5 R1 ) ;<== 取消最後的 "" 號
最後 (command "(gc)") 這個沒辦法執行
其餘執行起來沒什麼問題.~
;=================
q1.lsp 載點.
https://www.dropbox.com/s/bazx2b9uu2oq15l/q1.lsp?dl=0
(initget "S M L")
(setq SelSub1 (getkword "\n 選擇程式:[S/M/L]"))
; 變數名稱修改為 SelSub1 -因為跟上面A/B/C 的變數同名. 這理NG
(cond
((eq SelSub1 "S")(setq x 10 y 5 z 15))
((eq SelSub1 "M")(setq x 10 y 5 z 15))
((eq SelSub1 "L")(setq x 10 y 5 z 15))
)
(command "_circle" p5 R1 ) ;<== 取消最後的 "" 號
最後 (command "(gc)") 這個沒辦法執行
其餘執行起來沒什麼問題.~
;=================
q1.lsp 載點.
https://www.dropbox.com/s/bazx2b9uu2oq15l/q1.lsp?dl=0
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8077
威望值 : 1188
注冊日期 : 2009-06-03
Tiger&蘋果爸 likes this post
感謝回應
假如我的SML 每個都有三組參數要做選擇
先選SML
在選S1 S2 S2 或 M1 M2 M3 或 L1 L2 L3
我是否要再把Cond 往下一層寫
[quote="shenhung"];副程式 三種SML是相關參數
(initget "S M L")
(setq SelSub1 (getkword "\n 選擇程式:[S/M/L]"))
(cond
((eq SelSub1 "S")
(initget "S1 S2 S3")
(setq SelSub3 (getkword "\n 選擇程式:[S1/S2/S3]"))
(cond
((eq SelSub3 "S1")(setq x 10 y 5 z 15))
((eq SelSub3 "S2")(setq x 0 y 7 z9 ))
((eq SelSub3 "S2")(setq x 0 y 7 z9 ))
)
)
((eq SelSub1 "M")
(initget "M1 M2 M3")
(setq SelSub3 (getkword "\n 選擇程式:[M1/M2/M3]"))
(cond
((eq SelSub3 "M1")(setq x 20 y 15 z -15))
((eq SelSub3 "M2")(setq x 10 y 10 z 19 ))
((eq SelSub3 "M2")(setq x 30 y 7 z 29 ))
);依此類推
)
)
先選SML
在選S1 S2 S2 或 M1 M2 M3 或 L1 L2 L3
我是否要再把Cond 往下一層寫
[quote="shenhung"];副程式 三種SML是相關參數
(initget "S M L")
(setq SelSub1 (getkword "\n 選擇程式:[S/M/L]"))
(cond
((eq SelSub1 "S")
(initget "S1 S2 S3")
(setq SelSub3 (getkword "\n 選擇程式:[S1/S2/S3]"))
(cond
((eq SelSub3 "S1")(setq x 10 y 5 z 15))
((eq SelSub3 "S2")(setq x 0 y 7 z9 ))
((eq SelSub3 "S2")(setq x 0 y 7 z9 ))
)
)
((eq SelSub1 "M")
(initget "M1 M2 M3")
(setq SelSub3 (getkword "\n 選擇程式:[M1/M2/M3]"))
(cond
((eq SelSub3 "M1")(setq x 20 y 15 z -15))
((eq SelSub3 "M2")(setq x 10 y 10 z 19 ))
((eq SelSub3 "M2")(setq x 30 y 7 z 29 ))
);依此類推
)
)
閃電俠- 一般會員
- 文章總數 : 42
年齡 : 41
來自 : 新竹
職業 : Package Design
愛好 : 玩電腦
個性 : 喜愛思考
使用年資 : N+5years
使用版本 : 初學
經驗值 : 1533
威望值 : 20
注冊日期 : 2021-04-19
回復: 請教一下關於 COND 的用法
是的差不多就是這樣..這樣寫沒問題. 只是多層的設定.輸入會麻煩一點而已.!!
未來程式若改用對話框~!! 使用者操作起來.就容易很多了.
未來程式若改用對話框~!! 使用者操作起來.就容易很多了.
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8077
威望值 : 1188
注冊日期 : 2009-06-03
請教一下對話框的基本語法
請教一下前輩 對話框的基本語法
我只需要簡易型態的語法
其他的我會寫
感激不盡
我只需要簡易型態的語法
其他的我會寫
感激不盡
閃電俠- 一般會員
- 文章總數 : 42
年齡 : 41
來自 : 新竹
職業 : Package Design
愛好 : 玩電腦
個性 : 喜愛思考
使用年資 : N+5years
使用版本 : 初學
經驗值 : 1533
威望值 : 20
注冊日期 : 2021-04-19
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章