面積を表示(5) スクリプトでタグを作成
Vectorworks / ライノセラス / Revit / Archicad /CINEMA4D など今のCAD・BIM・ CGソフトはpyton(IronPython含めて)でスクリプトを実行できます。自分自身でコマンドを作って、痒いところに手が届くようになります。
今回はもう少し実用的な部分を説明します。
手を加える
前回作成したのは、実行したら、m2が表示するスクリプトですが、今回は以下の内容を加えます。
- エリアの名称を入力したい
- 坪 などを場合によって表記したい
作ったスクリプトの説明
複数の図形を選択>表示内容をダイアログで選ぶ>場合によってはエリア名を入力する という流れです。
import vs
kaigyo = vs.Chr(13)
def boo_tag():
kOK = 1
kCANCEL = 2
kSETUPDIALOG = 12255
def create_dialog_1():
dialog_1 = vs.CreateLayout('表示内容を選択', False, 'OK', 'キャンセル')
vs.CreateCheckBox( dialog_1, 10, 'エリア名を表示' )
vs.SetFirstLayoutItem( dialog_1, 10 )
vs.CreateCheckBox(dialog_1, 20, 'm2を表示')
vs.SetBelowItem(dialog_1, 10,20,0,0)
vs.CreateCheckBox(dialog_1, 30, '坪を表示')
vs.SetBelowItem(dialog_1, 20,30,0,0)
vs.CreateCheckBox(dialog_1, 40, '帖を表示')
vs.SetBelowItem(dialog_1, 30,40,0,0)
return dialog_1
def dialog_handler(item,data):
if item == kOK:
boo_tag.area_name = vs.GetBooleanItem(dialog_1, 10)
boo_tag.m = vs.GetBooleanItem(dialog_1, 20)
boo_tag.tsubo = vs.GetBooleanItem(dialog_1, 30)
boo_tag.jyo = vs.GetBooleanItem(dialog_1, 40)
elif item == kCANCEL:
pass
elif item == kSETUPDIALOG:
vs.SetBooleanItem(dialog_1, 10, True)
vs.SetBooleanItem(dialog_1, 20, True)
vs.SetBooleanItem(dialog_1, 30, False)
vs.SetBooleanItem(dialog_1, 40, False)
return item
dialog_1 = create_dialog_1()
result = False
if vs.RunLayoutDialog( dialog_1, dialog_handler ) == kOK:
result = True
return result , boo_tag.area_name , boo_tag.m , boo_tag.tsubo,boo_tag.jyo
def create_record():
vs.NewField('面積情報','エリア名', '',4,0 )
vs.NewField('面積情報','ターゲット', '',4,0 )
vs.NewField('面積情報','面積', '',3,0 )
def area_tag(hand):
uuid = vs.GetObjectUuid(hand)
area = round(vs.ObjAreaN(hand),1)
cent = vs.HCenter(hand)
if area_name == True:
name = vs.StrDialog('区画名を入力してください。', '')+ kaigyo
else:
name = ''
if m == True:
area_m = (str(area) + 'm2')+ kaigyo
else:
area_m = ''
if tsubo == True:
area_tsubo = (str(round(area/3.3,1)) + '坪') + kaigyo
else:
area_tsubo = ''
if jyo == True:
area_jyo = (str(round(area/1.65,1)) + '帖')
else:
area_jyo = ''
tag = vs.Concat(name , area_m ,area_tsubo,area_jyo)
vs.MoveTo(cent)
vs.CreateText(tag)
tag_h = vs.LNewObj()
vs.SetTextVerticalAlign(tag_h, 3)
vs.SetTextJust(tag_h, 2)
p1,p2 = vs.GetBBox(tag_h)
vs.Rect(p1, p2)
vs.HScale2D(vs.LNewObj(), cent[0], cent[1], 1.3, 1.3, False)
vs.HMoveForward(tag_h, True)
vs.SetRecord(tag_h, '面積情報')
vs.SetRField(tag_h, '面積情報','エリア名', str(name))
vs.SetRField(tag_h, '面積情報','ターゲット', str(uuid))
vs.SetRField(tag_h, '面積情報','面積', area)
def main():
hand = vs.FSObject(vs.ActLayer())
if vs.GetTypeN(hand) == 3 or 4 or 5 or 6 or 13 or 21:
area_tag(hand)
hand = vs.NextSObj(hand)
else:
vs.AlrtDialog('選択図形が適切ではありません')
create_record()
result , area_name , m , tsubo, jyo = boo_tag()
main()
実行してみる
実行してみるとこのような流れです。
実行してみると、単一のオブジェクトでは問題なさそうですが、次の内容が実用的ではありません。
- 選択した図形が複数の場合
- 元図形が変更された場合の対応
1については、選択図形を次々に処理を行うことになります。2については、別のスクリプトで該当図形を選択して作り直すということで対応可能です。
今回のスクリプトはリソースマネージャから行なっていますが、Vectorworksのスクリプトにはオブジェクト(vso<Vector Script Object)を作ることができます。
2 の編集についてはオブジェクトの方がオブジェクト情報パレットから必要な項目だけ編集できるため、都合が良いです。次はvso のオブジェクト作成について紹介したいと思います。