Vectorworks ビューポートを作る(3) 設定値
ビューポートの縮尺などを設定
CAD系のスクリプトで処理する際に、Get と Set の関数は兄弟みたいなもと思います。Getで取ってきた文字列とか数値を、Setで与えたい図形やレイヤに与えます。
今回は登録画面で表示されている状態(アクティブなレイヤ・クラスやレイヤの表示・縮尺・角度)とかをGetで取ってきて、作成したビューポートにSetしている状態です。
関数と設定値
何をGetするか、何をSetするかはVectorworksが用意している関数や、設定値によります。例えば、SetObjectVariableReal というのは色々数値を設定しますが、1003というのはビューポートの縮尺を設定します。上の段のGetLScaleで登録画面で開いた状態の縮尺をGetして、1003で割り当ててます。
設定値は少し入ったところで、Script Appendix から移動します。
Appendix は階層化されているので、結構探しやすいです。Viewport>縮尺の設定値1003と記載。
Vectorworksは日本語だから助かります。ライノセラスは英語なので慣れるまで大変です。グラスホッパーの場合は、日本語での解説と、画面説明があるのでこちらは掴みやすいです。
登録画面の図面をビューポートに一括変更 OK
レイヤの用紙設定から、用紙サイズを認識して、新しくシートレイヤを作ってます。縮尺もレイヤに合わせて図面を作成することで、そのまま出力サイズにクロップするようビューポートを作成できてます。
3D アクソメ表示 OK
3Dのアクソメ表示も概ねOKでした。角度は数値を正しくGetできて設定できてます。クロップ位置の問題はありますが、かねがね問題なさそう。
3D 透視投影の場合 NG
透視投影の場合、設定値が取れる関数が見つけられてません。
<ビューポートの投影距離の設定><登録画面上の座標>の 2つがうまく対応できず...
本来はこの位置のパースが欲しかったのですが、全然違う位置から同じ方向を向いてました。
次の処理
とりあえずは図面だけ対応出来るようにしようかと思いました。
・3Dの場合は例外にする
・異なる縮尺のレイヤが表示されている(図面の帯とか)場合に、分けてビューポート取り出す
・実行時に白黒かカラーか選ばせる(ダイアログ)
・登録画面がシートレイヤだった時の処理(多分エラーでそう)
import vs
import os
def create_Vlist():#登録画面のリストを作る
n = vs.SheetNum() #登録画面の数
vlist = []
i =1
for i in range(1,n+1):
v_String = vs.SheetList(i)
vlist.append(v_String)
i += 1
return vlist
#ーーーーーーーーーーーーーーーーーーー
def create_layer_list():#デザインレイヤ名のリストを作る
n = vs.NumLayers() #レイヤの数
layer_list = []
layerH = vs.FLayer()
layerName = vs.GetLName(layerH)
layer_list.append(layerName)
i =1
while i <= int(n-1):
layerH = vs.NextLayer(layerH)
boo = vs.SetSheetLayerUserOrigin(layerH, 0, 0)#シートレイヤの判別
if boo == True: #Trueの場合はシートレイヤなので何もしない
i += 1
continue
layerName = vs.GetLName(layerH)
layer_list.append(layerName)
i += 1
return layer_list
#ーーーーーーーーーーーーーーーーーーーー
def classNameList():#クラス名のリストを作る
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
return class_list
vlist = create_Vlist()
layer_list = create_layer_list()
class_list = classNameList()
def class_View(class_list):
classview_dict = {}
for view in class_list:
classview = vs.GetCVis(view) #クラスの表示状態
classview_dict[view] = classview
return classview_dict
def layer_View(layer_list):
layerview_dict = {}
for name in layer_list:
layer_H = vs.GetLayerByName(name)
layerview = vs.GetObjectVariableInt(layer_H, 153)
layerview_dict[name] = layerview
return layerview_dict
for vName in vlist: #登録画面の名前のリストでビューポートを作っていく
vs.VRestore(str(vName)) #登録画面の切り替え
#-----ここから現在の表示状態や縮尺などを入手(get)して変数にする----------
act_H = vs.ActLayer() #アクティブなレイヤを確認
layer_scale = vs.GetLScale(act_H)#現在のレイヤ縮尺をGet
zoom = vs.GetZoom()#現在の焦点距離をGet → 違う
boo,offset, rXAng, rYAng, rZAng = vs.GetViewMatrix(act_H) #現在の角度をGet
view = vs.GetProjection(act_H) #現在の視点ビューをGet
p1,p2 = vs.GetDrawingSizeRect()#現在の用紙サイズをGet
vs.Rect(p1,p2)#四角形を作る(ビューポートの枠)
crop_H = vs.LNewObj()#作った四角形を枠にクロップ枠に設定
#-----ここからシートレイヤとビューポートを作る
sheet_H = vs.CreateLayer(vName, 2)#シートレイヤを作成 vNameは名前 1はデザインレイヤ 2はシートレイヤ
view_H = vs.CreateVP(sheet_H)#ビューポートを作成
boo = vs.SetViewMatrix(view_H, (0,0,0), 0, 0, 0)
#-----ここからビューポートの設定を入力(set)---------
paperWidth ,paperHeight = (p1[0]-p2[0])/layer_scale , (p1[1]-p2[1])/layer_scale
vs.SetDrawingRect(paperWidth, paperHeight)#用紙サイズを設定(登録画面でGetした数値をもとに
vs.SetObjectVariableInt(view_H,1000,view)#視点ビューを設定
if rXAng != 0:
vs.SetObjectVariableInt(view_H, 1001, 11) #OpenGL
vs.SetObjectVariableReal(view_H, 1002, zoom)
vs.SetObjectVariableReal(view_H, 1003, layer_scale) #縮尺を設定
vs.SetObjectVariableBoolean(view_H, 1005, True) #2次元図形を表示
vs.SetObjectVariableInt(view_H, 1007, view)#ビューを設定
vs.SetVPCropObject(view_H, crop_H) #クロップ図形設定
boo = vs.SetViewMatrix(view_H, offset, rXAng, rYAng, rZAng)#角度を設定
classview_dict = class_View(class_list)
for key,value in classview_dict.items():
boo = vs.SetVPClassVisibility(view_H, key, int(value))
layerview_dict = layer_View(layer_list)
for key,value in layerview_dict.items():
layer_H = vs.GetLayerByName(key)
boo = vs.SetVPLayerVisibility(view_H, layer_H, int(value))
vs.UpdateVP(view_H)