[Autolisp]Rotateコマンドを効率化して、オブジェクトの回転を3クリックで済ませたい

AutoLisp

こんにちは、ISD です。
AutoCAD でオブジェクトを回転させるときに使う [Rotate]コマンドは、3Dモデリングのみならず使用頻度の高いコマンドです。
しかし、AutoCAD の [Rotate]コマンドの参照回転、作業効率が悪いと思いませんか?

Rotateコマンドの面倒なポイント

例えば、こんな時…

上の図の例で、頂点Aを基点にして頂点BをCの位置に来るように回転したいとき、
AutoCADでの通常の操作手順は、

コマンド [RO] を入力した後

① 頂点 A をクリック
② 参照[R] を入力
③ 頂点 A をクリック
④ 頂点 B をクリック
⑤ 頂点 C をクリック
となるのですが…

頂点 A を2回クリックするのって無駄じゃないですか ?! 
いや、③と④の操作で回転開始の角度を設定しているのと、条件によっては①と③は別の点をクリックするケースもあるのは理解できます。しかし、この例の場合は①と③は同じ頂点Aな訳で…

同じ点を2回クリックしなくてはいけないのが鬱陶しい!
それと、毎回 [R] を入力するのが鬱陶しい!
「あぁ!もうっ!!」って感じです。

オブジェクトの回転を3クリックで済ませたい

「これ、何とかならんのか?」
この回転の処理には、A、B、Cの3点さえ指定すれば十分なので、3クリックで済ませたいところです。

AutoLISPで Rotate コマンドをカスタマイズ

ということで、作成したコマンドがこちらです。

; ROTATE 参照回転版
; Rotate2
(defun c:Rotate2 ( / pt1 pt2 pt3 ss) 
  (setq ss (getSelectionSet)) ;選択セット取得
  (setq pt1 (getpoint "1点目(回転の基点)"))
  (setq pt2 (getpoint "2点目" pt1))
  (setq pt3 (getpoint "3点目" pt2))

  (selectCansel)              ;選択を解除
  (command "ROTATE" ss "")
  (command pt1)
  (command "R")
  (command pt1)
  (command pt2)
  (command pt3)
)

; [Rotate2]を[R2]でも呼び出せるようにする
(defun c:R2 ( / )
  (c:Rotate2)
)

; 選択セットを作成
(defun getSelectionSet ( / ss)
  (setq ss nil)
  ;最初に選択されているもので選択セットをつくる
  (setq ss (cadr (ssgetfirst)))
  ;選択セットが nil なら ssget を実行
  (while (= ss nil)
    (setq ss (ssget ))
  )
  ss
)

; 選択されているものを解除する
(defun selectCansel ( / ss)
  (setq ss nil)
  (command "PSELECT" ss )
)

非常に単純なプログラムなのですが、これにより手順が
コマンド [Rotate2] を入力した後
① 頂点 A をクリック
② 頂点 B をクリック
③ 頂点 C をクリック
と、回転を3クリックで済ませることができるようになりました。

プログラムの中でやっていることは、
必要な3点を先にクリックして座標を保存しておき、[Rotate]コマンドに適宜座標を送っているだけです。

さらに、[Rotate2]とコマンドを打つのが面倒だったので、[R2]という短い名前のコマンドを作ってこちらからも[Rotate2]を呼び出せるようにしています。

AutoLISPのファイルはこちらからダウンロードできますので、よろしかったらどうぞ。

コメント

タイトルとURLをコピーしました