[已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
4 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論 :: 已解決主題精華區
第1頁(共1頁)
[已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
(defun C:liuif(/ p1 p2 p3 p4 p5 h1 h2 w1 m1 m2 x1 x2 x3 l1 l2 l3 l4 l5 l6 l7 l8 z1 z2 r1 r2)
(setvar "cmdecho" 0) (這兩個不是設定鎖點開關的嗎?)
(setvar "blipmode" 0) (怎麼我設0了還會被其它物件點影嚮)
(setq p1 (getpoint "\n請點選基準點"))
(setq h2 (getreal "\n請輸入石材厚度(CM):"))
(setq h1 (* h2 10))
(setq w1 (* h1 3))
(setq p2 (polar p1 0 w1))
(setq p3 (polar p1 (* pi 0.5) h1))
(setq p4 (polar p3 0 w1))
(setq m1 (polar p1 (* pi 0.5) (/ h1 2)))
(setq m2 (polar p3 0 (/ w1 2)))
(setq p5 (polar m1 pi (+ h1 h1)))
(initget "1 2 3")
(setq type0 (getkword "\n請輸入加工型式:一般(1)、背切(2)、背定厚(3)"))
(if (= type0 nil)(setq type0 "1"))
(cond ((= type0 "1") (command "line" p2 p1 "")
(command "line" p1 p3 "")(setq z1(entlast))
(command "line" p3 p4 "")(setq z2(entlast))
(setq l1 "一般")(princ z1)(princ z2)
)
((= type0 "2") (setq x1 (polar p1 0 (- h1 2)))
(setq x2 (polar p3 (* pi 1.5) 2))
(command "line" x2 p3 "")
(command "line" p4 p3 "")
(command "line" x2 x1 "")
(command "line" x1 p2 "")
(setq l1 "背切45°")
)
((= type0 "3") (setq x1 (polar p1 0 (+ h1 5)))
(setq x2 (polar p1 (* pi 0.5) 2))
(setq x3 (polar x2 0 (+ h1 5)))
(command "line" x1 x3 "")
(command "line" x3 x2 "")
(command "line" x2 p3 "")(setq z1(entlast))
(command "line" p4 p3 "")(setq z2(entlast))
(command "line" p2 x1 "")
(setq l1 "背定厚")
))
(initget "1 2 3")
(setq type0 (getkword "\n請輸倒角型式:一般(1)、倒角(2)、倒圓角(3)"))
(if (= type0 nil)(setq type0 "1"))
(cond ((= type0 "1") (command "dimlinear" p2 p4 p5)
(setq l3 "一般")
(setq l7 0)
)
((= type0 "2") (setq r1 (getreal "\n請輸入小面倒角距離"))
(setq r2 (getreal "\n請輸入表面倒角距離"))
(command "chamfer" "d" r1 r2)
(command "chamfer" z1 z2)
(command "dimlinear" p2 p4 p5)
(setq l3 "倒角")
)
((= type0 "3") (setq r1 (getreal "\n請輸入圓角半徑"))
(command "fillet" "r" r1 "") (fillet chamfer→ 不太會用…翻書也沒看到詳細用法) (command "fillet" z1 z2 ) (有勞會的大大教一下>"<)
(command "dimlinear" p2 p4 p5)
(setq l3 "倒圓角") ))
(if (>= h1 200)
(setq l2 "mm")
(setq l2 "cm")
)
(setq l4 (fix (/ h1 10)))
(princ "\n ")
(princ "\n ")
(princ "\n████████████████")
(princ "\n███石材厚度█████:")(princ l4)(princ l2)
(princ "\n██石材背面加工██:")(princ l1)
(princ "\n█石材小面角加工█:")(princ l3)(princ l7)(princ " ")(princ l8)(princ "cm")
(princ "\n████████████████")
(prin1))
--------------------------------------------------------------------------------------------------------
不太會po問題,請大大別見怪…紅字橘字的是我想問的地方謝謝
(setvar "cmdecho" 0) (這兩個不是設定鎖點開關的嗎?)
(setvar "blipmode" 0) (怎麼我設0了還會被其它物件點影嚮)
(setq p1 (getpoint "\n請點選基準點"))
(setq h2 (getreal "\n請輸入石材厚度(CM):"))
(setq h1 (* h2 10))
(setq w1 (* h1 3))
(setq p2 (polar p1 0 w1))
(setq p3 (polar p1 (* pi 0.5) h1))
(setq p4 (polar p3 0 w1))
(setq m1 (polar p1 (* pi 0.5) (/ h1 2)))
(setq m2 (polar p3 0 (/ w1 2)))
(setq p5 (polar m1 pi (+ h1 h1)))
(initget "1 2 3")
(setq type0 (getkword "\n請輸入加工型式:一般(1)、背切(2)、背定厚(3)"))
(if (= type0 nil)(setq type0 "1"))
(cond ((= type0 "1") (command "line" p2 p1 "")
(command "line" p1 p3 "")(setq z1(entlast))
(command "line" p3 p4 "")(setq z2(entlast))
(setq l1 "一般")(princ z1)(princ z2)
)
((= type0 "2") (setq x1 (polar p1 0 (- h1 2)))
(setq x2 (polar p3 (* pi 1.5) 2))
(command "line" x2 p3 "")
(command "line" p4 p3 "")
(command "line" x2 x1 "")
(command "line" x1 p2 "")
(setq l1 "背切45°")
)
((= type0 "3") (setq x1 (polar p1 0 (+ h1 5)))
(setq x2 (polar p1 (* pi 0.5) 2))
(setq x3 (polar x2 0 (+ h1 5)))
(command "line" x1 x3 "")
(command "line" x3 x2 "")
(command "line" x2 p3 "")(setq z1(entlast))
(command "line" p4 p3 "")(setq z2(entlast))
(command "line" p2 x1 "")
(setq l1 "背定厚")
))
(initget "1 2 3")
(setq type0 (getkword "\n請輸倒角型式:一般(1)、倒角(2)、倒圓角(3)"))
(if (= type0 nil)(setq type0 "1"))
(cond ((= type0 "1") (command "dimlinear" p2 p4 p5)
(setq l3 "一般")
(setq l7 0)
)
((= type0 "2") (setq r1 (getreal "\n請輸入小面倒角距離"))
(setq r2 (getreal "\n請輸入表面倒角距離"))
(command "chamfer" "d" r1 r2)
(command "chamfer" z1 z2)
(command "dimlinear" p2 p4 p5)
(setq l3 "倒角")
)
((= type0 "3") (setq r1 (getreal "\n請輸入圓角半徑"))
(command "fillet" "r" r1 "") (fillet chamfer→ 不太會用…翻書也沒看到詳細用法) (command "fillet" z1 z2 ) (有勞會的大大教一下>"<)
(command "dimlinear" p2 p4 p5)
(setq l3 "倒圓角") ))
(if (>= h1 200)
(setq l2 "mm")
(setq l2 "cm")
)
(setq l4 (fix (/ h1 10)))
(princ "\n ")
(princ "\n ")
(princ "\n████████████████")
(princ "\n███石材厚度█████:")(princ l4)(princ l2)
(princ "\n██石材背面加工██:")(princ l1)
(princ "\n█石材小面角加工█:")(princ l3)(princ l7)(princ " ")(princ l8)(princ "cm")
(princ "\n████████████████")
(prin1))
--------------------------------------------------------------------------------------------------------
不太會po問題,請大大別見怪…紅字橘字的是我想問的地方謝謝
liuif1018 在 2010-10-18, 15:44 作了第 1 次修改
liuif1018- 初級會員
- 文章總數 : 31
年齡 : 42
來自 : 花蓮
職業 : 石材建築
愛好 : 公仔
個性 : 天真無邪開朗活潑
使用年資 : 半年
使用版本 : 2011
積分 : 1
經驗值 : 5388
威望值 : 9
注冊日期 : 2010-06-17
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
控制物件鎖點的是osmode變數,blipmode是控制亮點顯示與否,cmdecho是控制在執行 AutoLISP 指令函數時,是否對提示和輸入進行回應。
建議你控制物件鎖點最好的寫法是如下
(setq osm (getvar "osmode"));這一行請放置於第三行
(setvar "osmode" (+ 16384 osm));暫時關閉物件鎖點(請放至於會圖指令前)
....
(setvar "osmode" osm);恢復初始設定值
這樣的寫法就如同按下F3功能鍵一樣,可以暫時將物件所點關閉,就算你中斷程式時你也可以按下F3將物件所點回復。
建議你控制物件鎖點最好的寫法是如下
(setq osm (getvar "osmode"));這一行請放置於第三行
(setvar "osmode" (+ 16384 osm));暫時關閉物件鎖點(請放至於會圖指令前)
....
(setvar "osmode" osm);恢復初始設定值
這樣的寫法就如同按下F3功能鍵一樣,可以暫時將物件所點關閉,就算你中斷程式時你也可以按下F3將物件所點回復。
Tiger&蘋果爸 寫到: 謝謝熱心回覆~< 積分 +1>
[公告]關於團隊成員的回文及貢獻
Tiger&蘋果爸 在 2010-10-17, 11:28 作了第 1 次修改 (原因 : 非常專業!)
張譽璋- 榮譽顧問
- 文章總數 : 304
年齡 : 54
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 7520
威望值 : 641
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
請問張老師,
暫時關閉物件鎖點
(setvar "osmode" (+ 16384 osm))
和
(setvar "osmode" 0)
有啥差別??
暫時關閉物件鎖點
(setvar "osmode" (+ 16384 osm))
和
(setvar "osmode" 0)
有啥差別??
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
這樣的寫法可以防止不正常中斷程式時,可以按下F3,將物件鎖點回復至程式執行前的設定狀態。
直接設定為0時,若中斷程式則物件鎖點會被清空,無法使用F3將設定值恢復。
直接設定為0時,若中斷程式則物件鎖點會被清空,無法使用F3將設定值恢復。
張譽璋- 榮譽顧問
- 文章總數 : 304
年齡 : 54
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 7520
威望值 : 641
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
感謝張老師的詳細解答。張譽璋 寫到:這樣的寫法可以防止不正常中斷程式時,可以按下F3,將物件鎖點回復至程式執行前的設定狀態。
直接設定為0時,若中斷程式則物件鎖點會被清空,無法使用F3將設定值恢復。
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
光看書自已果然還是會有障礙…這時真的就很需要這裡的
各位前輩老師們的指導了…感謝張老師^^
各位前輩老師們的指導了…感謝張老師^^
liuif1018- 初級會員
- 文章總數 : 31
年齡 : 42
來自 : 花蓮
職業 : 石材建築
愛好 : 公仔
個性 : 天真無邪開朗活潑
使用年資 : 半年
使用版本 : 2011
積分 : 1
經驗值 : 5388
威望值 : 9
注冊日期 : 2010-06-17
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
張譽璋 寫到:
建議你控制物件鎖點最好的寫法是如下
(setq osm (getvar "osmode"));這一行請放置於第三行
(setvar "osmode" (+ 16384 osm));暫時關閉物件鎖點(請放至於會圖指令前)
....
(setvar "osmode" osm);恢復初始設定值
張老師教的這個方法真的好用~~
讓我寫的lisp不再會出現「靈動現像」 (明明就有給坐標點,卻跑到件物鎖點上)
可是後來發現好像有點點小缺點…
那就是要是物件鎖點本來就沒開啟的話…
程式就會出現錯誤如下:
錯誤: 已拒絕 AutoCAD 變數設定: "osmode" 48127
如果ㄚ在程式裡加上紅色這行就不會有問題了!
(defun C:textf3()
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(setq osm (getvar "osmode")) -設定osm去抓"osmode"系設變數的值
(setq osm 15359)-將osm這個值固定為 15359
(princ osm) -在銀幕上列出osm的值。會出現1535915359(為什麼我就不知了)
(setvar "osmode" (+ 16384 osm))-將系統變數設定為 osm加上16384
(setq osm2 (get var "osmode"))(princ osm2)-列出數值會是3174331743(也是不知為什麼會兩次)
(setvar "osmode" osm) -將系統變數設回osm的值(就是一開始的15359)
)
程式原理大約是這樣:
鎖點功能開啟的話「osm」這函數就會是15359
鎖點功能關閉的話「osm」這函數就會是31743
如果一開始run程式時F3鎖點功能有開啟的話,
15359會加上16384就等於31743
但是一開始run程式時F3鎖點沒開啟的話,
31743會加上16384就等於48127
此時我們設定的osm系統變數不會接受48127這個數值,而出現錯誤!
所以在(setq osm (getvar "osmode"))下一行加上
(setq osm 15359)
就不會讓osm系統變數加到48127這個數值了!!
liuif1018- 初級會員
- 文章總數 : 31
年齡 : 42
來自 : 花蓮
職業 : 石材建築
愛好 : 公仔
個性 : 天真無邪開朗活潑
使用年資 : 半年
使用版本 : 2011
積分 : 1
經驗值 : 5388
威望值 : 9
注冊日期 : 2010-06-17
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
你必須將osm提列為區域變數,以免osm的值被累加
寫法如下:
(defun c:textf3 (/ osm)
區域變數是指程式執行完後比須清除之變數。
寫法如下:
(defun c:textf3 (/ osm)
區域變數是指程式執行完後比須清除之變數。
張譽璋 在 2010-10-21, 12:31 作了第 1 次修改
張譽璋- 榮譽顧問
- 文章總數 : 304
年齡 : 54
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 7520
威望值 : 641
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
哦~我懂您的意思了
設定完區域變數就是不管osm起始值是15359還是31743
程式run到(setvar "osmode" (+ 16384 osm))這行時
得到的值都還是31743對吧!
但是剛剛又試了一次好像還是不行…
是將 (defun C:textf3 (/ osm)) 加入紅色字部分
還是將 (define C:textf3 (/ osm)) 還是修改成這樣(可是這樣整個程式就不能跑了…)
不好意思!我初學lisp要再麻煩張老師指導一下了
設定完區域變數就是不管osm起始值是15359還是31743
程式run到(setvar "osmode" (+ 16384 osm))這行時
得到的值都還是31743對吧!
但是剛剛又試了一次好像還是不行…
是將 (defun C:textf3 (/ osm)) 加入紅色字部分
還是將 (define C:textf3 (/ osm)) 還是修改成這樣(可是這樣整個程式就不能跑了…)
不好意思!我初學lisp要再麻煩張老師指導一下了
liuif1018- 初級會員
- 文章總數 : 31
年齡 : 42
來自 : 花蓮
職業 : 石材建築
愛好 : 公仔
個性 : 天真無邪開朗活潑
使用年資 : 半年
使用版本 : 2011
積分 : 1
經驗值 : 5388
威望值 : 9
注冊日期 : 2010-06-17
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
這是我打錯了,我修改一下。
張譽璋- 榮譽顧問
- 文章總數 : 304
年齡 : 54
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 7520
威望值 : 641
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
回復: [已決解]lisp 編寫問題~有勞大師們為我解答一下>"<
不好意思,我有兩個問題想請問一下..
1.如果變數沒設定成區域變數的話,是否稱為全域變數?
2.可以將所有全域變數名稱裝進一個LIST裡面嗎?
我想弄一個副程式來看看程式有沒有忘記設定區域變數的~"~
1.如果變數沒設定成區域變數的話,是否稱為全域變數?
2.可以將所有全域變數名稱裝進一個LIST裡面嗎?
我想弄一個副程式來看看程式有沒有忘記設定區域變數的~"~
RyanGuo- 初級會員
- 文章總數 : 206
年齡 : 41
來自 : 屏東
職業 : 機械繪圖
愛好 : 玩遊戲
個性 : 嗚嗚男
使用年資 : 1年多
使用版本 : 2011
積分 : 3
經驗值 : 5561
威望值 : 316
注冊日期 : 2013-04-18
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論 :: 已解決主題精華區
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章