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

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です