N値計算をVectorScriptでやってみる。等
カスタム壁倍率
簡単な木造の構造関連で、壁量計算はほぼ前回のやり方でうまくいってると思います。
ただ、面材などで壁倍率が2.5と異なったりする場合は、ワークシートでの集計時に無理やり数値を変換していたのですが、今回の木造BIMツールのアップデートで壁倍率をカスタマイズできるようになりました。
(また、某所でシートレイヤ番号を連番設定できたら、みたいなことを書いたら、中の人が見てくれてあっという間に実装してくださいました。)
N値計算をスクリプトで
前回のワークシートでの計算だと2つの課題がありました。
一つは、ワークシートで計算し、選定された金物の記号をデータタグで伏図と軸組図に表示させたかったのですが、ワークシートの計算結果をデータタグに渡す方法がわからず、手入力でレコードフォーマットに移していました。その際、X軸とY軸のどちらが不利側になるかの判断も人力でした。
もう一つは、計算と柱の位置を確認できるように通り新番号を手入力していたのですが、これが結構めんどくさかったです。位置確認できなくてもいいか、とも思ったのですが、ワークシートを表示させる意味があまり無くなってしまいます。
ワークシート内で解決すれば良かったのですが、やり方が分からなかったのでスクリプトで対応することにチャレンジしてみました。
データシートを使ってみる
基本的にはhasira_kanamonoというレコードフォーマットをつくってN値計算に対応させています。
ただ、これだと少し見にくくて入力しづらい感じがしてました。
そこで、2020からデータマネージャーでデータシートというのが作れるようになったので、試すことにしました。(実は、データマネージャーでN値計算までさせるようにいろいろ試してたのですが、ワークシートと同じく、計算結果は表示されますが、結果がフィールドに格納されないようで、データタグに渡せず断念した経緯があったりします)
データマネージャで入力と結果の目視がしやすいように設定。
結果、だいぶ入力画面が整理されました。
ただし、木造BIMツールの柱を使っていると、データシートの項目が勝手に消えていくバグがあったため、木造BIMツールではなく、一般の柱をスタイル設定して使ってます。(今回のアップデートでバグが無くなったかどうかは未確認です。)以後、一般の柱を使用している前提で作ってます。
また、金物をイレギュラーで設定できるように編集可にしてますが、再計算してしまうと上書きされるので図面上で修正したほうが良さそうです。ここは編集不可にした方が良いかもです。
N値計算のスクリプト
N値はレコードフォーマットの値をもとにスクリプトで計算するようにしています。柱に壁倍率差等の情報を一通り入力後にスクリプトを実行させるようにしています。
PROCEDURE Nchi;
VAR
b1,b2,l,xn,yn,maxn :real;
xa1,xb1,xa2,xb2,ya1,yb1,ya2,yb2:real;
sumi,jou,kana:STRING;
PROCEDURE Keisan(h:handle);
BEGIN
sumi := GetRField(h,'hasira_kanamono','隅柱');
jou := GetRField(h,'hasira_kanamono','上部階');
xa1 := Str2Num(GetRField(h,'hasira_kanamono','A1壁倍率差X'));
xb1 := Str2Num(GetRField(h,'hasira_kanamono','A1補正値X'));
xa2 := Str2Num(GetRField(h,'hasira_kanamono','A2壁倍率差X'));
xb2 := Str2Num(GetRField(h,'hasira_kanamono','A2補正値X'));
ya1 := Str2Num(GetRField(h,'hasira_kanamono','A1壁倍率差Y'));
yb1 := Str2Num(GetRField(h,'hasira_kanamono','A1補正値Y'));
ya2 := Str2Num(GetRField(h,'hasira_kanamono','A2壁倍率差Y'));
yb2 := Str2Num(GetRField(h,'hasira_kanamono','A2補正値Y'));
IF (sumi='隅') THEN b1:=0.8 ELSE b1:=0.5;
IF (jou='無') THEN b2:=0 ELSE IF (jou='有') THEN b2:=0.5 ELSE b2:=0.8;
IF (jou='無') THEN
IF (sumi='隅') THEN l:=0.4 ELSE l:=0.6
ELSE
IF (sumi='隅') THEN l:=1 ELSE l:=1.6;
SetRField(h,'hasira_kanamono','B1',Num2Str(1,b1));
SetRField(h,'hasira_kanamono','B2',Num2Str(1,b2));
SetRField(h,'hasira_kanamono','L',Num2Str(1,l));
xn := (xa1+xb1)*b1+(xa2+xb2)*b2-l;
yn := (ya1+yb1)*b1+(ya2+yb2)*b2-l;
maxn := max(xn,yn);
SetRField(h,'hasira_kanamono','X方向N値',Num2Str(2,xn));
SetRField(h,'hasira_kanamono','Y方向N値',Num2Str(2,yn));
SetRField(h,'hasira_kanamono','N値MAX',Num2Str(2,maxn));
kana:='NG' ;
IF (maxn <=0) THEN kana:='(い)0' ELSE
IF (maxn<=0.65) THEN kana:='(ろ)3.4' ELSE
IF (maxn<=1.00) THEN kana:='(は)5.1' ELSE
IF (maxn<=1.40) THEN kana:='(に)7.5' ELSE
IF (maxn<=1.60) THEN kana:='(ほ)8.5' ELSE
IF (maxn<=1.80) THEN kana:='【へ】10' ELSE
IF (maxn<=2.80) THEN kana:='【と】15' ELSE
IF (maxn<=3.70) THEN kana:='【ち】20' ELSE
IF (maxn<=4.70) THEN kana:='【り】25' ELSE
IF (maxn<=5.60) THEN kana:='【ぬ】30';
IF (xa1=0) THEN IF (ya1=0) THEN kana:=' ';
SetRField(h,'hasira_kanamono','金物',kana);
END;
BEGIN
ForEachObject(Keisan,((R IN ['hasira_kanamono'])));
END;
run( Nchi );
そんなに難しいことはしていないと思います。(参考にされる際は自己責任でお願いします。もし、間違いを見つけたりしたら教えて下さい!)
金物はX軸とY軸の不利側を選定するようにしています。
柱番号の連番設定
また、柱番号も自動でつけるようにしました。
上記のN値計算をさせた上で、下記のスクリプトを走らせると、N値計算と関係のない柱のレコードフォーマットを削除し、関係あるものに連番を振るようにしました。(レコードフォーマットが残っているとデータタグの表示対象になってしまうので。例えば、2階に耐力壁があって1階にない場合のように、引っ張りが生じる可能性があるのにA1が0になる場合は、A1に0.001のような小さい値を入れるようにしています。)
PROCEDURE ColumnNO;
VAR
No,hosei :real;
PROCEDURE Keisan(h:handle);
BEGIN
hosei := Str2Num(GetRField(h,'hasira_kanamono','A1壁倍率差X'))+Str2Num(GetRField(h,'hasira_kanamono','A1壁倍率差Y'));
If ( hosei = 0 ) THEN DelRecord(h,'hasira_kanamono')
ELSE
BEGIN
No := No+1;
SetRField(h,'hasira_kanamono','柱No',Num2Str(2,No));
END;
END;
BEGIN
NO := 0;
ForEachObject(Keisan,((PON='Column2')));
END;
run( ColumnNO );
(木造BIMツールの柱を使ってる場合はForEachObjectの条件式を書き換えないといけないと思います。)
計算結果は以前と同じようにワークシートを使って図面に表示させています。
(No.0が表示されてしまうのに今気づきました。非表示にしないと・・・)
この記事が気に入ったらサポートをしてみませんか?