houdini-node-library 0.2.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/CHANGELOG.md +13 -0
- {houdini_node_library-0.2.0/src/houdini_node_library.egg-info → houdini_node_library-0.3.0}/PKG-INFO +4 -3
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/README.md +2 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/docs/format.md +25 -2
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/docs/security.md +11 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/docs/user-guide.md +21 -3
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/pyproject.toml +2 -2
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/__init__.py +1 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/export.py +337 -292
- houdini_node_library-0.3.0/src/hnl/_houdini/python/hnl_bridge/hipfile.py +339 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/importer.py +13 -1
- houdini_node_library-0.3.0/src/hnl/_houdini/python/hnl_bridge/progress.py +95 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/server.py +461 -416
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/structure.py +20 -7
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/userset.py +5 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/app.py +7 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/library.py +2 -2
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/model.py +17 -0
- houdini_node_library-0.3.0/src/hnl/core/scenehip.py +97 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/share/base.py +42 -11
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/share/svn.py +136 -135
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/share/text.py +175 -173
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/trust.py +99 -77
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/houdini/client.py +277 -215
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/detail_cmd.py +222 -215
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/detail_header.py +3 -2
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/detail_info.py +5 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/detail_panel.py +1 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/grid.py +322 -322
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/import_dialog.py +107 -17
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/import_flow.py +17 -4
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/import_logic.py +154 -34
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/item_actions.py +3 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/main_window.py +16 -11
- houdini_node_library-0.3.0/src/hnl/ui/rebuild.py +18 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/receive_dialog.py +3 -2
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/dialog.py +38 -7
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/logic.py +26 -4
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/simple_tabs.py +280 -275
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/thumb_panel.py +1 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/workers.py +2 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/share_dialog.py +1 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/share_logic.py +4 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/tag_edit.py +1 -1
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/thumbs.py +20 -6
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/vcs_controller.py +24 -34
- houdini_node_library-0.3.0/src/hnl/ui/worker.py +116 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0/src/houdini_node_library.egg-info}/PKG-INFO +4 -3
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/houdini_node_library.egg-info/SOURCES.txt +4 -0
- houdini_node_library-0.2.0/src/hnl/ui/rebuild.py +0 -32
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/LICENSE +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/MANIFEST.in +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/setup.cfg +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/__main__.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_deps.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/OPmenu.xml +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/__init__.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/autostart.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/cmdio.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/extras.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/hdas.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/known_limits.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/launcher.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python/hnl_bridge/scan.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python3.11libs/uiready.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/python3.13libs/uiready.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/_houdini/toolbar/hnl.shelf +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/__init__.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/cmdio.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/cmdscan.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/cmdtext.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/collect.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/index.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/limits.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/refrules.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/settings.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/share/__init__.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/share/folder.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/share/service.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/structure.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/thumbmake.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/transfer.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/core/vocab.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/houdini/__init__.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/houdini/export.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/houdini/launcher.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/houdini/package.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/__init__.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/app_icon.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/detail_tables.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/empty_state.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/hou_icons.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/item_model.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/item_table.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/limits_view.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/main_toolbar.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/md_pane.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/md_render.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/progress_dialog.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/__init__.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/capture_dialogs.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/meta_form.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/picker.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/protocol.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/refs_tab.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register/structure_tab.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/register_flow.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/settings_dialog.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/share_flow.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/share_history.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/sidebar.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/structure_view.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/theme.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/theme_icons.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/vcs_dialogs.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/vcs_history.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/vcs_ops.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/vcs_style.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/ui/vocab_combo.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/vcs/__init__.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/vcs/base.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/vcs/none.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/hnl/vcs/svn.py +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/houdini_node_library.egg-info/dependency_links.txt +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/houdini_node_library.egg-info/entry_points.txt +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/houdini_node_library.egg-info/requires.txt +0 -0
- {houdini_node_library-0.2.0 → houdini_node_library-0.3.0}/src/houdini_node_library.egg-info/top_level.txt +0 -0
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
- 修正: テスト通し実行・終了時にまれに起きるアクセス違反(ワーカースレッドで走った GC が Qt オブジェクトを破棄)を、GC のメインスレッド限定化(`ui/worker.py`)と、ワーカー完了通知の寿命管理で解消。詳細は `docs/stability-notes.md`
|
|
6
|
+
- 変更: **シーン全体は hip のまま保存する**。これまでシーン全体も Hscript(`nodes.cmd`)に変換していたが、大きなシーン(ノード約 2,400、ロックされた HDA の内部を含めると約 30 万)で書き出しに約 265 秒、読み込み(`source`)に約 68 秒かかっていた。0.3.0 では `scene.hip`(ライセンスに応じて `.hip` / `.hiplc` / `.hipnc`)として保存し、書き出しは数秒で終わる。ノード単体・ノード群は従来どおり Hscript。`item.json` に `payload`(`cmd` / `hip`)を追加。古いアイテム(`payload` が無い)は cmd として従来の経路で開ける
|
|
7
|
+
- 追加: 書き出しは作業中のシーンの名前・保存状態・`$HIP`・undo を変えない(hscript `mwrite -n`)。`structure.json` は最上位ごとに件数を分け、時間でも打ち切る
|
|
8
|
+
- 追加: 「シーンを開く」は、ライブラリのファイルを作業ファイルにしない。既定は「名前なしで開く」(保存していない新規シーン扱い)。「保存先を指定して開く」は、ライブラリのファイルを複製してから開く(既存のファイルは上書きしない)
|
|
9
|
+
- 追加: **現在のシーンにマージ**(`hou.hipFile.merge`)。同名のノードは上書きせず、新しい側が改名される
|
|
10
|
+
- 追加: hip の外部ファイル参照は、登録時の置き換え・収集の結果を `item.json` の `path_map`(ノードの絶対パス + パラメータ名 → 新しい値)に記録し、開いた後にパラメータを設定し直す。収集していない `$HIP` 相対のパスは、開くときに元の絶対パスへ展開できる(既定オン)
|
|
11
|
+
- 追加: hip は中身を検査できないため、信頼しない場所のアイテムは開く前の確認ダイアログ内で 1 行の説明を出し、初回だけ承認を求める(承認の記憶は `scene.hip` と `path_map` を含む内容のハッシュ)。テキストコードの共有ではシーン全体を選べない(理由を表示)
|
|
12
|
+
- 追加: 非商用・限定ライセンスで保存した hip の「お知らせ」(登録時、および開く側の Houdini のライセンスが上位のとき)
|
|
13
|
+
- 追加: **長い処理の進行表示とキャンセル**。ブリッジに `progress` / `cancel` を追加。登録ダイアログの読み込み画面に段階と経過時間、キャンセルを出す。固定の 300 秒タイムアウトをやめた(最終上限 1 時間)。Houdini 側もステータスバーに段階を出す。キャンセルは確認点で止まり、Houdini のシーンは処理前のまま
|
|
14
|
+
- 改善: ノード単体・ノード群の書き出しの高速化。同じ HDA 型の「出荷時の見本」を型ごとに 1 つだけ作る(インスタンスごとに作り直していた)、ファイル参照の列挙で `hou.fileReferences()`(シーン全体を走査)をやめて書き出し対象の下だけを調べる。ロックされた HDA を多用する大きなシーンから約 380 ノードを選択した書き出しが 47.3 秒から 3.7 秒になった。読み込みは hscript の `source` が支配的で変わらない(約 16 秒)
|
|
15
|
+
- 変更: Houdini ブリッジのコマンド互換番号を `BRIDGE_VERSION = 5`、アプリの必要最小を `REQUIRED_BRIDGE_VERSION = 5` に上げた(`open_hip` / `progress` / `cancel` の追加、`export` の scope=scene の戻り値)。古いブリッジでは「Houdini を再起動してください」と案内する
|
|
3
16
|
## 0.2.0
|
|
4
17
|
|
|
5
18
|
- 追加: **ライブラリに載せない直接共有**。Houdini のシェルフ Share Selection / Receive、ノードの右クリック HNL: Share、ブラウザのファイルメニューとアイテムの右クリック「共有コードを作成...」。方式はテキストコード(`HNL1:...`、設定不要、256 KB まで)、共有フォルダ(`K7Q2-M9XD`、既定 30 日で掃除)、SVN リビジョン(`r1234`)。アプリの引数 `--share <selection|network|scene> --session <pid>` と `--receive`。設定ダイアログに「共有」タブ、サイト設定に `share_dir` / `share_svn_url`
|
{houdini_node_library-0.2.0/src/houdini_node_library.egg-info → houdini_node_library-0.3.0}/PKG-INFO
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: houdini-node-library
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: Houdini Node Library: save Houdini nodes as Hscript (cmd) and recall them from a standalone browser app
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Houdini Node Library: save Houdini nodes as Hscript (cmd) and whole scenes as hip, and recall them from a standalone browser app
|
|
5
5
|
Author: hamu-dev
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Keywords: houdini,sidefx,node,library,hscript
|
|
@@ -30,7 +30,8 @@ Dynamic: license-file
|
|
|
30
30
|
# Houdini Node Library (HNL)
|
|
31
31
|
|
|
32
32
|
Houdini のノードを Hscript (`nodes.cmd`) として保存し、独立したブラウザアプリから呼び出すツールです。
|
|
33
|
-
|
|
33
|
+
選択ノード、ネットワーク全体、シーン全体を登録できます。登録した内容は、現在のネットワークへの追加、新規シーンへのインポート、シーンを開く、現在のシーンへのマージ、のいずれかで復元します。
|
|
34
|
+
ノード単体・ノード群は Hscript(cmd)で、**シーン全体は hip のまま**保存します(大きなシーンでも数秒で登録・開けるため。0.3.0 から)。
|
|
34
35
|
|
|
35
36
|
## 必要環境
|
|
36
37
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Houdini Node Library (HNL)
|
|
2
2
|
|
|
3
3
|
Houdini のノードを Hscript (`nodes.cmd`) として保存し、独立したブラウザアプリから呼び出すツールです。
|
|
4
|
-
|
|
4
|
+
選択ノード、ネットワーク全体、シーン全体を登録できます。登録した内容は、現在のネットワークへの追加、新規シーンへのインポート、シーンを開く、現在のシーンへのマージ、のいずれかで復元します。
|
|
5
|
+
ノード単体・ノード群は Hscript(cmd)で、**シーン全体は hip のまま**保存します(大きなシーンでも数秒で登録・開けるため。0.3.0 から)。
|
|
5
6
|
|
|
6
7
|
## 必要環境
|
|
7
8
|
|
|
@@ -187,7 +187,7 @@ UTF-8 の JSON です。読むときは BOM があっても受け付けます。
|
|
|
187
187
|
|
|
188
188
|
Houdini の `opscript -r -b -s` の出力(Hscript)です。UTF-8、改行は LF です。
|
|
189
189
|
|
|
190
|
-
-
|
|
190
|
+
- 選択ノード、ネットワーク全体は同じ形式です。シーン全体は 0.3.0 から hip(下の「シーン全体(hip)の形式」)で、`nodes.cmd` は旧形式(0.2.0 以前)のシーンだけが持ちます。旧形式のシーンは `/` を対象にした cmd で、従来どおり開けます。
|
|
191
191
|
- ロックされた HDA の中身は出力されません(`opscript -r` が再帰しないため。HDA のパラメータと、編集可能ノードの中身だけが出ます)。標準ノード 4 個(grid / sphere / vellumconstraints / vellumsolver)の cmd は 79 行です。
|
|
192
192
|
- 付箋を作る Python 行(`createStickyNote` / `findStickyNote`)は取り除き、付箋は `extras.json` に保存します。
|
|
193
193
|
- 収集や検索置き換えをしたときは、登録時に cmd の値が書き換わります。
|
|
@@ -424,7 +424,7 @@ Houdini 側のブリッジ(`hnl_bridge/server.py`)は、待ち受けを始
|
|
|
424
424
|
- 待ち受けは `127.0.0.1` だけです。
|
|
425
425
|
- フレームは、4 バイトの長さ(ビッグエンディアン)の後ろに UTF-8 の JSON が続く形式です。1 フレームの上限は 64 MiB、無通信は 300 秒で切断します。
|
|
426
426
|
- 要求は `{"token": ..., "cmd": ..., "args": {...}}`、応答は `{"ok": true, "result": ...}` または `{"ok": false, "error": ...}` です。トークンが合わない要求には応答せず、接続を切ります。
|
|
427
|
-
- 受け付けるコマンドは、`ping`、`context`、`export`、`import`、`new_scene`、`capture`、`message` の
|
|
427
|
+
- 受け付けるコマンドは、`ping`、`context`、`export`、`import`、`open_hip`、`new_scene`、`capture`、`message`、`progress`、`cancel` の 10 個だけです(`progress` / `cancel` は実行中のコマンドを待たずに答えます)。任意のコードを実行する口はありません。
|
|
428
428
|
- Houdini の操作はすべてメインスレッドで、1 つずつ実行します。
|
|
429
429
|
|
|
430
430
|
### 起動時ジョブ
|
|
@@ -453,3 +453,26 @@ package(`hnl.json`)を導入した Houdini は、通常どおり GUI が立
|
|
|
453
453
|
### 履歴・キャッシュ
|
|
454
454
|
|
|
455
455
|
設定フォルダの `share_history.json`(発行したコード・名前・日時・方式。最大 30 件)と `share_cache/`(受け取ったデータ。7 日で掃除)。
|
|
456
|
+
|
|
457
|
+
## シーン全体(hip)の形式(0.3.0)
|
|
458
|
+
|
|
459
|
+
`type` が `scene` で `payload` が `hip` のアイテムは、`nodes.cmd` と `extras.json` を持たず、次のファイルを持ちます。
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
scene.hipnc | scene.hiplc | scene.hip シーンファイル(保存時のライセンスで拡張子が決まる。1 つだけ)
|
|
463
|
+
structure.json, hda/, assets/ ... 従来どおり
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
`item.json` の追加項目(無ければ cmd 形式として読みます):
|
|
467
|
+
|
|
468
|
+
| キー | 型 | 内容 |
|
|
469
|
+
|---|---|---|
|
|
470
|
+
| `payload` | 文字列 | `cmd`(`nodes.cmd`)または `hip`(`scene.hip*`)。`scene` だけが `hip` になり得ます |
|
|
471
|
+
| `path_map` | 配列 | 開いた後に設定し直すファイルパス `[{node, parm, raw, value}]`。`node` はノードの絶対パス、`parm` はパラメータ名、`raw` は登録時の生の値、`value` は新しい値(`$HNL_ITEM` は開くときに置換)。開くとき、現在の値が `raw` と同じものだけ設定します |
|
|
472
|
+
| `scene_info` | オブジェクト | `fps`、`frame_range`、`playback_range`、`frame`、`top_counts`(最上位ごとのノード数) |
|
|
473
|
+
| `hip_license` | オブジェクト | 保存時のライセンス `{category, ext}` |
|
|
474
|
+
|
|
475
|
+
`file_refs` の各要素には、hip では `node`(ノードの絶対パス)と `parm_name` が入ります。`node_count_total` は 0(不明)です。`limitations`(既知の制限)は cmd 由来のものなので hip では空です。
|
|
476
|
+
|
|
477
|
+
承認(信頼)のハッシュは、`nodes.cmd` + `extras.json` + `scene.hip*` + `path_map` + `hda/*` です(cmd 形式のアイテムのハッシュは変わりません)。
|
|
478
|
+
|
|
@@ -128,3 +128,14 @@
|
|
|
128
128
|
- 送信者名・名前・メモは長さを制限し、制御文字・双方向制御文字を除く。
|
|
129
129
|
- 受け取ったデータはローカルのキャッシュに置き(7 日で掃除)、ライブラリの一覧には出さない。
|
|
130
130
|
- テキストコードは既定で信頼しない(HDA の承認が要る)。初回のみ「このコードは実行されるデータです」の注意を 1 行出す(「次回から表示しない」可)。
|
|
131
|
+
|
|
132
|
+
## シーン全体(hip)は検査できない(0.3.0)
|
|
133
|
+
|
|
134
|
+
シーン全体は hip のまま保存・共有します。hip は中身を検査できません。開くと、シーンに埋め込まれたスクリプト(`pythonscript` など)、HDA の読み込み時スクリプト(`OnLoaded` など)、パラメータのコールバックが動き得ます。cmd のような危険コマンド検査は使えません。
|
|
135
|
+
|
|
136
|
+
- 信頼する場所のアイテム(ルート設定・共有方式の設定)は、確認なしで開きます。
|
|
137
|
+
- そうでないものは、開く前の確認ダイアログに「このシーンファイルは内容を検査できません」を 1 行で出し、初回だけ承認を求めます(「停止」にはしません)。承認の記憶は、`scene.hip*` と `path_map`(開いた後に設定し直すパラメータ)を含む内容のハッシュです。内容が変わると未承認に戻ります。共有で届いたものは承認を記憶しません。
|
|
138
|
+
- 開いた後に設定し直すパラメータ(`path_map`)は、文字列パラメータで、登録時の値と現在の値が同じときだけ、改行・バッククォート・`$(` を含まない値に限って設定します。ロックされた HDA の内部は触りません。
|
|
139
|
+
- 受け取ったデータでは、`payload` が `hip` のアイテムはシーンファイルがちょうど 1 つあることを確認し、`nodes.cmd` は取り除きます。cmd のアイテムに付いていた `scene.hip*` も取り除きます。
|
|
140
|
+
- テキストコードの共有では、シーン全体は扱えません(サイズ)。
|
|
141
|
+
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
|
|
127
127
|
- サムネイル: 右クリックで「画像ファイルから...」「クリップボードから貼り付け」「削除」を選べます。GIF は再生されます。
|
|
128
128
|
- 名前、タイプのバッジ、「プロジェクト / 部署」(どちらも空なら出ません)、お気に入りの星があります。
|
|
129
|
-
- ボタン:
|
|
129
|
+
- ボタン: シーンは「シーンを開く」と「現在のシーンにマージ」(hip 形式のみ)、それ以外は「現在のネットワークへ追加」と「新規シーンにインポート」が出ます。
|
|
130
130
|
|
|
131
131
|
### タブ
|
|
132
132
|
|
|
@@ -293,14 +293,15 @@
|
|
|
293
293
|
|---|---|---|
|
|
294
294
|
| 現在のネットワークへ追加 | ノード、ノード群 | Houdini のネットワークエディタで開いているネットワークに、カーソル位置を中心に追加します。コンテキストが違うとエラーになります |
|
|
295
295
|
| 新規シーンにインポート | ノード、ノード群 | コンテキストから読み込み先を自動で決めます。Object は `/obj`、Driver は `/out`、Lop は `/stage` です。Sop などは `/obj` に、アイテム名のコンテナ(Sop なら `geo`)を作ってその中へ入れます |
|
|
296
|
-
| シーンを開く | シーン |
|
|
296
|
+
| シーンを開く | シーン | 空のシーンに、シーン全体を読み込みます(hip 形式は「名前なしで開く」か「保存先を指定して開く」。下の「シーン全体(hip 形式)」を参照) |
|
|
297
|
+
| 現在のシーンにマージ | シーン(hip 形式) | いま開いているシーンへ足します |
|
|
297
298
|
|
|
298
299
|
- 「新規シーンにインポート」では、確認ダイアログの「この Houdini で新規シーンにする」で、実行先のシーンを空にしてから読み込めます。未保存の変更があると、Houdini 側に「保存」「破棄」「キャンセル」の確認が出ます。チェックしないと、現在のシーンにコンテナを作って読み込みます。
|
|
299
300
|
- 「新しい Houdini を起動」を選ぶと、Houdini を起動して新規シーンに読み込みます。起動に 1 分ほどかかります。
|
|
300
301
|
- シーンは、空のシーンにしか読み込めません。現在のシーンが空でないとエラーになります。
|
|
301
302
|
- 名前が衝突したノードは自動で別名になり、完了ダイアログに「改名されたノード」として出ます。
|
|
302
303
|
- インポートは 1 回の Undo にまとまります。途中で失敗したときは、作られたノードを取り消します。
|
|
303
|
-
- 付箋、ネットワークボックス、ドット、シーン設定は `extras.json`
|
|
304
|
+
- 付箋、ネットワークボックス、ドット、シーン設定は `extras.json` から復元されます(hip 形式のシーンは hip に含まれるので `extras.json` はありません)。
|
|
304
305
|
|
|
305
306
|
### 確認ダイアログの読み方
|
|
306
307
|
|
|
@@ -536,3 +537,20 @@ Houdini を起動したままアプリを更新すると、Houdini 側のブリ
|
|
|
536
537
|
- 「Houdini 側のブリッジが古いバージョンです。Houdini を再起動すると最新になります(未保存のシーンは先に保存してください)」と表示します。
|
|
537
538
|
- 新しいアプリと古いブリッジの組み合わせでも、アプリが使うコマンドが揃っていれば(必要バージョン 3 以上)案内は出ず、そのまま登録できます。
|
|
538
539
|
- 登録するセッションの選択と、インポート確認の実行先一覧では、該当セッションに「【要再起動】」と付きます。
|
|
540
|
+
|
|
541
|
+
## シーン全体(hip 形式)
|
|
542
|
+
|
|
543
|
+
0.3.0 から、シーン全体の登録は Hscript に変換せず、Houdini のシーンファイルをそのまま保存します(ノード単体・ノード群は従来どおり cmd)。
|
|
544
|
+
|
|
545
|
+
- **登録**: 作業中のシーンの名前・保存状態・`$HIP`・undo は変わりません(hscript `mwrite -n`)。保存先のファイルは `scene.hip` / `scene.hiplc` / `scene.hipnc`(Houdini のライセンスに応じた拡張子)です。`nodes.cmd` と `extras.json` は作りません。未保存の新しいシーンでも登録できます。登録画面の「依存・警告」タブには、cmd の検査結果の代わりに「hip は中身を検査できない」旨が出ます。詳細パネルの「cmd」タブには「このアイテムは hip 形式です」と出ます。
|
|
546
|
+
- **要約**: FPS、フレーム範囲、最上位(`/obj` など)ごとのノード数、保存時のライセンスを `item.json` に持ち、詳細パネルの「情報」タブに出します。
|
|
547
|
+
- **開く**: 「シーンを開く」は、ライブラリのファイルを作業ファイルにしません(Ctrl+S でライブラリのアイテムを上書きしないため)。
|
|
548
|
+
- 名前なしで開く(既定): 読み込んだあと、保存していない新規シーン(`untitled.hip`)にします。`$HIP` は Houdini の既定の場所になります。
|
|
549
|
+
- 保存先を指定して開く: ライブラリのファイルを指定した場所へ複製してから、その複製を開きます。同名のファイルがあるときは上書きせず、別の名前を求めます。
|
|
550
|
+
- 現在のシーンが空でないときは、新規シーンにしてから開きます(未保存の変更があれば Houdini 側で保存の確認が出ます)。「新しい Houdini を起動して開く」も使えます。
|
|
551
|
+
- **マージ**: 「現在のシーンにマージ」は `hou.hipFile.merge` で、いま開いているシーンへ足します。同名のノードは上書きせず、新しい側が改名されます。シーン設定(FPS など)は取り込みません。1 つの undo にまとまります。
|
|
552
|
+
- **外部ファイル**: hip の中の参照はテキスト置換できないので、登録時の「外部パス」タブの検索置き換え・収集の結果を `path_map`(ノードの絶対パス + パラメータ名 → 新しい値)として記録し、開いた後にパラメータを設定し直します。ロックされた HDA の内部など設定できないものはスキップして「お知らせ」に出します。`$HIP` 相対で収集していない参照は、開くときに元の絶対パスへ展開して設定し直せます(確認ダイアログのチェック、既定オン)。
|
|
553
|
+
- **安全性**: hip は中身を検査できません(開くと、埋め込まれたスクリプトや HDA の読み込み時スクリプト、パラメータのコールバックが動き得ます)。信頼する場所のアイテムは確認なしで開きます。そうでないものは、開く前の確認ダイアログに 1 行の説明が出て、初回だけ承認を求めます。テキストコードでの共有では、シーン全体は選べません。
|
|
554
|
+
- **ライセンス**: `.hipnc`(非商用)/ `.hiplc`(Indie)のファイルを商用の Houdini で開くと、そのセッションが制限付きになります。登録時と、開く側のライセンスが上位のときに「お知らせ」を出します。この PC(Apprentice)以外のライセンスでの挙動は確認していません。
|
|
555
|
+
- **長い処理**: 書き出し・開く処理中は、段階と経過時間を表示し、キャンセルできます。キャンセルは確認点で止まり、Houdini のシーンは処理前のままです(hip の読み込みやマージそのものは、始まったあとは途中で止められません)。
|
|
556
|
+
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "houdini-node-library"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "Houdini Node Library: save Houdini nodes as Hscript (cmd) and recall them from a standalone browser app"
|
|
7
|
+
version = "0.3.0"
|
|
8
|
+
description = "Houdini Node Library: save Houdini nodes as Hscript (cmd) and whole scenes as hip, and recall them from a standalone browser app"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
authors = [{ name = "hamu-dev" }]
|