Houdini 21.0 ネットワークとパラメータ

Infoウィンドウのカスタマイズ

スタジオおよびアセット作成者は、Infoウィンドウに独自情報を追加することができます。

On this page

Warning

この機能は 実験段階 であり、変更される可能性があります。

概要

Infoウィンドウは、ノードに関する情報を表示します。 例えば、ジオメトリ(SOP)ノードのInfoウィンドウは、そのノードによって生成されたジオメトリ上のアトリビュート、グループ、その他の情報を表示します。 ノードのInfoウィンドウを表示するには、ノード上にマウスカーソルを置いた時に表示されるノードリング内の“i”ボタンをクリックするか、または、ノードをクリックしたままにします。

特定のノードタイプやすべてのノードのInfoウィンドウにカスタム情報を追加すると便利になる場合があります。例:

  • デジタルアセットの作成者は、ユーザがそのデジタルアセットのインスタンスのInfoウィンドウを表示した時に、そのデジタルアセット固有の情報を表示したい場合があります。

  • 複雑なアセット管理パイプラインを持つスタジオでは、ワークフロー固有の各アセットに関する情報を表示できるようにしたいです。

Infoウィンドウ内でカスタム情報を表示できる場所がいくつかあります:

  • Infoウィンドウの上部で、ノードの見出しのすぐ下に“タグ”を追加することができます。 これは、角丸四角形状のテキストボックスです。 例えば、アセットが“古い”かどうかといったちょっとした情報を表示するのに役立ちます。

  • ウィンドウ上部(ノードの見出しの下)、中央(一般Infoグリッドの上)、下部(ノードコメントエディタの上)付近にも情報を追加することができます。

クイックスタート

  1. $HOUDINI_USER_PREFS/config/CustomNodeInfoディレクトリを作成します。

  2. CustomNodeInfoディレクトリ内に、以下の内容のindex.jsonファイルを作成します:

    index.json

    {
        "node_scripts": {
            "Sop/sphere": "test.py"
        }
    }
    
  3. 次に、同じディレクトリ内に以下の内容のtest.pyファイルを作成します:

    test.py

    addLabeledText("Custom Message", "This is some custom text for the info window.")
    
  4. Houdiniを起動します。Geoオブジェクトを作成して中に入ります。次に、Sphereノードを作成します。

  5. ノード上にマウスカーソルを置いて表示されるノードリング内の“i”ボタンをクリックするか、または、ノードをクリックしたままにします。

    Infoウィンドウにカスタムメッセージが表示されるはずです。

詳細は、下記のカスタマイズスクリプトの書き方を参照してください。

カスタマイズスクリプトをアセット内部に保存する方法

カスタマイズスクリプトは、アセット内部のセクション(“Extra File”)に保存することができます。 アセットにcustom_node_info.pyセクションがあれば、ユーザがそのアセットインスタンスのInfoウィンドウを表示した時にHoudiniが自動的にそのスクリプトを実行してカスタム情報を追加します。

  1. ネットワークエディタ内でアセットをクリックして、 Edit Type Properties を選択します。

  2. Type Propertiesダイアログで Extra Files タブをクリックします。

  3. Section Name フィールドにcustom_node_info.pyと入力して、 Add Empty Section をクリックします。

  4. 右側にあるエディタを使用して、スクリプトを入力(またはペースト)します。詳細は、下記のカスタマイズスクリプトの書き方を参照してください。

カスタマイズスクリプトをHoudiniパス上のファイルに保存する方法

Houdiniは、Houdiniパスからconfig/CustomNodeInfo/index.jsonファイルを検索します。 このファイル内で、特定のノードタイプまたはすべてのノードに対して実行するカスタマイズスクリプトを指定することができます。

Tip

Houdiniパス上に複数のconfig/CustomNodeInfo/index.jsonファイルが存在した場合(例えば、ユーザプリファレンスディレクトリと$JOBディレクトリにファイルが存在した場合)、Houdiniは、それらのファイルを結合します。

以下は、index.jsonファイルの例です:

{
    "node_scripts": {
        "Sop/lsystem": "lsystem.py"
    },
    "general_scripts": [
        "every_node.py"
    ]
}

