この掲示板は AutoCADマクロ屋本舗 の掲示板です。

【 注意 】最初に必ず ↓↓ 下記内容 ↓↓ を参照ください。
① マクロが分からない方は、まず 【 マクロ講座 】 を参照ください。
② 質問の前に 【 マクロ使用前の注意事項 】 をお読みください。
③ 質問する時は、新規投稿フォーム下の【 新規投稿時のお願い 】を必ずお読みください。

複写コマンドを子ループにしたい
お世話になっております。

Lispでブロックを挿入後、下記ルーチンで移動、回転、鏡像、コピーをループさせております。
ですが、コピーを選択して複数回実行した後右クリックするとルーチンは終わってしまいます。
なのでこのコピーの部分を子ループにして右クリックした時に親ループに戻ることはできますでしょうか。色々試してみたのですがうまくいきません。ご教授いただけないでしょうか。
よろしくお願いします。

使用CAD: AutoCAD 2025

(defun my_move_rotate_mirror ()
  (setq mrmi "init")
  (while mrmi
    (initget "M RO MI CO")
    (setq mrmi (getkword "Escで終了 [M 移動/RO 回転/MI 鏡像/CO 複写]: "))
    (cond ((= mrmi "M")
           (setq basepoint1 (getpoint "基点を指示\n"))
           (command "._move" "L" "" "_non" basepoint1 pause))
          ((= mrmi "RO")
           (setq basepoint1 (getpoint "基点を指示\n"))
           (command "._rotate" "L" "" "_non" basepoint1 pause))
          ((= mrmi "MI")
           (setq basepoint1 (getpoint "1点目を指示\n"))
           (setq basepoint2 (getpoint basepoint1 "2点目を指示\n"))
           (initget "Y N")
           (or (setq YN (getkword "元のオブジェクトを削除しますか? Yes or No [Yes/No]<No>"))(setq YN "N"))
           (command "._mirror" "L" "" "_non" basepoint1 "_non" basepoint2 YN))
          ((= mrmi "CO")
           (setq ob (ssget))(setq pt1 (getpoint "基点を指示\n"))
           (command "._copy" ob "" "m" pt1 "co" pause) )
          (t nil)))
  (princ)
) ; Escが押された場合にループを抜ける
  • mappy
  • 2025/09/19 (Fri) 19:39:39
Re: 複写コマンドを子ループにしたい
(defun my_move_rotate_mirror ()

(defun loop-pause ()
(while (> (getvar "CMDACTIVE") 0)
(command pause)))

(setq mrmi "init")
(while mrmi
(initget "M RO MI CO")
(setq mrmi (getkword "Escで終了 [M 移動/RO 回転/MI 鏡像/CO 複写]: "))
(cond ((= mrmi "M")
(setq basepoint1 (getpoint "基点を指示\n"))
(command "._move" "L" "" "_non" basepoint1 pause))
((= mrmi "RO")
(setq basepoint1 (getpoint "基点を指示\n"))
(command "._rotate" "L" "" "_non" basepoint1 pause))
((= mrmi "MI")
(setq basepoint1 (getpoint "1点目を指示\n"))
(setq basepoint2 (getpoint basepoint1 "2点目を指示\n"))
(initget "Y N")
(or (setq YN (getkword "元のオブジェクトを削除しますか? Yes or No [Yes/No]<No>"))(setq YN "N"))
(command "._mirror" "L" "" "_non" basepoint1 "_non" basepoint2 YN))
((= mrmi "CO")
(setq basepoint1 (getpoint "基点を指示\n"))
(command "._copy" "L" "" "m" basepoint1 (loop-pause)))
(t nil)))
(princ)
) ; Escが押された場合にループを抜ける
  • Hamu
  • 2025/09/22 (Mon) 13:05:41
Re: 複写コマンドを子ループにしたい
他のコマンドも(loop-pause)で対応すれば、これで良いと思います。

