Python | TECH ART ONLINE https://tech-art.online CG系デザイナーの為のテクニカルまとめサイトです。 Autodesk、Adobe、SideFX関連ソフトの技術情報や効率化・自動化について発信しています。 Wed, 12 Oct 2022 23:47:14 +0000 ja hourly 1 https://wordpress.org/?v=6.7.5 Dashスクリプトで等間隔&ランダム配置 https://tech-art.online/maya-dash/?utm_source=rss&utm_medium=rss&utm_campaign=maya-dash https://tech-art.online/maya-dash/#respond Thu, 13 Oct 2022 11:00:00 +0000 https://tech-art.online/?p=1433 MayaのDashスクリプトを使って等間隔やランダム配置する方法を紹介しました。
ちょっとマニアックかもしれませんが、難しいツールを作らなくてもランダムに配置できるのは便利ですね。

The post Dashスクリプトで等間隔&ランダム配置 first appeared on TECH ART ONLINE.]]>
MayaのDashスクリプトを使って等間隔やランダム配置する方法を紹介しました。
ちょっとマニアックかもしれませんが、難しいツールを作らなくてもランダムに配置できるのは便利ですね。

特にMayaはランダムな値の設定を行うツールがたしか存在しないのでDashスクリプトを使うことで不足分を補えそうです。

ちなみにDashスクリプトはMASHプラグインの中に入っているのでMASHのプラグインをロードしてお使いください。
カスタムも可能です。中身はPythonになっています。こちらの記事にカスタム方法がまとめてありますよ。

管理人がYouTubeで解説!

参考リンク

[Maya] Dash、デフォルトコマンドの紹介 – Patreon
オブジェクトを等間隔に並べるのとかめんどいよね。そんなときはチャンネルボックスを alt + 右クリックだ。- Zenn

The post Dashスクリプトで等間隔&ランダム配置 first appeared on TECH ART ONLINE.]]>
https://tech-art.online/maya-dash/feed/ 0
rivetリグの作り方4選! https://tech-art.online/maya-rivet-rig/?utm_source=rss&utm_medium=rss&utm_campaign=maya-rivet-rig https://tech-art.online/maya-rivet-rig/#respond Thu, 15 Sep 2022 12:00:00 +0000 https://tech-art.online/?p=1402 リベットリグの作り方について紹介しました。
リベットとはボタンのようなものをメッシュ上にくっつけるリグのことです。
メッシュ状に拘束する手法はリグではよく行います。
是非使ってみてくださいね!

The post rivetリグの作り方4選! first appeared on TECH ART ONLINE.]]>
リベットリグの作り方について紹介しました。
リベットとはボタンのようなものをメッシュ上にくっつけるリグのことです。
メッシュ状に拘束する手法はリグではよく行います。
是非使ってみてくださいね!

管理人がYouTubeで解説!

ノード構成:Follicleを使ったリベット

ノード構成: aimConstraintを使ったリベット

ノード構成: Matrixを使ったリベット

ノード構成: スキニング行列を利用したリベット

差分値取得のために使ったサンプルコード

from maya import cmds
from maya.api import OpenMaya as om2

bind_position = om2.MPoint(cmds.pointPosition()) #リベットしたい頂点
bind_spine01_matrix = om2.MMatrix(cmds.xform("spine_01", q=True, matrix=True, ws=True)) #spine01のバインド時のマトリックス
bind_spine02_matrix = om2.MMatrix(cmds.xform("spine_02", q=True, matrix=True, ws=True)) #spine02のバインド時のマトリックス

delta_spine01_position = bind_position * bind_spine01_matrix.inverse() #リベットしたい頂点とspine01の差分値
delta_spine02_position = bind_position * bind_spine02_matrix.inverse() #リベットしたい頂点とspine02の差分値
The post rivetリグの作り方4選! first appeared on TECH ART ONLINE.]]>
https://tech-art.online/maya-rivet-rig/feed/ 0
MayaからFBXの自動出力をPythonで書いてみる。 https://tech-art.online/maya-python-export-fbx/?utm_source=rss&utm_medium=rss&utm_campaign=maya-python-export-fbx https://tech-art.online/maya-python-export-fbx/#respond Tue, 25 Jan 2022 10:49:29 +0000 https://tech-art.online/?p=1334 UE4やUnityではFBXを使ってモデルデータを読み込みますよね?ただ、FBXの出力そのものが結構面倒くさくないですか? Mayaの場合、基本的に出 […]

