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

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

ブロック置換
いつもこちらのサイト様にお世話になっております。
AutoCAD2024使用してます。
既に登録してあるAという属性のブロックを、すでに登録してあるBというブロックに置換するマクロを探しています。
2015年しか様の掲示板を拝見して、とってぃ様のマクロも試してみたのですが、うまく作動しませんでした。

♪ブロックA⇒B(-45°)置換 試作2
*^C^C$M=setenv;to;0;$(nth,$(getenv,to),;okbl;「置換ブロック名記入」;ray;^x^xブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]^x\$M="""$(if,$(getvar,cmdactive),;u;^C;^Z^X,setenv;to;1)""",,,,)$(nth,$(getenv,to),,;areq;$(getvar,attreq);undo;be;attreq;0;copybase;non;0<0;p;;erase;p;;-layout;d;BlockAB;setenv;cv;$(getenv,CreateViewports);;to;2,,,)$(nth,$(getenv,to),,,;to;3;;CreateViewports;0;-layout;n;BlockAB;;s;BlockAB;pasteblock;non;0<0;zoom;a;explode;l,,)$(nth,$(getenv,to),,,,;to;4;select;l;;setenv;to;3;ucs;ob;l;erase;l;;-insert;$(getenv,okbl);s;1;r;-45;non;0<0;ucs;p;copybase;non;0<0;l;;erase;l;;-layout;s;Model;pasteclip;non;0<0;-layout;s;BlockAB,)$(nth,$(getenv,to),,,,,-layout;s;Model;;d;BlockAB;setenv;CreateViewports;$(getenv,cv);attreq;$(getenv,areq);id;^C;^Z^x置換完了^x)^M

今まで新しいシートにAを基点コピーして、ブロックエディタで基点コピーしたBを貼付け、RENAMEで名前変更し、元の図面に戻してました。
※BLOCKREPLACEは何故か置き換えできませんでした。
-45°角度なしで、置換はできますか?
よろしくお願いいたします。
  • みるきー
  • 2024/01/23 (Tue) 13:25:55
Re: ブロック置換
AutoCAD2022では、動作します。

元のトピックで描かれている手順で操作していますか?
示されたマクロの「置換ブロック名記入」部分を、置換したいブロック名Aに書き換えていますか?
置換したいブロックを選択してから、マクロを起動していますか?

また、-45°角度なしにするには、
$(getenv,okbl);s;1;r;-45;non;0<0; → $(getenv,okbl);s;1;r;0;non;0<0;
と書き換えてください。
  • LUNE
  • 2024/01/23 (Tue) 20:49:59
Re: ブロック置換
lispなら。

ブロックBを適当な場所に挿入しておく。

lispを走らせたら、ブロックBをクリック
Bに置き換えたいブロックを選択。(窓選択などでブロック以外の物も一緒に選択しても構わないが、ブロックAでもCでもDでも、ブロックは全てBに置き変わるので注意)


(defun C:BlockA2B (/ ent bn ss n1 count)
(if (setq ent (entget (car (entsel "\nブロックBを選択: "))))
(if (= (cdr (assoc 0 ent)) "INSERT")
(progn
(setq bn (cdr (assoc 2 ent)))
(princ "\nブロックAを選択: ")
(if (setq ss (ssget '((0 . "INSERT"))))
(progn
(setq count 0)
(repeat (sslength ss)
(setq n1 (entget (ssname ss count)))
(setq n1 (subst (cons 2 bn) (assoc 2 n1) n1))
(entmod n1)
(setq count (1+ count))
)
)
)
)
)
)
(princ)
)

  • 通りすがりの人
  • 2024/01/24 (Wed) 08:07:07
Re: ブロック置換
返信ありがとうございます。

1)ブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]
 ・左クリックまたはEscでキャンセル
 ・右クリックまたはEnterでマクロ実行開始

置換完了で終了となります。
こちらの手順で試してみました。

LUNE様のマクロ試してみたのですが、うまく作動しませんでした。
コマンド:
コマンド:
コマンド: setenv
変数名を入力: to
値 <0>: 0
コマンド:
コマンド:
SETENV
変数名を入力: okbl
値 <「2」>: 「2」
コマンド:
コマンド: ray
始点を指定: *削除*
*削除*
ブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]*削除*
ブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]
通過点を指定:
コマンド: u
ブロック置換
コマンド:
コマンド:
U
グループ
コマンド: *削除*
U
CLOSE
コマンド:

通りすがりの人様
lispも試してみたのですが、うまくい作動できませんでした。
考えてくださったのに申し訳ございません。
  • みるきー
  • 2024/01/24 (Wed) 09:32:31
