初めてのミニバン、スライドドア。

背が高い。
1.5L Dieselエンジン、WLTCモード18.1km/lでタンク容量60Lなので、満タンで900km走れる、計算になる。ゲットしたのはMAXIというモデル。ロングの7人乗りで、4770x1850x1825、ホイールベースは2975。長い、けど駐車場には無事入れました。
サーフボードが何枚でも積めて、2−3人乗って長距離いける、ようなスペックだ。
Vectorworksではシンボルは図面ファイルに登録する。シンボルを使えば作図作業が楽になり、図面の標準化も進む。シンボルはシンボルフォルダを使って分類することができる。フォルダの階層が深くなると全体でどのくらいのシンボルが登録されているか把握しにくくなる。
次のコマンドを実行して、現在の図面ファイルにどれだけのシンボルが登録されているか調べてみよう。実行手順は次の通り。
1.リソースマネージャを開く
2.新規リソースをクリック
3.スクリプト(P)を選んで[作成]をクリック
4.パレット名入力ダイアログでパレット名を入力
「パレット-1」でかまいません。
5.スクリプト名入力ダイアログでスクリプト名を入力
「スクリプト-1」でかまいません。
6.開いたエディタに上記のプログラムをペースト
7.歯車アイコンをクリックしてコンパイル
8.リソースマネージャで「スクリプト-1」をダブルクリック
ソースコードは次。
(* -------------------------------
関数: SP_NumOfSym
Version: 1.0.0
機能: 図面ファイルに登録されているすべての定義シンボルを数える
20241129 wat
------------------------------- *)
PROCEDURE SP_NumOfSym;
var
gLoopy: longint;
gMsg: string;
(* -------------------------------
関数: SP_SearchInSymFolder
機能: シンボルフォルダ内のシンボルを取得(再帰コール)
------------------------------ *)
procedure SP_SearchInSymFolder( symFolderH: handle; folderName: string );
var
symDefH: handle; {SymDef handle}
objType: longint;
currentFolderName: string;
begin
symDefH := FInFolder( symFolderH );
WHILE ( symDefH <> NIL ) DO BEGIN
objType := GetTypeN( symDefH );
if ( objType = 16 ) then begin
gLoopy := gLoopy + 1;
end else begin
if ( objType = 92 ) then begin
{ フォルダの場合はフォルダ内をサーチ(再帰) }
currentFolderName := GetName( symDefH );
currentFolderName := concat( folderName, '/', currentFolderName );
SP_SearchInSymFolder( symDefH, currentFolderName );
end;
end;
symDefH:= NextSymDef( symDefH );
END; {WHILE (objH<>NIL)}
end; { SP_SearchInSymFolder }
(* -------------------------------
関数: SP_arySymInfo_make
機能: シンボルを取得
------------------------------ *)
procedure SP_arySymInfo_make;
var
symDefH: HANDLE; {SymDef }
objType: longint;
currentFolderName: string;
begin
gLoopy := 0;
{ シンボル定義をハンドル移動して、シンボル定義情報を得る }
symDefH:= FSymDef;
WHILE ( symDefH <> NIL ) DO BEGIN
objType := GetTypeN( symDefH );
if ( objType = 16 ) then begin
gLoopy := gLoopy + 1;
end else begin
if ( objType = 92 ) then begin
{ フォルダの場合はフォルダ内をサーチ }
currentFolderName := GetName( symDefH );
SP_SearchInSymFolder( symDefH, currentFolderName );
end;
end;
symDefH:= NextSymDef( symDefH );
END; {WHILE (symDefH<>NIL)}
end; { SP_arySymInfo_make }
BEGIN {===== MAIN =====}
{ シンボル定義を取得 }
SP_arySymInfo_make;
if ( gLoopy >= 1 ) then begin { シンボル定義が一つ以上ある }
gMsg:= 'シンボルの数:';
gMsg:= concat( gMsg, Num2StrF( gLoopy ) );
gMsg:= concat( gMsg, chr(13) );
AlrtDialog( gMsg );
end else begin
gMsg:= 'この図面にはシンボルが登録されていません';
AlrtDialog( gMsg );
end; { if ( gLoopy >= 1 ) }
END;
RUN( SP_NumOfSym );
コンパイルエラーが表示されたり、実行時にエラーが出るような場合は、うまくコピペできていない可能性がある。そのような場合は次からソースコードをテキストファイルでダウンロードしてみてほしい。
シンボル図形を表示するツールは別売り。
Vectorworks 2024に限ったことではなく、VW2023でもそれ以前でも発生していたと思う。たまにハマるのでメモしておく。
文法エラーがあると、エラーの行の下の行番号と内容が表示される、という事例。
たとえば次のコード。

スクリプトをコンパイルすると、エラーになって次のようなメッセージが表示される。文字列を期待している、という指摘だ。で、何処の?となる。

349行目がエラー、と表示されているように見えるけど、varの宣言文を見ると、GFはrealで、GRがstringとなっていた。348行目を次のように修正。
GR:=gEDIT_11;

これでコンパイルは成功。

コンパイルエラーになったら、1行前のコードも疑おう。もちろん正しい宣言文があるか、セミコロンが記述されていないかとか、関数の始まりも要チェック。
ループを記述するには、For、Repeat、Whileがある。たいていのループはどの構造でも書ける。どれにするか迷う。そこでマイルール:
できるだけForを使う
理由の一番は、繰り返し回数の上限がループに入る前から決められていること、である。repeatやwhileでは、条件設定をミスっていると無限ループになって開発効率が悪くなる。
で、この習慣に従うと、ループの回数を事前に取得するのが当然になってくる。デバッグでこの回数を見れば、変な結果を返している場合は、まず繰り返し回数をチェックしてゼロとか意外な数値が入っていないか確認する。トレースする場合でもデバッグ中だけ繰り返し回数に小さな数字を代入してループの動きを見ることも容易だ。
ただし、何が何でもforにする、ということではないことに注意。
定型文のようにwhileを使っていて、そのコードをコピーして使う場合、ほかと同じ構造になっていると可読性がいい、のでこの場合は「どっちでもいい」ことにはならず、理由があってwhileを使う場面になる。理由が言えるのであればforじゃなくてもいいよ、ということだし、理由が言えなければforで書いてね、ということ。