その他」カテゴリーアーカイブ

サポート日記からその他に変更20190530

Vectorworks図面ファイルに登録されているシンボル数を調べる

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プラグイン)

VectorScriptエラー Vectorworks 2024

Vectorworks 2024に限ったことではなく、VW2023でもそれ以前でも発生していたと思う。たまにハマるのでメモしておく。

文法エラーがあると、エラーの行の下の行番号と内容が表示される、という事例。

たとえば次のコード。

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

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

GR:=gEDIT_11;

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

コンパイルエラーになったら、1行前のコードも疑おう。もちろん正しい宣言文があるか、セミコロンが記述されていないかとか、関数の始まりも要チェック。

macOS SonomaでExcelファイルを開いたら数字がはみ出していた

Microsoft Excel for mac 2021で、以前から使っていたシートを開いたら、次のように数字がセルからはみ出していた。入力してみても同じようにはみ出す。1桁の場合は大丈夫で、桁数が大きくなるとはみ出し量も大きくなるようだ。

問題はヒラギノフォントにあるようで、フォントを游ゴシックに変更したらOK。

macOS Sonomaではヒラギノフォントを使わないほうがいいかもしれない。

どっちでもよかったらFor文を使う

ループを記述するには、For、Repeat、Whileがある。たいていのループはどの構造でも書ける。どれにするか迷う。そこでマイルール:

できるだけForを使う

理由の一番は、繰り返し回数の上限がループに入る前から決められていること、である。repeatやwhileでは、条件設定をミスっていると無限ループになって開発効率が悪くなる。

で、この習慣に従うと、ループの回数を事前に取得するのが当然になってくる。デバッグでこの回数を見れば、変な結果を返している場合は、まず繰り返し回数をチェックしてゼロとか意外な数値が入っていないか確認する。トレースする場合でもデバッグ中だけ繰り返し回数に小さな数字を代入してループの動きを見ることも容易だ。

ただし、何が何でもforにする、ということではないことに注意。

定型文のようにwhileを使っていて、そのコードをコピーして使う場合、ほかと同じ構造になっていると可読性がいい、のでこの場合は「どっちでもいい」ことにはならず、理由があってwhileを使う場面になる。理由が言えるのであればforじゃなくてもいいよ、ということだし、理由が言えなければforで書いてね、ということ。

稼働棚板本棚

棚板が可動な本棚を作ってみた。天板、底板、側板は杉24mm厚、奥行き240mm、幅832mm(2連:24+380+24+380+24)、高さは収納場所のクローゼットに合わせて、出来上がりで1600mm。棚板は同じ木材から取るので24mm厚、幅380mm:隣に設置しているマノーネの40-30に合わせた内寸にした。背板は少々高いが実加工の杉板、板厚は9mm。背板を木ネジ止めすることで全体の強度を確保。これを2台作る。

杉板

笛田の矢沢材木店でカットしてもらう。

パーツ加工

可動棚に使う柱はROYAL製NR-6。端から30mmの位置に8mmのトリマーで溝加工して長さ1,500mmのNR-6を2本埋め込んでビス止め。

真ん中にも側板を配置して2連にしたため、端から30mmの同じ位置に両面からトリムすると24mm – 7mm – 7mmで10mmしか残らない。これでは強度に不安があるため、真ん中の側板のレールは左右で互い違いにした。端から10mmと50mm。

組み立て

寝かせて真横からドライバで木ネジを打つ。天と地からスペーサに380mmきっちりの棚板を入れて位置決めする。実加工の背板を張っていく。実加工の材木は軽くて施工が楽。スペーサを真ん中にも入れておかなかったため側板が少し膨らんでしまって棚板が入らない。背板を全部外して修正することになった。

本体をウォークインクローゼットに設置。

棚板

ダボELS-12のダボ溝を彫る。はじめはトリマーでレールと同じ位置に、同じトリマービットで四角い7mmの溝を彫ってみた。ダボは12φなのでやはり狭い。丸くしたほうがかっこいいので、コーナンにドリルの歯を買いに行く。12mmφのドリルと14mmφのヤスリを購入。まず12mmφのドリル、これだと位置が少しズレただけで入らない。ヤスリの方は仕上がりが気に入らない。結局うまくいったのは16mmφのドリルだった。

幅は380mmだが、ぴったりだと入らないのでマノーネの寸法を真似して2mm減らして378mmとした。しっかり測って鉛筆で線を引いてスライドマルノコでカット。ちょうどいい感じに収まった。ダボELS-12をねじ込んで出来上がり。

2台めを設置。

壁一面にマノーネ製本棚。クローゼットに自作の稼働棚板本棚が前後に2台。これで少しだけ片付いた。