AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~

[已解決]請問下列Lisp程式代表什麼意義

2頁(共2頁) 上一頁  1, 2

上一篇主題 下一篇主題 向下

[已解決]請問下列Lisp程式代表什麼意義

發表 由 swcforest 于 2009-11-01, 05:29

主題回顧 :

(defun *error*()
(princ "錯誤!")
(setvar "osmode" 63)
(princ)
)

請問各位大大
此程式是否是在程式執行過程中
若有錯誤 就重新設定鎖點模式
若我自己的程式 是因為我按了esc離開
是乎沒辦法重新設定鎖點模式
謝謝


swcforest 在 2009-11-03, 15:50 作了第 1 次修改

swcforest
初級會員
初級會員

文章總數 : 104
年齡 : 37
來自 : 台中市南區
職業 : 土木工程設計
愛好 : 遊山玩水及AutoLISP
個性 : 開朗活潑
使用年資 : 六七年了
使用版本 : AutoCAD 2016
積分 : 1
經驗值 : 3531
威望值 : 13
注冊日期 : 2008-07-27
男 天秤座 羊

回頂端 向下


回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 張譽璋 于 2013-05-03, 04:51

這個程式你一按ESC只會幫你還原並中斷程式,並無法讓你回復至程式中運作中,應該是*error*的預設模式就是如此。

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 46
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4848
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 shenhung 于 2013-05-03, 05:53

剛測了一下程式.!! 我先說一下我的理解.
Conquerable 說想要讓程式在折曲計算的時候.ESC回到 ,GETRG 主提式.!!剛某些段落. 好像操作者.沒選取東西.就會一直在WHILE迴圈內. 操作者沒辦法跳出來. 只能ESC.中斷.!! 而你希望.ESC中斷後.能跳回GETRG 主提示.!! 不知道意思是不是這樣.!!

通常ESC.就是使用者強制中斷程式. 而*ERROR*.是中斷後.讓你可以執行你想要回復的動作或變數

或許..你可思考.讓操作者若空輸入(借由按ENter或空白鍵,讓你知道操作者想回提示列).就跳出WHILE迴圈!! 然後回到.GETRG 提示.而不要用esc返回.

(initget " ") ;在entsel 定義空格的字串 就可以讓使用者空輸入.
(entsel)

;以上entsel 若沒選到圖元 返回nil
按Enter 或空白鍵 返回 ""
借由nil 和 "" 的差別 讓你判斷使用者動作和意圖



avatar
shenhung
高級會員
高級會員

文章總數 : 237
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 4928
威望值 : 904
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 Conquerable 于 2013-05-03, 06:22

shenhung大大感謝您的測試

照你說的沒錯,我寫的部分是進入到折曲副程式時,若第一步驟就按空白鍵即會回到GETRG

而如果不是第一步驟的空回應則會一直在WHILE迴圈內直到選取

因為我們公司有買其他外掛軟體,它的操作有點類似我敘述的

ESC會一階一階退回去,直到回到最初始的主程式介面按ESC才會中止程式

可是他的不像我有這麼多階,又要選線,選標註,選方向的...

因為看不到源碼沒辦法參考,所以才來提問&試驗改寫,看程式是否可以更完整好用!!

其實這些東西並不是我們公司大家都在用

但我自己用速度的確差很多,因為我們是鈑金廠,我光一個折曲少拿一次計算機,整片少拿個10次就差很多了...也能說我自己懶得拿計算機

我自己用這程式是很習慣了,如果沒辦法的話也沒關係...
avatar
Conquerable
初級會員
初級會員

文章總數 : 45
年齡 : 27
來自 : 新北市板橋區
職業 : 繪圖員
愛好 : 繪圖
個性 : 好動
使用年資 : 12
使用版本 : 2000
積分 : 1
經驗值 : 2127
威望值 : 30
注冊日期 : 2012-07-09
男 雙魚座 馬

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 shenhung 于 2013-05-03, 06:33

每個人設計的理念跟方法都不太一樣!! 我是不習慣用ESC.退回上一層.
都用空白鍵.代表我不想選取.放棄動作.而回到上一層.!!
不過別人的可以這樣用.!!那表示沒什麼問題.!!
偶爾研究一下.也是不錯.!!若你有心得.也希望一起分享.
avatar
shenhung
高級會員
高級會員

文章總數 : 237
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 4928
威望值 : 904
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 Conquerable 于 2013-05-03, 06:53

再次請教一下

下段是我程式的一小段
代碼:

