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