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

[已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

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

[已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 greetingsfromtw 于 2012-06-13, 04:50

如題,
方形的部份可以用getcorner來做到點選一點後會隨滑鼠移動而產生方形輪廓拉伸的效果,
不知圓心有無類似語法可供使用,還望會lisp的高手前輩不吝指點小弟,感恩....



greetingsfromtw 在 2012-06-14, 03:14 作了第 1 次修改
avatar
greetingsfromtw
初級會員
初級會員

文章總數 : 222
年齡 : 32
來自 : 高雄
職業 : CAD菜鳥繪圖員
愛好 : 吃好吃的東西
個性 : 文靜
使用年資 : 不到兩年
使用版本 : 公司為2008,家中為2011
積分 : 3
經驗值 : 3225
威望值 : 189
注冊日期 : 2012-05-02
經典問與答讀者 藍鵲441號
男 天蝎座 鼠

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 shenhung 于 2012-06-13, 13:47

你說的可是畫圓時的動態顯示? 你想運用在什麼地方?
avatar
shenhung
高級會員
高級會員

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

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 明~ 于 2012-06-13, 15:58

直接使用圓的指令不就是了嗎?
還是你的程式是要"動態的"方式呈現~
需求講清楚一點~
avatar
明~
高級會員
高級會員

文章總數 : 307
年齡 : 37
來自 : 彰化
職業 : 機械
愛好 : 打球 騎車 健行 音樂 電影 (說不完...)
個性 : 不與人爭
使用年資 : 從學生時代接觸到現在(工作中不一定使用)
使用版本 : 2004和2008
積分 : 17
經驗值 : 4609
威望值 : 670
注冊日期 : 2009-12-24
藍鵲292號
男 雙魚座 猴

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 greetingsfromtw 于 2012-06-13, 16:02

只是單純想知道這個功能而已,跟getcorner一樣的效果雖然用處似乎不大,但看起來的感覺就是比較良好....


小弟亂舉一簡例,還望各位前輩不吝指點:

(defun c:ya()
(setvar "cmdecho" 0)
(setq cenpt(getpoint "\n請輸入圓心:"))
(setq rad(getcircle "\n請輸入半徑:"))
(command "circle" cenpt rad "")

)


其中"getcircle"是我亂掰的,沒有這個語法,希望能以動態顯示圓的語法取代之,但是我不知道.....-_-|||....
因為看cad裡的畫圓指令有此效果,想說應該有這個語法的存在才是,

希望知道的前輩能不吝指點迷津,感恩....

(貌似寫錯修改一下,剛學lisp不到一週請多包含(汗))



greetingsfromtw 在 2012-06-13, 16:05 作了第 1 次修改 (原因 : (貌似例子寫錯修改一下,剛學lisp不到一週請多包含(汗)))
avatar
greetingsfromtw
初級會員
初級會員

文章總數 : 222
年齡 : 32
來自 : 高雄
職業 : CAD菜鳥繪圖員
愛好 : 吃好吃的東西
個性 : 文靜
使用年資 : 不到兩年
使用版本 : 公司為2008,家中為2011
積分 : 3
經驗值 : 3225
威望值 : 189
注冊日期 : 2012-05-02
經典問與答讀者 藍鵲441號
男 天蝎座 鼠

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 salad123 于 2012-06-13, 16:41

這是你想要的嗎?

(defun c:ya(/ cenpt)
(setvar "cmdecho" 0)
(setq cenpt (getpoint "\n請輸入圓心: "))
(command "circle" cenpt pause) ;其實可以用pause
(princ))
avatar
salad123
一般會員
一般會員

文章總數 : 60
年齡 : 34
來自 : 香港
職業 : 建築
愛好 : 寫lisp
個性 : 追求簡潔, 快捷
使用年資 : 5
使用版本 : 2011
經驗值 : 2846
威望值 : 108
注冊日期 : 2011-01-06
藍鵲407號
男 水瓶座 狗

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 明~ 于 2012-06-13, 17:13

要發送時發現有人回答了~程式是相同的~
可以這樣寫~用於局部放大程式中
代碼:

(defun c:test ()
  (setq cp (getpoint "\n圓心點: "))
  (prompt "\n半徑: ")
  (command "_.CIRCLE" cp pause)
  (princ)
)

如果寫成動態的也可以,不過程式就比較複雜~
通常在寫程式時,內定有的功能就拿來調用就好~
avatar
明~
高級會員
高級會員

文章總數 : 307
年齡 : 37
來自 : 彰化
職業 : 機械
愛好 : 打球 騎車 健行 音樂 電影 (說不完...)
個性 : 不與人爭
使用年資 : 從學生時代接觸到現在(工作中不一定使用)
使用版本 : 2004和2008
積分 : 17
經驗值 : 4609
威望值 : 670
注冊日期 : 2009-12-24
藍鵲292號
男 雙魚座 猴

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 greetingsfromtw 于 2012-06-14, 01:28

感謝前輩們的熱心回答,小弟受用良多,也請允許小弟再提問題:

小弟比較希望的是寫出像cad內定的rec及c的效果,
pause這個語法雖然很讚(學到新招好開心),但命令列不會出現提示....
....對不起看到這裡應該有人會想開罵了:

"不會直接調用內定功能就好喔????奇怪耶你!!!"

......小弟也知道,但做為一個欠罵喔不是,做為一個想認真把lisp學好的
菜鳥,以及出於好奇心(重點),

還是很希望能寫出跟rec及c極度類似的lisp, 還望各位前輩能不吝指點迷津,感恩....



avatar
greetingsfromtw
初級會員
初級會員

文章總數 : 222
年齡 : 32
來自 : 高雄
職業 : CAD菜鳥繪圖員
愛好 : 吃好吃的東西
個性 : 文靜
使用年資 : 不到兩年
使用版本 : 公司為2008,家中為2011
積分 : 3
經驗值 : 3225
威望值 : 189
注冊日期 : 2012-05-02
經典問與答讀者 藍鵲441號
男 天蝎座 鼠

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 shenhung 于 2012-06-14, 02:15

(prompt "\n半徑: ")
(command "_.CIRCLE" cp pause)
GREET .用內定功能一樣可以出現提示!!上面已經有加提示上去了..

用 grread 函數可以辦的到.先動態取得營幕的座標點.配合grdraw 劃出虛擬線.

個人習慣.也是有內定功能可以達到的效果.就用.不太會花力氣去寫出CAD已經有的東西.!!這沒什麼對錯..其實就真的是自己感覺好就可以.!!
以下是彷ZOOM 動態顯示..所作的程式碼.差別在.我改成圓型..用在詳圖標註.
讓使用者.取得範圍和大小..可以參考看看..!!
代碼:

(defun drawcir( / p1 p2 )
(repeat nms
   (setq p1 (polar center an deltax))
   (setq p2 (polar center (+ an step) deltax))
   (grdraw p1 p2 -1)
   (setq an (+ an step))
)
(if (= mode 0)(arrow)(cenx))
)
;-------------------------------------------------------
(DEFUN CENX()
(grdraw x1 x2 -1)(grdraw x3 x4 -1)
)
;--------------------------------------------------------
(DEFUN arrow()
(grdraw a1 a4 -1)(grdraw a2 a4 -1)(grdraw a3 a4 -1)
)
;--------------------------------------------------------
(defun newcir()
(setq deltay (* deltax aspect))
(setq xcen (car center)  ycen (cadr center))
(setq lx (- xcen deltax) ux (+ xcen deltax))
(setq ly (- ycen deltay) uy (+ ycen deltay))
(setq ll (list lx ly) ul (list lx uy))   ; draw_line
(setq ur (list ux uy) lr (list ux ly))   ; draw_line
(setq yp (+ ycen arm) ym (- ycen arm))
(setq a1 (list (- ux arm) yp) a2 (list (- ux arm) ym))
(setq a3 (list (- ux arm arm) ycen))
(setq a4 (list ux ycen))
(setq x1 (list (- xcen arm) ym) x2 (list (+ xcen arm) yp))
(setq x3 (list (- xcen arm) yp) x4 (list (+ xcen arm) ym))
(drawcir)
)

(defun c:xdet(/ nms step an  aspect arm loop inp source mode )
 (setq step 20)
 (setq nms (/ 360 step))
 (setq step (dtr 20))
 (setq an 0)
 (setq center (cadr (grread t)))
 (setq prev center)
 (setvar "lastpoint" center)
 (setq aspect (/ (cadr (setq aspect (getvar "screensize"))) (car aspect)))
 (setq deltax (* 0.05 (getvar "viewsize")))
 (setq arm (* 0.6 deltax) mode 1 loop 1)
 (setq RA deltax)
 (newcir)
(while loop
 (Prompt (STRCAT "\r選取一個圓(S)/半徑 R=" (RTOS (ABS deltax) 2 4)))
 (setq inp (grread T))
 (setq source (car inp) pt (cadr inp))
 (cond ((= source 3)
      (cenx) (arrow)
      (setq mode (- 1 mode))
      (setvar "lastpoint" center)
      )
      ((and (or (= pt 83) (= pt 115)) (= source 2))
      (setvar "lastpoint" center)
      (drawcir)
      (setq en (entsel "\n選取一個圓:"))
      (if en (setq ra (dxfa 40 (car en))))
      (setq deltax ra)
      (setq mode 1)
      (setq source 5)
      (newcir)
      (terpri)
      (PRompt (STRCAT "\r選取一個圓(S)/半徑 R=" (RTOS (ABS RA) 2 4)))
      )
      ((= source 5)
      (if (or (/= (car prev) (car pt))
         (/= (cadr prev) (cadr pt))
       )
       (progn
       (if (= mode 0)
      (progn
      (drawcir)
      (setq center pt)
      (setq deltax (+ deltax (- (car pt) (car prev))))
      (setq ra deltax)
      (PRompt (STRCAT "\r選取一個圓(S)/半徑 R=" (RTOS (ABS RA) 2 4)))
      (setq prev pt)
      (newcir)
      )
      (progn
       (drawcir)
       (setq center pt)
       (setq prev pt)
       (setvar "lastpoint" center)
       (newcir)
      )
       ))
      )
      )
      ((or (and (= source 6) (= pt 0))
       (and (= source 2) (or (= pt 13) (= pt 32)))
   )
   (drawcir)
   (setq loop nil)
      )
  );cond
) ;while
)
;-------------------------------------
(defun dtr (a / val)
  (setq val (* pi (/ a 180.0)))
)

(PRINC)


avatar
shenhung
高級會員
高級會員

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

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 greetingsfromtw 于 2012-06-14, 03:13

不好意思沒注意到....原來shenhung前輩已加了提示,真不好意思,
再次感謝各位前輩願意抽出保貴時間替小弟解惑並列舉簡單易懂的例子,令小弟受益匪淺!


autocad論壇讚啦 讚啦!!


greetingsfromtw 在 2012-06-14, 03:16 作了第 1 次修改 (原因 : 忘記加表情符號(我覺得這很重要))
avatar
greetingsfromtw
初級會員
初級會員

文章總數 : 222
年齡 : 32
來自 : 高雄
職業 : CAD菜鳥繪圖員
愛好 : 吃好吃的東西
個性 : 文靜
使用年資 : 不到兩年
使用版本 : 公司為2008,家中為2011
積分 : 3
經驗值 : 3225
威望值 : 189
注冊日期 : 2012-05-02
經典問與答讀者 藍鵲441號
男 天蝎座 鼠

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 pizg 于 2012-06-20, 06:14

shenhung 寫到:(prompt "\n半徑: ")
(command "_.CIRCLE" cp pause)
GREET .用內定功能一樣可以出現提示!!上面已經有加提示上去了..

用 grread 函數可以辦的到.先動態取得營幕的座標點.配合grdraw 劃出虛擬線.

個人習慣.也是有內定功能可以達到的效果.就用.不太會花力氣去寫出CAD已經有的東西.!!這沒什麼對錯..其實就真的是自己感覺好就可以.!!
以下是彷ZOOM 動態顯示..所作的程式碼.差別在.我改成圓型..用在詳圖標註.
讓使用者.取得範圍和大小..可以參考看看..!!
代碼:

(defun drawcir( / p1 p2 )
(repeat nms
   (setq p1 (polar center an deltax))
   (setq p2 (polar center (+ an step) deltax))
   (grdraw p1 p2 -1)
   (setq an (+ an step))
)
(if (= mode 0)(arrow)(cenx))
)
;-------------------------------------------------------
(DEFUN CENX()
(grdraw x1 x2 -1)(grdraw x3 x4 -1)
)
;--------------------------------------------------------
(DEFUN arrow()
(grdraw a1 a4 -1)(grdraw a2 a4 -1)(grdraw a3 a4 -1)
)
;--------------------------------------------------------
(defun newcir()
(setq deltay (* deltax aspect))
(setq xcen (car center)  ycen (cadr center))
(setq lx (- xcen deltax) ux (+ xcen deltax))
(setq ly (- ycen deltay) uy (+ ycen deltay))
(setq ll (list lx ly) ul (list lx uy))   ; draw_line
(setq ur (list ux uy) lr (list ux ly))   ; draw_line
(setq yp (+ ycen arm) ym (- ycen arm))
(setq a1 (list (- ux arm) yp) a2 (list (- ux arm) ym))
(setq a3 (list (- ux arm arm) ycen))
(setq a4 (list ux ycen))
(setq x1 (list (- xcen arm) ym) x2 (list (+ xcen arm) yp))
(setq x3 (list (- xcen arm) yp) x4 (list (+ xcen arm) ym))
(drawcir)
)

(defun c:xdet(/ nms step an  aspect arm loop inp source mode )
 (setq step 20)
 (setq nms (/ 360 step))
 (setq step (dtr 20))
 (setq an 0)
 (setq center (cadr (grread t)))
 (setq prev center)
 (setvar "lastpoint" center)
 (setq aspect (/ (cadr (setq aspect (getvar "screensize"))) (car aspect)))
 (setq deltax (* 0.05 (getvar "viewsize")))
 (setq arm (* 0.6 deltax) mode 1 loop 1)
 (setq RA deltax)
 (newcir)
(while loop
 (Prompt (STRCAT "\r選取一個圓(S)/半徑 R=" (RTOS (ABS deltax) 2 4)))
 (setq inp (grread T))
 (setq source (car inp) pt (cadr inp))
 (cond ((= source 3)
      (cenx) (arrow)
      (setq mode (- 1 mode))
      (setvar "lastpoint" center)
      )
      ((and (or (= pt 83) (= pt 115)) (= source 2))
      (setvar "lastpoint" center)
      (drawcir)
      (setq en (entsel "\n選取一個圓:"))
      (if en (setq ra (dxfa 40 (car en))))
      (setq deltax ra)
      (setq mode 1)
      (setq source 5)
      (newcir)
      (terpri)
      (PRompt (STRCAT "\r選取一個圓(S)/半徑 R=" (RTOS (ABS RA) 2 4)))
      )
      ((= source 5)
      (if (or (/= (car prev) (car pt))
         (/= (cadr prev) (cadr pt))
       )
       (progn
       (if (= mode 0)
      (progn
      (drawcir)
      (setq center pt)
      (setq deltax (+ deltax (- (car pt) (car prev))))
      (setq ra deltax)
      (PRompt (STRCAT "\r選取一個圓(S)/半徑 R=" (RTOS (ABS RA) 2 4)))
      (setq prev pt)
      (newcir)
      )
      (progn
       (drawcir)
       (setq center pt)
       (setq prev pt)
       (setvar "lastpoint" center)
       (newcir)
      )
       ))
      )
      )
      ((or (and (= source 6) (= pt 0))
       (and (= source 2) (or (= pt 13) (= pt 32)))
   )
   (drawcir)
   (setq loop nil)
      )
  );cond
) ;while
)
;-------------------------------------
(defun dtr (a / val)
  (setq val (* pi (/ a 180.0)))
)

(PRINC)



no function definition: DXFA
avatar
pizg
高級會員
高級會員

文章總數 : 253
年齡 : 52
來自 : 桃園縣
職業 : 建築設計;程式設計
愛好 : 音樂;攝影;繪畫;棋奕;電腦
個性 : 隨和
使用年資 : 20↑
使用版本 : 2010
積分 : 10
經驗值 : 4087
威望值 : 320
發帖精華 : 1
注冊日期 : 2010-04-16
串連貼紙成功 男 摩羯座 龍

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 shenhung 于 2012-06-20, 14:12

pizg 謝謝你發現問題.. 我已補上dxfa 副程式.

新載點:xdet.lsp 動態圓型..

http://db.tt/F3zIvyGX
avatar
shenhung
高級會員
高級會員

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

回頂端 向下

回復: [已解決](lisp)請問點選圓心後顯示圓輪廓的lisp語法?

發表 由 adslwang 于 2012-06-24, 04:35

shenhung 寫到:pizg 謝謝你發現問題.. 我已補上dxfa 副程式.

新載點:xdet.lsp 動態圓型..

http://db.tt/F3zIvyGX

很棒的程式 謝謝分享
對於使用grread方式一直看不懂
使用方法可以請前輩指點一下嘛?
竊喜
avatar
adslwang
高級會員
高級會員

文章總數 : 372
年齡 : 39
來自 : 台南
職業 : 自由業
愛好 : 電腦、旅行
個性 : 樂觀
使用年資 : 1年
使用版本 : 2009
積分 : 17
經驗值 : 4603
威望值 : 355
回帖精華 : 1
注冊日期 : 2008-10-02
藍鵲88號
男 處女座 馬

回頂端 向下

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


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