続きを読む

The post MayaからFBXの自動出力をPythonで書いてみる。 first appeared on TECH ART ONLINE.]]>
UE4やUnityではFBXを使ってモデルデータを読み込みますよね?
ただ、FBXの出力そのものが結構面倒くさくないですか?

Mayaの場合、基本的に出力する内容って毎回一緒なのにいちいちダイアログが出て面倒くさい…。
Pythonであればダイアログも出さずにサクッと出力することができます。

今回はMayaからFBXをPythonで、お好みのFBX設定にして出力する方法を紹介しました。

管理人がYouTubeで解説!

知りたいコマンドがあればFBX Plug-inガイドを参考に!

Autodesk Maya FBX Plug-in ガイド
こちらFBX2012のものですね。
といってもこれしかありませんし、これが一番参考になります。

YouTubeで使ったコマンド

UE4向けにノード名をリネームする

from maya import cmds
nodes = cmds.ls(sl=True)
for node in nodes:
    ue4_name = "SM_" + node[0].upper() + node[1:]
    cmds.rename(node, ue4_name)

選択したノードを個別にFBXで出力する

import os
from maya import cmds
from maya import OpenMaya as om

nodes = cmds.ls(sl=True)
for node in nodes:
    cmds.select(node)
    new_path = os.path.join(current_dir, "{}.fbx".format(node))
    new_path = new_path.replace("\\", "/")
    cmds.FBXPushSettings()
    try:
        cmds.FBXResetExport()
        cmds.FBXProperty("Export|IncludeGrp|Geometry|Triangulate", "-v", 1)
        cmds.FBXProperty("Export|IncludeGrp|Animation", "-v", 0)
        cmds.FBXExportInputConnections("-v", 0)
        cmds.FBXExportCameras("-v", 0)
        cmds.FBXExportConstraints("-v", 0)
        cmds.FBXExportLights("-v", 0)
        om.MGlobal.executeCommand('FBXExport("-f", "{}", "-s")'.format(new_path))
    finally:
        cmds.FBXPopSettings()
The post MayaからFBXの自動出力をPythonで書いてみる。 first appeared on TECH ART ONLINE.]]>
https://tech-art.online/maya-python-export-fbx/feed/ 0
objectSetを使ってチェックツールを発展させよう! https://tech-art.online/maya-check-with-objectset/?utm_source=rss&utm_medium=rss&utm_campaign=maya-check-with-objectset https://tech-art.online/maya-check-with-objectset/#respond Mon, 06 Dec 2021 12:06:16 +0000 https://tech-art.online/?p=1296 チェックツール10選というのを前回紹介しました。チェックした時に検出されるノードをどこかに保存しておきたくないですか?そんな時はobjectSetが最高に便利です!是非使ってみて下さいね。

The post objectSetを使ってチェックツールを発展させよう! first appeared on TECH ART ONLINE.]]>
チェックツール10選というのを前回紹介しました。
チェックした時に検出されるノードをどこかに保存しておきたくないですか?

そんな時はobjectSetが最高に便利です!
Mayaノードの中でも最強と言っても過言ではないノードです。

是非使ってみて下さいね。

管理人がYouTubeで解説!

The post objectSetを使ってチェックツールを発展させよう! first appeared on TECH ART ONLINE.]]>
https://tech-art.online/maya-check-with-objectset/feed/ 0
Qt DesignerでサクッとGUI作っちゃおう! https://tech-art.online/maya-qt-designer/?utm_source=rss&utm_medium=rss&utm_campaign=maya-qt-designer https://tech-art.online/maya-qt-designer/#respond Sun, 27 Jun 2021 11:48:33 +0000 https://tech-art.online/?p=1130 QtDesignerを使えば、MayaのGUIを簡単に作ることができます。
またMayaQWidgetBaseMixinを使うことで余計なことを考えることなくGUIも作れちゃいますよ!