(defun getrgvalue()
  (setq en1 (entsel "\n 選擇折彎尺寸:"))
  (while (= en1 nil)
    (getrg)
    );end while
  (while (/= (cdr (assoc 0 (entget (car en1)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgvalue)
    );end while
  (setq ent1 (atof (rtos (cdr (assoc 42 (entget (car en1)))) 2 2)))
  (redraw (car en1) 3)
  )

如果我在(setq en1 (entsel "\n 選擇折彎尺寸:"))之前加入(initget " ")

是代表我在執行此行時,若左鍵沒選取到的回應是nil,而空白鍵,ENTER,右鍵則是回傳""的意思嘛?

如果是的話這樣有沒有可能是把*error*變成是""的回應呢?

我剛測試那個程式他用空白,ENTER,右鍵,ESC都是會回到前段
avatar
Conquerable
初級會員
初級會員

文章總數 : 45
年齡 : 27
來自 : 新北市板橋區
職業 : 繪圖員
愛好 : 繪圖
個性 : 好動
使用年資 : 12
使用版本 : 2000
積分 : 1
經驗值 : 2127
威望值 : 30
注冊日期 : 2012-07-09
男 雙魚座 馬

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 Conquerable 于 2013-05-03, 07:39

修改後測試OK...

照shenhung大大您的方式修改,所有entsel部分都可以用空白或enter回到getrg,最後一個步驟getpoint,空白也可回到getrg

下面是修改後程式..
代碼:

(defun c:rg()
  (setvar "cmdecho" 0)
  (getrg)
  )
(defun getrg()
  (setq getrgshow 0)
  (if (/= rgthick nil) (setq getrgshow (+ 1 getrgshow)))
  (if (/= rgcoeffici nil) (setq getrgshow (+ 2 getrgshow)))
  (if (/= rgzcoeffici nil) (setq getrgshow (+ 4 getrgshow)))
  (if (/= rgfcoeffici nil) (setq getrgshow (+ 8 getrgshow)))
  (cond
    ((= getrgshow 0) (setq show1 "未設定板厚&係數"))
    ;1個.
    ((= getrgshow 1) (setq show1 (strcat "板厚:" (rtos rgthick 2 2))))
    ((= getrgshow 2) (setq show1 (strcat "折彎係數:" (rtos rgcoeffici 2 2))))
    ((= getrgshow 4) (setq show1 (strcat "段差係數:" (rtos rgzcoeffici 2 2))))
    ((= getrgshow 8) (setq show1 (strcat "壓平係數:" (rtos rgfcoeffici 2 2))))
    ;2個.
    ((= getrgshow 3) (setq show1 (strcat "板厚:" (rtos rgthick 2 2) "/折彎係數:" (rtos rgcoeffici 2 2))))
    ((= getrgshow 5) (setq show1 (strcat "板厚:" (rtos rgthick 2 2) "/段差係數:" (rtos rgzcoeffici 2 2))))
    ((= getrgshow 9) (setq show1 (strcat "板厚:" (rtos rgthick 2 2) "/壓平係數:" (rtos rgfcoeffici 2 2))))
    ((= getrgshow 6) (setq show1 (strcat "折彎係數:" (rtos rgcoeffici 2 2) "/段差係數:" (rtos rgzcoeffici 2 2))))
    ((= getrgshow 10) (setq show1 (strcat "折彎係數:" (rtos rgcoeffici 2 2) "/壓平係數:" (rtos rgfcoeffici 2 2))))
    ((= getrgshow 12) (setq show1 (strcat "段差係數:" (rtos rgzcoeffici 2 2) "/壓平係數:" (rtos rgfcoeffici 2 2))))
    ;3個.
    ((= getrgshow 7) (setq show1 (strcat "板厚:" (rtos rgthick 2 2) "/折彎係數:" (rtos rgcoeffici 2 2) "/段差係數:" (rtos rgzcoeffici 2 2))))
    ((= getrgshow 11) (setq show1 (strcat "板厚:" (rtos rgthick 2 2) "/折彎係數:" (rtos rgcoeffici 2 2) "/壓平係數:" (rtos rgfcoeffici 2 2))))
    ((= getrgshow 13) (setq show1 (strcat "板厚:" (rtos rgthick 2 2) "/段差係數:" (rtos rgzcoeffici 2 2) "/壓平係數:" (rtos rgfcoeffici 2 2))))
    ((= getrgshow 14) (setq show1 (strcat "折彎係數:" (rtos rgcoeffici 2 2) "/段差係數:" (rtos rgzcoeffici 2 2) "/壓平係數:" (rtos rgfcoeffici 2 2))))
    ;4個.
    ((= getrgshow 15) (setq show1 (strcat "板厚:" (rtos rgthick 2 2) "/折彎係數:" (rtos rgcoeffici 2 2) "/段差係數:" (rtos rgzcoeffici 2 2) "/壓平係數:" (rtos rgfcoeffici 2 2))))
    );end cond
  (print show1)
  (initget "t c f z r a s")
  (setq getrgchoose (getkword "\n 修改板厚<T> / 修改係數<C> / 壓平展開<F> / 段差展開<Z> / R角展開<R> / 角度展開<A> / R角角度展開<S> / 折彎展開<>:"))
  (while (= getrgchoose "t")
    (initget 6)
    (setq rgthick (getreal "\n 請輸入板厚:"))
    (if (= rgthick nil) (getrg) (setq rgthick (atof (rtos rgthick 2 2))))
    (getrg)
    );end while
  (while (= getrgchoose "c")
    (initget "c f z")
    (setq getrgchooser (getkword " \n 折彎係數<C> / 壓平係數<F> / 段差係數<Z>:"))
    (while (= getrgchooser "c")
      (initget 6)
      (setq rgcoeffici (getreal "\n 請輸入折彎係數:"))
      (if (= rgcoeffici nil) (getrg) (setq rgcoeffici (atof (rtos rgcoeffici 2 2))))
      (getrg)
      );end while
    (while (= getrgchooser "f")
      (initget 6)
      (setq rgfcoeffici (getreal "\n 請輸入壓平係數:"))
      (if (= rgfcoeffici nil) (getrg) (setq rgfcoeffici (atof (rtos rgfcoeffici 2 2))))
      (getrg)
      );end while
    (while (= getrgchooser "z")
      (initget 6)
      (setq rgzcoeffici (getreal "\n 請輸入段差係數:"))
      (if (= rgzcoeffici nil) (getrg) (setq rgzcoeffici (atof (rtos rgzcoeffici 2 2))))
      (getrg)
      );end while
    (while (= getrgchooser nil)
      (getrg)
      );end while
    );end while
  (while (= getrgchoose "f")
    (dorgf)
    );end while
  (while (= getrgchoose "z")
    (dorgz)
    );end while
  (while (= getrgchoose "r")
    (dorgr)
    );end while
  (while (= getrgchoose "a")
    (dorga)
    );end while
  (while (= getrgchoose "s")
    (dorgra)
    );end while
  (while (= getrgchoose nil)
    (dorg)
    );end while
  )

;;;;;折彎.

;;;折彎主程式.
(defun dorg()
  (if (= rgthick nil)
    (progn
      (initget 6)
      (setq rgthick (getreal "\n 請輸入板厚:"))
      (if (= rgthick nil) (getrg) (setq rgthick (atof (rtos rgthick 2 2))))
      );end progn
    );end if
  (if (= rgcoeffici nil)
    (progn
      (initget 6)
      (setq rgcoeffici (getreal "\n 請輸入折彎係數:"))
      (if (= rgcoeffici nil) (getrg) (setq rgcoeffici (atof (rtos rgcoeffici 2 2))))
      );end progn
    );end if
  (setq show1 (strcat "<一般折曲>板厚:" (rtos rgthick 2 2) "/折彎係數:" (rtos rgcoeffici 2 2)))
  (print show1)
  (getrgvalue)
  (getrgline)
  (getrgdirection)
  (setq gg (getvar "osmode"))
  (setvar "osmode" 0)
  (setq offset1 (+ (- ent1 (* rgthick 2)) rgcoeffici))
  (setq offset2 (+ (- ent1 rgthick ) (/ rgcoeffici 2)))
  (command "offset" offset1 en2 pt2 "")
  (setq en3 (entlast))
  (command "offset" offset2 en3 pt1 "")
  (setq en4 (entlast))
  (command "change" en2 "" "p" "c" "red" "")
  (if (= (tblsearch "layer" "dash") nil) (command "layer" "m" "DASH" "l" "dashed" "DASH" "c" "magenta" "DASH" "s" "0" ""))
  (command "change" en4 "" "p" "la" "dash" "")
  (setvar "osmode" gg)
  (dorg)
  )
;------------------------------

;;;折彎副程式.
(defun getrgvalue()
  (initget " ")
  (setq en1 (entsel "\n 選擇折彎尺寸:"))
  (while (= en1 "")
    (getrg)
    );end while
  (while (= en1 nil)
    (getrgvalue)
    );end while
  (while (/= (cdr (assoc 0 (entget (car en1)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgvalue)
    );end while
  (setq ent1 (atof (rtos (cdr (assoc 42 (entget (car en1)))) 2 2)))
  (redraw (car en1) 3)
  )
(defun getrgline()
  (initget " ")
  (setq en2 (entsel "\n 選擇基準線:"))
  (while (= en2 "")
    (redraw (car en1) 4)
    (getrg)
    );end while
  (while (= en2 nil)
    (getrgline)
    );end while
  (while (and (/= (cdr (assoc 0 (entget (car en2)))) "XLINE") (/= (cdr (assoc 0 (entget (car en2)))) "LINE"))
      (print "選擇物件非建構線或線段!")
      (getrgline)
    );end while
  (setq pt1 (cdr (assoc 10 (entget (car en2)))))
  (redraw (car en2) 3)
  )
(defun getrgdirection()
  (setq pt2 (getpoint "\n 選擇展開方向:"))
  (while (= pt2 nil)
    (redraw (car en1) 4)
    (redraw (car en2) 4)
    (getrg)
    );end while
  (redraw (car en1) 4)
  (redraw (car en2) 4)
  )
;------------------------------

;;;;;段差.

;;;段差主程式.

(defun dorgz()
  (if (= rgthick nil)
    (progn
      (initget 6)
      (setq rgthick (getreal "\n 請輸入板厚:"))
      (if (= rgthick nil) (getrg) (setq rgthick (atof (rtos rgthick 2 2))))
      );end progn
    );end if
  (if (= rgzcoeffici nil)
    (progn
      (initget 6)
      (setq rgzcoeffici (getreal "\n 請輸入段差係數:"))
      (if (= rgzcoeffici nil) (getrg) (setq rgzcoeffici (atof (rtos rgzcoeffici 2 2))))
      );end progn
    );end if
  (setq show1 (strcat "<段差>板厚:" (rtos rgthick 2 2) "/段差係數:" (rtos rgzcoeffici 2 2)))
  (print show1)
  (getrgzvalue1)
  (getrgzvalue2)
  (getrgzline)
  (getrgzdirection)
  (setq gg (getvar "osmode"))
  (setvar "osmode" 0)
  (setq enzt3 (/ (- (+ rgthick enzt2) rgzcoeffici) 2))
  (setq offsetz1 (+ (/ (- (* rgthick 2) enzt3) 2) enzt1))
  (setq offsetz2 (+ (- enzt2 enzt3) offsetz1))
  (command "offset" rgzcoeffici enz3 ptz2 "")
  (setq enz4 (entlast))
  (command "offset" offsetz1 enz4 ptz1 "")
  (setq enz5 (entlast))
  (command "offset" offsetz2 enz4 ptz1 "")
  (setq enz6 (entlast))
  (command "change" enz3 "" "p" "c" "green" "")
  (if (= (tblsearch "layer" "dash") nil) (command "layer" "m" "DASH" "l" "dashed" "DASH" "c" "magenta" "DASH" "s" "0" ""))
  (command "change" enz5 "" "p" "la" "dash" "")
  (command "change" enz6 "" "p" "la" "dash" "")
  (setvar "osmode" gg)
  (dorgz)
  )

;------------------------------

;;;段差副程式.
(defun getrgzvalue1()
  (initget " ")
  (setq enz1 (entsel "\n 選擇段差單板:"))
  (while (= enz1 "")
    (getrg)
    );end while
  (while (= enz1 nil)
    (getrgzvalue1)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enz1)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgzvalue1)
    );end while
  (setq enzt1 (atof (rtos (cdr (assoc 42 (entget (car enz1)))) 2 2)))
  (redraw (car enz1) 3)
  )
(defun getrgzvalue2()
  (initget " ")
  (setq enz2 (entsel "\n 選擇段差雙板:"))
  (while (= enz2 "")
    (redraw (car enz1) 4)
    (getrg)
    );end while
  (while (= enz2 nil)
    (getrgzvalue2)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enz2)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgzvalue2)
    );end while
  (setq enzt2 (atof (rtos (cdr (assoc 42 (entget (car enz2)))) 2 2)))
  (redraw (car enz2) 3)
  )
(defun getrgzline()
  (initget " ")
  (setq enz3 (entsel "\n 選擇基準線:"))
  (while (= enz3 "")
    (redraw (car enz1) 4)
    (redraw (car enz2) 4)
    (getrg)
    );end while
  (while (= enz3 nil)
    (getrgzline)
    );end while
  (while (and (/= (cdr (assoc 0 (entget (car enz3)))) "XLINE") (/= (cdr (assoc 0 (entget (car enz3)))) "LINE"))
      (print "選擇物件非建構線或線段!")
      (getrgzline)
    );end while
  (setq ptz1 (cdr (assoc 10 (entget (car enz3)))))
  (redraw (car enz3) 3)
  )
(defun getrgzdirection()
  (setq ptz2 (getpoint "\n 選擇展開方向:"))
  (while (= ptz2 nil)
    (redraw (car enz1) 4)
    (redraw (car enz2) 4)
    (redraw (car enz3) 4)
    (getrg)
    );end while
  (redraw (car enz1) 4)
  (redraw (car enz2) 4)
  (redraw (car enz3) 4)
  )

;------------------------------

;;;;;壓平.

;;;壓平主程式.

(defun dorgf()
  (if (= rgthick nil)
    (progn
      (initget 6)
      (setq rgthick (getreal "\n 請輸入板厚:"))
      (if (= rgthick nil) (getrg) (setq rgthick (atof (rtos rgthick 2 2))))
      );end progn
    );end if
  (if (= rgfcoeffici nil)
    (progn
      (initget 6)
      (setq rgfcoeffici (getreal "\n 請輸入壓平係數:"))
      (if (= rgfcoeffici nil) (getrg) (setq rgfcoeffici (atof (rtos rgfcoeffici 2 2))))
      );end progn
    );end if
  (setq show1 (strcat "<壓平>板厚:" (rtos rgthick 2 2) "/壓平係數:" (rtos rgfcoeffici 2 2)))
  (print show1)
  (getrgfvalue)
  (getrgfline)
  (getrgfdirection)
  (setq gg (getvar "osmode"))
  (setvar "osmode" 0)
  (setq offsetf1 (- entf1 rgfcoeffici))
  (setq offsetf2 (- entf1 (/ rgfcoeffici 2)))
  (command "offset" offsetf1 enf2 ptf2 "")
  (setq enf3 (entlast))
  (command "offset" offsetf2 enf3 ptf1 "")
  (setq enf4 (entlast))
  (command "change" enf2 "" "p" "c" "blue" "")
  (if (= (tblsearch "layer" "dash") nil) (command "layer" "m" "DASH" "l" "dashed" "DASH" "c" "magenta" "DASH" "s" "0" ""))
  (command "change" enf4 "" "p" "la" "dash" "")
  (setvar "osmode" gg)
  (dorgf)
  )

;------------------------------

;;;壓平副程式.

(defun getrgfvalue()
  (initget " ")
  (setq enf1 (entsel "\n 選擇壓平尺寸:"))
  (while (= enf1 "")
    (getrg)
    );end while
  (while (= enf1 nil)
    (getrgfvalue)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enf1)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgfvalue)
    );end while
  (setq entf1 (atof (rtos (cdr (assoc 42 (entget (car enf1)))) 2 2)))
  (redraw (car enf1) 3)
  )
