画像の一括取り込み(サイズと形状指定) 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)+'枚の画像が取り込まれました。')

Follow me!

コメントを残す

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