2010年8月6日 星期五

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 工作輕鬆太多了 ...

沒有留言:

張貼留言