Autolisp CopyRotate.LSP 複製物件後旋轉角度 示範使用 NEntSS 副程式
CopyRotate.LSP 作用是複製物件後旋轉角度,在此是示範使用 NEntSS副程式,展示 NEntSS 如何讓你在撰寫 Autolisp 時思路變得非常簡單,並且能很輕易就保留指令本身的視覺回饋效果。
;;************************************************************
;;* CopyRotate.LSP *
;;************************************************************
;;* 複製物件後旋轉角度 *
;;* (c) Copyright 2009 Max T. *
;;* 有點像複製+對齊指令 =^.^= *
;;************************************************************
(defun C:CR (/ *error* olderr OSM Ooth obj Nobj ssoldx BasePt
AliPT LP DP ang dist input default )
;;儲存系統變數**********************************************
(command "undo" "group")
(setq olderr *error*)
(setq *error* DetectError)
(setq OSM (getvar "OSMODE"))
(setq Ooth (getvar "OrthoMode"))
(setvar "OrthoMode" 0)
(setvar "CMDECHO" 0)
;;主程式****************************************************
(while (= obj nil)
(princ "\n *.* 選擇要旋轉複製物件 :")
(setq obj (ssget))
);;while
(setq BasePt (getpoint "\n *.* 請點選複製旋轉的基準點 :"))
(setq AliPT (getpoint BasePt "\n *.* 請選擇對齊點"))
(print "選擇複製目標點 : ")
(setq ang (angle BasePt AliPT ))
(setq dist (distance BasePt AliPT))
(setq ssoldx (ssget "x")) ;;取得現有的物件的總集合
(command "_.copy" obj "" BasePt pause)
(setq LP (getvar "Lastpoint")) ;;取得上一個指令的最後選取點 !!
(setq DP (polar LP ang dist)) ;;取得上一個指令的最後選取點的相對位置!!
(setq Nobj (NentSS ssoldx));;排除舊物件的集合
(command "_.rotate" Nobj "" LP "R" LP DP )
;;回復系統變數**********************************************
(setq *error* olderr)
(setvar "OrthoMode" Ooth)
(command "undo" "end")
(setvar "CMDECHO" 1)
(print " =^.^= =^O^=")
(princ)
)
;;endDefun
;;;;;********************* function DectectError *********************
(defun DetectError (s)
(if (/= s "程式錯誤")
(princ (strcat "\nError: " s))
)
(setq *error* olderr)
(setvar "OSMODE" OSM)
(setvar "OrthoMode" Ooth)
(command "undo" "end")
(setvar "CMDECHO" 1)
(print "使用者強制關閉")
(princ)
)
;;**** 角度徑度轉換 ***** ;;
(defun Radian->Degrees (nbrOfRadians)
(* 180.0 (/ nbrOfRadians pi))
)
;;**************************************************************************;;
;;**** 取得 command 新產生物件選集 ****;;
;;**** 必須在產生物件的動作前取得舊選集(setq ssoldx (ssget "x")) ****;;
;;**************************************************************************;;
(defun NentSS (oldSSx / NewSSx i enNameI ssExclude result)
(setq NewSSx (ssget "x"))
(setq i 0)
(if (/= oldSSx nil)
(progn
(repeat (sslength oldSSx)
(setq enNameI (ssname oldSSx i))
(setq ssExclude (ssdel enNameI NewSSx))
(setq i (+ 1 i))
) ;;repeat
);;progn
(exit)
)
;;if
(setq result ssExclude)
)
使用方式
1.選取您要複製並旋轉的物件
2.選取複製基準點(也是旋轉的中心點)
3.選取對齊點,這點是物件要選轉對齊的點
4.選取複製目標點(也是新的物件旋轉的中心點)
5.輸入角度 或是 依導引線決定角度
若您會撰寫 Autolisp 您就會發現主程式極其簡單,也不必為了保有視覺回饋效果絞盡腦汁,做一堆的假動作來達到視覺回饋效。這個副程式讓撰寫 Autolisp 工作輕鬆太多了 ...

標籤: AutoLisp



0 個意見:
張貼留言
訂閱 張貼留言 [Atom]
<< 首頁