Vectorworks ビューポートを作る(4) 仕上げ
ダイアログの設定
ダイアログはVectorworks内で処理されます。今回は「異なる縮尺の処理」「白黒表示」の二つをダイアログで選ぶようにしました。初期値は 設定値12255にて設定します。
def selectScale():#ダイアログの設定
kOK = 1
kCANCEL = 2
kSETUPDIALOG = 12255
def create_dialog():
dialog = vs.CreateLayout('', False, 'OK', 'キャンセル')
vs.CreateStaticText(dialog, 5, '登録画面からビューポートを作成します。'+ vs.Chr(13)+'既にシートレイヤがある登録画面名は作成されません。', 45)
vs.SetFirstLayoutItem( dialog, 5 )
vs.CreateCheckBox( dialog, 10, '異なる縮尺のレイヤを表示' )
vs.SetBelowItem(dialog, 5,10,0,0)
vs.CreateCheckBox(dialog, 20, '図面を白黒表示')
vs.SetBelowItem(dialog, 10,20,0,0)
return dialog
def dialog_handler(item,data):
if item == kOK:
selectScale.diffscale = vs.GetBooleanItem(dialog, 10)#縮尺
selectScale.glayscale = vs.GetBooleanItem(dialog, 20)#白黒
elif item == kCANCEL:
pass
elif item == kSETUPDIALOG:
vs.SetBooleanItem(dialog, 10, True)
vs.SetBooleanItem(dialog, 20, False)
return item
dialog = create_dialog()
result = False
selectScale.diffscale = False
selectScale.glayscale = False
if vs.RunLayoutDialog( dialog, dialog_handler ) == kOK:
result = True
return result , selectScale.diffscale , selectScale.glayscale
説明動画
youtubeに説明動画をあげました。
積み残し
積み残してるものも幾つかあります。
- 枠の要不要:ダイアログで選ばせるか。理想は用紙サイズ内で収まるものは枠不要にすることだが、少し難しい。表示図形の最小四角形の書き方を考える必要あり。
- 複数の用紙の場合:試してもいないので、エラーが発生するかも。
- 3D:透視投影の場合の視点処理ができればできますが、見当たりません。
全文
以下のコードをコピーして、Vectorworksのスクリプトに貼り付けて実行してください。
※細かなエラーチェックは行ってないので、必ず保存して実行してください。
import vs
import os
def selectScale():#ダイアログの設定
kOK = 1
kCANCEL = 2
kSETUPDIALOG = 12255
def create_dialog():
dialog = vs.CreateLayout('', False, 'OK', 'キャンセル')
vs.CreateStaticText(dialog, 5, '登録画面からビューポートを作成します。'+ vs.Chr(13)+'既にシートレイヤがある登録画面名は作成されません。', 45)
vs.SetFirstLayoutItem( dialog, 5 )
vs.CreateCheckBox( dialog, 10, '異なる縮尺のレイヤを表示' )
vs.SetBelowItem(dialog, 5,10,0,0)
vs.CreateCheckBox(dialog, 20, '図面を白黒表示')
vs.SetBelowItem(dialog, 10,20,0,0)
return dialog
def dialog_handler(item,data):
if item == kOK:
selectScale.diffscale = vs.GetBooleanItem(dialog, 10)#縮尺
selectScale.glayscale = vs.GetBooleanItem(dialog, 20)#白黒
elif item == kCANCEL:
pass
elif item == kSETUPDIALOG:
vs.SetBooleanItem(dialog, 10, True)
vs.SetBooleanItem(dialog, 20, False)
return item
dialog = create_dialog()
result = False
selectScale.diffscale = False
selectScale.glayscale = False
if vs.RunLayoutDialog( dialog, dialog_handler ) == kOK:
result = True
return result , selectScale.diffscale , selectScale.glayscale
def create_Vlist():#登録画面のリストを作る
n = vs.SheetNum() #登録画面の数
vlist = []
i =1
for i in range(1,n+1):
v_String = vs.SheetList(i)
vs.VRestore(str(v_String)) #登録画面の切り替え
act_H = vs.ActLayer() #アクティブなレイヤを確認
boo,xO,yO = vs.GetSheetLayerUserOrigin(act_H)
if boo == True:
pass
else:
boo,offset, rXAng, rYAng, rZAng = vs.GetViewMatrix(act_H) #現在の角度をGet
if rXAng == 0:
vlist.append(v_String)
i += 1
return vlist
def create_layer_list():#デザインレイヤ名のリストを作る
sheet_list = []
n = vs.NumLayers() #レイヤの数
layer_list = []
scale_dict = {}
scaleLayer = {}
layer_H = vs.FLayer()
layerName = vs.GetLName(layer_H)
boo = vs.SetSheetLayerUserOrigin(layer_H, 0, 0)#シートレイヤの判別
if boo == True:
sheet_list.append(layerName)
else:
layer_list.append(layerName)
scale = vs.GetLScale(layer_H)
scale_dict[layerName] = scale
scaleLayer.setdefault(scale,[]).append(layerName)
i =1
while i <= int(n-1):
layer_H = vs.NextLayer(layer_H)
boo = vs.SetSheetLayerUserOrigin(layer_H, 0, 0)#シートレイヤの判別
layerName = vs.GetLName(layer_H)
if boo == True:
sheet_list.append(layerName)
else:
layer_list.append(layerName)
scale = vs.GetLScale(layer_H)
scaleLayer.setdefault(scale,[]).append(layerName)
scale_dict[layerName] = scale
i += 1
return layer_list ,sheet_list, scale_dict , scaleLayer
def class_name_List():#クラス名のリストを作る
n = vs.ClassNum()
class_list = []
i =1
for i in range(1,n+1):
c_Name = vs.ClassList(i)
class_list.append(c_Name)
i += 1
classview_dict = {}
for view in class_list:
classview = vs.GetCVis(view) #クラスの表示状態
classview_dict[view] = classview
return class_list , classview_dict
def main():
for vName in vlist: #登録画面の名前のリストでビューポートを作っていく
#layer_list , sheet_list , scale_dict , scaleLayer = create_layer_list()
if vName in sheet_list:
pass
else:
vs.VRestore(str(vName)) #登録画面の切り替え
#-----ここから現在の表示状態や縮尺などを入手(get)して変数にする----------
act_H = vs.ActLayer() #アクティブなレイヤを確認
layer_scale = vs.GetLScale(act_H)#現在のレイヤ縮尺をGet
p1,p2 = vs.GetDrawingSizeRect()#現在の用紙サイズをGet
p1 = (p1[0]/layer_scale,p1[1]/layer_scale)
p2 = (p2[0]/layer_scale,p2[1]/layer_scale)
sheet_H = vs.CreateLayer(vName, 2)#シートレイヤを作成 vNameは名前 1はデザインレイヤ 2はシートレイヤ
paperWidth ,paperHeight = (p1[0]-p2[0])/layer_scale , (p1[1]-p2[1])/layer_scale
vs.SetDrawingRect(paperWidth, paperHeight)#用紙サイズを設定(登録画面でGetした数値をもとに
for key in scaleLayer.keys():
layerview_dict = {}
vs.Rect(p1,p2)#四角形を作る(ビューポートの枠)
crop_H = vs.LNewObj()#作った四角形を枠にクロップ枠に設定
view_H = vs.CreateVP(sheet_H)#ビューポートを作成
vs.SetObjectVariableReal(view_H, 1003, key) #縮尺を設定
vs.SetObjectVariableBoolean(view_H,1005,True)
vs.SetObjectVariableBoolean(view_H,1035,True)
vs.SetVPCropObject(view_H, crop_H)
if selectScale.glayscale == True:
vs.SetObjectVariableBoolean(view_H, 1030, True) #白黒表示
for classkey,value in classview_dict.items():
boo = vs.SetVPClassVisibility(view_H, classkey, int(value))
countlist = []
for name in scaleLayer[key]:
if (key != layer_scale) and selectScale.diffscale == False:
pass
else:
layer_H = vs.GetLayerByName(name)
layerview = vs.GetObjectVariableInt(layer_H, 153)
countlist.append(layerview)
layerview_dict[name] = layerview
boo = vs.SetVPLayerVisibility(view_H, layer_H, int(layerview))
if len(countlist) == countlist.count(-1):
vs.DelObject(view_H)
vs.UpdateVP(view_H)
vs.DSelectAll()
result , selectScale.diffscale , selectScale.glayscale = selectScale()
if result == True:
try:
vlist = create_Vlist()
layer_list , sheet_list , scale_dict , scaleLayer = create_layer_list()
class_list , classview_dict = class_name_List()
main()
vs.AlrtDialog('操作が完了しました。')
except:
vs.AlrtDialog('エラーが発生しました。処理は完了していません。')
else:
pass