(defun getrgfline()
  (initget " ")
  (setq enf2 (entsel "\n 選擇基準線:"))
  (while (= enf2 "")
    (redraw (car enf1) 4)
    (getrg)
    );end while
  (while (= enf2 nil)
    (getrgfline)
    );end while
  (while (and (/= (cdr (assoc 0 (entget (car enf2)))) "XLINE") (/= (cdr (assoc 0 (entget (car enf2)))) "LINE"))
      (print "選擇物件非建構線或線段!")
      (getrgfline)
    );end while
  (setq ptf1 (cdr (assoc 10 (entget (car enf2)))))
  (redraw (car enf2) 3)
  )
(defun getrgfdirection()
  (setq ptf2 (getpoint "\n 選擇展開方向:"))
  (while (= ptf2 nil)
    (redraw (car enf1) 4)
    (redraw (car enf2) 4)
    (getrg)
    );end while
  (redraw (car enf1) 4)
  (redraw (car enf2) 4)
  )

;------------------------------

;;;;;R角.

;;;R角主程式.
(defun dorgr()
  (if (= rgthick nil)
    (progn
      (initget 6)
      (setq rgthick (getreal "\n 請輸入板厚:"))
      (if (= rgthick nil) (getrg) (setq rgthick (atof (rtos rgthick 2 2))))
      );end progn
    );end if
  (setq show1 (strcat "<R角折曲>板厚:" (rtos rgthick 2 2)))
  (print show1)
  (getrgrvalue1)
  (getrgrvalue2)
  (getrgrline)
  (getrgrdirection)
  (setq gg (getvar "osmode"))
  (setvar "osmode" 0)
  (setq offsetr1 (- (- (+ (/ (* (+ (* entr4 rgthick) entr2) pi) 2) entr1) (* entr2 2)) (* rgthick 2)))
  (setq offsetr2 (- (- (+ (/ (* (+ (* entr4 rgthick) entr2) pi) 4) entr1) entr2) rgthick))
  (command "offset" offsetr1 enr3 ptr2 "")
  (setq enr5 (entlast))
  (command "offset" offsetr2 enr5 ptr1 "")
  (setq enr6 (entlast))
  (command "change" enr3 "" "p" "c" "yellow" "")
  (if (= (tblsearch "layer" "dash") nil) (command "layer" "m" "DASH" "l" "dashed" "DASH" "c" "magenta" "DASH" "s" "0" ""))
  (command "change" enr6 "" "p" "la" "dash" "")
  (setvar "osmode" gg)
  (dorgr)
  )
