🔗

【Houdini】URLを開くノードを用意する

に公開

はじめに

制作中に参考にしたサイト等のURLを Sticky Note に書いていましたが、
そこからURLを開くのが面倒だと感じたので
"ボタンを押すと入力欄のURLをブラウザで開く"
機能を持ったNullノードを用意できたので紹介します。
スクリプトだけで大丈夫な方は目次のスクリプトからどうぞ🙇

今回の成果 : ボタンを押すだけでURLが開ける

今まで : URLを開くときにコピペが面倒

作成手順

1.入力欄のURLを開くボタンの作成

まずは入力欄のURLを開くボタンを持つNullノードを作成してみます。

  1. Nullノードを作成 > Edit Parameter Interface...

  2. Invisible をチェックして初期パラメータを非表示

  3. String と Button を追加

    Label Name
    String URL1 url1
    Button Open URL btn1


    Button の Callback Script に以下のスクリプトを入力して Apply/Accept

    callback_script
    import webbrowser; webbrowser.open(kwargs["node"].evalParm("url1"))
    
  4. Open URL ボタンを押せば入力したURLをブラウザで開けます。

2.複数URLへの対応 (Multiparms)

次に、複数のURL欄を用意できるようにします。
Multiparms を使えば複数のリストを用意できそうだったので使ってみました。

  1. フォルダ―を追加し、作成手順1で用意した String と Button を配置

    • Folder Type = Multiparm Block (list)
  2. String と Button の1の部分を#に変更

    Label Name
    String URL# url#
    Button Open URL btn#


    Button の Callback Script に以下のスクリプトを入力して Apply/Accept

    callback_script
    import webbrowser; i=kwargs["script_multiparm_index"]; webbrowser.open(kwargs["node"].evalParm(f"url{i}"))
    
  3. Open URL ボタンを押せば入力したURLをブラウザで開けます。

スクリプト

最後にここまでで作成したノードを使いまわせるようにスクリプト化したものを置いておきます。
geometry 内だけでなく /obj, /out などでも使えるようにしています。
URLの説明欄として Title Label を用意しました

url_launcher
"""
url_launcher

入力欄のURLをブラウザで開くボタンを持つNullを生成するスクリプト

Title : URLの説明
URL   : URLを入力
"""

import hou

pane = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
if not pane:
    raise hou.Error("No Network Editor pane found.")
parent = pane.pwd()

node = parent.createNode("null", "URLs")
node.moveToGoodPosition()

group = node.parmTemplateGroup()

# 既存パラメータ・フォルダを非表示
for parm in group.parmTemplates():
    parm.hide(True)
    group.replace(parm.name(), parm)

for entry in group.entriesWithoutFolders():
    if isinstance(entry, hou.FolderParmTemplate):
        entry.hide(True)
        group.replace(entry.name(), entry)

# Multiparm folder
multi = hou.FolderParmTemplate(
    "urls", "URLs", folder_type=hou.folderType.MultiparmBlock
)

# Title# (説明欄)
multi.addParmTemplate(hou.StringParmTemplate("title#", "Title#", 1))
# URL#
multi.addParmTemplate(hou.StringParmTemplate("url#", "URL#", 1))
# Open URL ボタン
btn = hou.ButtonParmTemplate("open#", "Open URL")
btn.setScriptCallback(
    'import webbrowser; i=kwargs["script_multiparm_index"]; '
    'webbrowser.open(kwargs["node"].evalParm(f"url{i}"))'
)
btn.setScriptCallbackLanguage(hou.scriptLanguage.Python)
multi.addParmTemplate(btn)

group.append(multi)
node.setParmTemplateGroup(group)

# Nodeの形を指定
node.setUserData("nodeshape", "chevron_up")

# Display フラグをオフ
if hasattr(node, "setDisplayFlag"):
    node.setDisplayFlag(False)

node.setSelected(True, clear_all_selected=True)

# フォーカス
pane.homeToSelection()

参考

https://support.borndigital.co.jp/hc/ja/articles/900001578626-MultiparmsをHDAで使用する
https://qiita.com/yu_kita/items/0288dada86cf0361a70c

Discussion