造作図のビューポートを作るスクリプト
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('適切な図形を選択してください')