The post Qt DesignerでサクッとGUI作っちゃおう! first appeared on TECH ART ONLINE.]]>
PySideでGUIを作る簡単な方法です。

PySideのQtDesignerを使えば、MayaのGUIを簡単に作ることができます。
またMayaQWidgetBaseMixinを使うことで余計なことを考えることなくGUIも作れちゃいます。

便利なものを組み合わせてお手軽にGUIを作っちゃいましょう!

管理人がYouTubeで解説!

PySideをインストールする

pip install pyside

これでインストールできますが、Pythonの設定周りがよくわからない!って方は以下を参考にすると良いでしょう。
環境変数PATHを設定する | Python入門 – Let’sプログラミング

pipが使えるようになる…というのもプログラムわからん時代の私にはハードル高かったので…。

Maya2020がPython27なのでPython27でPySideをインストールしましょう。
無事インストールできたら、Python27\Lib\site-packages\PySideの中にdesigner.exeが存在します。

そもそもPySideって何よ?って方はWikiを参照下さい。
PySide – Wikipedia – ウィキペディア

今回作ったサンプルコード

# -*- coding: utf-8 -*-
import os
from maya import cmds
from PySide2 import QtWidgets
from PySide2.QtUiTools import QUiLoader
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin

# designer.exeで作ったUIファイルを取得する
CURRENT_FILE = os.path.normpath(__file__)
path, ext = os.path.splitext(CURRENT_FILE)
UI_FILE = path + ".ui"

class TRSConnectorWindow(MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(TRSConnectorWindow, self).__init__(*args, **kwargs)

        # 作ったUIファイルをロードして変数に入れる
        self.widget = QUiLoader().load(UI_FILE)
        self.setWindowTitle(self.widget.windowTitle())

        # QMainWindowの中央のウィジェットに入れる
        self.setCentralWidget(self.widget)

        # ボタンとのコネクションを作る
        self.widget.pb_t.clicked.connect(self.clicked_connect_translate)
        self.widget.pb_r.clicked.connect(self.clicked_connect_rotate)
        self.widget.pb_s.clicked.connect(self.clicked_connect_scale)

    def clicked_connect_translate(self): # 移動を接続する関数
        src, dst = cmds.ls(os=True)
        cmds.connectAttr("{}.translate".format(src), "{}.translate".format(dst))

    def clicked_connect_rotate(self): # 回転を接続する関数
        src, dst = cmds.ls(os=True)
        cmds.connectAttr("{}.rotate".format(src), "{}.rotate".format(dst))

    def clicked_connect_scale(self): # スケールを接続する関数
        src, dst = cmds.ls(os=True)
        cmds.connectAttr("{}.scale".format(src), "{}.scale".format(dst))
The post Qt DesignerでサクッとGUI作っちゃおう! first appeared on TECH ART ONLINE.]]>
https://tech-art.online/maya-qt-designer/feed/ 0
Maya Python API 2.0 応用編『最近接頂点スナップツールを作る』 https://tech-art.online/maya-python-api2-201/?utm_source=rss&utm_medium=rss&utm_campaign=maya-python-api2-201 https://tech-art.online/maya-python-api2-201/#respond Fri, 07 May 2021 11:40:12 +0000 https://tech-art.online/?p=1101 『Maya Python API 2.0 入門編『最近接頂点の取得』』で行った関数を使ってスナップツールを実装してみました。
管理人は最近接頂点のスナップツールはかなりの頻度で利用します。結構使えると思うので実装チャレンジしてみてくださいね。

The post Maya Python API 2.0 応用編『最近接頂点スナップツールを作る』 first appeared on TECH ART ONLINE.]]>
Maya Python API 2.0 入門編『最近接頂点の取得』』で行った関数を使ってスナップツールを実装してみました。
管理人は最近接頂点のスナップツールはかなりの頻度で利用します。

結構使えると思うので実装チャレンジしてみてくださいね。

管理人がYouTubeで解説!

サンプルコード

1.入門編で作ったツールを関数化しましょう。

in_pos、in_meshを引数に置き換えました。
戻り値は最近接頂点を返すように変更しただけです。

