2015-03-24

Houdini Startup Scripts

Houdini起動時に実行される pythonrc.py, ready.py (H20.0 から), 123.{cmd|py}, 456.{cmd|py} に関して紹介。




Houdini にはおおざっぱに言って以下の4種類の起動ファイルがある。

ファイル名 種類 役割
pythonrc.py Python Houdini起動時、HDA ロード前に実行される
ready.py Python Houdini起動時、HDA ロード後に実行される
123.{cmd|py} Hscript/Python Houdini FX でファイル名を指定せずに起動した時に実行される。Houdini Core の場合、houdinicore.py というファイル名にする。
456.{cmd|py} Hscript/Python File->New および File->Open 実行後に実行される
これら四種類のファイルが存在する場合、上からこの順に実行される。

以下 Houdini FX 20.0 を使った場合の詳細。

pythonrc.py

  • Houdini 起動時、 HDA ロード前に実行される。
  • デフォルトでは存在しない。
  • H18.0 まで
    • ~/houdini18.0/scripts/python (要作成)以下に置く。
    • ~/houdini18.0/scripts/ においた場合実行されない。
  • H18.5 以降
    • ~/houdini20.0/pythonX.ylibs (要作成)以下に置く。
    • ~/houdini20.0/scripts/ においた場合実行されない。
    • H20.0 Python 3.10 ビルドを使っている場合は、~/houdini20.0/python3.10libs/pythonrc.py とする。
  • 上記以外の *.py ファイルの配置位置はこちらを参照。

NEW: ready.py

  • H20.0 から追加された。Houdini 起動時、 HDA ロード後に実行される。
  • デフォルトでは存在しない。
  • ~/houdini20.0/pythonX.ylibs (要作成)以下に置く。
  • H20.0 Python 3.10 ビルドを使っている場合は、~/houdini20.0/python3.10libs/ready.py とする。
  • サンプルはこちら

123.{cmd|py}

  • ファイル名を指定せずに Houdini FX を起動した時に実行される。
  • Houdini Core の場合、houdinicore.py というファイル名にする。
  • デフォルトでは $HH/scripts/123.cmd として存在する。
  • ~/houdini19.5/scripts/ (要作成) 以下に 123.{cmd|py}として配置すると、こちらが実行され、 $HH/scripts/123.cmd は実行されない。
  • 123.cmd と123.py が共に ~/houdini19.5/scripts/ に存在する場合、123.py が実行され、123.cmd は実行されない。
  • 123.py を ~/houdini19.5/scripts/python/ に配置した場合、実行されない。

456.{cmd|py}

  • File->NewまたはFile->Open実行後に実行される。
    • つまり、Houdini起動後にも実行される。
  • デフォルトでは存在せず、 ~/houdini19.5/scripts/ (要作成)以下に置く。
  • 456.cmd と456.py が共に ~/houdini19.5/scripts/ に存在する場合、456.py が実行され、456.cmd は実行されない。
  • 456.py を ~/houdini19.5/scripts/python/ に配置した場合、実行されない。
  • 例えば、デフォルトでは保持されない Edit->Auto Save を起動時およびシーンを新しくするたびに常にオンにしたい場合、
    import hou
    hou.appendSessionModuleSource('''hou.hscript("autosave on")''')
    print("autosave on 456");
    
    などと 456.py に記述する。


pythonrc.py
print ("python/pythonrc.py loaded")

123.py
print ("123.py loaded")

123.cmd
opcd /obj
opadd geo
opcolor -c 1 0 0 /obj/geo1

456.py
print ("456.py loaded")

456.cmd
opcd /obj
opadd geo
opcolor -c 0 0 1 /obj/geo1
  1. 上記の pythonrc.py ~/houdini19.5/scripts/python/ に、123.py, 456.py ~/houdini19.5/scripts/ に配置し Houdini を起動すると、起動したシェルまたは Houdini Console に、
    python/pythonrc.py loaded
    123.py loaded
    456.py loaded
    
    と表示され、File->Newを繰り返すたびに、
    456.py loaded
    と表示される。
  2. 123.py をパスから外し、上記の 123.cmd ~/houdini19.5/scripts/ に配置し Houdini を起動すると、起動したシェルまたは Houdini Console に、
    python/pythonrc.py loaded
    456.py loaded
    
    と表示され、シーンには赤く色づけされた /obj/geo1 が出来ている。 File->Newを行えば、
    456.py loaded
    と表示される。
  3. 456.py をパスから外し、上記の 456.cmd ~/houdini19.5/scripts/ に配置し Houdini を起動すると、起動したシェルまたは Houdini Console に、
    python/pythonrc.py loaded
    
    と表示され、シーンには青く色づけされた /obj/geo1 と色の付いていない/obj/geo2 が出来ている。
    File->Newを行えば、青く色付けされた /obj/geo1 だけが残る。

