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

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

マクロについてアドバイスお願いいたします。
いつもお世話になっております。

下記のようなマクロを作成したのですが、動作途中で止まってしまいます。
おそらく文字数制限だと思うのですが、なにぶんマクロ初心者のため解決策を見出せずにいます。
アドバイスお願いいたします。

※やりたいこと※
①ばらばらに位置しているオブジェクトを指定した座標及び指定座標から一定の位置に移動させたい。
②オブジェクトの数は最低でも10個以上
③指定座標は一定数①の動作後に変更したい

※作成マクロ※

*^C^C_id;\_setenv;p1;$M=$(index,0,$(getvar,lastpoint));_setenv;p2;$M=$(index,1,$(getvar,lastpoint));_move;\;_mid;\"$M=$(getenv,p1),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),169),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),338),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),507),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),676),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),845),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),1014),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),1183),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),1352),$(getenv,p2)";_move;\;_mid;\"$M=$(+,$(getenv,p1),1521),$(getenv,p2)";

環境はLT2019です。
初歩的な質問で申し訳ありませんが、ご教示お願いいたします。
  • motaro
  • 2020/03/13 (Fri) 12:10:06
Re: マクロについてアドバイスお願いいたします。
ご提示のマクロを改行入れて見やすくして。
*^C^C_id;\_setenv;p1;$M=$(index,0,$(getvar,lastpoint));_setenv;p2;$(index,1,$(getvar,lastpoint));
_move;\;_mid;\"$M=$(getenv,p1),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),169),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),338),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),507),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),676),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),845),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),1014),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),1183),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),1352),$(getenv,p2)";
_move;\;_mid;\"$M=$(+,$(getenv,p1),1521),$(getenv,p2)";



169ピッチで10回移動してるので、その様にループするマクロにしてみました。
10回移動したら、指定座標指示に戻る
*^C^C$M=setenv;to;0;;cnt;0;$(nth,$(getenv,to),id;\;non;@169<180;setenv;cnt;0;;to;1,)$(nth,$(getenv,to),,select;\move;p;;_mid;\non;$(+,$(index,0,$(getvar,lastpoint)),169)","$(index,1,$(getvar,lastpoint));setenv;cnt;$(+,$(getenv,cnt),1);;to;$(if,$(-,$(getenv,cnt),9),1,0))^M

x座標とy座標を分離しなくても、こんな方法でも出来たりします。
*^C^C$M=setenv;to;0;;cnt;0;$(nth,$(getenv,to),id;\;non;@169<180;setenv;cnt;0;;to;1,)$(nth,$(getenv,to),,select;\move;p;;_mid;\from;$(getvar,lastpoint);@169<0;setenv;cnt;$(+,$(getenv,cnt),1);;to;$(if,$(-,$(getenv,cnt),9),1,0))^M

回数が不確定ならこれで。(適当なとことでESCすれば終了)
*^C^C$M=setenv;to;0;$(nth,$(getenv,to),id;\;non;@169<180,)$(nth,$(getenv,to),,select;\move;p;;_mid;\from;$(getvar,lastpoint);@169<0);setenv;to;1^M

更に、169というピッチを可変にしたいなら、初めにピッチ指定を追加
*^C^C$M=setenv;to;0;$(nth,$(getenv,to),;ピッチ;\id;\;non;@$M="""$(getenv,ピッチ)"""<180,)$(nth,$(getenv,to),,select;\move;p;;_mid;\from;$(getvar,lastpoint);@$(getenv,ピッチ)<0);setenv;to;1^M
  • Lon
  • 2020/03/13 (Fri) 14:10:15
Re: マクロについてアドバイスお願いいたします。
Lonさま

さっそくの作成ありがとうございます。
こんなに早くしかも複数パターンを作成できるとは・・・うらやましい限りです。

まだまだ未熟でnthもほとんど理解できていないのですが、参考までに教えていただければ幸いです。
作成いただいた二つ目のマクロは簡単にいうと、どういうカラクリなのでしょうか?
部分部分では何を行っているのか理解できるところもあるのですが、全体を通してみるとまだまだ理解できませんでした。。
本当は「全て」を「細かく」お聞きしたいのですが(笑)
そういうわけにもいきませんので、簡単に教えて頂ければ幸いです。

宜しくお願いいたします。

  • motaro
  • 2020/03/13 (Fri) 16:23:24
Re: マクロについてアドバイスお願いいたします。
ザックリで説明すると、1個目と2個目の違いは、
1個目は次の点を指示するのに座標で指示している。
2個目は次の点を指示するのに移動距離&方角で指示している。

