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

  • URLをコピーしました!

Enterキーを押すたびにブロックが90°ずつ回転するLISPは、向きを頻繁に変える部材配置で効果を発揮します。例えばボルトブロックを、ネジの付け根を基点に作成しておけば、配置後にEnterを押すだけで0°、90°、180°、270°と順に回転します。毎回ROTATEコマンドを実行したり、プロパティで回転角度を入力する手間が省け、直感的に向きを決められます。ESCで終了する仕様にしておけば、作業の流れを止めずに使えます。単純ですが、繰り返し配置が多い図面ほど効果を実感できるLISPです。

;; BR90 – ブロックを Enter 毎に +90° 回転
;; 使い方:
;; 1) コマンド BR90 を実行
;; 2) 回転させたいブロック参照(INSERT)を選択(複数可)
;; 3) Enter で +90°、さらに Enter で +90° …(ESC で終了)
;;
;; 備考:ブロックの挿入点を基準に回転します。動的ブロックでも有効です。
;; 反時計回り。時計回りにしたい場合は inc の符号を負にしてください。

(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)
)

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

コメント

コメントする

Contents