当ブログのリンクにはプロモーションを含む場合がありますのでご了承下さい

【Substance 3D Designer】Pythonでテクスチャ出力

この記事では、Substance 3D Designerでのテクスチャ出力をPythonで行う方法について解説します。以下のテストマテリアルを出力してみたいと思います。

手動でテクスチャを出力する

まずは手動でテクスチャ出力する場合について。
グラフを右クリックして、Export outputsからテクスチャ出力します。

出力ファイル名はデフォルトではグラフ名_出力ノードのidentifierになります。

ファイル名のパターンは右のプルダウンメニューからどの要素を使うか変更することが可能です。

Pythonでテクスチャ出力する

Pythonでテクスチャ出力する場合はsd.tools.export.exportSDGraphOutputs関数が用意されています。これを使って出力してみましょう。

import sd
from sd.tools.export import exportSDGraphOutputs

context = sd.getContext() 
app = context.getSDApplication() 
ui_mgr = app.getQtForPythonUIMgr()

# 現在のグラフを取得
graph = ui_mgr.getCurrentGraph()

export_path = "F:/SubstanceDesigner/ExportTexturePy"
exportSDGraphOutputs(graph, export_path, 'png')

こちらのコードをPython Editorから実行してみます。

出力したテクスチャ名は、グラフ名_output_連番 となるようです。

なぜにこのような仕様なのでしょう・・・
ファイル名はこの命名規則で決め打ちになっているようです。

exportSDGraphOutputs関数は以下に記述されています。

pythonファイル格納場所

インストールパス/resources/python/sd/tools/export.py

自前のテクスチャ出力関数を作る

ライブラリのsd.tools.export.exportSDGraphOutputs関数を改造して、
出力ファイル名が、グラフ名_出力ノードのidentifierとなるようなテクスチャ出力関数を自前で作ってテクスチャを出力してみます。

import sd
import os
from sd.api.sbs import sdsbscompgraph
from sd.api import sdproperty
from sd.api.apiexception import APIException

def export_texture(aSDGraph, aOutputDir = '', aFileExt = 'png'):
	if not aSDGraph:
		return False
	
	if not issubclass(type(aSDGraph), sdsbscompgraph.SDSBSCompGraph):
		return False

	aSDGraph.compute()

	graphIdentifier = aSDGraph.getIdentifier()

	nodeIndex = -1
	for sdNode in aSDGraph.getOutputNodes():
		nodeIndex = nodeIndex + 1

		nodeDefinition = sdNode.getDefinition()

		outputProperties = nodeDefinition.getProperties(sdproperty.SDPropertyCategory.Output)
		for outputProperty in outputProperties:
			
			propertyValue = sdNode.getPropertyValue(outputProperty)
			
			propertyTexture = propertyValue.get()
			if not propertyTexture:
				continue
			
			fileExt = aFileExt
			identifier = outputProperty.getId()
			fileName = str(graphIdentifier) + '_' + identifier + '.'+ str(fileExt)
			textureFileName = os.path.abspath(os.path.join(aOutputDir, fileName))

			try:
				propertyTexture.save(textureFileName)
			except APIException:
				print('Fail to save texture %s' % textureFileName)

	return True

context = sd.getContext() 
app = context.getSDApplication() 
ui_mgr = app.getQtForPythonUIMgr()

graph = ui_mgr.getCurrentGraph()

export_path = "F:/SubstanceDesigner/ExportTexturePy"
export_texture(graph, export_path, 'png')

こちらのコードで出力すると以下のようなファイル名で出力されます。

やったね!
自分用の命名規則で出力する関数を作ってライブラリ化しておけば良いですね。

参考記事

かもそばさんの書かれた以下の記事で、export.pyに自前関数を実装する例が紹介されております。
アニメーションテクスチャをスクリプトで出力する方法で大変参考になります。

【Substance Designer + Python】コースティクスの連番画像を出力する