Maya Python API 2.0 入門編『最近接頂点の取得』』のサンプルコードと比較するとわかりやすいかもしれません。

from maya import cmds
from maya.api import OpenMaya as om2

def getClosestVertexPoint(in_pos, in_mesh):
    
    # 選択リストを作ってターゲットメッシュを追加する
    sl = om2.MSelectionList()
    sl.add(in_mesh)
    
    # 選択リストの0番目の要素をMDagPath型で取得する
    dagpath = sl.getDagPath(0)
    
    # 取得したMDagPathをMFnMeshに入れる
    mesh = om2.MFnMesh(dagpath)
    
    # MFnMeshのコマンドが使えるようになったので最近接頂点取得コマンドを使ってみる。
    poly_pt, poly_id = \
        mesh.getClosestPoint(om2.MPoint(in_pos),om2.MSpace.kWorld)
        
    # 指定したポリゴン内の頂点IDを取得する
    poly_ids = mesh.getPolygonVertices(poly_id)
    
    # 入力頂点から最も近い頂点IDの位置を取得する
    closest_vtx_pos = None
    temp_length = None
    for i in range(len(poly_ids)):
        temp_pos = mesh.getPoint(poly_ids[i], om2.MSpace.kWorld)
        delta = (temp_pos - om2.MPoint(in_pos)).length()
        if temp_length is None or delta < temp_length:
            closest_vtx_pos = temp_pos
            temp_length = delta
    return list(closest_vtx_pos)[:3]

2.1の関数を使ってスナップツールを実装する

from maya import cmds
from maya.api import OpenMaya as om2

# スナップ先のポリゴンメッシュ名
tgt= "tgtShape"

# 選択頂点でリストを作ってくれる。cmds.ls(sl=True)みたいなもの。
sl = om2.MGlobal.getActiveSelectionList()

# メッシュのDagPathと頂点といったコンポーネント情報を取得
dagpath, obj = sl.getComponent(0)

# 頂点のインデックス情報を取得できるのがMFnSingleIndexedComponent
fn_comp = om2.MFnSingleIndexedComponent(obj)
ids = fn_comp.getElements()

# 以下で作った関数を利用してスナップまで行う
fn_mesh = om2.MFnMesh(dagpath)
for i in range(len(ids)):
    vtx_point = fn_mesh.getPoint(ids[i], om2.MSpace.kWorld)
    closest_point = getClosestVertexPoint(vtx_point, tgt)
    cmds.xform("{0}.vtx[{1}]".format(dagpath.fullPathName(), ids[i]), t=closest_point, ws=True)

おまけ

xformでシンプルに1の関数を使った場合。

from maya import cmds
from maya.api import OpenMaya as om2

# 選択した頂点を保存しておく
vtxs = cmds.ls(sl=True,fl=True)
for vtx in vtxs:
    in_pos = cmds.xform(vtx, q=True, t=True)
    closest_pos = getClosestVertexPoint(in_pos, "tgtShape")
    cmds.xform(vtx, t=closest_pos, ws=True)
The post Maya Python API 2.0 応用編『最近接頂点スナップツールを作る』 first appeared on TECH ART ONLINE.]]>
https://tech-art.online/maya-python-api2-201/feed/ 0
Maya Python API 2.0 入門編『最近接頂点の取得』 https://tech-art.online/maya-python-api2-101/?utm_source=rss&utm_medium=rss&utm_campaign=maya-python-api2-101 https://tech-art.online/maya-python-api2-101/#respond Thu, 06 May 2021 10:03:41 +0000 https://tech-art.online/?p=1093 MayaのPython API 2.0について解説してみました。
例として最近接頂点の取得の実装を行いつつ、API2.0の使い方を説明しています。

The post Maya Python API 2.0 入門編『最近接頂点の取得』 first appeared on TECH ART ONLINE.]]>
MayaのPython API 2.0について解説してみました。
例として最近接頂点の取得の実装を行いつつ、API2.0の使い方を説明しています。

最近接頂点はMaya Pythonの標準モジュールのmaya.cmdsでは取得できません。
取得できないものが取得できるのがAPIの強みですね。

管理人がYouTubeで解説!

