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

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

setenvについて
はじめまして。最近autocadを勉強し始めたものです。

今同じ動作を任意の数だけ繰り返し、最後に違う動作を行う、というマクロを組むために少しずつ拡張させようとしているのですが、
setenvで値を設定後、「;^C」で繰り返しマクロを抜けようと思っても抜け出すことができません。(最後は手動でEnterを押して終了させています)
なぜでしょうか?もしよろしければ理由を教えて下さい。

以下がマクロの内容と表示結果です。

*^C^C$M=$(if,$(eq,$(getenv,to),0),$M=$(if,$(<,$(getenv,cnt),2),setenv;cnt;"$(+,$(getenv,cnt),1)",setenv;to;1;^C),_setenv;to;0;setenv;cnt;1;)^M

コマンド: _setenv
変数名を入力: to
値 <1>: 0
コマンド: setenv
変数名を入力: cnt
値 <2>: 1
コマンド:
SETENV
変数名を入力:
コマンド:
コマンド:
コマンド: setenv
変数名を入力: cnt
値 <1>: 2
コマンド:
コマンド:
コマンド: setenv
変数名を入力: to
値 <0>: 1
コマンド:
コマンド:
SETENV
変数名を入力:

バージョンはautocad lt 2014です。よろしくお願いします。
  • atsu
  • 2016/12/02 (Fri) 13:57:17
Re: setenvについて
詳しく説明するのは難しいですが
^Cはキャンセルの意味ですが
nth構文内では、マクロが停止しません。

マクロ講座
■中級 4.制御文字
http://ameblo.jp/totthi-macro/entry-11075569354.html

こちらにも記載していますが
^Zは「メニュー項目の終わりに対する[Spacerbar]の自動追加を抑止」です。

つまり
^Cだけで終わらせようとすると、自動でエンターが追加される(違ったらすみません)

これを改善するには
自分も良く使っていますが (145.選択画層以外グレー表示マクロなど)

^Cid;^Z

とすることで、マクロを終了させれます。

id;は、直前のコマンドによっては不要です。
マクロ終了後に謝ってエンターを押した場合などの為に
問題無いコマンド「id」を入れているだけです。

お試しください。



  • とってぃ
  • 2016/12/02 (Fri) 14:40:19
Re: setenvについて
早急なご回答ありがとうございます。

早速上記の内容を確認し、色々試してみたのですが、特に状況が変わりません。
私の認識が誤っているのだと思いますが、いまいち変更点がわかりません。上記のマクロを

*^C^C$M=$(if,$(eq,$(getenv,to),0),$M=$(if,$(<,$(getenv,cnt),2),setenv;cnt;"$(+,$(getenv,cnt),1)"^Z,setenv;to;1;^Cid;^Z),_setenv;to;0;setenv;cnt;1;^Z)^M

のように修正してみましたが、結果が変わりません。
idのメニューは表示されないのですが、依然としてidの前にあるsetenvのコマンドが残り、変数名の入力を要求されます。

以下が実行時のメッセージです。

コマンド: _setenv
変数名を入力: to
値 <1>: 0
コマンド: setenv
変数名を入力: cnt
値 <2>: 1
コマンド:
SETENV
変数名を入力:
コマンド:
コマンド:
コマンド: setenv
変数名を入力: cnt
値 <1>: 2
コマンド:
コマンド:
コマンド: setenv
変数名を入力: to
値 <0>: 1
コマンド:
コマンド: id
点を指定:

もし、上記のマクロを変更するならば、どのように変更するべきでしょうか?
何度も質問をしてしまい、申し訳ありません
  • atsu
  • 2016/12/02 (Fri) 15:32:07
Re: setenvについて

上記のマクロの流れですと

-------------------------------------
コマンド: setenv
変数名を入力: to
値 <0>: 1
コマンド:
コマンド: id
点を指定:
-------------------------------------
で、
マクロがちゃんと終了しているように見えるのですが?
  • とってぃ
  • 2016/12/02 (Fri) 16:02:50
Re: setenvについて
申し訳ありません。間違えました。
上記の結果ですと、8行目のcntに1を設定するところでsetenvが呼び出されていました。

後ろ側の
setenv;cnt;1;^Z)^M

setenv;cnt;1;id;^Z)^M
に変更することで解決しました。
お騒がせいたしました。ありがとうございます。
  • atsu
  • 2016/12/02 (Fri) 16:10:18
Re: setenvについて
今じっくり見ました。

