この記事では、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関数は以下に記述されています。
自前のテクスチャ出力関数を作る
ライブラリの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に自前関数を実装する例が紹介されております。
アニメーションテクスチャをスクリプトで出力する方法で大変参考になります。
インストールパス/resources/python/sd/tools/export.py