このJSONには、以下の2つのオプションキーを含めることができます:

node_scripts (オブジェクト)

内部ノードタイプ名( カテゴリ付き )とスクリプトパスをマッピングするオブジェクト。 指定されたノードタイプのインスタンスのInfoウィンドウをユーザが表示すると、それに呼応したカスタマイズスクリプトが実行されます。

ノードタイプに対してカテゴリ付き内部ノードタイプ名を取得するには、Pythonシェルを開いて、そのノードをPythonシェルウィンドウにドラッグして、そのノードの参照を取得するPythonコードを生成します。 そして、そのPythonコードの後に.type().nameWithCategory()を加えてEnterを押します。例:

>>> hou.node('/obj/copnet1/custom_test1').type().nameWithCategory()
'matt::Cop/custom_test::1.0'

general_scripts (配列)

スクリプトパス文字列の配列。 Houdiniは、 あらゆる ノードタイプのInfoウィンドウを表示する際に、このリスト内の各スクリプトを(順番通りに)実行します。

  • node_scriptsは、パターンに対応していません。 代わりに、general_scriptを作成して、特定のノードのみに情報を追加するようにしてください。 例えば、acmeネームスペース内のノードにカスタム情報を追加するには、general_scriptを作成して、namespace == "acme"の場合にのみ情報を追加するスクリプトを記述します。

  • 通常、node_scriptsオブジェクトの値はパス文字列です。 しかし、特定のノードタイプに対して複数のスクリプトを実行したい場合など何かしらの理由がある場合には、パス文字列の 配列 を使用することもできます。

    {
        "node_scripts": {
            "Sop/lsystem": "lsystem.py",
            "Sop/sphere": ["sphere.py", "shape.py"]
        }
    }
    
  • 相対パスは、index.jsonファイルが含まれているディレクトリを基準に解決されます。

カスタマイズスクリプトの書き方

概要

Tip

