2019の10日目の記事です。先月の終わりにHoudini18.0がリリースされました!もうすでに使ってる方も多いと思いますが、新機能ムービーで紹介されたノード以外にも細かい更新がされているようです。そこで、この記事ではHoudini18.0で追加、更新されたノードを取得、作成する方法を紹介します。調べるために追加、更新の定義を考えます。定義したのは下記の2つです。Houdini17.5のノード全てと比較してHoudini18.0にしか存在しない物ノードは存在するが新しくパラメータが追加された物この条件を元にPythonで追加、更新されたノードをネットワークエディタ状に全て作成したいと思います。ちなみに比較するバージョンは17.5.391と18.0.287を使用しています。スクリプトの実行結果まずスクリプトを実行した結果をご覧ください。スクリプトを実行すると、どのバージョンと比較するかを選ぶウィンドウが出てきて、選ぶとノードの比較処理が走ります。処理が終わると、ノード自体が追加された物はNewNodes、パラメータが追加されたノードはNewParmNodesというSubnetが作成され、中にSopなどカテゴリごとにノードが出来ています。Valuesを選ぶと追加されたパラメータのみ表示出来るようになっています。スクリプトは下記GitHubのリポジトリからダウンロードして使用することが出来ます。最初は追加、更新されたノードを全て載せようかと思ったんですが、余りにも多かったので、カテゴリ別に追加、更新されたノードの数をまとめました。2全体で152個のノードが追加、更新されています。新しく追加されたLOPだけでなく、SOPだけでも62個のノードが追加、更新されています。次にパラメータが追加されたノードの数をご覧ください。361こちらでは全体で187個のノードにパラメータが追加されており、パラメータ数でいうと1054個のパラメータが追加されてます。これを見るとLopはHoudini17.5の時点ですでに入ってたんですね。LOP、Sopに限らず、Top、Dopもかなり更新されてるようです。CSVデータノード名やパラメータ名の一覧も見たいという方の為に下記にCSVファイルをアップしました。Houdini18.0にしか存在しないノードCSVをダウンロードエクセルで開いた図。ノードごとにカテゴリ、ノード名、ノードラベルで分けています。パラメータが追加されたノードCSVをダウンロードエクセルで開いた図。パラメータごとにカテゴリ、ノード名、ノードラベル、パラメータ名、パラメータラベルで分けています。追加、更新されたノードを取得する方法ここからはPythonの解説です。全てを書くのは厳しいので、ポイントになる箇所だけ解説していきます。インストールしてるHoudiniのバージョンの取得まず比較したいバージョンを指定したいので、インストールしてるHoudiniのバージョンを全て取得します。インストールディレクトリの取得Houdiniは起動時にHFSという環境変数にインストールディレクトリを登録するので、osモジュールで取得します。os.getenv('HFS')#C:/PROGRA~1/SIDEEF~1/HOUDIN~1.287全てのバージョンの取得ここから全てのバージョンを取得するには一つ上のディレクトリに行き、そのフォルダにある全てのフォルダ名を取得します。18.0.287']起動してるHoudiniのバージョンを省くこれで全バージョンが取れましたが、起動してるHoudiniのバージョンは必要ないので、省きます。本来ならHFSで取得したパスから省けるんですが、HFSはHOUDIN~1.287のように略字で返ってくるので、下記の方法で省きました。取得したバージョンをUIに表示させてユーザーが選べるようにします。UIはPySideで作るのが一般的ですが、面倒なのでhou.uiモジュールのselectFromList関数を使用しました。比較する為に全てのノードタイプを取得する必要があります。全てのノードタイプを取得するにはhou.nodeTypeCategories()でキーに各カテゴリ名、値にhou.NodeTypeCategoryオブジェクトを持った辞書が返ってきます。hou.NodeTypeCategoryオブジェクトのnodeTypes関数を実行することで、キーにノードタイプ名、値にhou.NodeTypeオブジェクトを持った辞書が返ってきます。SOPのノードタイプ名を全て取得するには下記コードを実行します。全てのパラメータを取得するにはhou.NodeTypeオブジェクトのparmTemplates()関数を実行することで、基本的に全てのパラメーターのhou.parmTemplateオブジェクトを取得することが出来ます。Blockに入ってる物は取得することが出来ません。Blockに含まれるパラメータも取得するには、下記のように再帰関数を使用する事で取得可能です。以上を踏まえてノードタイプとパラメータを全て取得します。node_data上記コードを実行すると下記のようなカテゴリごとにノード名、ノードラベル、パラメータ名を持つ辞書が返ってきます(PolySplitSopの箇所のみ表示)。これを実行しても今起動してるバージョンのノード情報を取得出来るだけで指定したバージョンのノード情報を取得出来る訳ではありません。指定したバージョンのノード情報を取得するためにHythonを使います。Hythonとは$HFS/bin内に置かれてるPythonシェルで、各バージョンごとに存在します。起動時に自動でhouモジュールを読み込んでくれるため、Houdiniを起動せずにHoudini独自の処理を実行することが出来ます。指定したバージョンのHythonでスクリプトを実行するには先ほどのコードを.pyファイルで保存し、subprocessを使用してHythonの引数に指定します。eval(stdout)しかしこれを実行してもstdoutには何も返ってこず、stderrには次の文字列が返ってきました。\x8ew\x92\xe8\x82\xb3\x82\xea\x82\xbd\x83v\x83\x8d\x83V\x81[\x83W\x83\x83\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81B\r\n'エラーを見るとどうやらhouモジュールのインポートに失敗してるようです。エラーの原因なぜエラーが出るかと言うと、Hythonはhouモジュールをインポートする時に$HFSと$HFS/houdini/python2.7libsを見に行きます。18.0からHythonを実行すると18.0用のHFSとPYTHONPATHしか認識しないため、インポートエラーが出るという事です。解決方法これを解決するにはHythonを実行する前に下記コードを実行して、そのバージョン用の設定に変更する必要があります(安全のため、Hython実行後は元の設定に戻します)。version_path#houモジュールのインポート時にDLLもロードするため、PATH環境変数も書き換えます。path)コード全体コード全体は下記のようになりました(長いので折りたたんでます)。スクリプトの実行はmain関数を呼び出します。hou.node('/obj').layoutChildren()まとめ以上、新しいバージョンで追加、更新されたノードの調べ方でした。このスクリプトを使う事で新しいバージョンが出る度にいち早く更新されたノードを確認する事が出来ますね!もし記事内で間違いや不明点等あれば書き込んでいただけると幸いです。最後までお読みいただき、ありがとうございました。upLoginユーザーは見つかりませんでした。