見出し画像

フォルダ内の画像からまとめて複数の添景をつくるプラグインメニューをつくってみた

添景を大量に作るのは大変

とある案件で人物添景が必要になり、某有名サイトさんの添景画像をダウンロードさせていただいたのですが、これを一つ一つベクターワークスの添景にしていくのはなかなか大変です。

上の記事のときも植栽を添景にするのにかなり時間がかかりました。

一つの添景をつくるために、9クリックほどの同じ作業を繰り返す必要がありますが、繰り返し作業はプログラムにさせるべし、とプラグインをつくってみました。

プラグイン化するのもなかなか大変だった

まず、vectorscriptのどの関数を扱えば意図する結果になるかが分かりません。片っ端から関係ありそうな関数の組み合わせと変数の設定を試しながら、少しづつは近づくけれども、ダイアログを開いて設定する作業を削るとどうしてもうまくいかず、9クリックを6クリックに減らすことしかできませんでした。

フォーラムでかなり近いものを発見

仕方ないかと半ばあきらめていた時に、いつも頼りになるベクターワークスのフォーラムで参考になりそうなものを発見!(いろいろな単語で延々と検索を試みてようやく見つけました。)

後半でjonasfehr氏がアップしているコードがかなりやりたいことに近かったです。
ただ、png画像の透過が反映されないため、一つ一つ透明属性を反映する必要がありました。これもやはり自動化したいところです。

さらに試行錯誤

昨年末に作業をしたので思い出してみると、その後の試行錯誤は以下のような感じ(読み飛ばしても良いかも。ディテールは思い出せないので概略だけ)

・pythonでpng画像のアルファチャンネルを取り出せるものを探す→すぐにPIL(pillow)にたどり着く。

→pythonにPILをインストールするもPILを呼び出そうとするとエラーになる。バージョンを変えたりいろいろ試しても同じ。

https://bim.aanda.co.jp/blog/2020/10/7111/ を見て環境パスをいろいろ試してみるもうまくいかず。

→PCにpythonの最新版をインストールしているのをアンインストールしてVW2020と同じver3.5にしていろいろ試すと、PILを呼び出し成功

→試行錯誤して、一旦アルファチャンネルを取り出した画像を***2.pngの名前で保存し、それをテクスチャの透明属性に属性に使えるように読み込んで、***2.pngを削除、という遠回りでなんとか透過属性を設定成功

→添景の高さをとりあえず1600に設定+添景ごとにx方向に1000ずらす工程を追加

→完成!

→と思ったら、作った添景を他のファイルにコピペすると、添景のテクスチャが白紙になってしまうことが判明。(テクスチャのイメージとマスクをVectorscriptの古い関数を使って割り当ててることが原因かと思われますがそれに変わる関数は見つけられず)

→添景は一つのファイルにまとめて作成しておいて、そこから作業ファイルにコピペ、という手順を想定していたので何とかしたい。けれども、対策が思いつかず心が折れかける。

→たまたま、一度テクスチャの編集画面を開いてからコピペすると白紙化しないっぽい。ということに気づく。(おそらく編集画面を開くことで、古い関数で設定したのがちゃんとした形?に更新されるのかと)

→プログラムで取り込む時に編集画面を開く儀式を1工程噛ませとけばいいのかも。と思いつき試してみると成功。工程が増えて、ワンクリックで完了とはいかないけれども、これで十分。

という感じでなんとか使えるものに行き着きました。

コードと操作動画

ということでプラグインメニュー(phython)のコードをのっけておきます。

import os
import vs
from PIL import Image, ImageFilter

major, minor, maintenance, platform = vs.GetVersion()
isMac = False
if platform == 1: isMac = True

# define a location to import the images
importPt = (0,0)

symCreatedCnt = 0

err, dirPath = vs.GetFolder( 'Select a Folder' )
if err == 0: # no-error
	hsfDirPath = dirPath
	if isMac: ok, hsfDirPath = vs.ConvertPosix2HSFPath( dirPath )

	fileIndex = 1
	x = 0
	while True: # loop the files
		fileName = vs.GetFilesInFolder( hsfDirPath, fileIndex )
		fileIndex += 1

		if fileName == '': # no more files
			break

		name, ext = os.path.splitext( fileName )
		if ext.lower() == '.png' or ext.lower() == '.jpg':
			imagePath = os.path.join( dirPath, fileName )
						
			hPaint = vs.ImportImageFile(imagePath, 0,0)
			
			im_rgba = Image.open(imagePath)
			alpha = im_rgba.convert('RGBA').split()[-1]
			imagePath2 = imagePath.replace('.png','2.png')
			alpha.save(imagePath2)
			hPaint2 = vs.ImportImageFile(imagePath2, 0,0)
			hImage = vs.CreateImageFromPaint(hPaint, 'Just_a_name')
			hImage2 = vs.CreateImageFromPaint(hPaint2, 'Just_a_name2')
			os.remove(imagePath2)
			hTexture = vs.CreateTexture()
			vs.SetTextureSize(hTexture, 1)
			vs.SetName(hTexture, name+"_tex")
			hShaderRec = vs.CreateShaderRecord(hTexture, 1, 41) #1 = Color image
			hTextureBitMap = vs.CreateTextureBitmapD( hShaderRec)

			vs.SetObjectVariableHandle(hTextureBitMap, 528, hImage) #Were the magic happens!
			
			hShaderRec2 = vs.CreateShaderRecord(hTexture, 3, 19)
			hTextureBitMap2 = vs.CreateTextureBitmapD( hShaderRec2)
			vs.SetObjectVariableHandle(hTextureBitMap2, 528, hImage2) 
			vs.EditTexture(hTexture)
			texRef = vs.Name2Index(name+"_tex")
			pH = vs.CreateImageProp(name, texRef, 1600, 1100, True , True, True, True ,False)
			vs.HMove(pH,x,0)
			x += 1000
		
			vs.DelObject(hPaint)
			vs.DelObject(hPaint2)
			
			symCreatedCnt += 1

	vs.AlrtDialog( 'Done! Imported ', symCreatedCnt , ' images to textures.' )

操作感はこんな感じ、

添景化がめちゃめちゃ楽になりました!

補足 PILのインストールと設定

VW2021をインストールすると、再びPILが呼び出せないエラーが・・・

とりあえずPCに直接インストールしているpyhtonは使わなくても良さそうなのでアンインストール。

その後、再び https://bim.aanda.co.jp/blog/2020/10/7111/ を見ながら以下の作業で使えるようになりました。

8-1-2. 外部ライブラリインストールモジュール(pip)のアップデート
この手順は、Windows環境でのみ必要な作業となります。
1.  コマンドプロンプトの起動
2.  VectorworksPythonのパスに移動するコマンドを入力
>cd "C:¥Program files¥Vectorworks2020¥Python35"
3.  pipバージョンアップのコマンドを入力
>python -m pip install --upgrade pip --user

ここまでは先のA&Aの記事(8-1-2)のとおり。最後の--userをつけないとうまくいかなかったです。

4. 次にPIL(pillow)をインストール。

>python -m pip install pillow --user

5. インストールが成功したら、再び同じコマンドを実行。すると、どこにインストール済みですよと出るのでそれをコピー(下の画像の緑に該当する部分)

aaaのコピー

(途中で--userつけ忘れて拒否されてます。)

6. コピーしたものをベクターワークスのメニュー>ツール>プラグイン>スクリプトオプションで追加

画像2

これで私の場合はうまくいきました。(この辺がいまいち理解出来てないので、来年のためのメモです。)

この記事が気に入ったらサポートをしてみませんか?