エンター毎にブロックが90°回転するLISP

  • URLをコピーしました!


図面作業で地味に時間を奪われるのが、「ブロックの向きの調整」です。
ブロックを配置したあと、ROTATEコマンドやプロパティの回転角度を修正して角度を調整…

この流れ、1回なら大したことはありませんが、数十回・数百回と繰り返すと確実に効率を下げてきます。

特にボルトや金物など、向きを細かく変えながら配置する部材では、この手間がストレスになりがちです。

そこで今回紹介するのが、「Enterキーを押すだけで90°ずつ回転するLISP」です。

(defun br90--rotate-ss (ss / i en obj rot inc)
(vl-load-com)
(setq inc (* pi 0.5)) ; +90°(ラジアン)
(setq i 0)
(while (< i (sslength ss)) (setq en (ssname ss i)) (setq i (1+ i)) (if (= (cdr (assoc 0 (entget en))) "INSERT") ; ブロック参照のみ対象 (progn (setq obj (vlax-ename->vla-object en))
(setq rot (vla-get-Rotation obj)) ; 現在角度(ラジアン)
(vla-put-Rotation obj (+ rot inc)) ; +90°
)
)
)
(princ)
)

(defun c:BR ( / ss)
(vl-load-com)
(princ "nBR90: ブロックを +90° 回転します。")
(while T
(princ "nブロックを選択(複数可) [Enter: 前回対象を+90° / ESC: 終了]: ")
;; ブロック参照だけを選択対象にするフィルタ
(setq ss (ssget '((0 . "INSERT"))))
(cond
;; 新規選択がある → 記憶して回転
(ss
(setq *BR90-LAST* ss)
(br90--rotate-ss ss)
)
;; Enter(選択なし)かつ直前選択がある → 直前選択を再度 +90°
((and (boundp '*BR90-LAST*) *BR90-LAST*)
(br90--rotate-ss *BR90-LAST*)
)
;; Enter(選択なし)で直前選択もない → 終了
(T
(princ "n対象が選択されていません。終了します。")
(setq ss nil)
(exit)
)
)
)
(princ)
)
すぐできる設定手順
  • コマンド「BR」を入力
  • ブロックを選択
  • 「Enter」を押す毎に90°回転
  • 「Esc」で終了
仁(じん)

画像付きのSTEPは、下で確認できますよ!

Contents

操作手順

STEP
  • コマンド「BR」を入力します
  • 回転したいブロックを選択します
STEP
  • 「Enter」を押す毎に「90°」回転します
  • 「Esc」で終了します

※ブロックの基点で回転します

凛(りん)

0°→90°→180°→270°と順番に回転するため、直感的変更できます。

LISP解説

以下の処理では、選択されたブロックを1つずつ取り出します。

現在の回転角度を取得して90°加算することで、まとめて回転させています。

ブロック参照(INSERT)のみを対象にしているため、他の図形に影響を与えないのもポイントです。

(defun br90--rotate-ss (ss / i en obj rot inc)
(vl-load-com)
(setq inc (* pi 0.5)) ; +90°(ラジアン)
(setq i 0)
(while (< i (sslength ss)) (setq en (ssname ss i)) (setq i (1+ i)) (if (= (cdr (assoc 0 (entget en))) "INSERT") ; ブロック参照のみ対象 (progn (setq obj (vlax-ename->vla-object en))
(setq rot (vla-get-Rotation obj)) ; 現在角度(ラジアン)
(vla-put-Rotation obj (+ rot inc)) ; +90°
)
)
)
(princ)
)

3行目の「(setq inc (* pi 0.5)) ; +90°(ラジアン)」の部分を変更することで変更角度を修正できます。

  • 45° …(* pi 0.25)
  • 90° …(* pi 0.5)
  • 180°…(* pi 1.0)
  • 270°…(* pi 1.5)
仁(じん)

この数値を変更することで、回転角度を自由に調整できます!

7行目の(vla-put-Rotation obj (+ rot inc))の「+ rot」を修正することで、回転方向も変更可能です。

  • (vla-put-Rotation obj (+ rot inc)) … 反時計回り
  • (vla-put-Rotation obj (- rot inc)) … 時計回り

(defun c:BR ( / ss)
(vl-load-com)
(princ "nBR90: ブロックを +90° 回転します。")
(while T
(princ "nブロックを選択(複数可) [Enter: 前回対象を+90° / ESC: 終了]: ")
;; ブロック参照だけを選択対象にするフィルタ
(setq ss (ssget '((0 . "INSERT"))))
(cond
;; 新規選択がある → 記憶して回転
(ss
(setq *BR90-LAST* ss)
(br90--rotate-ss ss)
)
;; Enter(選択なし)かつ直前選択がある → 直前選択を再度 +90°
((and (boundp '*BR90-LAST*) *BR90-LAST*)
(br90--rotate-ss *BR90-LAST*)
)
;; Enter(選択なし)で直前選択もない → 終了
(T
(princ "n対象が選択されていません。終了します。")
(setq ss nil)
(exit)
)
)
)
(princ)
)

この部分では、ユーザー操作をループ処理で受け付けながら、「直前に選択したブロック」を記憶することで、Enterキーだけで同じ対象を繰り返し回転できる仕組みを作っています。

一度選択すれば、その後はEnterを押すだけで90°ずつ回転できるため、操作の流れを止めることなく直感的に向きを調整できるのが特徴です。

まとめ

操作自体はとてもシンプルですが、「回転」という頻出作業を一気に効率化できるのが最大のポイントです。

  • ROTATEコマンド不要
  • 角度入力不要
  • Enterキーだけで直感操作

という流れに変わるだけで、作業スピードとストレスが大きく改善されます。

関連記事

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

Contents