【VectorScript】 便利な一行スクリプト

図形選択マクロでVectorScriptを作ると、例えば次のようなスクリプトができあがります。

DSelectAll; SelectObj((INSYMBOL & INVIEWPORT & (L=’レイヤ-1′) & (C=’一般’)));

スクリプトが一行に収まるので、慣習的に一行スクリプト(一行マクロ)と呼ばれています。

*

VectorScript は Pascal というプログラミング言語をベースとしていますが、このPascalという言語の目的のひとつがプログラミング言語学習用であることから、作法に厳しい言語であることが VectorScript を書くときの障害となりやすいと思います。

ところが、一行スクリプトは Pascalを知らなくても、VectorScriptのコマンドを書き連ねればできてしまいます。

*

2018-07-07_150440.png

幸いなことに、図形選択マクロが作るスクリプトだけでなく、環境設定のオンオフやメニューの中のコマンドなども一行に収まるものがたくさんあります。それらを自作パレットに入れておくと操作が大幅に効率アップします。私は頻繁に使う操作を複数のパレットに整理して入れて、そのパレットをテンプレートに組み込み、作図開始時はそのテンプレートから始めるようにしています。(右図はパレットのひとつ)

Vectorworksベストテクニック100表紙これらの一行スクリプトの使い方や作成方法は、『VECTORWORKS ベストテクニック 100』でご覧ください。

 

*

一行スクリプトの利点は、VectorScriptを言語として学習しなくてもよい点です。外国語学習にたとえれば、文法を勉強せず、いくつかの単語をかじってカタコトで通じる範囲のことだけで何とかするのと同様の状態なので、言語学習を目的とした場合は望ましいことではありません。しかし、「ほんのちょっとしたことを便利にしたいだけ」であれば、カタコト英語のごとく、一行スクリプトがかなり助けてくれます。

 

カテゴリー:VectorScript

【VectorScript】 VectorScriptのおまじない、PushAttrs、PopAttrs

UNIXのシェルにpushd、popdという、現在のディレクトリを一時的に保存するコマンドがあります。pushd、popdのおかげで作業中のディレクトリ移動のときのキー入力の手間が大幅に減ります。MS-DOS時代にはKI-Shellという素晴らしいフリーのシェルがあって、大変お世話になりました。

で、本題ですが、VectorworksにはPushAttrs、PopAttrs、というpushd、popdというよく似たコマンドがあります。

Attr=attribute=属性ですが、同じく日本語では「属性」と訳せるproperty(プロパティ)とは異なります。どういう属性であるか、VectorScript のリファレンス( ヘルプフォルダに入っている ScriptFunctionReference.html )から引用しますと;

Stores current attribute, tool, text, and constraint settings for later retrieval as the document default settings. Document settings can be modified as needed after using this call, and the stored settings can be restored with a call to PopAttrs. Calling this function more than once (nested) is allowed. The settings will be placed on a stack, and will be retrieved by calls to PopAttrs in the correct sequence.

ということで、この場合の属性とは、スクリプト実行前のツール、テキスト、拘束の設定のことで、それをpushしたりpopしたりするのがPushAttrs、PopAttrs で、VectorScriptの中でペンの色、フォントサイズ、線の太さなどを一定の設定に変える必要があるが、スクリプト実行後には元に戻したいという場合に役立ちます。

スクリプト実行前後で上記のような属性を維持したい場合は、下記のようにします。

  • BEGINのすぐ次の行に、PushAttrs; を記入
  • END;のすぐ前の行に、 PopAttrs;  を記入

つまり、スクリプトを下記のようにします。下記の「あれこれあれこれ」と書いてある部分にVectorScriptで行いたい処理を書きます。

PROCEDURE Pokopen;
BEGIN
PushAttrs;
あれこれあれこれ
PopAttrs;
END;
RUN(Pokopen);

で、これは一種のおまじないとして、BEGIN、END;とセットで覚えておくといいと思います。

*

VectorScriptの手っ取り早い入門は下記をどうぞ。(VectorScriptだけの本ではありませんが、Vectorworks作業の効率化のひとつの方法としてVectorScriptについても記されています。)

Vectorworksベストテクニック100表紙『VECTORWORKS ベストテクニック 100』

今までのVECTORWORKS解説書にはなかった、より便利に速く図面を描くためのVectorworksの使い方を100コ紹介しています。

カテゴリー:VectorScript

【VectorScript】 図形の面積値をスクリプトで記入する