そしてあなたのマクロとの違いは、
初めに指示した点がずっと基準点。

移動する度にその移動先が基準点として更新される。


では2個目のマクロを説明します。
マクロは2段落になっています。

①*^C^C$M=setenv;to;0;;cnt;0;$(nth,$(getenv,to),id;\;non;@169<180;setenv;cnt;0;;to;1,)
②$(nth,$(getenv,to),,select;\move;p;;_mid;\from;$(getvar,lastpoint);@169<0;setenv;cnt;$(+,$(getenv,cnt),1);;to;$(if,$(-,$(getenv,cnt),9),1,0))^M

①段落目は基準点指示です。
id;\で基準点指示をした後、[id];non;@169<180;で、基準点から逆に1ピッチ移動した点を指示しています。
これは、移動処理をループ化したために発生した余計な処理です。
CAD処理的には余計な操作ですが、マクロ構文を短くすることができます。

そのあとの、
setenv;cnt;0は10回で処理を切り上げさせる為の、カウントを初期値0にする操作です。
[setenv];to;1は②段落目に行け。という指示。(0から始まるので、0が①で 1が②)

②段落目は移動
select;\で移動するオブジェクトを選択。
move;p;;_mid;\from;$(getvar,lastpoint);@169<0;が移動。
p;;は、select;\で選択したオブジェクトをもう一度選びなさいという意味。
from;$(getvar,lastpoint);@169<0;は、lastpointから、0°方向に169行った点。

で、lastpointがどこか?が重要になってくるのですが、mid;\で指示した点ではありません。
$(getvar,lastpoint)の前直近の$M=の時点での最後の指示点。
つまり、1段落前の[id];non;@169<180;で指示した点です。
そこから、0°方向に169行った点だから、id;\で指示した基準点となる訳です。

setenv;cnt;$(+,$(getenv,cnt),1);は1個目を移動したのでカウントを1進めなさい。(cntに1を足しなさい)
[setenv];to;$(if,$(-,$(getenv,cnt),9),1,0)は、cntが9(正確には cnt-9=0)なら、
①段落目に戻れ、cntが9以外なら②段落にループして次のオブジェクトを選べ。

まだ1個しか移動していないので、カウント(cnt)は1。②をループします。

select;\で移送するオブジェクトを選択。
move;p;;_mid;\from;$(getvar,lastpoint);@169<0;が移動。

で、この時のlastpointは、直近の$M=の時点での最後の指示点なので、
1回目の②でのfrom;$(getvar,lastpoint);@169<0;になります。

以降、cntが9になるまでループを繰り返すわけですが、
setenv;cnt;$(+,$(getenv,cnt),1)でcntが9になれば即ループ終了ではありません。まだ9個しか移動してませんから。
(if,$(-,$(getenv,cnt),9)この時のcntはその直近の$M=の時点でのcnt値です。
ですから、8個目を処理した後でcntに1を足した値=8なのです。

もう一度ループして10個目を処理すれば、その後にcntが10になりますが、
その後の$(getenv,cnt)で読み込まれるcntは10になる前の9です。

文章で書いても理解できないかな~。(多分、ここが難しいんですよね?)
$(xxx,xxx)は、それを計算する・値を呼び出すタイミングは、$(xxx,xxx)が出てきた時ではありません。
その直前に通過した$M=がトリガーとなります。

例えばこんなマクロを実行します。
setenv;p1;1;setenv;p1;2;setenv;p1;3;setenv;p1;4;$M=setenv;p1;5;setenv;p1;6;$(getenv,p1)
実行後にコマンドラインの最終行に表示されるのは4です。
$M=を通過した時点でのp1の値を呼び出しているからです。


この事が判れば、大体のマクロは読み取れるようになります。(知らないコマンドはヘルプで調べて)
lastpointを時間差で呼び出すことが出来るのと、
次の移動点を前の点からの相対座標に切り替えることで、
基準点をp1、p2といった変数に仮置きしておく必要がなくなります。
  • Lon
  • 2020/03/13 (Fri) 17:55:26
Re: マクロについてアドバイスお願いいたします。
Lonさま

ご丁寧に解説いただきありがとうございます。

正直一発読みで理解は中々できるレベルにはありませんので、じっくり何度か読み返したいとおもいます。
また何かご相談があるときは宜しくお願いいたします。
  • motaro
  • 2020/03/16 (Mon) 11:12:10

返信フォーム






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