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

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

マクロの文法について教えてください。
マクロの文法についてご教授頂きたく、宜しくお願い致します。
nthについてですが、マクロの文字数の制限からnthでマクロを分割する技法を用いられていると思います。
決して揚げ足という意味ではなく、マクロの勉強のために、マクロ集を分析していて疑問に感じたことをご教授願えないでしょうか?
120.ストレッチ(2006以後版)ですが、nthの3番目の記述がなく、カンマの数も7番目があるものとないものがあるような気がします。これは、意図的なものでしょうか?私のカウントの考え方が間違えていますでしょうか?
教えて頂けないでしょうか?
悪意は無いことをご理解頂ければ幸いです。

  • わん
  • MAIL
  • 2017/12/22 (Fri) 13:32:41
Re: マクロの文法について教えてください。
おじゃまします。

まずは、マクロを「$(nth,」が有る場所で改行してみます。

*^C^C$m=setenv;to;0;
$(nth,$(getenv,to),offset;;^Xオブジェクトを選択^X\;undo;be;setenv;to;1;select;non;@;non;@;;setenv;to;4,undo;m;stretch;c;non;@;'setenv;to;2;\r,,,,,)
$(nth,$(getenv,to),,,offset;;^Xオブジェクトを選択:[UNDO(R)]^X\$M="""$(if,$(getvar,cmdactive),;setenv;to;1;select;non;@;non;@;;setenv;to;4,undo;b;setenv;to;2)""",,,,)
$(nth,$(getenv,to),,,,,;p1;$(getvar,lastpoint);;to;5;undo;m;select;c;end+ins+nod;@;end+ins+nod;@;r;$(getvar,lastpoint);;setenv;to;6,stretch;c;end+ins+nod;@;end+ins+nod;@;;end+ins+nod;@;\setenv;to;2,,)
$(nth,$(getenv,to),,,,,,,-layer;n;s-damy;;chprop;p;;la;s-damy;;-layer;LO;s-damy;;stretch;c;end+ins+nod;@;end+ins+nod;@;;end+ins+nod;@;'-layer;u;s-damy;;--キャンセル不可--[UNDO(R)]^X\setenv;to;7,)
$(nth,$(getenv,to),,,,,,,,copybase;non;0<0;p;;undo;b;erase;non;$(getenv,p1);;pasteclip;non;0<0;setenv;to;2)^M

次に、$(nth,$(getenv,to),以降でネストされていないカンマ部分で改行してみます。

*^C^C$m=setenv;to;0;
$(nth,$(getenv,to),offset;;^Xオブジェクトを選択^X\;undo;be;setenv;to;1;select;non;@;non;@;;setenv;to;4
,undo;m;stretch;c;non;@;'setenv;to;2;\r,,,,,)
$(nth,$(getenv,to),,,offset;;^Xオブジェクトを選択:[UNDO(R)]^X\$M="""$(if,$(getvar,cmdactive),;setenv;to;1;select;non;@;non;@;;setenv;to;4,undo;b;setenv;to;2)""",,,,)
$(nth,$(getenv,to),,,,,;p1;$(getvar,lastpoint);;to;5;undo;m;select;c;end+ins+nod;@;end+ins+nod;@;r;$(getvar,lastpoint);;setenv;to;6
,stretch;c;end+ins+nod;@;end+ins+nod;@;;end+ins+nod;@;\setenv;to;2,,)
$(nth,$(getenv,to),,,,,,,-layer;n;s-damy;;chprop;p;;la;s-damy;;-layer;LO;s-damy;;stretch;c;end+ins+nod;@;end+ins+nod;@;;end+ins+nod;@;'-layer;u;s-damy;;--キャンセル不可--[UNDO(R)]^X\setenv;to;7,)
$(nth,$(getenv,to),,,,,,,,copybase;non;0<0;p;;undo;b;erase;non;$(getenv,p1);;pasteclip;non;0<0;setenv;to;2)^M

これで1段落づつに分けられました。
分かり易い様に頭に、$(nth,$(getenv,to),を追加します。 お尻もカッコでくくります。

*^C^C$m=setenv;to;0;
$(nth,$(getenv,to),offset;;^Xオブジェクトを選択^X\;undo;be;setenv;to;1;select;non;@;non;@;;setenv;to;4,,,,,,)
$(nth,$(getenv,to),,undo;m;stretch;c;non;@;'setenv;to;2;\r,,,,,)
$(nth,$(getenv,to),,,offset;;^Xオブジェクトを選択:[UNDO(R)]^X\$M="""$(if,$(getvar,cmdactive),;setenv;to;1;select;non;@;non;@;;setenv;to;4,undo;b;setenv;to;2)""",,,,)
$(nth,$(getenv,to),,,,,;p1;$(getvar,lastpoint);;to;5;undo;m;select;c;end+ins+nod;@;end+ins+nod;@;r;$(getvar,lastpoint);;setenv;to;6,,,)
$(nth,$(getenv,to),,,,,,stretch;c;end+ins+nod;@;end+ins+nod;@;;end+ins+nod;@;\setenv;to;2,,)
$(nth,$(getenv,to),,,,,,,-layer;n;s-damy;;chprop;p;;la;s-damy;;-layer;LO;s-damy;;stretch;c;end+ins+nod;@;end+ins+nod;@;;end+ins+nod;@;'-layer;u;s-damy;;--キャンセル不可--[UNDO(R)]^X\setenv;to;7,)
$(nth,$(getenv,to),,,,,,,,copybase;non;0<0;p;;undo;b;erase;non;$(getenv,p1);;pasteclip;non;0<0;setenv;to;2)^M

うん。あってるみたいですね。

ヘルプ等を見ると、
$(nth, which, arg0 , arg1 , arg2 , arg3 , arg4 , arg5 , arg6 , arg7)
これが本来の使い方。
でもこれが長すぎる場合、途中でマクロを分割させます。

$(nth, which, arg0 , arg1 , arg2 , arg3 , arg4 , arg5) $(nth, which, , , , , , , arg6 , arg7)
例えば、which=1だった場合、前半の$(nth, which, arg0 , arg1 , arg2 , arg3 , arg4 , arg5)にはarg1の命令が有るのでそれを実行するが、後半の$(nth, which, , , , , , , arg6 , arg7)は命令が無いので素通り。
そして、which=6だった場合、前半の$(nth, which, arg0 , arg1 , arg2 , arg3 , arg4 , arg5)は命令が無いので素通りし、後半の$(nth, which, , , , , , , arg6 , arg7)にはarg6の命令が有るのでそれを実行。

まだ文字数が多いなら、もう一か所分割・・・と繰り返し全部分割してしまうと、

$(nth,which,arg0)$(nth,which,,arg1)$(nth,which,,,arg2)$(nth,which,,,,arg3)$(nth,which,,,,,arg4)$(nth,which,,,,,,arg5)$(nth,which,,,,,,,arg6)$(nth,which,,,,,,,,arg7)
となる訳です。

改行入れると
$(nth,which,arg0)
$(nth,which,,arg1)
$(nth,which,,,arg2)
$(nth,which,,,,arg3)
$(nth,which,,,,,arg4)
$(nth,which,,,,,,arg5)
$(nth,which,,,,,,,arg6)
$(nth,which,,,,,,,,arg7)
こうなります。

分かり易くするため? 最後にもカンマを足します。

$(nth,which,arg0,,,,,,,)
$(nth,which,,arg1,,,,,,)
$(nth,which,,,arg2,,,,,)
$(nth,which,,,,arg3,,,,)
$(nth,which,,,,,arg4,,,)
$(nth,which,,,,,,arg5,,)
$(nth,which,,,,,,,arg6,)
$(nth,which,,,,,,,,arg7)

つまり、文字数が多くない物を無理やり区切って段落分けする必要は無いんです。
1段落づつに区切った方が解析する人は見易いかもしれませんが、作る方はどっちでもいいです。
1段落づつに区切る事で、総文字数が増えてしまうデメリットもあります。
  • Lon
  • 2017/12/22 (Fri) 16:52:13
Re: マクロの文法について教えてください。
上の文章、自動改行が入らない様にブラウザを最大化してみた方が読みやすいですよ。
  • Lon
  • 2017/12/22 (Fri) 16:58:50
Re: マクロの文法について教えてください。
ちょっと追記
$(nth, which, arg0 , arg1 , arg2 , arg3 , arg4 , arg5) $(nth, which, , , , , , arg6 , arg7 , arg8)と書くと、
which=5だった場合、前半の$(nth, which, arg0 , arg1 , arg2 , arg3 , arg4 , arg5)ではarg5の命令が実行され、後半の$(nth, which, , , , , , arg6 , arg7 , arg8)ではarg6の命令が実行される。
つまり、両方が実行される結果になります。


$(nth,which,arg0,,,arg8,,,,)
$(nth,which,,arg1,,,,,,)
$(nth,which,,,arg2,,,arg11,,)
$(nth,which,,,,arg3,,,,)
$(nth,which,,,,,arg4,,,)
$(nth,which,,arg9,,,,arg5,,)
$(nth,which,,,,,,,arg6,)
$(nth,which,,,,,arg10,,,arg7)

こんな風に応用すれば、めちゃくちゃ複雑な処理も可能だし、更なる文字数削減も可能になったりしますが、頭が混乱します。
  • Lon
  • 2017/12/22 (Fri) 17:21:16
Re: マクロの文法について教えてください。
まだ解読できてないのですが、
このマクロ、toが7になることあります?
to=6の
$(nth,$(getenv,to),,,,,,,-layer;n;s-damy;;chprop;p;;la;s-damy;;-layer;LO;s-damy;;stretch;c;end+ins+nod;@;end+ins+nod;@;;end+ins+nod;@;'-layer;u;s-damy;;--キャンセル不可--[UNDO(R)]^X\setenv;to;7,)
でs-damyがロックされて、その後のstretchの選択で蹴られて、toは0になると思うんですが。

to=7で実行すると
$(NTH,??) $(NTH,??)と出てエラーにはなるのですが、エンターの数がちょうど良くて次のcopybaseが走るので
見かけ上エラーはないように見えますがnthの0,1のコンマが足りないのは間違いだと思います。
  • zukki-
  • 2017/12/22 (Fri) 18:12:43
Re: マクロの文法について教えてください。
皆様!丁寧にご回答ありがとうございます。
決して、間違いを指摘しようとしているのではなく、理解を深めようとしているだけと理解して頂ければ幸いです。

Lonの説明を確認させて頂くと
①$(nth,which,arg0)
②$(nth,which,,arg1)
③$(nth,which,,,,arg3)
④$(nth,which,,,,,arg4)
と記述すると、
質問A)Whichが、0の場合:①でarg0が実行して、②では、arg0が空欄なので事実上スキップ、以下③、④同じということで正しいのでしょうか?
質問B)whichが、3の場合:①で、カンマが足りないが、エラーとはならず、空欄と同じとみなして事実上スキップ、②も同じ。
             ③で、arg3がヒットして実行。④はスキップ(評価自体は行われている)
質問C)whichが、2の場合:①②③④どれもヒットしないので、何も実行されない
質問D)whichが、5の場合:①②③④すべてにカンマがないが、エラーにはならず、何も実行されない
ということでよろしでしょうか?
それとも、zukkiさんの仰る$(NTH,??) $(NTH,??)のようなエラーは、カンマが足りないと発生するのでしょうか?
自分で、確かめろと怒られそうですが、カスタマイズでマクロ登録していると、繰り返しに膨大な時間がかかってなかなか
進みません。zukkiさんに押して頂いたカスタマイズ方法を早く習得しなければ・・・

なんだか?個人授業みたいになってすみません!
  • わん
  • 2017/12/22 (Fri) 20:50:15
Re: マクロの文法について教えてください。
Lonさんへの敬称が抜けてしまっています。まことに申し訳ありません。
zukkiさんに押してではなく、教えてです。
  • わん
  • 2017/12/22 (Fri) 21:11:36
Re: マクロの文法について教えてください。
質問A)はそのとおりです。
質問B)はカンマが足りないと①と②が $(NTH,??) $(NTH,??) と展開されてエンター2回押したのと同じになります。
質問C)は①がエラーとなり$(NTH,??) エンター一回押されたようになり、ヒットしないのでそれで終わります。
質問D)は全部$(NTH,??)となり、エンターが4回発行される。

カンマが足りないと$(NTH,??)が出ます。
カンマの数を数えてあわせるのが面倒なので僕は
$(if,$(=,$(getenv,to),0),to;1)
$(if,$(=,$(getenv,to),1),to;2)
$(if,$(=,$(getenv,to),2),to;3)
$(if,$(=,$(getenv,to),3),to;4)
.
.
.

の折り返し使うことがありますが、本質はnth構文の折り返しと同じです。




  • zukki-
  • 2017/12/23 (Sat) 01:32:15
Re: マクロの文法について教えてください。
丁寧な御指導ありがとうございます。
一つ理解すると次々に疑問が出てきて、しかし、マクロは奥が深い!!
nthのカンマもネスティングだけ配慮すればよいと思っていたらそんなことはなく。
nullStringも;を入力すればよいと思っていたら・・・って感じです。

みなさん、やっぱりすごいですね!!

勉強になります。

ありがとうございました。
  • わん
  • 2017/12/23 (Sat) 09:02:34

返信フォーム






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