Vectorworks ランダムな幅と厚み
石やタイル、木工など、複数の幅や厚みから選んで壁を仕上げるというのはよく見ます。最終的な図面はしっかりと幅を指定して数量が拾える形と思いますが、初期の3Dは適当に作ってるのがほとんどでは無いかと思います。
繰り返しなので時間がかかる
ランダムに選ぶとなると、選択→幅設定→選択の繰り返しで時間がかかります。この辺りをスクリプトにします。
選択した四角形(壁の範囲)を複数の幅から選ぶスクリプト
簡単に作ったので、斜めの四角形には対応していません。エラーの処理も適当です。ダイアログをしっかり作ろうとすると大変なので、元からある<vs.StrDialog>という関数を使ってます。
カンマ区切りで数値を入力することで、複数の厚みを読み込む形となっています。
本来はカンマ区切りや文字列が入力された時など対応が必要ですが、この辺りを省いてエラーが出たらダイアログを出すようにしています。
import vs
import random
hand = vs.FSActLayer()
p1,p2 = vs.GetBBox(hand)
wide = p2[0]-p1[0]
high = p1[1]-p2[1]
text = vs.StrDialog('<,>区切りで幅を入力してください' + vs.Chr(13) + '例) 100,120,140,160,180,200', '100')
l = text.split(',')
total = 0
try:
while True:
w = float(random.choice(l))
total += w
if total > wide:
sub = total - wide
p2 = p1[0] + sub , p2[1]
vs.Rect(p1,p2)
break
else:
p2 = p1[0] + w - 3 , p2[1]
vs.Rect(p1,p2)
p1 = p2[0] + 3 , p1[1]
vs.SetDSelect(hand)
#vs.Group()
except:
vs.AlrtDialog('図形を選択して、正しく入力してください')
選択した複数の四角形の厚みをランダムに設定
複数の四角形の厚みをばらけて作成するスクリプトです。
import random
def callbackUuid(hand):
uuidList.append(vs.GetObjectUuid(hand))
uuidList = []
vs.ForEachObject(callbackUuid, "((V) & (SEL=TRUE))")
def callback(hand):
top = random.choice(topList)
if topnew != '':
topList.append(topnew)
topnew = top
vs.HExtrude(hand, 0, top)
topList.remove(top)
top = vs.StrDialog('<,>区切りで厚みを入力してください' + vs.Chr(13) + '例) 10,20,30', '10,20')
topList = top.split(',')
before = ''
try:
for index,obj in enumerate(uuidList):
top = random.choice(topList)
vs.HExtrude(vs.GetObjectByUuid(obj), 0, top)
if index != 0:
topList.append(before)
before = top
topList.remove(before)
except:
vs.AlrtDialog('図形を選択して、正しく入力してください')
ワークシートで数量を算出
Vectorworksのワークシートを使えば、どの幅の四角形の厚みがそれぞれ何本か調べることができます。