動画で使用したスライド

動画で使用したコマンド

from maya import cmds
from maya.api import OpenMaya as om2

# 入力頂点
in_pos = cmds.xform("in_locator", q=True, t=True)

# 選択リストを作ってターゲットメッシュを追加する
sl = om2.MSelectionList()
sl.add("body_smooth_skinShape")

# 選択リストの0番目の要素をMDagPath型で取得する
dagpath = sl.getDagPath(0)

# 取得したMDagPathをMFnMeshに入れる
mesh = om2.MFnMesh(dagpath)

# MFnMeshのコマンドが使えるようになったので最近接頂点取得コマンドを使ってみる。
poly_pt, poly_id = \
    mesh.getClosestPoint(om2.MPoint(in_pos),om2.MSpace.kWorld)
    
# 指定したポリゴン内の頂点IDを取得する
poly_ids = mesh.getPolygonVertices(poly_id)

# 入力頂点から最も近い頂点IDの位置を取得する
closest_vtx_pos = None
temp_length = None
for i in range(len(poly_ids)):
    temp_pos = mesh.getPoint(poly_ids[i], om2.MSpace.kWorld)
    delta = (temp_pos - om2.MPoint(in_pos)).length()
    if temp_length is None or delta < temp_length:
        closest_vtx_pos = temp_pos
        temp_length = delta

# 取得した最も近い頂点位置に"out_locator"をセットする
cmds.xform("out_locator", t=list(closest_vtx_pos)[:3])

Python API勉強におすすめ書籍!

少し古い書籍になりますが、Python APIにおける基本が全て書かれています。
というよりも本書をマスターできればMaya Pythonマスターです。ってくらいには初心者向けではありません。

The post Maya Python API 2.0 入門編『最近接頂点の取得』 first appeared on TECH ART ONLINE.]]>
https://tech-art.online/maya-python-api2-101/feed/ 0
Substance Automation Toolkitでも使ってみるか https://tech-art.online/substance-automation-toolkit101/?utm_source=rss&utm_medium=rss&utm_campaign=substance-automation-toolkit101 https://tech-art.online/substance-automation-toolkit101/#comments Tue, 23 Feb 2021 14:10:53 +0000 https://tech-art.online/?p=995 Substance Automation Toolkitを試してみました。サンプルコードと感想を置いておきます!

The post Substance Automation Toolkitでも使ってみるか first appeared on TECH ART ONLINE.]]>
Substanceのインディー版を去年のブラックフライデーか何かで購入しました。
インディーライセンスではSubstance Automation Toolkitも使えるので試してみました!

Substance Automation Toolkitって?

Pythonを使ってノード作ったり、もろもろ自動化できます!(ざっくり)
詳しくは、ボンデジさんのページがわかりやすいです!
Substance Automation Tool kitとは – Born Digital サポート

インストール方法

こちらもボンデジさんのサポートページが一番わかりやすかったです。
セットアップとはじめに – Born Digital サポート

サンプルコード

以下はUniform Colorノードを2つ作り、
Outputノードと接続しSBSファイルとして保存するシンプルなコードを作ってみました。
※ Pysbs-2020.2.2を利用しています。

こういうノード構成を作り、SBSファイルとして保存します。
# coding: utf-8
import os
from pysbs import context
from pysbs import sbsenum
from pysbs import sbsgenerator