Re: ブロック置換
*^C^C$M=setenv;to;0;$(nth,$(getenv,to),;okbl;B;ray;^x^xブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]^x\$M="""$(if,$(getvar,cmdactive),;u;^C;^Z^X,setenv;to;1)""",,,,)$(nth,$(getenv,to),,;areq;$(getvar,attreq);undo;be;attreq;0;copybase;non;0<0;p;;erase;p;;-layout;d;BlockAB;setenv;cv;$(getenv,CreateViewports);;to;2,,,)$(nth,$(getenv,to),,,;to;3;;CreateViewports;0;-layout;n;BlockAB;;s;BlockAB;pasteblock;non;0<0;zoom;a;explode;l,,)$(nth,$(getenv,to),,,,;to;4;select;l;;setenv;to;3;ucs;ob;l;erase;l;;-insert;$(getenv,okbl);s;1;r;0;non;0<0;ucs;p;copybase;non;0<0;l;;erase;l;;-layout;s;Model;pasteclip;non;0<0;-layout;s;BlockAB,)$(nth,$(getenv,to),,,,,-layout;s;Model;;d;BlockAB;setenv;CreateViewports;$(getenv,cv);attreq;$(getenv,areq);id;^C;^Z^x置換完了^x)^M

上記のマクロを、再度貼り付けてみてください。
前後に余計なスペースなどがないか、確認をお願いします。

コマンドラインを見ると、toが1以降進んでないようです。
置き換え後のブロック名は「2」ということですよね?
  • LUNE
  • 2024/01/24 (Wed) 11:11:27
Re: ブロック置換
ダイナミックブロックや属性定義を含むブロックでは、試していませんのでうまくいかないかもしれません。
他にも何かの設定の影響かもしれません。

新規図面に簡単なブロックを作成して試した限りでは、うまくいきます。
  • 通りすがりの人
  • 2024/01/24 (Wed) 11:19:29
Re: ブロック置換
ご返信マクロありがとうございます。
LUME様

*^C^C$M=setenv;to;0;$(nth,$(getenv,to),;okbl;B;ray;^x^xブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]^x\$M="""$(if,$(getvar,cmdactive),;u;^C;^Z^X,setenv;to;1)""",,,,)$(nth,$(getenv,to),,;areq;$(getvar,attreq);undo;be;attreq;0;copybase;non;0<0;p;;erase;p;;-layout;d;BlockAB;setenv;cv;$(getenv,CreateViewports);;to;2,,,)$(nth,$(getenv,to),,,;to;3;;CreateViewports;0;-layout;n;BlockAB;;s;BlockAB;pasteblock;non;0<0;zoom;a;explode;l,,)$(nth,$(getenv,to),,,,;to;4;select;l;;setenv;to;3;ucs;ob;l;erase;l;;-insert;$(getenv,okbl);s;1;r;0;non;0<0;ucs;p;copybase;non;0<0;l;;erase;l;;-layout;s;Model;pasteclip;non;0<0;-layout;s;BlockAB,)$(nth,$(getenv,to),,,,,-layout;s;Model;;d;BlockAB;setenv;CreateViewports;$(getenv,cv);attreq;$(getenv,areq);id;^C;^Z^x置換完了^x)^M

頂いたマクロ試したのですが、うまく作動しませんでした。
おっしゃる通りです。Aのブロックを1、Bのブロックを2という名前で登録しております。

コマンド:
コマンド:
コマンド:
コマンド: setenv
変数名を入力: to
値 <0>: 0
コマンド:
コマンド:
SETENV
変数名を入力: okbl
値 <B>: B
コマンド:
コマンド: ray
始点を指定: *削除*
*削除*
ブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]*削除*
ブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]
通過点を指定:
コマンド: u
ブロック置換
コマンド:
コマンド:
U
グループ
コマンド: *削除*
U
INTELLIZOOM

通りすがりの人様
かしこまりました。
簡単なブロックの時使用させていただきます。
ありがとうございました。
  • みるきー
  • 2024/01/24 (Wed) 13:32:51
Re: ブロック置換
すみません、私の出したマクロは、みるきーさんのブロック名に合わせるのを忘れていますね。
okbl;B; → okbl;2; にしても、ダメでしょうか。

でも、ブロック名が異なった場合に出るコマンドラインともちょっと異なるのですよね・・・
  • LUNE
  • 2024/01/24 (Wed) 15:46:03
Re: ブロック置換
ご返信ありがとうございます。
ややこしくてすいません。

*^C^C$M=setenv;to;0;$(nth,$(getenv,to),;okbl;2;ray;^x^xブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]^x\$M="""$(if,$(getvar,cmdactive),;u;^C;^Z^X,setenv;to;1)""",,,,)$(nth,$(getenv,to),,;areq;$(getvar,attreq);undo;be;attreq;0;copybase;non;0<0;p;;erase;p;;-layout;d;Block12;setenv;cv;$(getenv,CreateViewports);;to;2,,,)$(nth,$(getenv,to),,,;to;3;;CreateViewports;0;-layout;n;Block12;;s;Block12;pasteblock;non;0<0;zoom;a;explode;l,,)$(nth,$(getenv,to),,,,;to;4;select;l;;setenv;to;3;ucs;ob;l;erase;l;;-insert;$(getenv,okbl);s;1;r;0;non;0<0;ucs;p;copybase;non;0<0;l;;erase;l;;-layout;s;Model;pasteclip;non;0<0;-layout;s;Block12,)$(nth,$(getenv,to),,,,,-layout;s;Model;;d;Block12;setenv;CreateViewports;$(getenv,cv);attreq;$(getenv,areq);id;^C;^Z^x置換完了^x)^M