余計な部分に^Zが付いていますね。
エンターが2回押されていた状態となってますよ。

最後の部分の
,_setenv;to;0;setenv;cnt;1;^Z)^M
     ↓
,_setenv;to;0;setenv;cnt;1)^M

また、他の部分でも^Zを使用しているみたいですが、不要です。
通常のエンターは「;」で十分です。

ちょっと直してみますと
*^C^C$M=$(if,$(eq,$(getenv,to),0),$M=$(if,$(<,$(getenv,cnt),2),setenv;cnt;"$(+,$(getenv,cnt),1)",setenv;to;1;^Cid;^Z),_setenv;to;0;setenv;cnt;1)^M
こんな感じです。

全てに「id;^Z」を使う必要もありません。


尚、このマクロを
こちらで試すと、常時ループとなるようです。
若干構文に問題があります。


  • とってぃ
  • 2016/12/02 (Fri) 16:18:59
Re: setenvについて
ちょっと気になったので、横入り失礼します。

まず、

このマクロを初めて使う場合、to=0、cnt=0の状態から始まってしまうので、
cnt=1にするリセット処理が行われないまま実行され、1ループで終わりたいところが2ループしてしまう。

なので、リセット処理はcnt=0とするべきだと思う。

また、このマクロ以外でtoを使う場合、to=0で終了していれば、
cntがどんな値であれ、cntをリセットする処理が行われまいままマクロが実行される。
※とってぃさんが提供しているマクロの大半はto=0の状態でマクロを終了させる様に仕組んであります。

具体的に実行したいコマンドが盛り込まれていないので、よく分からないのですが、
今のマクロの処理だけなら、^Cの位置を見直せば^Zなんて必要ないし、評価の遅延の必要も無いと思う。

if構文を分割して考えれば、最後の^Mが3つのコマンドに作用していることに気が付くと思います。
そうすれば、やりたいことは出来るのではないかな?(簡単な処理なら。)
  • Lon
  • 2016/12/05 (Mon) 11:20:30
Re: setenvについて
とってぃさん、Lonさん返信有難う御座います。

やりたいこととしては、

①多重ブロックを全て分解
②分解したオブジェクトの線種、色などをbyblockに
③再度ブロック化

です。

そのためにif文を用いてループを行い10回ほど分解したのち、②、③の動作を実行するつもりでした。

^Zや変数回りがまだ理解できていないみたいですので、勉強し直してからてじゅんを考えてたいと思います。

ありがとうございました。
  • atsu
  • 2016/12/06 (Tue) 09:46:42
Re: setenvについて
作業内容が違いますがマクロの流れはこんな感じですかね?(〇を3個書いたら、線を1本書いて終わり)
*^C^C$M=$(if,$(eq,$(getenv,to),0),$(if,$(<,$(getenv,cnt),3),setenv;cnt;$(+,$(getenv,cnt),1);circle;\50,^Csetenv;to;1;line;\\),setenv;to;0;setenv;cnt;0)^M

〇を3個書く⇒10回分解
線を1本書く⇒Byblockにして再ブロック化

と変更すれば良いのかな。
  • Lon
  • 2016/12/06 (Tue) 10:22:47
Re: setenvについて
何度も申し訳ありません。

②、③の線種などの変更、再ブロック化はひとまず置いておいて、多重ブロックの分解のみを行うマクロを考えることにしました。

1.xplodeでall選択、gの一括,eの分解
2.cntに1加算
3.cntが10ならばcntを0にして^Cを入れ、ループを離脱する

という動作にしたいのですが、xplode実行後にマクロが終了してしまい、そもそもループされません。
他にも不備な点はあると思いますが、どのような修正をすればよろしいでしょうか?

もしよろしければ、修正案など教えて頂ければ幸いです。

以下がマクロです。

*^C^C_xplode;ALL;;G;E;setenv;cnt;$M=$(+,$(getenv,cnt),1)$M=$(if,$(<,$M="$(getenv,cnt)",10),,setenv;cnt;0;^C;id;^Z);^M

環境は前とかわらずautocad lt 2014です。

お手数おかけしますが、よろしくお願いします。
  • atsu
  • 2016/12/07 (Wed) 11:27:46
Re: setenvについて
ご提示のマクロ、
エンターの位置や数が間違ってます。不要な$M=や^Zも有るので書き換えるとこんな感じ。
*^C^C_xplode;ALL;;G;E;setenv;cnt;$M=$(+,$(getenv,cnt),1);$M=$(if,$(<,$"(getenv,cnt)",10),id;,setenv;cnt;0;^Cid;)^M

