図面範囲を設定するマクロ

 さて。「_lm」があるので、「limits」・・・「図面範囲」の設定に関するマクロだという事は読み取れますか? 拡大して詳しく見てみましょう。

 この通りです。ここでの「*」は「繰り返し」ではなく、「かけ算」の意味。エクセルで数式を入力するときも、「*」は「×」ですよね。それと同じ用法です。
 何をしてるのかというと、入力部で「紙の大きさの縦横(実寸)」と「尺度」を入力してやれば、後はその尺度なりにマクロが「図面範囲」を指定してくれるという仕掛け。「limits」の一点目は0,0固定で、後は2点目を尺度を掛けて指定し、その後、「ズーム」→「全体表示」にしています。

 例えば、「A3、1:100」で範囲指定するには、入力部で「横=420、縦=297、尺度=100」で入力すれば この通り、ちゃんと設定されます。

 ↑と言っても非常に見た目、分かりづらいので、再度、「図面範囲」を実行して、「現在の設定状態」を確認してみました。

 OKですね。


マクロ上でオブジェクトスナップの設定を操作する

 上のマクロ、実際の作業の中で使用すると、きちんと指定どおりに範囲を設定してくれないことがあります。あらかじめ、他のオブジェクトを作図していると起こる不具合なんですが、これはマクロのせいではなく、getenvで値を取得し、座標として入力した際、何故か近くのオブジェクトに 対してOスナップを効かせてしまうことに原因があります。
 そこで、マクロ上でOスナップをコントロールする方法を見てみましょう。もちろん、他のマクロにも応用可能です。私もたまに既存のマクロを改造しますが、そうしたマクロにOスナップに関する設定がまぎれている事は意外に多いので、知っておくと便利ですよ。

「解除」を使う

上の図面範囲のマクロの場合はマクロ内でOスナップを無効化してしまえばいいんですが、そうした場合、最も単純なのは 「解除」のOスナップを使う事です。

 やり方はこの通り。「一点目」「二点目」を指定する前に、それぞれOスナップの「解除」を入れるだけです。 これはいつもの「一時Oスナップ」ですから、別にDESEL関数を使う必要もない、”その場限り”コマンドです。


定常Oスナップを操作する

 もうひとつの考え方は、マクロ内だけで「定常Oスナップ」を無効化してしまうことです。そうすればAutoCADが勝手にOスナップを 取りにいくこともありません。ここではDESEL関数を使います。

 前々ページでやった「$M=$(・・・)」の形を思い出して下さいね。 「$M」の前の時点の設定が「$(・・・)」で取出されるんでしたね。
 で、定常Oスナップのコントロールをマクロ内でしているのが「osmode」というシステム変数です。

 つまり、左の式は「osmode;0;」で一旦、定常Oスナップをすべて解除し、「osmode;$(・・・)」の部分で、それをまた 元の状態に戻してやっています。

 ちなみに、←こちらがAutoCADのヘルプ参照による、「osmode」で使うコード一覧です。

 「0」を入れれば「解除」になるんですが、例えば「端点」「交点」「中心点」を入れたい、となると その合計・・・「1+4+32=37」を入れればOK。
 こういう使い方ができるので、DESEL関数を 使えば、何も「無効化」したい時ばかりでなく、ある特定のOスナップを「効かせたい」時にも対応が可能になってきます。

 ・・・上のコード、「合計」を入れると複数のOスナップが指定できるって、すごく不思議ですよね。でもちゃんと機能するんですよ。


 で、こちらが上のマクロ式の実際の動きの確認です。私はいつも「端点」と「交点」だけ「定常」に設定しているので 開始の時点で、「33」になっていますが、それが「0」に変わって、最後にまた「33」に戻されているのが分かりますね。


 と、ここまでやってきましたがいかがでしたでしょうか?いずみさんのマニュアルにはもう少し、高度な関数の説明が続いて いましたが、取り合えず、当サイトではここまでで・・・皆様が、マクロを何とかマスターしたいと思った際の、「導入部」だけで いいかな、と思っております。

 しかし、実際にここまでをしっかり飲み込んで頂くだけでも、かなり既存のマクロの改造はできるようになってきます。 例えば下記の、これもやはり以前に青葉さんに教えて頂いたマクロなんですが・・・

面積を測定し、自動でその数値を文字化 ^C^C_area;O;\_text;\$m=$(*,$(getvar,dimscale),3);0; $m=$(rtos,$(/,$(getvar,area),1000000));

 面積を測りたいものはポリゴンになっている事が条件です。それにしてもそれ自体がすんごいマクロだったんですが、 これを元に私が改造したものが下記です。

長さ計測後、その数値を自動で文字化 ^C^C_dist;\\_text;\$m=$(*,$(getvar,dimscale),3);0;
$m=$(getvar,distance);

 ちゃんと機能した時は、本当に感動しました。これもいずみさん、青葉さんのおかげです。
 私が上のマクロの改造を行ったのは、自分で使う用があったから、なんですが、そんな風に、「こうしたい!」と思った ときに、ちょっとした手直しが自分で出来ると、ネット上で”ぴったりジャスト”なものを捜す手間は省けます。 似たようなものさえ見つけられればOKなので・・・。

 そんな訳で、皆様もぜひ、マクロに挑戦してみて下さいね。これ以上をお求めの方は、TOPのお役立ちリンクなどからどうぞ・・・。