okbl;B; → okbl;2;変更しましたがうまく作動しませんでした。

ブロックの名前変更で1→A 2→Bに変更しましたがうまく作動しませんでした。

*^C^C$M=setenv;to;0;$(nth,$(getenv,to),;okbl;B;ray;^x^xブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]^x\$M="""$(if,$(getvar,cmdactive),;u;^C;^Z^X,setenv;to;1)""",,,,)$(nth,$(getenv,to),,;areq;$(getvar,attreq);undo;be;attreq;0;copybase;non;0<0;p;;erase;p;;-layout;d;BlockAB;setenv;cv;$(getenv,CreateViewports);;to;2,,,)$(nth,$(getenv,to),,,;to;3;;CreateViewports;0;-layout;n;BlockAB;;s;BlockAB;pasteblock;non;0<0;zoom;a;explode;l,,)$(nth,$(getenv,to),,,,;to;4;select;l;;setenv;to;3;ucs;ob;l;erase;l;;-insert;$(getenv,okbl);s;1;r;0;non;0<0;ucs;p;copybase;non;0<0;l;;erase;l;;-layout;s;Model;pasteclip;non;0<0;-layout;s;BlockAB,)$(nth,$(getenv,to),,,,,-layout;s;Model;;d;BlockAB;setenv;CreateViewports;$(getenv,cv);attreq;$(getenv,areq);id;^C;^Z^x置換完了^x)^M

コマンド:
コマンド:
コマンド: setenv
変数名を入力: to
値 <0>: 0
コマンド:
コマンド:
SETENV
変数名を入力: okbl
値 <B>: B
コマンド:
コマンド: ray
始点を指定: *削除*
*削除*
ブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]*削除*
ブロック置換を実行しますか?[いいえ(Lc)/はい(Rc)]
通過点を指定:
コマンド: u
ブロック置換
グループの開始点が見つかりました。
さらに戻るには UNDO[元に戻す]/終了(E) オプションを使用してください。
コマンド:
コマンド:
U
グループ
コマンド: *削除*
U
INTELLIZOOM INTELLIZOOM INTELLIZOOM
  • みるきー
  • 2024/01/24 (Wed) 16:20:37
Re: ブロック置換
マクロがうまく動かないようなので、通りすがりの人様のLispを少し変更して、属性定義を含むブロックに対応してみました。どうでしょうか。

(defun C:BlockA2BR (/ ent bn ss n1 count pt sc ang #attreq)
(if (setq ent (entget (car (entsel "\nブロックBを選択: "))))
(progn
(setq #attreq (getvar "attreq"))
(setvar "attreq" 0)
(command-s "ucs" "W")
(if (= (cdr (assoc 0 ent)) "INSERT")
(progn
(setq bn (cdr (assoc 2 ent)))
(princ "\nブロックAを選択: ")
(if (setq ss (ssget '((0 . "INSERT"))))
(progn
(setq count 0)
(repeat (sslength ss)
(setq n1 (entget (ssname ss count)))
(setq pt (cdr (assoc 10 n1)))
(setq sc (cdr (assoc 41 n1)))
(setq ang (cdr (assoc 50 n1)))
(setq ang (Radian->Degrees ang))
(command-s "-insert" bn "s" sc "r" ang "non" pt)
(entdel (ssname ss count))
(setq count (1+ count))
)
)
)
)
)
)
)
(setvar "attreq" #attreq)
(command-s "ucs" "P")
(princ)
)

(defun Radian->Degrees (nbrOfRadians)
(* 180.0 (/ nbrOfRadians pi))
)
  • LUNE
  • 2024/01/24 (Wed) 17:29:29
Re: ブロック置換
ご返信作成ありがとうございます。
Lisp新しいシートに移したらできました。
作って頂き、ありがとうございました。

過去ログを遡ってみたら、Lon様のマクロがありこちらのマクロはうまく置換できました。

^C^CSELECT;\SETENV;変更前;\;変更後;\ERASE;P;;UNDO;BE;OOPS;-RENAME;B;$M=$(GETENV,変更後);HOGEHOGE;;B;$(GETENV,変更前);$(GETENV,変更後);COPYBASE;NON;0,0;P;;UNDO;E;U;PASTECLIP;NON;0,0^M
  • みるきー
  • 2024/01/25 (Thu) 11:04:35
Re: ブロック置換
確認不足で申し訳ございません。
両方使用させていただきます。
ありがとうございました。
  • みるきー
  • 2024/01/25 (Thu) 11:06:44

返信フォーム






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