;------------------------------

;;;R角副程式.
(defun getrgrvalue1()
  (initget " ")
  (setq enr1 (entsel "\n 選擇折彎尺寸:"))
  (while (= enr1 "")
    (getrg)
    );end while
  (while (= enr1 nil)
    (getrgrvalue1)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enr1)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgrvalue1)
    );end while
  (setq entr1 (atof (rtos (cdr (assoc 42 (entget (car enr1)))) 2 2)))
  (redraw (car enr1) 3)
  )
(defun getrgrvalue2()
  (initget " ")
  (setq enr2 (entsel "\n 選擇內R尺寸:"))
  (while (= enr2 "")
    (redraw (car enr1) 4)
    (getrg)
    );end while
  (while (= enr2 nil)
    (getrgrvalue2)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enr2)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgrvalue2)
    );end while
  (setq entr2 (atof (rtos (cdr (assoc 42 (entget (car enr2)))) 2 2)))
  (cond
    ((< entr2 rgthick) (setq entr4 0.35))
    ((and (>= entr2 rgthick) (< entr2 (* rgthick 2))) (setq entr4 0.4))
    ((and (>= entr2 (* rgthick 2)) (< entr2 (* rgthick 3))) (setq entr4 0.45))
    ((>= entr2 (* rgthick 3)) (setq entr4 0.55))
    )
  (redraw (car enr2) 3)
  )