でも、これだと11回分解してしまいます。(遅延の指示がまずい)
また、^Cの位置を変えるとid;が不要になります。
それを反映させるとこんな感じ
*^C^C_xplode;ALL;;G;E;setenv;cnt;$M=$(+,$(getenv,cnt),1);$M="$(if,$(<,$(getenv,cnt),10),id;,^Csetenv;cnt;0)"^M

コマンドの順番を変えると遅延も必要なくなります。
*^C^C$M=$(if,$(<,$(getenv,cnt),10),_xplode;ALL;;G;E;setenv;cnt;$(+,$(getenv,cnt),1),^Csetenv;cnt;0)^M

>他にも不備な点はあると思いますが、
に関しては今回はノーコメント。
  • Lon
  • 2016/12/07 (Wed) 14:30:58
Re: setenvについて
↑でLonさんが解答されてますが
私の方も少しだけ

*^C^C_xplode;ALL;;G;E;setenv;cnt;$M=$(if,$(<,$(getenv,cnt),10),$(+,$(getenv,cnt),1),0;^Cid;^Z)^M

ご参考までに。
  • とってぃ
  • 2016/12/07 (Wed) 14:55:03
Re: setenvについて
Lonさん、とってぃさんご回答ありがとうございます。

DIESEL関数を使用する場合、記述の順番を変えることで評価を遅らせる必要のないわかりやすいマクロができるすね!

ですが、申し訳ありません。

御二方のマクロを使用して

ライン2本のブロックにもう1本のライン増やしてブロック化

した多重ブロックをとりあえず作成し、マクロを走らせてみたのですが、
やはり1回xplodeが動いた後、setenvまで行かずにマクロが終了してしまいます。

xplodeの仕様なのでしょうか?

以下が表示されたメッセージです。

コマンド: _xplode
拡張分解するオブジェクトを選択:
オブジェクトを選択: ALL
認識された数: 22
オブジェクトを選択:
22 個のオブジェクトが見つかりました。 16 個は無効です。
拡張分解 [個別(I)/一括(G)] <一括>: G
オプションを入力
[すべて(A)/色(C)/画層(LA)/線種(LT)/線の太さ(LW)/親ブロックから継承(I)/分解(E)] <分解>: E
オブジェクトは現在の空間にありません。
何も見つかりません。
*選択無効*
点を指定 または 最後(L)/すべて(ALL)/グループ(G)
オブジェクトは現在の空間にありません。
何も見つかりません。
*選択無効*
点を指定 または 最後(L)/すべて(ALL)/グループ(G)
オブジェクトは現在の空間にありません。
何も見つかりません。
*選択無効*
点を指定 または 最後(L)/すべて(ALL)/グループ(G)
オブジェクトは現在の空間にありません。
何も見つかりません。
*選択無効*
点を指定 または 最後(L)/すべて(ALL)/グループ(G)
オブジェクトは現在の空間にありません。
何も見つかりません。
*選択無効*
点を指定 または 最後(L)/すべて(ALL)/グループ(G)
オブジェクト 分解されました。
  • atu
  • 2016/12/09 (Fri) 11:58:02
Re: setenvについて
エラーでxplodeコマンドを抜けてないですよね。

  [すべて(A)/色(C)/画層(LA)/線種(LT)/線の太さ(LW)/親ブロックから継承(I)/分解(E)] <分解>: E
  オブジェクトは現在の空間にありません。

その図面に対して、xplodeコマンドだけを実行してみて下さい。
それでも同じエラーが出るなら、それを回避してください。
>オブジェクトは現在の空間にありません。
これが出ないように。
  • Lon
  • 2016/12/09 (Fri) 12:19:11
Re: setenvについて
ちなみに

自分の2013で多重ブロックを作って試すと動かなかったんですよねー
-----------------------------------------------------------------
コマンド: _xplode

拡張分解するオブジェクトを選択:
オブジェクトを選択: ALL
認識された数: 1

オブジェクトを選択:

1 個のオブジェクトが見つかりました。
オプションを入力
[すべて(A)/色(C)/画層(LA)/線種(LT)/線の太さ(LW)/親ブロックから継承(I)/分解(E)] <分解>: G

そのようなオプション キーワードはありません。
-----------------------------------------------------------------
こんな感じで。