middleに情報を追加したい場合が多いので、middleのメソッドはトップレベル関数としても利用可能です。 例えば、addText("Hello)middle.addText("Hello")のショートカットとして記述することができます。

変数

hou: module

houモジュールはスクリプト内で自動的にインポートされます。

node: hou.Node

ユーザがInfoウィンドウを表示しているノード。

node_name: str

ノードの名前。これはnode.name()のショートカットです。

type_name: str

ノードのタイプの名前。これはnode.type().name()のショートカットです。

category: str

ノードタイプのカテゴリの名前。例えば、"Sop""Dop"

namespace: str

タイプ名のネームスペース部分のみ。 これは、スタジオのネームスペース内のノードのみに情報を表示したい場合に役立ちます。

basename: str

タイプ名のベース名部分のみ。

version: str

タイプ名のバージョン部分のみ。

output_index: int

特定のネットワークタイプ(SOPなど)では、ユーザは、ノード出力上でを押したり、または、Infoウィンドウに表示される出力を切り替えることができます。 これは、Infoウィンドウに現在表示されている出力コネクタのインデックスです。 hou.SopNode.geometryを使用してノードのジオメトリから情報を取得する場合には、これを使用します。

if namespace == "acme" and category == "Sop":
    # Detailアトリビュートに保存されている追加情報を検索して、
    # それが存在すればInfoウィンドウに表示します。
    geometry = node.geometry(output_index)
    try:
        value = geometry.attribValue("my_extra_info_string")
    except hou.OperationFailed:
        pass
    else:
        addLabeledText("Extra Information", value)

タグ

addTag(text: str)

Infoウィンドウの上部に、色の付いた角丸四角形状のテキストボックスを表示します。 これは、“Up to Date”や“Deprecated”などの重要な二進情報を簡潔に表示するのに役立ちます。

オプションのキーワード引数:

color: color

タグ本文のカラー。 背景を描画しない場合は"transparent"を使用します。 詳細は、カラー指定を参照してください。

textColor: color

通常、Houdiniはベースカラーに対して視認性の高いテキスト/シンボルカラーを自動選択します。 ただし、この引数で色を明示的に設定することも可能です。 詳細は、カラー指定を参照してください。

textSize: int

テキストフォントのサイズ(ピクセル単位)。

symbol: str

テキストの左側に表示するPhosphorIconの名前。

symbolSize: float

symbolが指定された場合、これは、そのアイコンのサイズです デフォルトは16です。

symbolVariant: str

symbolが指定された場合、これは、PhosphorIconのバリエーションです。 設定可能な値は、"regular"(デフォルト)、"bold"(太線)、"light"(細線)、"thin"(超細線)、"filll"(アウトラインスタイルではなく実線スタイル)です。

addTag("Synced", color=theme.amber)
addTag("Puppy", symbol="dog")
addTag("Kitteh", symbol="cat")

コンテナオブジェクト

top, middle, bottom: CustomContainer

topmiddlebottomのオブジェクトは、Infoウィンドウレイアウト内で情報を追加できる“挿入ポイント”を示します。

CustomContainerオブジェクトには以下のメソッドがあります:

コンテナ作成メソッド

addColumn() -> CustomContainer

垂直スタックレイアウトを追加します。 返されるオブジェクトはコンテナを表現しているので、そのメソッドをコールして新しい列に情報を追加することができます。 デフォルトのtopmiddlebottomのオブジェクトが列となっているため、 通常では、これは不要です。 ただし、列内のアイテム間の間隔をカスタマイズしたい場合に役立ちます。

オプションのキーワード引数:

spacing: float

列内のアイテム間の間隔。

topPadding: float / leftPadding: float / rightPadding: float / bottomPadding: float

列の内容の周囲にスペースを追加します。

column = middle.addColumn(spacing=10)
column.addText("Love looks not with the eyes, but with the mind")
column.addText("And therefore is winged Cupid painted blind.")

addGrid() -> CustomContainer

アイテムを固定サイズのセルで構成されたグリッドに配置するレイアウトを追加します。 返されるオブジェクトはコンテナを表現しているので、そのメソッドをコールして新しいグリッドに情報を追加することができます。

通常は、グリッドに対してaddSimpleTextTile("label", "text")メソッドをコールして情報を追加します。

オプションのキーワード引数:

cellWidth: float

グリッド内のセルの幅。デフォルトは100です。

cellheight: float

グリッド内のセルの高さ。デフォルトは48で、通常は1行のテキストを表示する“シンプルな”タイルを可能にします。

columnSpacing: float

セル間の水平方向の間隔。

rowSpacing: float

セル間の垂直方向の間隔。

grid = middle.addGrid()
grid.addSimpleTextTile("State", "Opened")
grid.addSimpleTextTile("Version", "2.5")
grid.addSimpleTextTile("Project", "Bob's Big Day")
grid.addSimpleTextTile("Shot", "28.5B")
grid.addSimpleTextTile("Supe", "Agnes")
grid.addSimpleTextTile("Signed Off", "No")

addTile(label: str) -> CustomContainer

背景とラベルを持つタイルを追加します。 返されるオブジェクトはタイルの内容を表現しているので、そのメソッドをコールして新しいタイル内の列に情報を追加することができます。

オプションのキーワード引数:

backgroundColor: str

タイル背景のカラー。

labelColor: str

ラベルテキストのカラー。

labelBackgroundColor: str

ラベル背景のカラー。

labelVisible: bool

タイルラベル(およびラベル背景)を表示するかどうか。

copyText: str

通常、ユーザがタイルを選択してクリップボードにコピーする場合、Houdiniはタイル内のテキストをコピーします。 この引数を渡すと、代わりにこの文字列がクリップボードにコピーされます。 これは、表示されている内容ではなく“フォーマットされていない”テキストをクリップボードにコピーしたい場合に役立ちます。 例えば、12,345ではなく12345をコピーする場合などです。

詳細は、カラー指定を参照してください。

tile1 = addTile("First Tile")
tile1.addText("Some information")
tile2 = addTile("Second Tile", labelColor="#ffcc00",
                labelBackgroundColor="black", backgroundColor="#574D25")
tile2.addText("More information")

addSimpleTile(label: str) -> CustomContainer

addTile()と同じですが、タイルとラベルの背景を自動的に非表示にし、余白を減らすことで、よりシンプルでコンパクトな見た目になります。

これは、addTile()と同じオプションのキーワード引数を受け取ります。

tile1 = addSimpleTile("First Tile")
tile1.addText("Some information")

addExpandingTile(label: str, expanded=True) -> CustomContainer

展開可能なタイルを追加します。 ユーザがタイル内の項目を展開または折り畳むことができます。 expandedキーワードでタイルの初期状態を制御します。

これは、addTile()と同じオプションのキーワード引数を受け取ります。

tile1 = addExpandingTile("Expanding Tile", expanded=False)
tile1.addText("Some information the user can see when the tile is expanded.")

addLabeledColumn(label: str) -> CustomContainer

addSimpleTile()と同様ですが、ラベルが内容の上ではなく横に配置されます。 同じ親コンテナ内のラベル付き列は、自動的にラベルの幅に合わせられます。

item1 = addLabeledColumn("State")
item1.addText("Opened")
item2 = addLabeledColumn("Rendering")
item2.addProgress(0.5)

Tip

以下のaddLabeledX()メソッドは、列に1つの項目のみを配置する場合に便利なショートカットです。

addLabeledText(“State”, “Opened”) addLabeledProgress(“Rendering”, 0.5)

項目作成メソッド

情報の項目を追加する各addX()メソッドには、それに呼応したaddLabeledX()メソッドがあり、それによってラベル付き値のテーブルを作成することができます。 addLabeledX(label, ...)のバリエーションは、addLabeledColumn(label).addX(...)のショートカットとなります。

addText(text: str) /addLabeledText(label: str, text: str)

テキストを追加します。

オプションのキーワード引数:

size: int

フォントサイズ(ピクセル単位)。

monospaced: bool

テキストに等幅フォントを使用するかどうか。デフォルトはFalseです。

color: str

テキストのカラー。 詳細は、カラー指定を参照してください。

format: str

テキスト文字列の解釈方法を制御します。 auto(デフォルト)は、タグの有無などの経験則に基づいて、テキストがHTMLかプレーンテキストかを推測します。 plainは、プレーンテキストを表示します。 richは、文字列をHTMLとして解釈します。 markdownは、テキストをマークダウンとして解釈します。

symbol: str

テキストの左側に表示するPhosphorIconの名前。

symbolSize: float

symbolが指定された場合、これは、そのアイコンのサイズです。デフォルトは16です。

symbolVariant: str

symbolが指定された場合、これは、PhosphorIconのバリエーションです。 設定可能な値は、"regular"(デフォルト)、"bold"(太線)、"light"(細線)、"thin"(超細線)、"filll"(アウトラインスタイルではなくソリッドスタイル)です。

symbolColor: color

symbolが指定された場合、これは、そのアイコンのカラーです。 詳細は、カラー指定を参照してください。

spacing: float

シンボル(存在する場合)とテキストの間の間隔。デフォルトは2です。

addLabeledText(
    "Review Feedback",
    "Increase the light on the main character when the first leave the doorway",
    symbol="chat-text"
)

addDonut(value: float) / addLabeledDonut(label: str, value: float)

“ドーナツ”プログレスグラフを作成します。 valueは、0.0から1.0までの範囲の数値です。

オプションのキーワード引数:

size: real

ドーナツグラフの幅と高さ。デフォルトは32です。

text: str

ドーナツの中心に表示されるテキスト。 通常は25%のような短いテキストになります。

description: str

グラフの右側に表示されるテキスト。

startAngle: real / endAgnle: real

グラフの範囲を定義する開始角度と終了角度を制御します。 デフォルトは-160160で、左下0.0から右下1.0まで回る“スピードメーター”のような外観になります。 代わりに、上部の0.0から始まり、1.0まで回り込んで再び上部に戻るグラフを表示するには、startAngle=0, endAngle=360を使用してください。

clockwise: bool

Trueの場合、弧は時計回りに進行します。 Falseの場合、反時計回りに進行します。 デフォルトはTrueです。

arcColor: str

“塗りつぶされる”弧のカラー。

trackColor: str

グラフの“空っぽ”の部分のカラー。 トラックを表示しない場合は、"transparent"に設定してください。

詳細は、カラー指定を参照してください。

addLabeledDonut("Completion", 0.8, text="80%", description="Final Stage")
addLabeledDonut("Rating", 0.4, text="2/5", startAngle=0, endAngle=360,
                arcColor="#ffcc00")

addProgress(value: float) / addLabeledProgress(label: str, value: float)

水平棒グラフを作成します。 valueは、0.0から1.0までの数値です。

オプションのキーワード引数:

description: str

棒の下部に小さなテキストとして表示されます。

barHeight: real

棒グラフの高さ。

barColor: str

棒グラフの“塗りつぶされる”部分のカラー。

trackColor: str

棒グラフの“塗りつぶされない”部分のカラー。 トラックを表示しない場合は、"transparent"に設定してください。

詳細は、カラー指定を参照してください。

addLabeledProgress("Completion", 0.8, description="Final Stage")
addLabeledProgress("Rating", 0.4, barColor="#ffcc00")

addImage(source: str, animated=False) / addLabeledImage(label: str, source: str, animated=False)

画像を表示します。 source文字列は、URLである必要があります。例えば、file:またはhttp:といったURLです。 (画像がアニメーションGIFの場合は、animated=Trueを使用してください。そうしないと、アニメーションの最初のフレームのみが表示されます。)

Note

画像はHoudiniではなくQtユーザインターフェースライブラリによって読み込まれて表示されるので、 残念ながらJPEGやPNGなどの一般的な形式にしか対応していないです(.exrファイルは表示できません)。 また、OCIOカラースペースは正しく表示されません。 レンダリング済み画像を表示したい場合は、hoiiotoolを使用して、そのレンダリング結果の(必要に応じて縮小された)sRGB PNGまたはJPG“サムネイル”を作成し、それを表示することができます。

top.addLabeledImage("Preview Image", "file:///Users/matt/Downloads/Cenote.png")

addButton(text: str, callback: Callable) / addLabeledButton(label: str, text: str, callback: Callable)

クリック可能なボタンを作成します。 ユーザがボタンをクリックすると、callback関数がコールされます。

オプションで、ユーザがボタンをクリックした際に⌃ Ctrl⇧ ShiftAltキーを押していたかどうかを伝えることができます。 これは、代替動作を許可するのに役立ちます。 callback関数がshiftcontrolaltmetaという名前の引数を受け取るようにすると、 Houdiniは、callback関数をコールする時にユーザがボタンをクリックした際にそれらの修飾キーが押されていたかどうかに基づいてそれらの引数にブール値を設定します。

def my_func():
    print("They clicked me!")

addButton("Click Me", my_func)

# このボタンは、Shiftクリックされたかどうかを伝えることができます。
# この関数には"shift"引数があるので、Houdiniは、この関数をコールする時に
# その引数にブール値を設定します。
def my_func2(shift=False):
    if shift:
        print("Shift clicked!")
    else:
        print("Clicked")

addButton("Check In", my_func2)

Mac

Macでは、controlmetaの意味が入れ替わります:control(“meta”)キーが押されている場合にTrueとなり、meta⌃ Ctrlキーが押されている場合にTrueとなります。 これは、Qtユーザインターフェースライブラリによる仕様であり、変更することができません。 すべてのプラットフォームで実際の⌃ Ctrlキーを検出したい場合は、control または metaを確認してください。

def callback(control=False, meta=False):
    if control or meta:
        print("Modified behavior")
    else:
        print("Normal behavior")

addCustomItem(url: str | pathlib.Path | QtCore.QUrl, **kwargs)

これは、QMLソースファイルで定義されたカスタム項目をInfoウィンドウに追加することができます。 これは推奨されていません。 QMLの記述は、このドキュメントおよびHoudiniサポートの範囲外となります。 カスタムQMLの使用を検討される前に、上記の他の情報表示用オプションを試しください。

url引数は、カスタム項目を作成するためにインスタンス化するQMLファイルを指した文字列、Path、QUrlオブジェクトです。 相対ファイルパスまたはfile:URLは、現在実行中のスクリプトファイルを基準に解決されます。

Houdiniは、渡されたキーワード引数を使用して、新規アイテムのプロパティを設定します。

カラー指定

カラーを受け取る引数には、以下のいずれかの値を使用することができます:

  • 16進数カラー文字列(例えば、"#ffcc00" )またはCSSカラー名(例えば、"rebeccapurple")。

  • 何も描画しない"transparent"文字列。

*QtCore.QColorオブジェクト。

  • 以下のUIカラー値のいずれか(例えば、addTag("Oops!", color=theme.error)):

    • theme.success (緑系の色)

    • theme.warning (黄色系の色)

    • theme.error (赤系の色)

    • theme.primary (UIアクセントカラー)

    • theme.secondary (アクセントカラーの彩度を落とした色)

    • theme.red, theme.orange, theme.amber, theme.yellow, theme.lime, theme.green, theme.emerald, theme.teal, theme.cyan, theme.sky, theme.blue, theme.indigo, theme.violet, theme.purple, theme.fuchsia, theme.pink, theme.rose, theme.stone, theme.gray, theme.zinc, theme.steel, theme.slate, theme.heather

パフォーマンス対策

Houdiniは、Infoウィンドウが利用可能になる前に、すべてのカスタマイズスクリプトを順次実行します。 ユーザがInfoウィンドウを待つ必要がないよう、スクリプトを可能な限り高速に実行されるよう心がけてください。 表示する情報の収集に時間がかかる可能性がある場合(例えば、ネットワーク経由での情報取得)、処理を高速化するための対策がいくつかあります。

非同期更新

処理が遅延する可能性のあるコードは、async関数またはThread内で実行して、情報が利用可能になった時点でアイテムのプロパティを更新する方法を試してください。

項目を非同期で更新するには、作成メソッドが返すオブジェクトへの参照を保持してください。 その後、情報が利用可能になった時点で、そのオブジェクトに対してupdate()メソッドをコールして、キーワード引数を使用して変更したいプロパティを設定します。

(以下は簡単な例です。Pythonのasyncやスレッド機能の詳細な使用方法は、このドキュメントの範囲外であり、Houdiniサポートの対象外となります。)

import requests
import threading

# テキスト項目を作成し、初期テキストをプレースホルダに設定します。
status_item = addLabeledText("Status", "--")

# スレッド内でHTTPリクエストを介して情報を取得します。
def threaded_fn():
    response = requests.get("api.example.com/status")
    # Once the information is available, update the item with the new text
    status_item.update(text=response.text)
threading.Thread(target=fn).start()

Note

項目の追加削除を行なう関数/メソッドは、 Infoウィンドウ表示後は機能しません 。 カスタム項目を非同期で“削除”するには、item.update(visible=False)を使用してそれを非表示にしてください。

要求に応じた更新

取得に時間がかかる情報については、Infoウィンドウにボタンを追加し、ユーザがボタンをクリックした場合にのみスクリプトが情報を取得してウィンドウを更新する方式も検討すると良いでしょう。 これは、ユーザが情報の取得コストを負担するタイミングを自ら決められるため、時折のみ必要な情報に役立ちます。

実装方法としては、ボタンと非表示の表示項目を追加します。 ボタンのコールバック関数内で情報を取得し、新しい情報で表示項目を更新して表示します。 情報を一度だけ取得する意味がある場合はボタンを非表示にすることも可能ですし、情報を複数回更新したい可能性がある場合は表示したままにしておくこともできます。

def get_status_callback(button):
    response = requests.get("api.example.com/status")
    # ボタンとテキストの参照をIDで取得します。
    button = findByID("status_button")
    text_item = findByID("status_text")
    # ボタンを非表示にします。
    button.update(visible=False)
    # 新しいテキストを設定して表示します。
    text_item.update(text=response)("status_button")
    text_item = findByID("status_text")
    # ボタンを非表示にします。
    button.update(visible=False)
    # 新しいテキストを設定し、表示します。
    text_item.update(text=response.text, visible=True)

# ボタンとステータス表示を保持するラベル付きカラムを作成します。
column = addLabeledColumn("Status")
# ボタンと表示をカラムに追加します。
column.addButton("取得", get_status_callback, id="status_button")
# テキスト表示は、ユーザがボタンをクリックしコールバック関数が情報を読み込むまで非表示にします。
column.addText("", id="status_text", visible=False)

バックグラウンドでの情報のキャッシュ化

更新速度の遅い情報をバックグラウンドプロセスで更新してキャッシュ化し、Infoウィンドウにそのキャッシュされた情報を表示する方法を検討してみてください。

別スクリプトからの情報の結合

複数のカスタマイズスクリプト(例えば、スタジオ全体用スクリプト、ノードタイプ固有スクリプト、ユーザプリファレンス内の汎用スクリプト)が情報を追加する場合、異なるスクリプトが同じコンテナに項目を追加できるようにしたい場合があります。

スクリプト間でコンテナを共有するには、新しいコンテナを作成するメソッド(例えば、addGrid()addLabeledColumn())にid引数を追加します。 異なるスクリプトで同じIDを使用することで、同一のコンテナを取得することができます。

例えば、2つのスクリプトに以下のコードがある場合:

script1.py

c1 = addLabeledColumn("Comments", id="comments")
c1.addText("Comment from script1")

script2.py

c2 = addLabeledColumn("Comments", id="comments")
c2.addText("Comment from script2")

…この結果は、2つの項目(Comment from script1Comment from script2)を含んだ単一のCommentsカラムになります。

id引数がない場合、この2つのスクリプトはそれぞれ個別のカラムを作成し、両方にCommentsというラベルが付けられ、各カラムに1つの項目が含まれます。

コンテナを操作する必要がある場合、カスタマイズスクリプトでは以下のユーティリティ関数も使用することができます。

findByID(id: str) -> CustomContainer | None

指定したIDのコンテナが存在した場合、それを返します。

findByLabel(label: str) -> CustomContainer | None

指定したラベルを持つ最初のコンテナが存在した場合、それを返します。

removeByID(id: str)

指定したIDのコンテナが存在した場合、それを削除します。

removeByLabel(label: str)

指定したラベルを持つ項目が存在した場合、それらを削除します。

Tipsとメモ

  • スクリプト内でnodeオブジェクトを使用することで、ノードに保存されているパラメータ値やユーザデータにアクセスすることができます。詳細は、hou.Nodeオブジェクトリファレンスを参照してください。

  • Infoウィンドウは、インデックスファイルとスクリプトの変更時刻をチェックして、変更があればリロードを行ないます。 ファイルの変更を反映させるためにHoudiniを再起動する必要はありません。

  • Infoウィンドウを開いてもスクリプトの結果が表示されない場合は、以下の手順を試してください:

    • コンソールにエラーメッセージが表示されていないかチェックしてください。

    • スクリプトがディスク上のファイルにある場合、Houdiniパス上のconfig/CustomNodeInfo/index.jsonファイルにそのファイルが登録されているか再度ご確認ください。

    • ノード固有のスクリプトの場合は、index.jsonファイル内のキーがノードタイプの“カテゴリ付き内部名”と完全に一致していることを確認してください。

  • カスタマイズスクリプトは、Infoウィンドウが開くのが遅くならないよう、迅速に実行されるべきです。 ネットワークから情報を取得してInfoウィンドウに表示したい場合は、非同期処理やスレッド処理といった対策を施したり、または、バックグラウンドで情報を取得して、ユーザがInfoウィンドウを表示するまでキャッシュしておくことを検討してください。

  • HTMLを表示するだけの場合、addText()を使用することで、HTML文字列を“テキスト”として渡すことができます。 Qtの“リッチテキスト”ウィジェットが使用されており、HTML4やCSS2のサブセットをサポートしていますが、実際のブラウザほどの機能はありません。

  • カラー のみ による情報表示(例えば、常に“Status”と表示されるタグが、正常時は緑、エラー時は赤になる)は避けてください。 カラーは、テキストやシンボルで表示される情報を 補強 するために使用してください。

  • Infoウィンドウに多くの操作機能を組み込むことは控えてください。 Infoウィンドウは、ノードに関する情報を素早く確認するためのものであって、“コマンドインターフェース”として機能するものではありません。 ユーザがを押したままInfoウィンドウを表示した状態では、そのInfoウィンドウ自体に一切操作ができない点を忘れないでください。

ネットワークとパラメータ

ネットワーク

パラメータの編集

次のステップ

エクスプレッション

レシピ

リファレンス

導師レベル