def createSBSGraph(aDestFileAbsPath):
    aContext = context.Context()
    startPos = [48, 48, 0]
    xOffset  = [192, 0, 0]
    yOffset  = [0, 192, 0]

    try:
        # ファイルと"SimpleMaterial"グラフをを作成する
        sbsDoc = sbsgenerator.createSBSDocument(
                                aContext,
                                aFileAbsPath = aDestFileAbsPath,
                                aGraphIdentifier = 'SimpleMaterial'
                                )

        # SimpleMaterialグラフを取得する
        aGraph = sbsDoc.getSBSGraph(aGraphIdentifier = 'SimpleMaterial')

        # BaseColor用のUniformカラーノードを作成する
        baseColor = aGraph.createCompFilterNode(
                        aFilter = sbsenum.FilterEnum.UNIFORM,
                        aParameters = {sbsenum.CompNodeParamEnum.OUTPUT_COLOR: [1, 0, 0, 1]},
                        aGUIPos     = startPos
                        )

        # Metallic用のUniformカラーノードを作成する
        metallic = aGraph.createCompFilterNode(
                        aFilter = sbsenum.FilterEnum.UNIFORM,
                        aParameters = {
                            sbsenum.CompNodeParamEnum.COLOR_MODE: sbsenum.ColorModeEnum.GRAYSCALE,
                            sbsenum.CompNodeParamEnum.OUTPUT_COLOR: 0.6
                            },
                        aGUIPos = baseColor.getOffsetPosition(yOffset)
                        )

        # BaseColorのアウトプットノードを作成する
        outBaseColor = aGraph.createOutputNode(
                            aIdentifier = 'BaseColor',
                            aGUIPos = baseColor.getOffsetPosition(xOffset),
                            aUsages = {
                                sbsenum.UsageEnum.BASECOLOR: {
                                    sbsenum.UsageDataEnum.COMPONENTS:sbsenum.ComponentsEnum.RGBA
                                    }
                                }
                            )

        # Metallicのアウトプットノードを作成する
        outMetallic = aGraph.createOutputNode(
                            aIdentifier = 'Metallic',
                            aGUIPos = metallic.getOffsetPosition(xOffset),
                            aUsages = {
                                sbsenum.UsageEnum.METALLIC: {
                                    sbsenum.UsageDataEnum.COMPONENTS:sbsenum.ComponentsEnum.RGBA
                                    }
                                }
                            )

        # Uniform ColorノードとOutputノードを接続する
        aGraph.connectNodes(aLeftNode = baseColor, aRightNode = outBaseColor)
        aGraph.connectNodes(aLeftNode = metallic,  aRightNode = outMetallic)

        # sbsファイルに書き込む
        sbsDoc.writeDoc()

        return True

    except BaseException as error:
        raise error


def main():
    destFileAbsPath = os.path.join(os.path.dirname(__file__), 'sample/resultDemoHelloWorld.sbs')
    createSBSGraph(destFileAbsPath)


if __name__ == "__main__":
    main()

感想

うーん、便利かもしれませんが…使うかは微妙です。

バリエーションを複数出力したい時は便利かもしれません。
例えば、水玉模様の色違いを1000枚自動出力する時とか。
色違いで素材集を作る時とか便利かもしれませんね。

ただ、実戦にならないと使う機会はないと感じました。
どのような状況下で費用対効果が高くなるかは今後の経験次第かもしれません。

The post Substance Automation Toolkitでも使ってみるか first appeared on TECH ART ONLINE.]]>
https://tech-art.online/substance-automation-toolkit101/feed/ 1
PySideをはじめよう!設計の基本!クラスを継承して使いまわそう https://tech-art.online/pyside101/?utm_source=rss&utm_medium=rss&utm_campaign=pyside101 https://tech-art.online/pyside101/#comments Mon, 08 Feb 2021 11:04:18 +0000 https://tech-art.online/?p=933 PySideを使って簡単なボタン付きウインドウを作ってみましょう。
PySideで作ったベースクラスを継承し、Mayaでカスタムして使うといった一連の流れをやってみました。

The post PySideをはじめよう!設計の基本!クラスを継承して使いまわそう first appeared on TECH ART ONLINE.]]>
PySideを使って簡単なボタン付きウインドウを作ってみましょう。
PySideで作ったベースクラスを継承し、Mayaでカスタムして使うといった
一連の流れをやってみました。

管理人がYouTubeで解説!

PySideってなに?

GUIを構築するのに特化したクロスプラットフォームなライブラリです。
PySideというよりもQtといった方が馴染み深いのかもしれません。
Qt for Python | 公式Pythonバインディング

PySideはMayaに同梱されている豪華なGUIが作れるライブラリと思ってもらえると良いでしょう。
概要はAutodesk Maya 2020のヘルプを見るのが良いでしょう。
Maya で PySide を使用する | Maya 2020 | Autodesk Maya ヘルプ

PySideを使うメリット