xplodeコマンドの仕様なのか、多重ブロックを認識しない?



なので自分は

*^C^C_explode;ALL;setenv;cnt;$M=$(if,$(<,$(getenv,cnt),10),$(+,$(getenv,cnt),1),0;^Cid;^Z)^M

こちらで試してました。

  • とってぃ
  • 2016/12/09 (Fri) 12:54:37
Re: setenvについて
ありがとうございます。

Lonさんに修正して頂いたマクロを

_xplode;ALL;;G;E;

でなく

_xplode;\;E;

に変更するときちんとループが働いたので、
ALLでなく別の選択方法を考えてみます。
  • atu
  • 2016/12/09 (Fri) 13:05:18
Re: setenvについて
xplodeのGオプションは、ブロックが複数選択されていない時は出ませんからね。

なので、例えば10回分解を繰り返すうちに、ブロックの数が1個以下になってしまうとエラーです。

>他にも不備な点はあると思いますが、
の不備の一つですね。

とってぃさんの言われる様に、特にxplodeでなければならない理由が無いなら、explodeがいいんじゃないかな?
それでもブロックが0個になるとエラーなので、10回と回数を固定しないでやる方法を考えるのがベターですが、
それは、今の問題が解決してからの、次の段階ですかに。
  • Lon
  • 2016/12/09 (Fri) 13:13:11
Re: setenvについて
とってぃさん、Lonさんありがとうございます。

xplodeを利用していた理由はネットのどこで見たのかは覚えていないのですが、explodeは*の繰り返しに対応していないと記事で見たからです。

とってぃさんに書いて頂いたマクロですと、やはりブロックが1個以下になると、エラーが出てしまい、cntが0にならないので、別の案を考えてみたいと思っていますが、
ブロックの分解は出来ますので、他の方法が思いつかなければ、cntの初期化や以前私がやりたかった線種などの変更、再ブロック化を別のマクロでやりたいと思います。
  • atu
  • 2016/12/09 (Fri) 13:41:20
Re: setenvについて
とりあえず
当初のatuさんのマクロを参考に作っていましたが

エラーの出ないマクロ置いておきます。

*^C^C$M=setenv;to;0;$(nth,$(getenv,to),;cnt;0;;to;1,explode;ALL;$M="""$(if,$(getvar,cmdactive),;^Csetenv;cnt;0^Z,setenv;to;2)""",;to;1;;cnt;$(if,$(<,$(getenv,cnt),10),$(+,$(getenv,cnt),1),0;^Cid;^Z))^M


ちなみに
10回に拘らず、全てを分解する場合は

*^C^C$M=setenv;to;0;$(nth,$(getenv,to),explode;ALL;$M="""$(if,$(getvar,cmdactive),;^Cid;^Z,id;)""")^M

こうなります。
  • とってぃ
  • 2016/12/09 (Fri) 14:51:04
Re: setenvについて
僕もいろいろ考えたので参考のためにレスさせてください。

xplodeは手入力と同じ動きをします。explodeはdieselと手入力とで違う動きをします。
なのでxplodeを使うのはいいと思います。僕もexplodeで引っ掛かりました。

分解回数を決めないでやるとするとxplode;p;;でcmdactiveを調べました。

ブロックの名前が定義されてないN/Yを聞かれないのでうまく走りません。
新たに作るブロック名を先に登録しておいてください。
chpropで線種尺度も1.0にしています。

デバックのため最後^Z(エンター必要)、menuecho=8、pickadd=1としてます。pickaddはどうでもいいのかな?


*^C^C$M=setenv;to;0;$(if,$(=,0,$(getenv,to)),menuecho;8;pickadd;1;id;ins;\$M=xplode;non;@;;e;setenv;bn;\;ip;"""$(getvar,lastpoint)""";;to;1)$(if,$(=,1,$(getenv,to)),setenv;to;2;xplode;p;;$M="""$(if,$(getvar,cmdactive),e;setenv;to;1)""")$(if,$(=,2,$(getenv,to)),select;\chprop;p;;c;byblock;la;0;lt;byblock;s;1.0;lw;byblock;;-block;$(getenv,bn);y;$(getenv,ip);p;;^C-insert;$(getenv,bn);$(getenv,ip);;;)^Z

idでブロック選択
bnで新しい名前の入力
selectで新しいブロックの部品を選びます
  • zukki-
  • 2016/12/09 (Fri) 14:59:14

返信フォーム






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