(defun my_move_rotate_mirror ()

(defun loop-pause ()
(while (> (getvar "CMDACTIVE") 0)
(command pause)))

(while T
(initget "M RO MI CO")
(setq mrmi (getkword "Escで終了 [M 移動/RO 回転/MI 鏡像/CO 複写]: "))
(cond ((= mrmi "M")
(command "._move" "L" "" (loop-pause)))
((= mrmi "RO")
(command "._rotate" "L" "" (loop-pause)))
((= mrmi "MI")
(command "._mirror" "L" "" (loop-pause)))
((= mrmi "CO")
(command "._copy" "L" "" "m" (loop-pause)))
(t nil)))
(princ)
) ; Escが押された場合にループを抜ける
  • Hamu
  • 2025/09/22 (Mon) 13:12:33
Re: 複写コマンドを子ループにしたい
Hamu様

2通りのご提案ありがとうございます。
2番目の方がコードがスッキリしていていいですね。
というか、凄過ぎです。
因みに2番目のもので鏡像、元の・・・Yes Noはgetkwordにすることはできないのでしょうか?
  • mappy
  • 2025/09/22 (Mon) 16:44:55
Re: 複写コマンドを子ループにしたい
Hamu様

大変失礼いたしました。

以前自分が書いていたものと組み合わせたらできました。

((= mrmi "MI")
(setq basepoint1 (getpoint "1点目を指示\n"))
(setq basepoint2 (getpoint basepoint1 "2点目を指示\n"))
(initget "Y N")
(or (setq YN (getkword "元のオブジェクトを削除しますか? Yes or No [Yes/No]<No>"))(setq YN "N"))
(command "._mirror" "L" "" "_non" basepoint1 "_non" basepoint2 YN (loop-pause)))
  • mappy
  • 2025/09/22 (Mon) 16:58:10
Re: 複写コマンドを子ループにしたい
>元の・・・Yes Noはgetkwordにすることは
元に戻せば良いだけです。

getkwordを使わなければならない理由は?
最後のlispでも、Yes Noの選択はできるはずですけど。(コマンド標準機能としてYes Noの選択が有る)
  • Hamu
  • 2025/09/22 (Mon) 16:59:11
Re: 複写コマンドを子ループにしたい
元に戻したのなら、最後に(loop-pause)を付ける意味は無いです。
  • Hamu
  • 2025/09/22 (Mon) 17:01:26
Re: 複写コマンドを子ループにしたい
Hamu様

> getkwordを使わなければならない理由は?
使わなければいけないわけではなく、他のlispでも殆どgetkwordを使っていて、目線を動かしたり、矢印をクリックしてからyes noを表示させると言う手間、getkwordの方が視覚的に分かりやすいかなという勝手な私の拘りです。
オートキャドに精通していない為、今はこれに拘ってしまっていますが何かいい方法が有ればご教授いただけると幸いです。

> 最後に(loop-pause)を付ける意味は無いです。
そうだったんですね。恥ずかしいです。明後日修正します。
  • mappy
  • 2025/09/22 (Mon) 23:28:10
Re: 複写コマンドを子ループにしたい
((= mrmi "MI")
(command "._mirror" "L" "" (loop-pause)))



((= mrmi "MI")
(setq basepoint1 (getpoint "1点目を指示\n"))
(setq basepoint2 (getpoint basepoint1 "2点目を指示\n"))
(initget "Y N")
(or (setq YN (getkword "元のオブジェクトを削除しますか? Yes or No [Yes/No]<No>"))(setq YN "N"))
(command "._mirror" "L" "" "_non" basepoint1 "_non" basepoint2 YN))

で、

操作手順、手間、視覚的、ほぼ同じだと思うのですが。
対象オブジェクトがハイライトされるか、否かの違い程度。(ハイライトされる方が便利じゃないですか?)
  • Hamu
  • 2025/09/23 (Tue) 07:42:03 New

返信フォーム






プレビュー (投稿前に内容を確認)