Mayaコマンドを使ってもGUIを作ることができますが、
あえてPySideを使う理由はなんでしょうか?

よく言われるのがシャレオツなUIを作れる!ってのがありますね。
もちろんPySideじゃないと作るのが難しいUIとかもあります。
コントロールリグのピッカーとかもMayaに用意されたコマンドだけでは難しいですね。

ただ、一番の強みは継承して使いまわせることだと私は思います。

例えば、ベースとなるクラスを作って、
そのベースクラスをMayaで使ったり、Houdiniで使ったりと汎用的な使い方ができます。


もちろんMaya内部だけでも1つのベースクラスを使い回すこともできます。
Mayaの中だとオプションウインドウは使いまわしていますよね。

UE4でいうマテリアルとマテリアルインスタンスの仕組みのようなものですね。
※ UE4わからない方すみません。

元を直せば全てに反映されるので、いちいちユニークなGUI設計をする必要がないのが強みですね!
一括修正一括変更をしやすいGUI設計ができる!というのが強みでしょうか。

サンプルコード

# coding: utf-8
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *

# Mayaとは依存関係のない単なるボタン付きウインドウ
class SimpleButtonUIBase(QWidget):    
    def __init__(self, *args, **kwargs):
        super(SimpleButtonUIBase, self).__init__(*args, **kwargs)
        
        # ウインドウのタイプを決める
        self.setWindowFlags(Qt.Window)

        # ウインドウのオブジェクト名とタイトル名を設定する
        self.setObjectName('simple_button')        
        self.setWindowTitle('Simple Button')

        # いろいろ作る部分
        # 1.レイアウトを作る
        main_layout = QVBoxLayout(self)
        # 2.部品を作る
        self.buttonA = QPushButton("Button A", self)
        self.buttonB = QPushButton("Button B", self)
        # 3.部品をレイアウトに追加する
        main_layout.addWidget(self.buttonA)
        main_layout.addWidget(self.buttonB)
        # 4.部品をクリックした時の振る舞いを作る
        self.buttonA.clicked.connect(self.buttonA_onClicked)
        self.buttonB.clicked.connect(self.buttonB_onClicked)

    def buttonA_onClicked(self):
        print("ButtonA Clicked.")

    def buttonB_onClicked(self):
        print("ButtonB Clicked.")


# Mayaと依存関係のないウインドウ
window_instance = SimpleButtonUIBase()
window_instance.show()


##########################################################
# ここからMaya依存にしたGUIを作っていきます。
##########################################################
from maya import cmds
from maya import OpenMayaUI as omui
from shiboken2 import wrapInstance

# SimpleButtonUIBase継承したMaya用のクラス
class MayaSimpleButtonUI(SimpleButtonUIBase):
    def __init__(self, parent):
        super(MayaSimpleButtonUI, self).__init__(parent)
        self.setWindowTitle("Create Primitive")
        self.buttonA.setText("Poly Cube")
        self.buttonB.setText("Poly Sphere")
        
    def buttonA_onClicked(self):
        print("Maya ButtonA Clicked")
        cmds.polyCube()
        
    def buttonB_onClicked(self):
        print("Maya ButtonB Clicked")
        cmds.polySphere()


# mayaのメインウインドウを取得する
def get_maya_main_window():
    omui.MQtUtil.mainWindow()
    ptr = omui.MQtUtil.mainWindow()
    widget = wrapInstance(long(ptr), QWidget)
    return widget


# 依存関係のないウインドウを継承して作ったMaya用のボタンUI
maya_window_instance = MayaSimpleButtonUI(parent=get_maya_main_window())
maya_window_instance.show()

参考リンク

setWindowFlagsを使いこなす!! | KIWAMIDEN

The post PySideをはじめよう!設計の基本!クラスを継承して使いまわそう first appeared on TECH ART ONLINE.]]>
https://tech-art.online/pyside101/feed/ 2
Substance DesignerのPythonを使ってみたけど…のお話 https://tech-art.online/substance-designer-python101/?utm_source=rss&utm_medium=rss&utm_campaign=substance-designer-python101 https://tech-art.online/substance-designer-python101/#respond Tue, 26 Jan 2021 11:02:05 +0000 https://tech-art.online/?p=890 Substance DesignerのPythonを少し触ってみました。
いろいろやっているうちに気づくことがあったのでまとめておきます。

