2点回転コピー(&Z)
①copyする物を選択→②基点を選択→③角度を入力(繰り返し)
2点回転コピー:IJCAD2023用
^C^C(LOAD "CRP7_MULTI.lsp");CRP7_MULTI
CRP7_MULTI.lsp
;;; crp7_multi.lsp
;;; コマンド: CRP7_MULTI
;;; 複数選択対応版: 選択セット内の全オブジェクトを毎回複製し、複製群をまとめて回転する
(defun c:CRP7_MULTI ( / ss enames base ang i newents ss2 e cont last)
(princ "\n--- CRP7_MULTI: 回転コピー(複数選択対応)---")
(princ "\n対象を選択してください: ")
(setq ss (ssget))
(if (not ss)
(progn (princ "\n選択がキャンセルされました.") (princ))
(progn
;; 選択セットのエンティティ名リストを順序保持で作成
(setq enames '())
(setq i 0)
(while (< i (sslength ss))
(setq enames (append enames (list (ssname ss i))))
(setq i (1+ i))
)
;; 基点指定
(princ "\n回転の基点を指定してください: ")
(setq base (getpoint))
(if (not base)
(progn (princ "\n基点が指定されませんでした.") (princ))
(progn
;; 角度入力
(princ "\n回転角度を入力(度、正で反時計回り): ")
(setq ang (getreal))
(if (not ang)
(progn (princ "\n角度が指定されませんでした.") (princ))
(progn
;; 1回目を即作成(各エンティティを個別に COPY して entlast で取得)
(setq i 1)
(setq newents '())
(foreach e enames
(command "._COPY" e "" base base)
;; entlast で直近作成エンティティを取得
(setq last (entlast))
(if last (setq newents (cons last newents)))
)
;; 複製群をまとめて選択セットに入れ回転
(setq ss2 (ssadd))
(foreach e newents (ssadd e ss2))
(if ss2
(command "._ROTATE" ss2 "" base (* i ang))
(princ "\n複製の選択に失敗しました(1回目)。")
)
(princ (strcat "\nコピー " (itoa i) " を作成しました (角度 " (rtos (* i ang) 2 6) "°)。"))
(princ "\nEnter を押すと次のコピー(角度増分)、任意文字+Enterで終了、Escでキャンセルします。")
;; 繰り返しループ: Enter(空文字)で継続、非空で終了、Escでキャンセル
(while
(progn
(setq cont (getstring T "\n続けるには Enter、終了は任意文字+Enter、Escでキャンセル: "))
(and cont (= (strlen cont) 0))
)
(progn
(setq i (1+ i))
(setq newents '())
(foreach e enames
(command "._COPY" e "" base base)
(setq last (entlast))
(if last (setq newents (cons last newents)))
)
(setq ss2 (ssadd))
(foreach e newents (ssadd e ss2))
(if ss2
(command "._ROTATE" ss2 "" base (* i ang))
(princ "\n複製の選択に失敗しました(繰り返し)。")
)
(princ (strcat "\nコピー " (itoa i) " を作成しました (角度 " (rtos (* i ang) 2 6) "°)。"))
)
) ; while
(princ "\nCRP7_MULTI: 終了しました.")
)
)
)
)
)
)
(princ)
)