このスクリプトは、アクティブレイヤの全図形(※1)ひとつひとつのほぼ中心(※2)に面積値(単位は㎡、小数点以下第2位まで)を書き込むためのスクリプトです。(2018/07/09 YouTubeで動作を示した動画を公開)

(※1)スクリプトは対象レイヤ上の全図形を対象としていますが、スクリプト中にコメントした2行を削除すれば、予め手作業で選択した図形を対象にできます。

(※2)面積値を記入する座標としては、図形の境界ボックスの中心(下図)を拾っているので、L形など入り隅があるような図形では面積値が図形の外にこぼれます。その場合は、必要に応じて手動で修正することになります。

2018-07-07_131932.png

また、このスクリプトでは、面積値をいったん一時的なレイヤに書き込んで、後から元のレイヤ(面積値を記入した図形があるレイヤ)に移動しています。これは一種の保険としてやっているだけで、「選択図形に面積値を書き込む動き」として見れば不要です。

*

以下がスクリプトです(私は VectorScript の専門家ではなく、「必要な結果が得られれば十分」というポリシーです)。行頭をインデントしていないので、多少読みづらいですがご容赦ください。実行に際してはコメント行は不要なので削除しても大丈夫です。またレイヤ名、クラス名、作業レイヤの削除の有無などは、必要に応じてアレンジしてください。それから変数名をreiyaのように頭が悪そうな名前にしていますが、本物の英語である組み込みコマンドと見間違えないようにするためです。動作確認は、Windows版 Vectorworks 2017/2018 で行いました。(某掲示板で、Mac版2018で動いたという報告を頂戴しました。)

なお、VectorScriptの基本的な作り方や実行方法は下記をご覧ください。

Vectorworksベストテクニック100表紙『VECTORWORKS ベストテクニック 100』

今までのVECTORWORKS解説書にはなかった、より便利に速く図面を描くためのVectorworksの使い方を100コ紹介しています。

*

VectorScriptユーザは分かると思いますが、{}内は注記なので実際の動作には必要ありません。

Procedure WriteArea;
VAR
reiya:STRING;

{以下が面積値を記入するためのサブルーチン}
FUNCTION DoIt(h :HANDLE) :BOOLEAN;
VAR
x1,x2,y1,y2:REAL;
BEGIN
{面積記入用の一時的レイヤの設定}
Layer(‘面積記入用一時’);
{面積値を書き込む位置(座標)の設定。上の図で示したように境界ボックスの中央に書き込む。}
GetBBox(h, x1,y1,x2, y2);
MoveTo( (x1+x2)/2, (y1+y2)/2 );
{次は面積値の書き込み。小数点以下の桁数はHAreaの前の数値で設定。また平方ミリを1000^2=1000000で割って平方メートルに換算している。}
CreateText(Num2Str(2,HArea(h)/1000000));
{単位を付ける場合は、上の1行を下記のように変更すればOK。
CreateText(Concat(Num2Str(2,HArea(h)/1000000),’㎡’));
CreateText(Concat(Num2Str(2,HArea(h)/1000000*0.3025),’坪’));
㎡、坪を併記する場合は、Concatで繋げるか、㎡を書かせた後、MoveToで位置をずらしてt坪を書かせるような手順にすればよい。}

{レイヤを元に戻す}
Layer(reiya);
END;
{サブルーチンはここまで}

BEGIN
{作業状況の待避}
PushAttrs;

{アクティブレイヤの名称を取得}
reiya:=GetLName(ActLayer);

{記入用テキストの設定。設定はご随意に。}
TextSize(72);
TextJust(2);
TextVerticalAlign(1);

{作業用にクラス、レイヤの設定}
SetClassOptions(5);
SetLayerOptions(4);

{念のため、あらためてアクティブレイヤを作業用に設定する}
Layer(reiya);

{面積を記入するためのクラスを設定する(存在しない場合は自動追加)}
NameClass(‘面積値(㎡)’);

{事前に選択した図形に適用する場合は下の2行を削除}
DSelectAll;
SelectAll;

{面積記入用サブルーチンに飛ばす}
ForEachObjectInLayer(DoIt, 2, 0, 0);

{記入した面積値が選択状態になっているので、解除する}
DSelectAll;

{面積値を一時的レイヤから元のアクティブレイヤに移動する(必須ではない)。}
Layer(‘面積記入用一時’);
DSelectAll;
SelectAll;
DoMenuTextByName(‘Cut’,0);