123.py で起動時間を計測

~/houdini19.5/scripts/123.py を以下のように記述。

import hdefereval
import time

start_time=time.time()
last_time = start_time

print("beginning at", start_time, "-", time.ctime())

def print_since_start(msg):
    global start_time
    global last_time
    now = time.time()
    print(msg, "-", now - start_time, "-", now - last_time, "-", time.ctime())
    last_time = now

print_since_start("NOW")

hdefereval.executeDeferredAfterWaiting(print_since_start, 1, "STARTUP TIME")
とすれば、Houdini 起動したターミナルまたはコンソールに起動時間が表示される。

456.py で $JOB のリセット

他人が作った .hip ファイルの中にその作者の使っている $JOB 設定が埋め込まれていて、そのディレクトリが自分のところに存在しない時は非常に煩わしかったりする。この手のファイルを開いた時に、自分の環境に強制的にリセットするには、456.py に
import os
hou.allowEnvironmentToOverwriteVariable("JOB", True)
os.environ["JOB"] = "//dell-m4700/share/HoudiniFiles/projects"
とする。実際の変更先ディレクトリは自分の環境に合わせて変える必要あり。

複数ある 456.py の実行

456.py が ~/houdini19.5/scripts $HSITE/houdini19.5/scripts の両方にある場合、Houdini は ~/houdini19.5/scripts 以下の 456.py のみを実行し、$HSITE 以下のは実行しない。両方を実行するには、ホーム以下 (~/houdini19.5/scripts/) の 456.py の最後に以下のようなコマンドを追加。

print("456 in ~/houdini19.5/scripts");
post_load_files = hou.findFiles("scripts/456.py")
n = len(post_load_files)
for i in range(1, n):
    post_load_file = post_load_files[i]
    with open(post_load_file, "r") as f:
        exec(f.read())
とすると、hou.findFiles が自身を含む HOUDINI_PATH にあるすべての 456.py を探すが、range を 0 からではなく 1 から始めているので、自身の再実行は行わない。

Hscript Texport での現在ディレクトリ表示

123.cmd に

prompt '`strcat(oppwf(), " -> ")`'
と記述すると、Hscript Textport のプロンプトが現在のディレクトリを表示する。 これを Python で記述するには、
hou.hscript( 'prompt \'`strcat(oppwf(), " -> ")`\'')

古いノードの復活

H19.5 以降 TAB メニューから消えた Copy Stamp ノードを復活させたい場合には、

  1. Hscript Editor に
    opunhide Sop copy
    とするか、
  2. 123.cmd に同じコマンドを仕込むか、
  3. 123.py または ready.py
    hou.hscript('opunhide Sop copy')
とする。pythonrc.py に仕込んだ場合、実行が早すぎて unhide が再び hide されている感じ。

旧 Mountain ノードの復活についてはこちら

デフォルトシーンの設定

Entagma のこのチュートリアル (Setting Up A Default Scene In Houdini, 2022年10月) で、ロード時のファイル設定に関しての説明がある。ここでは、 hou.hipFile.merge を使って、Houdini 起動時に指定したファイルを読み込む設定をしている。 現時点 (20.0) では、 123.py では問題なく動くが、456.py に指定するとうまくいかない。456.py の問題が解決しているのは 20.5.227 以降で、なおかつ ignore_load_warnings=True を以下のように指定する必要がある。

hou.hipFile.merge("C:/tmp/test_startup.hip", ignore_load_warnings=True)

ただし 456.py に設定すると、File->New しても同じファイルが読み込まるだけで、クリアするすべがなくなるので、必要なノードをネットワークエディタで選択して、シェルフにドラッグ&ドロップで登録しておき、必要に応じてクリックして呼び出す方が便利だと思う。

なお、インストールディレクトリ (C:/Program Files/ 以下) のファイルを変更するのは、個人的な好みかもしれないが、お勧めしない。 自分の環境で設定すれば、ビルドごとの編集が不要。

おまけ


最終更新: 2024-05-06

0 件のコメント:

コメントを投稿