結論としては、うーん、使うかなー?っていう印象でした。

The post Substance DesignerのPythonを使ってみたけど…のお話 first appeared on TECH ART ONLINE.]]>
Substance DesignerのPythonを少し触ってみました。
いろいろやっているうちに気づくことがあったのでまとめておきます。

結論としては、うーん、使うかなー?っていう印象でした。
※ Substance Designer 2020.2.2を利用しています。

Substance DesignerでPythonを使うには?

簡単な方法は用意されているPython Editorを利用することです。
メニューのWindows > Python Editor を実行すると以下のようなエディタが開きます。

あとは、ガリガリPythonを書くだけです。
始めるなら公式のスクリプトのドキュメントを見ながらやるのが良いでしょう。

Scripting – Substance Designer

サンプルコード

選択したUniform ColorノードのOutput Colorを赤色にするスクリプトです。

from sd.api.sdproperty import SDPropertyCategory
from sd.api.sdvaluecolorrgba import SDValueColorRGBA
from sd.api.sdbasetypes import ColorRGBA

# 現在開いているグラフを取得する
g = uiMgr.getCurrentGraph()

# グラフ内の選択しているノードを取得する
selection = uiMgr.getCurrentGraphSelection()
for node in selection:
    # ノードに存在するインプット関連のパラメーターを取得する。
    props = node.getProperties(SDPropertyCategory.Input)
    for prop in props:
        # パラメーター名が"Output Color"の場合は赤色をセットする
        if prop.getLabel() == "Output Color":
            value = node.setPropertyValue(
                prop,
                SDValueColorRGBA.sNew(ColorRGBA(1,0,0,1))
            )

ちょっとイケてないと思ったところ

APIリファレンスが充実していない

一応あるにはあるんですが、中身のコマンド関連は自分でhelpコマンドを使って調べたり、
それでもわからなければ元のpythonファイルの中身を調べていかないといけません。

Scripting API reference – Substance Designer

全て型指定する必要がある!勝手に解釈してくれ~

18行目に以下のような指定がありますが・・・
使いにくすぎる!型を指定して、引数でも型指定しないと通らない!

SDValueColorRGBA.sNew(ColorRGBA(1,0,0,1))

うーん、float4なら、[1,0,0,1]とリストやタプルを入れれば解釈してほしいです。
型をいちいち指定しなければいけないとなると
モジュールのimport部分が相当荒れる気がします…。

intやfloatも全て用意された型を使うので、さすがにそれはないと思いました。

Pythonを使うならココ!

Substance Designerの仕様でイケてないところは、

複数選択してプロパティーを変更しても、
後に選択したものしか設定した値が反映されない!

フォーラムでも意見が出ていますね。
Multiple nodes modification – Feedback – Substance

フォーラムの中で値を公開してリンクするといった方法もありましたけど違うんですよね。
そんな設定せずともユーザーは同時選択してサクサク複数のパラメーターを設定したいのです。

Substance Designerのように1つ1つのノードが複雑になると難しいんだろうなぁ…
というのはUI設計目線でもわかります。

ただ、これ改善されればSubstance Designerはかなり使い勝手よくなりますよね。

参考リンク

以下を見ればなんとなくわかるはずです!参考にしましょう~。

Substance DesignerのPythonプラグインの基本 – もんしょの巣穴ブログ Ver2.0
Substance Designer Scripts事始め – pky’s creativelog
【Substance Designer】pythonコードメモ|三味松ブログ

まとめ

HoudiniやMaya、UE4のAPIリファレンスを見るのに慣れていると物足りなさを感じてしまう…。

というよりも、まだまだ発展途上だし、
Substance DesignerにPythonの有用性が低いってのも大きいかもしれませんね。

また、別の機会にSubstance Automation Toolkitについてもお話してみようと思ってます。
それでは!

The post Substance DesignerのPythonを使ってみたけど…のお話 first appeared on TECH ART ONLINE.]]>
https://tech-art.online/substance-designer-python101/feed/ 0