Layer(reiya);
DSelectAll;
DoMenuTextByName(‘Paste In Place’,0);
DSelectAll;
{一時的レイヤを削除しない場合は下の行を削除}
DelObject(GetLayerByName(‘面積記入用一時’));

{ここまでが面積値移動のためのスクリプト}

{作業状況の復帰}
PopAttrs;

END;
Run(WriteArea);

*

おまけ

上の動画中にある「削除」や「選択」はいずれも一行スクリプトなので、使う場合は改行を入れずに入力してください。

  • 選択
    DSelectAll; SelectObj((INSYMBOL & INVIEWPORT & (T=TEXT) & (C=’面積値(㎡)’)));
  • 削除(選択するスクリプトの最後に、「 DeleteObjs; 」を付けただけ)
    DSelectAll; SelectObj((INSYMBOL & INVIEWPORT & (T=TEXT) & (C=’面積値(㎡)’)));
    DeleteObjs;

*

<経緯>

ある掲示板に面白そうなネタがありました。以前作ったスクリプト(※)をちょっと変更すればできそうだったので掲示板にちょっとした書き込みをしましたが、せっかくなので自分なりに完成させてみました。(シュウさん、ありがとう!)

(※)数年前、ある伝統的建造物群保存地区の報告書のために地図を作成しました。この地図は3つの時代の地籍の変化を比較するためのもので、昔の歪んだ地図を現況の地図に合致させながらリライトし、さらに地籍ひとつひとつに地番を書き込む作業が必要でした。数千を超える地積ひとつひとつに手作業で地番を打つとヒューマンエラーが発生しやすいのでVectorScriptで自動処理することにしたのでした。

【2018年10月追記】この報告書、インターネットで公開されていました。
http://www.city.fukuyama.hiroshima.jp/soshiki/bunka/129485.html

なお、元のスクリプトでは、ForEachObjectInLayer の部分にForEachObjectInListを使っていましたが、件の談話室でForEachObjectInLayer を使うと良いという指摘があったので、上のスクリプトではForEachObjectInLayer を使ってみています。ForEachObjectInListでも同じ結果を得られますが、変数が1つ増えます。

 

<補足>

上に記した報告書用の地籍図データは、下図のような感じです。これは明治初期の状態。元の手書き地図は歪みが甚だしく(というより「歪み」というほど生やさしいものではなかったので)、現状と突き合わせた作図は骨が折れました。今後、機会があればそんなことも含めて記事にしたいと思います。(報告書には地図作成における諸問題についてすでに記されていますが、もうちょっとスキル面からの記事を書いてみようかな、ということ。)

2018-07-07_103941.png

地番等は、Vectorworksのデータベース機能を利用し、Vectorworksの多角形で表現した地籍ひとつひとつにいくつかのフィールドを割り当てています。スクリプトは、それらの項目から地番フィールドを読み出して図形中央に打つためのものでした。不整形な地籍の場合は、文字がこぼれるので、ひとつひとつ手作業で位置を移動しました。大変ではあったけれど、社会的に大きな問題となっていた地域だったので、結果としては有意義な仕事でした。

この後、あらたな必要でデータをGISに落とし込んだりしましたが、それもあまり手間がかからずに可能でした。この手の要求を容易にかなえてくれる点がVectorworksの強みだと思います。Vectorworksの宣伝や紹介において3Dやレンダリングの能力が強調される場合が多いですが、他のBIMにおいても似たり寄ったりです。Vectorworksのこういう部分こそが強みであると私は思うし、私はこんな使い方をするのが好きです。

カテゴリー:VectorScript

【作図のヒント】 位置決めには面図形も使えます

手書きの図面は、補助線を引いて位置を決め、不要になった補助線を消しゴムで削除しながら作図します。Vectorworksでも同様の方法で位置決めできますが、補助線ではなく、補助図形(面図形である四角形や円など)を使いましょう。最大の理由は、面図形と線は、書く手間に差がない一方で、面図形は線よりも選択・スナップなどが楽だから、位置決めするのも、後から削除するのも楽なのです。

*

以下に使いからの例を示します。

  • ここでは、補助図形を使ってテーブルセットを3000mm右にコピーしてみましょう。アクティブクラスは何でもかまいません。コピー元の図形の基準となる点をスナップして、幅3000mm(高さは任意)の四角形を描きます。

3-7-1.png

  • コピー元の図形の基準点をスナップして、Ctrlを押しながらドラッグし、③で書いた四角形の右上にスナップさせます。

