造作図のビューポートを作るスクリプト

Vectorworksでは単体のビューポートを作成することができません。投影図ビューポートではあくまで現在の状態をビューポートにする必要があります。

造作図のビューポートを作る

せっかく造作や家具を3Dで作ったらそれをそのまま図面にも活用したいです。ただ、現状だと単体でビューポートを作成することができないので、レイヤやクラスで調整する必要があります。

その作業が意外と手間なので、スクリプトにしてみました。

正直ビューポートに関してはスクリプトが上手くいかないことが多く、一発で完璧にというのはできませんでしたが、ベースは作成できると思います。サンプルとしてご利用ください。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# 2022.12.22

import vs
import sys


def settingSym(hand, symName):  # シンボルに変換する関数。座標とシンボルのハンドルを返す
    vs.BeginSym(symName)
    vs.Locus((0, 0))
    dummy = vs.LNewObj()
    vs.SetPlanarRefIDToGround(dummy)
    vs.EndSym()

    symH = vs.GetObject(symName)
    dupH = vs.CreateDuplicateObject(hand, symH)
    vs.SetPlanarRef(dupH, 0)
    x, y = vs.HCenter(hand)
    vs.HMove(dupH, -x, -y)
    vs.DelObject(dummy)
    p = (x, y)
    return p, symH


def setClassLayer(symName):  # 造作レイヤと造作+''の名前を返す
    layerName = "造作"
    vs.Layer(layerName)

    className = "造作-" + symName
    vs.NameClass(className)
    return layerName, className


def createSheet(className):
    sheetH = vs.CreateLayer(className, 2)
    vs.SetDrawingRect(420, 290)
    vs.SetObjectVariableInt(sheetH, 155, 300)  # シートレイヤ解像度
    return sheetH


def createVp(sheetH, layerName, className):
    def setBaseVp(vp,layerName,className):
        boo = vs.SetVPLayerVisibility(vp['hand'], vs.GetObject(layerName), 0)  # レイヤネームを表示
        boo = vs.SetVPClassVisibility(vp['hand'], className, 0)  # クラスを表示
        boo = vs.SetVPClassVisibility(vp['hand'], '寸法', 0)  # クラスを表示
        vs.SetObjectVariableBoolean(vp['hand'], 1035, True)  # プレイナー図形の表示
        vp['uuid'] = vs.GetObjectUuid(vp['hand'])
        vs.SetObjectVariableInt(vp['hand'], 1001, vp['レンダリング'])  # レンダリング
        vs.SetObjectVariableInt(vp['hand'], 1007, vp['view'])  # view
        vs.UpdateVP(vp['hand'])
        vs.SetPref(596, True)
        vs.SetObjectVariableBoolean(vp['hand'], 1167, True)  # 即座にリセット
        vp['高さ'] =  vs.HHeight(vp['hand'])
        vp['幅'] = vs.HWidth(vp['hand'])
        
        rectWide = 210
        rectHigh = 148.5

        ratioH = vp['高さ'] / rectHigh  # 高さの比率
        ratioW = vp['幅'] / rectWide  # 幅の比率
        
        return ratioH,ratioW

    def setVpFinish(vp,ratio):
        vs.SetObjectVariableReal(vp['hand'], 1003, ratio)
        vs.SetPref(596, True)
        vs.UpdateVP(vp['hand'])
        vs.SetObjectVariableBoolean(vp['hand'], 1167, True)
        center = vs.HCenter(vp['hand'])
        vs.HMove(vp['hand'], vp['中心'][0]-center[0], vp['中心'][1]-center[1])

    topH = vs.CreateVP(sheetH)
    forwardH = vs.CreateVP(sheetH)
    rightH = vs.CreateVP(sheetH)
    diagonalH = vs.CreateVP(sheetH)

    top = {
        "hand": topH,
        "uuid": vs.GetObjectUuid(topH),
        "view": 7,
        "中心": (-105, 74.25),
        "レンダリング": 0,
        "高さ": "",
        "幅": "",
    }
    forward = {
        "hand": forwardH,
        "uuid": vs.GetObjectUuid(forwardH),
        "view": 3,
        "中心": (-105, -74.25),
        "レンダリング": 6,
        "高さ": "",
        "幅": "",
        "uuid": "",
    }
    right = {
        "hand": rightH,
        "uuid": vs.GetObjectUuid(rightH),
        "view": 6,
        "中心": (105, 74.25),
        "レンダリング": 6,
        "高さ": "",
        "幅": "",
        "uuid": "",
    }
    diagonal = {
        "hand": diagonalH,
        "uuid": vs.GetObjectUuid(diagonalH),
        "view": 9,
        "中心": (105, -74.25),
        "レンダリング": 6,
        "高さ": "",
        "幅": "",
        "uuid": "",
    }#陰線消去に変更(シェイド11)
        
    ratioList = []
    ratioH,ratioW = setBaseVp(top,layerName,className)
    ratioList.extend([ratioH,ratioW])
    ratioH,ratioW = setBaseVp(forward,layerName,className)
    ratioList.extend([ratioH,ratioW])
    ratioH,ratioW = setBaseVp(right,layerName,className)
    ratioList.extend([ratioH,ratioW])
    ratioH,ratioW = setBaseVp(diagonal,layerName,className)
    ratioList.extend([ratioH,ratioW])

    ratioMax = max(ratioList)

    if ratioMax <= 10:
        ratio =  (ratioMax + 4.9999) // 5 * 5
    
    elif ratioMax < 100:
        ratio = (ratioMax + 9.9999) // 10 * 10
    
    else:
        ratio =  (ratioMax + 24.9999) // 50 * 50

    setVpFinish(top,ratio)
    setVpFinish(forward,ratio)
    setVpFinish(right,ratio)
    setVpFinish(diagonal,ratio)

    (major, minor, maintenance, platform) = vs.GetVersion()

    #Vectorworksの2022からレンダリングの仕様変更
    if major < 27:
        render = 4
    else:
        render = 11

    vs.SetObjectVariableInt(diagonal['hand'], 1001, render)  # レンダリング
    vs.SetObjectVariableInt(top['hand'], 1000, 6)  # レンダリング
    vs.UpdateVP(diagonal['hand'])
    vs.SetObjectVariableBoolean(diagonal['hand'], 1167, True)


# ここからMain
hand = vs.FSActLayer()

if vs.GetTypeN(hand) == 11:  # グループ
    symName = vs.StrDialog("シンボル名を入力してください。", "test")
    if vs.GetObject(symName) != 0:
        vs.AlrtDialog("同じ名前のオブジェクトがすでに存在します。")
    
    else:
        layerName, className = setClassLayer(symName)
        vs.SetClassN(hand, className, True)
        p, symH = settingSym(hand, symName)
        vs.Symbol(symName, p, 0)
        sheetH = createSheet(className)
        createVp(sheetH, layerName, className)

elif vs.GetTypeN(hand) == 15:  # シンボル
    symName = vs.GetSymName(hand)
    layerName, className = setClassLayer(symName)
    vs.SetClassN(hand, className, True)
    x, y = vs.HCenter(hand)
    p = (x, y)
    vs.Symbol(symName, p, 0)
    sheetH = createSheet(className)
    createVp(sheetH, layerName, className)
    vs.AlrtDialog('ビューポートのクラス表示設定を確認ください。')
    
else:
    vs.AlrtDialog('適切な図形を選択してください')

Follow me!

コメントを残す

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