画像の一括取り込み(サイズと形状指定) Vectorworks
Vectorworksの画像をサクッと取り込める機能は、使っていて当たり前の機能です。BIMとかCGソフトを触ってると気軽にできないので、本当にすごいなと思います。
建築だと画像を扱う機会は少ないですが、インテリアの場合は、仕上げとかデザインのイメージを伝えるのに手っ取り早く画像はよく使います。
画像のサイズ変更 / トリミング
画像を指定の形にトリミングするのは、画像をダブルクリック>指定の形を作成 の流れですが、取り込んだ画像はサイズがマチマチです。複数枚画像の取り込み > サイズ調整 > トリミングは時間がかかります。
こうした連続作業をスクリプトで行います。
画像取り込みの流れ
スクリプトを実行 > サイズとトリミング形状を選択>複数の画像を入れたフォルダを選択
サイズを変えてトリミング
長さを100とすると、画像サイズも100となります。
幅や高さを合わせて
横一列に整列する場合は、画像の高さを合わせます。縦一列も場合は、画像の幅を合わせます。
他にも円形のケースもあると思うので、それぞれ選択すれば直ぐに取り込めます。
スクリプトサンプル
Vectorworks Forumを参考にしてます。
ダイアログでサイズやトリミング形状を選んで、フォルダ内の画像を読み込み完了するまで while で繰り返し処理を行っています。
取り込んだ後に整列するかどうするか模索しましたが、randomモジュールを使ってパッと見て枚数とかわかるようにしてます。
import vs
import os
import random
def sizeD():
kOK = 1
kCANCEL = 2
kSETUPDIALOG = 12255
def create_dialog():
dialog = vs.CreateLayout('1:1のサイズを入力', False, 'OK', 'キャンセル')
vs.CreateRadioButtonGroupBox(dialog, 100, '四角形', True)
vs.CreateRadioButton(dialog, 110, '正方形 ')
vs.CreateRadioButton(dialog, 120, '高さ合わせ')
vs.CreateRadioButton(dialog, 130, '幅合わせ ')
vs.CreateStaticText(dialog, 140, '長さ', -1)
vs.CreateEditReal(dialog, 150, 1, 50, 20)
vs.SetFirstLayoutItem( dialog, 100 )
vs.SetFirstGroupItem(dialog,100,110,0,0)
vs.SetBelowItem(dialog,110,120,0,0)
vs.SetBelowItem(dialog,120,130,0,0)
vs.SetBelowItem(dialog,130,140,0,0)
vs.SetRightItem(dialog,140,150,0,0)
vs.CreateRadioButtonGroupBox(dialog, 200, '円形', True)
vs.CreateStaticText(dialog, 210, '半径', -1)
vs.CreateEditReal(dialog, 220, 1, 25, 20)
vs.SetBelowItem(dialog,100,200,0,0)
vs.SetFirstGroupItem(dialog,200,210,43)
vs.SetRightItem(dialog,210,220,0,0)
return dialog
def dialog_handler(item,boo):
if item == kOK:
sizeD.rect = vs.GetBooleanItem(dialog, 100)
sizeD.square = vs.GetBooleanItem(dialog, 110)
sizeD.high = vs.GetBooleanItem(dialog, 120)
sizeD.wide = vs.GetBooleanItem(dialog, 130)
sizeD.boo,sizeD.length = vs.GetEditReal(dialog, 150, 1)
sizeD.circle = vs.GetBooleanItem(dialog, 200)
sizeD.boo,sizeD.rad = vs.GetEditReal(dialog, 210, 1)
elif item == kCANCEL:
pass
elif item == kSETUPDIALOG:
vs.SetBooleanItem(dialog, 100, True)
vs.SetBooleanItem(dialog, 200, False) #普通
#vs.SetControlData(dialog, 110, 3) #陰影
#vs.SetControlData(dialog, 120, 3) #全体を明るく
#vs.SetBooleanItem(dialog, 210, True)
#vs.SetBooleanItem(dialog, 220, False)
dialog = create_dialog()
result = False
sizeD.rect = False
sizeD.square = False
sizeD.high = False
sizeD.wide = False
sizeD.length = 0
sizeD.circle = False
sizeD.rad = 0
if vs.RunLayoutDialog( dialog, dialog_handler ) == kOK:
result = True
return result , sizeD.rect ,sizeD.square , sizeD.high , sizeD.wide ,sizeD.length , sizeD.circle , sizeD.rad
result , rect , square , high , wide , length , circle , rad = sizeD()
if result == True:
major, minor, maintenance, platform = vs.GetVersion()
isMac = False
if platform == 1:
isMac = True
layerScale = vs.GetLScale(vs.ActLayer())
err, dirPath = vs.GetFolder( '画像フォルダを選択してください' )
imgCreatedCnt = 0
if err == 0: #エラーじゃない場合
hsfDirPath = dirPath
fileIndex = 1
imageSize = length * layerScale
p0 = vs.GetVCenter()
while True:
fileName = vs.GetFilesInFolder( hsfDirPath, fileIndex )
fileIndex += 1
if fileName == '': #全てのファイルの取得が完了
break
name, ext = os.path.splitext( fileName )
if ext.lower() == '.png' or ext.lower() == '.jpg':
imagePath = os.path.join( dirPath, fileName )
importPt = p0
imgHand = vs.ImportImageFile(imagePath, importPt)
w = vs.HWidth(imgHand)
h = vs.HHeight(imgHand)
pp = vs.HCenter(imgHand)
if rect == True:
if square == True:
if h > w:
p1 = 0,0
p2 = imageSize,-1*imageSize
vs.Rect(p1,p2)
trim = vs.LNewObj()
vs.HScale2D(imgHand, pp[0] , pp[1], imageSize/w, imageSize/w, False)
else:
p1 = 0,0
p2 = imageSize,-1*imageSize
vs.Rect(p1,p2)
trim = vs.LNewObj()
vs.HScale2D(imgHand, pp[0] , pp[1], imageSize/h, imageSize/h, False)
vs.SetImageCropObject(imgHand, trim)
vs.SetImageCropVisible(imgHand, True)
elif high == True:
scale = imageSize/h
vs.HScale2D(imgHand, pp[0] , pp[1], scale, scale, False)
elif wide == True:
scale = imageSize/w
vs.HScale2D(imgHand, pp[0] , pp[1], scale, scale, False)
elif circle == True:
if w < h:
h = w
vs.HScale2D(imgHand, pp[0] , pp[1], imageSize/h, imageSize/h, False)
p1 = 0,0
p2 = imageSize,-1*imageSize
vs.Arc(p1, p2, 0, 360)
vs.SetImageCropObject(imgHand, vs.LNewObj())
vs.SetImageCropVisible(imgHand, True)
movex = random.randint(-imageSize,imageSize)
movey = random.randint(-imageSize,imageSize)
vs.HMove(imgHand,movex,movey)
imgCreatedCnt += 1
vs.DSelectAll()
vs.AlrtDialog(str(imgCreatedCnt)+'枚の画像が取り込まれました。')