(defun getrgrline()
  (initget " ")
  (setq enr3 (entsel "\n 選擇基準線:"))
  (while (= enr3 "")
    (redraw (car enr1) 4)
    (redraw (car enr2) 4)
    (getrg)
    );end while
  (while (= enr3 nil)
    (getrgrline)
    );end while
  (while (and (/= (cdr (assoc 0 (entget (car enr3)))) "XLINE") (/= (cdr (assoc 0 (entget (car enr3)))) "LINE"))
      (print "選擇物件非建構線或線段!")
      (getrgrline)
    );end while
  (setq ptr1 (cdr (assoc 10 (entget (car enr3)))))
  (redraw (car enr3) 3)
  )
(defun getrgrdirection()
  (setq ptr2 (getpoint "\n 選擇展開方向:"))
  (while (= ptr2 nil)
    (redraw (car enr1) 4)
    (redraw (car enr2) 4)
    (redraw (car enr3) 4)
    (getrg)
    );end while
  (redraw (car enr1) 4)
  (redraw (car enr2) 4)
  (redraw (car enr3) 4)
  )
;------------------------------

;;;;;角度.

;;;角度主程式.
(defun dorga()
  (if (= rgcoeffici nil)
    (progn
      (initget 6)
      (setq rgcoeffici (getreal "\n 請輸入折彎係數:"))
      (if (= rgcoeffici nil) (getrg) (setq rgcoeffici (atof (rtos rgcoeffici 2 2))))
      );end progn
    );end if
  (setq show1 (strcat "<角度折彎>折彎係數:" (rtos rgcoeffici 2 2) "(90度以下)"))
  (print show1)
  (getrgavalue1)
  (getrgavalue2)
  (getrgavalue3)
  (getrgaline)
  (getrgadirection)
  (setq gg (getvar "osmode"))
  (setvar "osmode" 0)
  (setq offseta1 (+ enta1 enta2 (* (/ rgcoeffici (/ pi 2)) enta3)))
  (setq offseta2 (+ enta2 (/ (* (/ rgcoeffici (/ pi 2)) enta3) 2)))
  (command "offset" offseta1 ena4 pta2 "")
  (setq ena5 (entlast))
  (command "offset" offseta2 ena5 pta1 "")
  (setq ena6 (entlast))
  (command "change" ena4 "" "p" "c" "cyan" "")
  (if (= (tblsearch "layer" "dash") nil) (command "layer" "m" "DASH" "l" "dashed" "DASH" "c" "magenta" "DASH" "s" "0" ""))
  (command "change" ena6 "" "p" "la" "dash" "")
  (setvar "osmode" gg)
  (dorga)
  )
