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)

Follow me!

コメントを残す

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