3-7-2.png

  • 上の手順で描いた補助図形を使う必要がない場合は、補助図形(今回は四角形)を削除します。もし同じ補助図形を今後も使う可能性があれば、残しておきます。※残す場合が多ければ、あらかじめ補助図形のためのクラスを作っておいて、上記の作業とに、データパレットから補助図形のクラスを「補助図形のクラス」に変更します。

*

ひとつひとつの補助図形へのクラスの割り当て方については、これが絶対に良い、こうでなければいけないという決まりごとはないので、クラスの一般的な考え方「図形の意味合いが異なる場合は異なるクラスに入れるのがよい」に従えば十分です。手順④に描いたように、この後も使う可能性の有無で考えましょう。

【重要】このTIPSと同じ操作は、他の手順(たとえば同位置複製+数値移動、ポイント間複製)でも可能です。このような場合に考えてほしいのは、操作のステップ数を少なくしたり、自分が使うコマンドを絞り込むことによって、総合的な作業時間を短縮することです。ここで示した方法を使うと、右手、左手の動きをかなり低減できます。来る日も来る日も何百、何千回とあっちこっちに手を動かし続けたときに、少しでも身体に負担が少ない方法を身につけることはとても大切です。

*

Vectorworksベストテクニック100表紙『VECTORWORKS ベストテクニック 100』

今までのVECTORWORKS解説書にはなかった、より便利に速く図面を描くためのVectorworksの使い方を100コ紹介しています。

カテゴリー:一般

【Oops!】 Vectorworksのバージョン違いが原因でデータを開けない場合、、、

9-10-R1.png

Vectorworksはバージョンアップの度にデータ形式が変更され、新しいバージョンで作ったファイルは古いバージョンでは開けません。また、バージョンが変わっても拡張子のvwxは共通なので(※12.5より前はmcd)、右図のように自分が使っているバージョンのVectorworksファイルアイコンで表示されます。何の疑いもなくファイルアイコンをダブルクリックして開こうとするとエラーメッセージが表示されて開けない場合があります。

上の図はVectorworks 2008、2017それぞれで作成したファイルをVectorworks 2008がインストールされたPCで見ている状態で、どちらも同じ絵柄のアイコンになっているのが分かります(Vectorworksがバージョンアップしても、拡張子vwxは変わらないのでOS側からは見ると違いが分からない)。

*

Vectorworks 2008 で 2017 のデータを開こうとした場合は、最初に次のようなエラーメッセージが表示されます。

9-10-1.png

表示の通り「古いバージョン」つまり自分が使っているバージョンより前のバージョンで作成されていた場合はOKをクリックすれば開けますが、自分が使っているバージョンより新しいバージョンのVectorworksで作成されたいた場合は、次のメッセージが出てVectorworksが終了してしまいます。

9-10-2.png

*

このような場合にはどうすればよいでしょうか?

【自分のPCで開けない場合】

残念ながら、自力解決は無理です。相手と同じバージョンを入手するか、データ作成者に以下の方法で自分が使用するバージョンに下げてもらうかどちらかです。

【データを渡した相手のPCで開けない場合】

  • 相手のVectorworksのバージョンを教えてもらいます。(さすがに自分が使うバージョンが分からないという人はいないでしょう。)
  • 「ファイル>取り出し」で、相手のバージョン形式で取り出します。しかし、ある一定の古さのバージョンまでしか取り出せないので、相手と自分の間で大きなバージョン差がある場合は取り出せません。そのようなときは、相手と自分の中間に位置するバージョンを使っている人を探して、その人を経由してバージョンダウンすることになります。(たとえば、2017→2013→2009など)

*

複数人でのコラボレーションでは、全員が同一バージョンを使っているとはかぎりません。そのようなときは、最下位バージョンを標準としてデータをやり取りしてください。

ただし新バージョンに付加された新しい機能で作った部分が欠落したり、おかしくなったりする場合もあります。こういう場合は、メンバー内の最下位バージョンがもつ機能だけを使うか、全員のバージョンを揃えるか、どちらかしか方法はありません。

*

上記のような次第で、残念ながらバラ色の解決法はありません。

*

Vectorworksベストテクニック100表紙『VECTORWORKS ベストテクニック 100』

今までのVECTORWORKS解説書にはなかった、より便利に速く図面を描くためのVectorworksの使い方を100コ紹介しています。

カテゴリー:Oops!
%d人のブロガーが「いいね」をつけました。