;------------------------------

;;;角度副程式.
(defun getrgavalue1()
  (initget " ")
  (setq ena1 (entsel "\n 選擇折彎尺寸1(內寸,靠近基準線):"))
  (while (= ena1 "")
    (getrg)
    );end while
  (while (= ena1 nil)
    (getrgavalue1)
    );end while
  (while (/= (cdr (assoc 0 (entget (car ena1)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgavalue1)
    );end while
  (setq enta1 (atof (rtos (cdr (assoc 42 (entget (car ena1)))) 2 2)))
  (redraw (car ena1) 3)
  )
(defun getrgavalue2()
  (initget " ")
  (setq ena2 (entsel "\n 選擇折彎尺寸2(內寸,遠離基準線):"))
  (while (= ena2 "")
    (redraw (car ena1) 4)
    (getrg)
    );end while
  (while (= ena2 nil)
    (getrgavalue2)
    );end while
  (while (/= (cdr (assoc 0 (entget (car ena2)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgavalue2)
    );end while
  (setq enta2 (atof (rtos (cdr (assoc 42 (entget (car ena2)))) 2 2)))
  (redraw (car ena2) 3)
  )
(defun getrgavalue3()
  (initget " ")
  (setq ena3 (entsel "\n 選擇折彎角度:"))
  (while (= ena3 "")
    (redraw (car ena1) 4)
    (redraw (car ena2) 4)
    (getrg)
    );end while
  (while (= ena3 nil)
    (getrgavalue3)
    );end while
  (while (/= (cdr (assoc 0 (entget (car ena3)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgavalue3)
    );end while
  (setq enta3 (atof (rtos (cdr (assoc 42 (entget (car ena3)))) 2 9)))
  (if (> enta3 (/ pi 2)) (setq enta3 (- pi enta3)))
  (redraw (car ena3) 3)
  )
(defun getrgaline()
  (initget " ")
  (setq ena4 (entsel "\n 選擇基準線:"))
  (while (= ena4 "")
    (redraw (car ena1) 4)
    (redraw (car ena2) 4)
    (redraw (car ena3) 4)
    (getrg)
    );end while
  (while (= ena4 nil)
    (getrgaline)
    );end while
  (while (and (/= (cdr (assoc 0 (entget (car ena4)))) "XLINE") (/= (cdr (assoc 0 (entget (car ena4)))) "LINE"))
      (print "選擇物件非建構線或線段!")
      (getrgaline)
    );end while
  (setq pta1 (cdr (assoc 10 (entget (car ena4)))))
  (redraw (car ena4) 3)
  )
(defun getrgadirection()
  (setq pta2 (getpoint "\n 選擇展開方向:"))
  (while (= pta2 nil)
    (redraw (car ena1) 4)
    (redraw (car ena2) 4)
    (redraw (car ena3) 4)
    (redraw (car ena4) 4)
    (getrg)
    );end while
  (redraw (car ena1) 4)
  (redraw (car ena2) 4)
  (redraw (car ena3) 4)
  (redraw (car ena4) 4)
  )
;------------------------------

;;;;;R角角度.

;;;R角角度主程式.
(defun dorgra()
  (if (= rgthick nil)
    (progn
      (initget 6)
      (setq rgthick (getreal "\n 請輸入板厚:"))
      (if (= rgthick nil) (getrg) (setq rgthick (atof (rtos rgthick 2 2))))
      );end progn
    );end if
  (setq show1 (strcat "<R角角度折曲>板厚:" (rtos rgthick 2 2) "(90度以下)"))
  (print show1)
  (getrgravalue1)
  (getrgravalue2)
  (getrgravalue3)
  (getrgravalue4)
  (getrgraline)
  (getrgradirection)
  (setq gg (getvar "osmode"))
  (setvar "osmode" 0)
  (setq offsetra1 (+ entra1 entra2 (* (+ (* entra6 rgthick) entra3) entra4)))
  (setq offsetra2 (+ entra2 (* (/ (+ (* entra6 rgthick) entra3) 2) entra4)))
  (command "offset" offsetra1 enra5 ptra2 "")
  (setq enra6 (entlast))
  (command "offset" offsetra2 enra6 ptra1 "")
  (setq enra7 (entlast))
  (command "change" enra5 "" "p" "c" "30" "")
  (if (= (tblsearch "layer" "dash") nil) (command "layer" "m" "DASH" "l" "dashed" "DASH" "c" "magenta" "DASH" "s" "0" ""))
  (command "change" enra7 "" "p" "la" "dash" "")
  (setvar "osmode" gg)
  (dorgra)
  )
;------------------------------

;;;R角角度副程式.
(defun getrgravalue1()
  (initget " ")
  (setq enra1 (entsel "\n 選擇折彎尺寸1(內寸,靠近基準線):"))
  (while (= enra1 "")
    (getrg)
    );end while
  (while (= enra1 nil)
    (getrgravalue1)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enra1)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgravalue1)
    );end while
  (setq entra1 (atof (rtos (cdr (assoc 42 (entget (car enra1)))) 2 2)))
  (redraw (car enra1) 3)
  )
(defun getrgravalue2()
  (initget " ")
  (setq enra2 (entsel "\n 選擇折彎尺寸2(內寸,遠離基準線):"))
  (while (= enra2 "")
    (redraw (car enra1) 4)
    (getrg)
    );end while
  (while (= enra2 nil)
    (getrgravalue2)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enra2)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgravalue2)
    );end while
  (setq entra2 (atof (rtos (cdr (assoc 42 (entget (car enra2)))) 2 2)))
  (redraw (car enra2) 3)
  )
(defun getrgravalue3()
  (initget " ")
  (setq enra3 (entsel "\n 選擇內R尺寸:"))
  (while (= enra3 "")
    (redraw (car enra1) 4)
    (redraw (car enra2) 4)
    (getrg)
    );end while
  (while (= enra3 nil)
    (getrgravalue3)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enra3)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgravalue3)
    );end while
  (setq entra3 (atof (rtos (cdr (assoc 42 (entget (car enra3)))) 2 2)))
  (cond
    ((< entra3 rgthick) (setq entra6 0.35))
    ((and (>= entra3 rgthick) (< entra3 (* rgthick 2))) (setq entra6 0.4))
    ((and (>= entra3 (* rgthick 2)) (< entra3 (* rgthick 3))) (setq entra6 0.45))
    ((>= entra3 (* rgthick 3)) (setq entra6 0.55))
    )
  (redraw (car enra3) 3)
  )
(defun getrgravalue4()
  (initget " ")
  (setq enra4 (entsel "\n 選擇折彎角度:"))
  (while (= enra4 "")
    (redraw (car enra1) 4)
    (redraw (car enra2) 4)
    (redraw (car enra3) 4)
    (getrg)
    );end while
  (while (= enra4 nil)
    (getrgravalue4)
    );end while
  (while (/= (cdr (assoc 0 (entget (car enra4)))) "DIMENSION")
      (print "選擇物件非尺寸標註!")
      (getrgravalue4)
    );end while
  (setq entra4 (atof (rtos (cdr (assoc 42 (entget (car enra4)))) 2 9)))
  (if (> entra4 (/ pi 2)) (setq entra4 (- pi entra4)))
  (redraw (car enra4) 3)
  )
(defun getrgraline()
  (initget " ")
  (setq enra5 (entsel "\n 選擇基準線:"))
  (while (= enra5 "")
    (redraw (car enra1) 4)
    (redraw (car enra2) 4)
    (redraw (car enra3) 4)
    (redraw (car enra4) 4)
    (getrg)
    );end while
  (while (= enra5 nil)
    (getrgraline)
    );end while
  (while (and (/= (cdr (assoc 0 (entget (car enra5)))) "XLINE") (/= (cdr (assoc 0 (entget (car enra5)))) "LINE"))
      (print "選擇物件非建構線或線段!")
      (getrgraline)
    );end while
  (setq ptra1 (cdr (assoc 10 (entget (car enra5)))))
  (redraw (car enra5) 3)
  )
(defun getrgradirection()
  (setq ptra2 (getpoint "\n 選擇展開方向:"))
  (while (= ptra2 nil)
    (redraw (car enra1) 4)
    (redraw (car enra2) 4)
    (redraw (car enra3) 4)
    (redraw (car enra4) 4)
    (redraw (car enra5) 4)
    (getrg)
    );end while
  (redraw (car enra1) 4)
  (redraw (car enra2) 4)
  (redraw (car enra3) 4)
  (redraw (car enra4) 4)
  (redraw (car enra5) 4)
  )
;------------------------------

avatar
Conquerable
初級會員
初級會員

文章總數 : 45
年齡 : 27
來自 : 新北市板橋區
職業 : 繪圖員
愛好 : 繪圖
個性 : 好動
使用年資 : 12
使用版本 : 2000
積分 : 1
經驗值 : 2127
威望值 : 30
注冊日期 : 2012-07-09
男 雙魚座 馬

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 shenhung 于 2013-05-03, 08:00

代碼:

(defun getrgvalue()
  (initget " ") ;讓使用者可以空輸入
  (setq en1 (getenty "\n選擇折彎尺寸:" '("DIMENSION")))
  (if (/= en1 "") ;如果使用者不是空輸入 .
      (progn
      (setq ent1 (atof (rtos (cdr (assoc 42 (entget (car en1)))) 2 2))) ;取得尺寸值.
      (redraw (car en1) 3) ; 高量顯示
      )
      (getrg) ;空輸入.回到主提示
  )
 
)

;;選取附程式.
;範例 (setq en1 (getenty "\n選擇圓或ARC:" '("ARC" "CIRCLE")))
;    (setq en1 (getenty "\n選擇折彎尺寸:" '("DIMENSION")))
;    (setq en1 (getenty "\n選擇XLINE 或 LINE:" '("XLINE" "LINE")))

(defun getenty (msg lise / ii #enty msg ennm lis_en eny)
 (setq #enty nil lis_en "" ii 0)
 ;;lise  組合  -----------------------------------------------------
 (repeat (length lise)
        (if (= ii 0)
       (setq lis_en (nth ii lise))
       (setq lis_en (strcat lis_en "," (nth ii lise)))
        )
        (setq ii (1+ ii))
 )
;-------------------------------------------------------------------
 (initget " ") ;可按Enter
 (setq eny (entsel msg))
 (while (and (/= eny "") (/= #enty 1)) ;不是按Enter
        (if (/= eny nil) ;選到物件
       (progn
            (setq ennm (cdr (assoc 0 (car eny))))
       (if  (not (member ennm lise)) ;選到的不是指定的物件
           (PROGN
           (PROMPT (strcat "\n***選到的物件是" ennm "  ***請選取相對應的" lis_en "物件***"))
           (initget " ")
           (setq eny (entsel msg))
       )
           (setq #enty 1)
       );if
       );progn
       (PROGN
            (prompt "\n***沒選到物件.請重新選取***")
       (initget " ")
       (setq eny (entsel msg))
       ) ;progn
    
        ) ;if
)
 (if (= eny "") "" eny)  ;
)

沒錯.就是你理解那樣. 沒選到是 nil. 空白鍵 就是 ""
在這提供 一個 getenty 我自己寫的 選取副程式. 處理我一般選圖元上的工作.!!
因為你程式內. while迴圈很多
我將你的程式改寫小部分. 讓你參考.!!

getenty 附程式.有3種回應.
1. 沒選到正確圖元.提示你該選那種圖元.
2. 空輸入.反回 ""
3. 選到圖元. 返回 正常 entsel 的返回值 ((圖元) (選取點)) 串列





avatar
shenhung
高級會員
高級會員

文章總數 : 237
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 4928
威望值 : 904
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 張譽璋 于 2013-05-03, 08:43

Shenhung 的建議做法很好,所以不建議使用Esc鍵返回。一般我要返回上一層也是跟Shenhung的做法類似。

張譽璋
榮譽顧問
榮譽顧問

文章總數 : 303
年齡 : 46
來自 : 彰化縣員林鎮
職業 : 機械設計工程師/AutoCAD講師/AutoCAD外掛系統開發/AutoCAD書籍作者
愛好 : 旅行及電影
個性 : 風趣健談
使用年資 : 25年
使用版本 : AutoCAD2010/2011/2012/2013
積分 : 20
經驗值 : 4848
威望值 : 624
發帖精華 : 2
回帖精華 : 1
注冊日期 : 2008-05-28
藍鵲12號
男 處女座 狗

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 Conquerable 于 2013-05-03, 08:58

了解了..感謝兩位的幫忙

已經將程式修改完畢..

目前均是以空白鍵回到上一層..

手邊有許多lisp可以來嘗試修改看看!

shenhung 您的getenty這個是等於自己做一個類似get系列的函數

增加了選錯物件的回應,空白鍵即傳回""的意思是嗎?

如果這樣寫就不用每次都寫一推if.....的意思?
avatar
Conquerable
初級會員
初級會員

文章總數 : 45
年齡 : 27
來自 : 新北市板橋區
職業 : 繪圖員
愛好 : 繪圖
個性 : 好動
使用年資 : 12
使用版本 : 2000
積分 : 1
經驗值 : 2127
威望值 : 30
注冊日期 : 2012-07-09
男 雙魚座 馬

回頂端 向下

回復: [已解決]請問下列Lisp程式代表什麼意義

發表 由 shenhung 于 2013-05-03, 09:26

增加了選錯物件的回應,空白鍵即傳回""的意思是嗎? YES
如果這樣寫就不用每次都寫一推if.....的意思? YES

主要是因為重覆工作.重覆的程式碼.就改寫為副程式.!!讓每次都方便調用.
getreal getint .等等.使用者輸入的函數.也有類似的副程式.!! 網上我看到的都是早期.10年前.自動化圖書奚永智寫的AUTOLISP.範例.那是我初學買的第一本書. 書內的範例副程式,我到現在還在用.!!

你也可以慢慢建立自己常用的副程式.讓自己寫起來事半功倍.!! 程式也比較好維護.



avatar
shenhung
高級會員
高級會員

文章總數 : 237
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 4928
威望值 : 904
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

2頁(共2頁) 上一頁  1, 2

上一篇主題 下一篇主題 回頂端


 
這個論壇的權限:
無法 在這個版面回復文章