[討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
4 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
[討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
如標題
個人學習LISP並不是從正規管道學,而是自己看網路的零散資料自學的
程式上的編排與用法看起來並沒有很正規,就好比沒學過AutoCAD的人繪圖時不會管理圖層一樣
以前就自己寫過標註自動換dim圖層的程式,只是使用上並不是很方便
若在指令中途按esc,圖層就停留在dim
需要用到(R)旋轉的話也變得無法使用
這是我目前的程式,標註時自動換dim圖層
開始繪製前先讀取前次圖元的圖元碼,保存為(dli_001)與(dli_002)
再來開始繪製標註,輸入(command "DIMLINEAR"),後面則不打任何數值
再來進入while迴圈,若沒有繪製任何的圖元,就繼續執行(command pause)
若有標註出新的圖元,則結束迴圈
後面的程式則是一般的轉換圖層而已
目前此程式只能用在沒有任何圖元的新圖,若有繪製過任何的線與標註就無法使用此程式了
下面紅色標註是成功煥圖層,上面是失敗的
問題出在while後面的式子:(= dli_001 dli_002)
實際用!dli_001與!dli_002查是一樣的圖元碼,但程式判定(= dli_001 dli_002)卻是nil
本來以為程式判定圖元碼無法用於計算的語法,後來發現圖元碼只要有更新過,即使查是一樣的圖元碼程式判定就是nil
目前我只想到的解決方法就是將圖元碼換成純文字,這樣判定的話就不會有問題,程式就能繼續寫下去
但我所學的語法並沒有可以將圖元碼換成純文字的方法,沒辦法把程式寫完
以上,希望能幫忙解答
個人學習LISP並不是從正規管道學,而是自己看網路的零散資料自學的
程式上的編排與用法看起來並沒有很正規,就好比沒學過AutoCAD的人繪圖時不會管理圖層一樣
以前就自己寫過標註自動換dim圖層的程式,只是使用上並不是很方便
若在指令中途按esc,圖層就停留在dim
需要用到(R)旋轉的話也變得無法使用
- 代碼:
;●一般標註
(defun c:dli()
(allbylayer) ;圖層切換至0,顏色、線型、線粗為ByLayer
(cm0) ;關閉文字顯示
(command "-layer" "s" "dim" "") ;圖層切換至dim
(cm1) ;開啟文字顯示
(command "DIMLINEAR" pause pause pause) ;標註
(allbylayer) ;圖層切換至0,顏色、線型、線粗為ByLayer
(prin1))
這是我目前的程式,標註時自動換dim圖層
- 代碼:
;DIMLINEAR
(defun c:ts1()
(cm1) ;開啟文字顯示
(setq dli_001(entlast)) ;取得前次圖元資料
(setq dli_002 dli_001) ;(暫存)前次圖元資料
(command "DIMLINEAR") ;執行指令DIMLINEAR
(while (= dli_001 dli_002) ;while迴圈:圖元未更新則繼續執行指令,圖元更新則停止執行指令
(command pause) ;執行指令 空值
(setq dli_001(entlast)) ;取得前次圖元資料
)
(cm0) ;關閉文字顯示
(if (= (tblsearch "layer" "dim") nil) ;判定圖面是否有標註圖層
(command "layer" "n" "dim" "c" "1" "dim" "") ;執行指令layer,建立LIM圖層,顏色為1(紅色)
)
(setq
dli_003 (entget(entlast)) ;取得新繪製圖元資料
dli_004 (assoc 8 dli_003) ;取得群碼8資料(圖層)
dli_005 (cons 8 "dim") ;新群碼8資料(圖層)
dli_003 (subst dli_005 dli_004 dli_003) ;取代圖元資料
)
(entmod dli_003) ;更新圖面中新繪製圖元
(prompt "\n測試用指令完成")
(prin1))
開始繪製前先讀取前次圖元的圖元碼,保存為(dli_001)與(dli_002)
再來開始繪製標註,輸入(command "DIMLINEAR"),後面則不打任何數值
再來進入while迴圈,若沒有繪製任何的圖元,就繼續執行(command pause)
若有標註出新的圖元,則結束迴圈
後面的程式則是一般的轉換圖層而已
目前此程式只能用在沒有任何圖元的新圖,若有繪製過任何的線與標註就無法使用此程式了
下面紅色標註是成功煥圖層,上面是失敗的
問題出在while後面的式子:(= dli_001 dli_002)
實際用!dli_001與!dli_002查是一樣的圖元碼,但程式判定(= dli_001 dli_002)卻是nil
本來以為程式判定圖元碼無法用於計算的語法,後來發現圖元碼只要有更新過,即使查是一樣的圖元碼程式判定就是nil
目前我只想到的解決方法就是將圖元碼換成純文字,這樣判定的話就不會有問題,程式就能繼續寫下去
但我所學的語法並沒有可以將圖元碼換成純文字的方法,沒辦法把程式寫完
以上,希望能幫忙解答
j2832383- 一般會員
- 文章總數 : 11
年齡 : 34
來自 : 台南市
職業 : 模具設計
愛好 : 電腦休閒
個性 : 沉默/不擅於溝通
使用年資 : 學校使用8年,工作使用15個月
使用版本 : 2012
經驗值 : 4003
威望值 : 12
注冊日期 : 2014-02-09
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
問題應該是出在樓主想用迴圈連續標註.~!! 一般不會這樣做..
AUTOCAD也是一次標一個.再ENTER 做連續標註的動作.
以下是跟據你的須求.寫的一個參考範例.~~
在標註前做一個換圖層的動作.
LISP載點.
https://db.tt/l8k4p5KC
AUTOCAD也是一次標一個.再ENTER 做連續標註的動作.
以下是跟據你的須求.寫的一個參考範例.~~
在標註前做一個換圖層的動作.
- 代碼:
;;錯誤處理副程式.
(defun dim_err(st)
(setvar "clayer" clayer)
(setq *error* old_err)
)
;;主LISP
(defun c:dli(/ clayer)
(setq old_err *error* *error* dim_err)
(setq clayer (getvar "clayer"))
(setvar "cmdecho" 0)
(if (= (tblsearch "layer" "DIM") nil)
(command "-layer" "m" "DIM" "c" "1" "" "")
(setvar "clayer" "DIM")
)
(command "dimlinear")
(setvar "clayer" clayer)
(setvar "cmdecho" 1)
(setq *error* old_err)
(princ)
)
LISP載點.
https://db.tt/l8k4p5KC
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8075
威望值 : 1188
注冊日期 : 2009-06-03
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
竟然這麼簡單,我又學到一招了,謝謝shenhung大哥指導
____________________________________________________________________________________
djh1006- 中級會員
- 文章總數 : 177
年齡 : 53
來自 : 彰化縣員林鎮中山路二段369巷二弄15-14號
職業 : 連續沖壓模具設計工程師
愛好 : UG,SOLIDWORKS,AUTOCAD 2D,autolisp
個性 : 內向偏外
使用年資 : 23年以上
使用版本 : 2014
積分 : 7
經驗值 : 6137
威望值 : 359
注冊日期 : 2011-06-16
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
shenhung 寫到:
很訝異有人提供完整的程式,謝謝shenhung的提供
我本身不期望有人能夠提供我完整的程式,因為我覺得寫程式非常累人,因此我只問單一個功能而已
另外我覺得程式自己寫出來的話學到的都會比較多,且自己寫的比較能夠照自己的意思
其實前些日子有自己找到解決方法
自己的程式改前面成這樣就能解決自己的問題了
- 代碼:
(defun c:dli()
(cm1)
(setq dim_001 (ssget "l"))
(setq dim_002 (entlast))
(command "DIMLINEAR")
(while
(if
(= dim_001 nil)
(= dim_002 dim_001)
(/= nil (ssmemb dim_002 dim_001))
)
(command pause)
(setq dim_002 (entlast))
)
以下略
雖然程式的問題解決了,但是我還是想知道圖元能不能轉換其他型態,所以論串我還是放著等問題解答
而shenhung提供的程式,我先前也是寫過類似的(但是沒有*error*那一段)
不過自己沒有使用的原因有2個
1.esc離開的時候圖層會停留在"dim"標註圖層
2.回復(ctrl+Z)的時候需要回復2次才能回到沒有繪製的狀態
標註1個要回復2次,連續標註2個要回復3次,連續標註3個要回復4次......以此類推
如果連續標註繪製完,回復時圖層會停留在"dim",最後一次回復才能回到初始圖層狀態
因此我才想用另一個方式寫出來,雖然程式寫了複雜了一點......
shenhung提供的程式有一段讓我研究了大半天都不知道程式如何運作,就是程式除錯*error*那一段
我研究了半天,感覺*error*看起來跟一般的函數不一樣,也有在AutoCAD程式裡面的lisp程式中看到*error*字樣
如果程式沒有除錯這一段,繪製到一半esc離開時圖層就不會回到初始圖層狀態
程式中(defun c:dli(/ clayer),後面(/ clayer)這一段也不知道功能性,我也是研究老半天找不出功能性
(defun dim_err(st)中的"st"拿掉以後就會有奇怪的訊息出現
(defun c:dli(/ clayer)中的"/ clayer"拿掉以後程式能正常運作,感覺沒有異樣
看起來高手寫出來的程式就是不一樣,目前還在研究shenhung寫的程式
如果了解這程式完整運作方式"尤其是程式除錯*error*那一段",以後自寫出來的程式應該就能簡短許多
還是再次感謝shenhung提供的程式
j2832383- 一般會員
- 文章總數 : 11
年齡 : 34
來自 : 台南市
職業 : 模具設計
愛好 : 電腦休閒
個性 : 沉默/不擅於溝通
使用年資 : 學校使用8年,工作使用15個月
使用版本 : 2012
經驗值 : 4003
威望值 : 12
注冊日期 : 2014-02-09
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
(defun c:dli(/ clayer)
此行的(/ clayer)作用如下:
首先要了解的是
1.(setq CLAYER (getvar "clayer")),將目前使用中圖層儲存到變數CLAYER中(假設目前使用中的圖層為TEXT)
2.程式執行標註時,(setvar "clayer" "DIM")會把使用中圖層轉換到DIM圖層,這樣標註出來的尺寸都會在DIM圖層。
3.程式結束時,(setvar "clayer" CLAYER),將圖層又換回剛才程式前面記憶的TEXT。
4.(/ clayer)的意思就是程式結束時,不把CLAYER帶走(清除CLAYER的記憶),否則若別的程式也用了這個變數CLAYER,則記憶值可能會亂掉。
意思就是清除記憶~~~
清除CLAYER變數的記憶
其實這個程式犯了一個小小小小的BUG,通常使用者設定的變數盡量不要和AUTOCAD及AUTOLISP的系統名稱一樣,否則可能會造成程式掛掉或CAD搞不清楚是系統的指令或是使用者自訂的變數
建議修改如下:
(defun c:dli(/ CLY)
此行的(/ CLY)作用如下:
首先要了解的是
1.(setq CLY (getvar "clayer")),將目前使用中圖層儲存到變數CLY中(假設目前使用中的圖層為TEXT)
2.程式執行標註時,(setvar "clayer" "DIM")會把使用中圖層轉換到DIM圖層,這樣標註出來的尺寸都會在DIM圖層。
3.程式結束時,(setvar "clayer" CLY),將圖層又換回剛才程式前面記憶的TEXT。
4.(/ CLY)的意思就是程式結束時,不把CLY帶走(清除CLY的記憶),否則若別的程式也用了這個變數CLY,則記憶值可能會亂掉。
意思就是清除記憶~~~
清除CLY變數的記憶
完整的修改如下
(defun dim_err(st)
(setvar "clayer" CLY)
(setq *error* old_err)
)
(defun c:dli(/ CLY)
(setq old_err *error* *error* dim_err)
(setq CLY (getvar "clayer"))
(setvar "cmdecho" 0)
(if (= (tblsearch "layer" "DIM") nil)
(command "-layer" "m" "DIM" "c" "1" "" "")
(setvar "clayer" "DIM")
)
(command "dimlinear")
(setvar "clayer" CLY)
(setvar "cmdecho" 1)
(setq *error* old_err)
(princ)
)
此行的(/ clayer)作用如下:
首先要了解的是
1.(setq CLAYER (getvar "clayer")),將目前使用中圖層儲存到變數CLAYER中(假設目前使用中的圖層為TEXT)
2.程式執行標註時,(setvar "clayer" "DIM")會把使用中圖層轉換到DIM圖層,這樣標註出來的尺寸都會在DIM圖層。
3.程式結束時,(setvar "clayer" CLAYER),將圖層又換回剛才程式前面記憶的TEXT。
4.(/ clayer)的意思就是程式結束時,不把CLAYER帶走(清除CLAYER的記憶),否則若別的程式也用了這個變數CLAYER,則記憶值可能會亂掉。
意思就是清除記憶~~~
清除CLAYER變數的記憶
其實這個程式犯了一個小小小小的BUG,通常使用者設定的變數盡量不要和AUTOCAD及AUTOLISP的系統名稱一樣,否則可能會造成程式掛掉或CAD搞不清楚是系統的指令或是使用者自訂的變數
建議修改如下:
(defun c:dli(/ CLY)
此行的(/ CLY)作用如下:
首先要了解的是
1.(setq CLY (getvar "clayer")),將目前使用中圖層儲存到變數CLY中(假設目前使用中的圖層為TEXT)
2.程式執行標註時,(setvar "clayer" "DIM")會把使用中圖層轉換到DIM圖層,這樣標註出來的尺寸都會在DIM圖層。
3.程式結束時,(setvar "clayer" CLY),將圖層又換回剛才程式前面記憶的TEXT。
4.(/ CLY)的意思就是程式結束時,不把CLY帶走(清除CLY的記憶),否則若別的程式也用了這個變數CLY,則記憶值可能會亂掉。
意思就是清除記憶~~~
清除CLY變數的記憶
完整的修改如下
(defun dim_err(st)
(setvar "clayer" CLY)
(setq *error* old_err)
)
(defun c:dli(/ CLY)
(setq old_err *error* *error* dim_err)
(setq CLY (getvar "clayer"))
(setvar "cmdecho" 0)
(if (= (tblsearch "layer" "DIM") nil)
(command "-layer" "m" "DIM" "c" "1" "" "")
(setvar "clayer" "DIM")
)
(command "dimlinear")
(setvar "clayer" CLY)
(setvar "cmdecho" 1)
(setq *error* old_err)
(princ)
)
Tiger&蘋果爸 寫到: 謝謝熱心程式解說分享~< 積分 +1>
[公告]關於團隊成員的回文及貢獻
____________________________________________________________________________________
djh1006- 中級會員
- 文章總數 : 177
年齡 : 53
來自 : 彰化縣員林鎮中山路二段369巷二弄15-14號
職業 : 連續沖壓模具設計工程師
愛好 : UG,SOLIDWORKS,AUTOCAD 2D,autolisp
個性 : 內向偏外
使用年資 : 23年以上
使用版本 : 2014
積分 : 7
經驗值 : 6137
威望值 : 359
注冊日期 : 2011-06-16
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
再補充一下,若有錯請指正
- 代碼:
(defun dim_err(st) ;;中斷程式時的回復被修改的參數
(setvar "clayer" CLY) ;;回復原來圖層
(setq *error* old_err) ;;不太清楚,反正是中斷程式的整套標準語法,請懂的人解釋一下
)
(defun c:dli(/ CLY)
(setq old_err *error* *error* dim_err) ;;程式被中斷時執行 dim_err副程式
(setq CLY (getvar "clayer")) ;;將使用中的圖層記憶到CLY變數裡
(setvar "cmdecho" 0) ;;程式執行時,停止一些不必要的回應訊息
(if (= (tblsearch "layer" "DIM") nil) ;;檢測是否有DIM圖層
(command "-layer" "m" "DIM" "c" "1" "" "") ;;若沒有則新建DIM圖層並切換到DIM圖層
(setvar "clayer" "DIM") ;;若有DIM圖層則切換系統圖層到DIM圖層
)
(command "dimlinear") ;;開始線性標註
(setvar "clayer" CLY) ;;標註完後,回復原來圖層,可能有人習慣畫圖圖層為1或2或其它,但習慣標註在DIM圖層
(setvar "cmdecho" 1) ;;啟動回應訊息
(setq *error* old_err) ;;不太清楚,反正是中斷程式的整套標準語法,請懂的人解釋一下
(princ)
)
____________________________________________________________________________________
djh1006- 中級會員
- 文章總數 : 177
年齡 : 53
來自 : 彰化縣員林鎮中山路二段369巷二弄15-14號
職業 : 連續沖壓模具設計工程師
愛好 : UG,SOLIDWORKS,AUTOCAD 2D,autolisp
個性 : 內向偏外
使用年資 : 23年以上
使用版本 : 2014
積分 : 7
經驗值 : 6137
威望值 : 359
注冊日期 : 2011-06-16
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
這是連續標註的寫法,但還有問題,無法結束,請高手幫我修改,謝謝(要能連續標註哦,按右鍵可以結束,像autocad本身的功能一樣)
- 代碼:
;DDL.lsp
;線性標註
(defun dim_err(st) ;;中斷回復副程式
(setvar "clayer" clayer)
(setvar "DIMASSOC" DAC)
(setq *error* old_err)
)
(defun C:DDL(/ old_err CLY DAC PT1 PT2)
(graphscr)
(setvar "CMDECHO" 0)
(setq old_err *error* *error* dim_err)
(setq
CLY (getvar "clayer")
DAC (getvar "DIMASSOC") ;;標註關聯性
PT1 nil
PT2 nil
)
(setvar "DIMSD1" 0)
(setvar "DIMSE1" 0)
(setvar "DIMASSOC" 2) ;;打開標註關聯
(if (= (tblsearch "layer" "DIM") nil) ;;檢查本圖面有沒有DIM圖層
(command "-layer" "m" "DIM" "c" "1" "" "") ;;若無則新建DIM圖層
(setvar "clayer" "DIM") ;;若有則切換到DIM圖層
)
(while (or (= PT1 nil)(/= PT2 nil))
(setq PT1 (getpoint "\n指定第一條延伸線原點 <選取物件>:"))
(if (/= PT1 nil)(setq PT2 (getpoint PT1 "\n指定第二條延伸線原點:")))
(if (= PT1 nil)(progn
(command "UNDO" "BE")
(command "DIMLINEAR" "")
(while (= (getvar "CMDACTIVE") 1)
(command pause)
)
(setvar "DIMASSOC" DAC) ;;回復標註關聯性
(setvar "CLAYER" CLY)
(command "UNDO" "E")
(setq *error* old_err)
(setq PT1 nil PT2 nil)
))
(if (and (/= PT1 nil)(/= PT2 nil))(progn
(command "UNDO" "BE")
(setvar "CLAYER" "DIM")
(command "DIMLINEAR" PT1 PT2 pause)
(setvar "DIMASSOC" DAC) ;;回復標註關聯性
(setvar "CLAYER" CLY)
(command "UNDO" "E")
(setq *error* old_err)
(setq PT1 nil PT2 nil)
))
)
(princ)
)
____________________________________________________________________________________
djh1006- 中級會員
- 文章總數 : 177
年齡 : 53
來自 : 彰化縣員林鎮中山路二段369巷二弄15-14號
職業 : 連續沖壓模具設計工程師
愛好 : UG,SOLIDWORKS,AUTOCAD 2D,autolisp
個性 : 內向偏外
使用年資 : 23年以上
使用版本 : 2014
積分 : 7
經驗值 : 6137
威望值 : 359
注冊日期 : 2011-06-16
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
修正代碼如下.~僅搬動while 迴圈啟動條件. pt1
- 代碼:
;線性標註
(defun dim_err(st) ;;中斷回復副程式
(setvar "clayer" clayer)
(setvar "DIMASSOC" DAC)
(setq *error* old_err)
)
(defun C:DDL(/ old_err CLY DAC PT1 PT2)
(graphscr)
(setvar "CMDECHO" 0)
(setq old_err *error* *error* dim_err)
(setq
CLY (getvar "clayer")
DAC (getvar "DIMASSOC") ;;標註關聯性
PT1 nil
PT2 nil
)
(setvar "DIMSD1" 0)
(setvar "DIMSE1" 0)
(setvar "DIMASSOC" 2) ;;打開標註關聯
(if (= (tblsearch "layer" "DIM") nil) ;;檢查本圖面有沒有DIM圖層
(command "-layer" "m" "DIM" "c" "1" "" "") ;;若無則新建DIM圖層
(setvar "clayer" "DIM") ;;若有則切換到DIM圖層
)
(setq PT1 (getpoint "\n指定第一條延伸線原點 <選取物件>:"))
(while (/= PT1 nil)
(if (/= PT1 nil)(setq PT2 (getpoint PT1 "\n指定第二條延伸線原點:")))
(if (= PT1 nil)(progn
(command "UNDO" "BE")
(command "DIMLINEAR" "")
(while (= (getvar "CMDACTIVE") 1)
(command pause)
)
(setvar "DIMASSOC" DAC) ;;回復標註關聯性
(setvar "CLAYER" CLY)
(command "UNDO" "E")
(setq *error* old_err)
(setq PT1 nil PT2 nil)
))
(if (and (/= PT1 nil)(/= PT2 nil))(progn
(command "UNDO" "BE")
(setvar "CLAYER" "DIM")
(command "DIMLINEAR" PT1 PT2 pause)
(setvar "DIMASSOC" DAC) ;;回復標註關聯性
(setvar "CLAYER" CLY)
(command "UNDO" "E")
(setq *error* old_err)
(setq PT1 nil PT2 nil)
))
(setq PT1 (getpoint "\n指定第一條延伸線原點 <選取物件>:"))
)
(princ)
)
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8075
威望值 : 1188
注冊日期 : 2009-06-03
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
感謝shenhung大哥的幫忙,快來去測試
____________________________________________________________________________________
djh1006- 中級會員
- 文章總數 : 177
年齡 : 53
來自 : 彰化縣員林鎮中山路二段369巷二弄15-14號
職業 : 連續沖壓模具設計工程師
愛好 : UG,SOLIDWORKS,AUTOCAD 2D,autolisp
個性 : 內向偏外
使用年資 : 23年以上
使用版本 : 2014
積分 : 7
經驗值 : 6137
威望值 : 359
注冊日期 : 2011-06-16
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
測試結果是這樣的,CAD的原始功能是當使用者執行dimlinear指令時
指定第一條延伸線原點或 <選取物件>:
若第一個動作是選取標註第一點,則會繼續詢問
指定第二條延伸線原點:
而當第一個動作不是選點而是按ENTER時,CAD會要你
選取要標註的物件:
所以shenhung大哥修改的程式是當第一個
(setq PT1 (getpoint "\n指定第一條延伸線原點 <選取物件>:"))
若按ENTER則PT1會是nil的值,就不能進入WHILE迴圈
並且永遠無法執行
(if (= PT1 nil)(progn
中的選取物件的功能,永遠只能以選取二點的方式線性標註
所以:
如何修改這個程式,請再費心想一下,非當感謝
若真沒辦法,只好以ESC結束程式
(setq PT1 (getpoint "\n指定第一條延伸線原點 <按ENTER選取物件或按ESC結束>:"))
指定第一條延伸線原點或 <選取物件>:
若第一個動作是選取標註第一點,則會繼續詢問
指定第二條延伸線原點:
而當第一個動作不是選點而是按ENTER時,CAD會要你
選取要標註的物件:
所以shenhung大哥修改的程式是當第一個
(setq PT1 (getpoint "\n指定第一條延伸線原點 <選取物件>:"))
若按ENTER則PT1會是nil的值,就不能進入WHILE迴圈
並且永遠無法執行
(if (= PT1 nil)(progn
中的選取物件的功能,永遠只能以選取二點的方式線性標註
所以:
如何修改這個程式,請再費心想一下,非當感謝
若真沒辦法,只好以ESC結束程式
(setq PT1 (getpoint "\n指定第一條延伸線原點 <按ENTER選取物件或按ESC結束>:"))
____________________________________________________________________________________
djh1006- 中級會員
- 文章總數 : 177
年齡 : 53
來自 : 彰化縣員林鎮中山路二段369巷二弄15-14號
職業 : 連續沖壓模具設計工程師
愛好 : UG,SOLIDWORKS,AUTOCAD 2D,autolisp
個性 : 內向偏外
使用年資 : 23年以上
使用版本 : 2014
積分 : 7
經驗值 : 6137
威望值 : 359
注冊日期 : 2011-06-16
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
個人研究了好半天新程式的寫法,也研究很久*error*執行的訣竅,今天算是弄清楚了(應該吧......)
(defun error(st),這個(st)還是不懂意思,在我眼裡沒有ST應該也能執行才對,ST不知道有沒有特別的意思
附件的程式是我全部程式中標註的部分
我個人習慣繪圖都是用指令的方式,所以如果習慣用按鈕的人大概不會用
(defun error(st),這個(st)還是不懂意思,在我眼裡沒有ST應該也能執行才對,ST不知道有沒有特別的意思
附件的程式是我全部程式中標註的部分
我個人習慣繪圖都是用指令的方式,所以如果習慣用按鈕的人大概不會用
- 附件
j2832383- 一般會員
- 文章總數 : 11
年齡 : 34
來自 : 台南市
職業 : 模具設計
愛好 : 電腦休閒
個性 : 沉默/不擅於溝通
使用年資 : 學校使用8年,工作使用15個月
使用版本 : 2012
經驗值 : 4003
威望值 : 12
注冊日期 : 2014-02-09
回復: [討論]如何將圖元碼轉換成字串? (用於標註自動換dim圖層)
djh1006:
我忘了你還須要 選取物件這個選項.~!!拍謝 因為當你空輸入時. 無法判別回傳的nil
是要結束程式.還是要選取物件.~~ 基本上這2個目的是相互衝突的.~~
也是無法跳出while 迴圈的原因.~!!
所以自己的程式才沒有用迴圈.連續標註!!
但我寫單一標註的原因.是要加入公差和直徑符號的關係.~
https://www.autocad-tw.com/t9084-topic
j2832383:
st 的確可以省略. 當程式產生錯誤的時候. 會傳送一個錯誤訊息給st !!
我忘了你還須要 選取物件這個選項.~!!拍謝 因為當你空輸入時. 無法判別回傳的nil
是要結束程式.還是要選取物件.~~ 基本上這2個目的是相互衝突的.~~
也是無法跳出while 迴圈的原因.~!!
所以自己的程式才沒有用迴圈.連續標註!!
但我寫單一標註的原因.是要加入公差和直徑符號的關係.~
https://www.autocad-tw.com/t9084-topic
j2832383:
st 的確可以省略. 當程式產生錯誤的時候. 會傳送一個錯誤訊息給st !!
shenhung- 高級會員
- 文章總數 : 281
年齡 : 57
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 8075
威望值 : 1188
注冊日期 : 2009-06-03
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章