houdini-node-library 0.3.0__tar.gz → 0.4.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.
Files changed (129) hide show
  1. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/CHANGELOG.md +60 -48
  2. {houdini_node_library-0.3.0/src/houdini_node_library.egg-info → houdini_node_library-0.4.0}/PKG-INFO +14 -4
  3. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/README.md +139 -129
  4. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/docs/user-guide.md +560 -556
  5. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/pyproject.toml +1 -1
  6. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/__init__.py +1 -1
  7. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_deps.py +82 -81
  8. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/__init__.py +71 -67
  9. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/launcher.py +367 -237
  10. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/thumbmake.py +21 -5
  11. houdini_node_library-0.4.0/src/hnl/houdini/export.py +573 -0
  12. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/houdini/package.py +291 -252
  13. houdini_node_library-0.4.0/src/hnl/houdini/run_hnl.py +252 -0
  14. houdini_node_library-0.4.0/src/hnl/houdini/runtime.py +124 -0
  15. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/thumb_panel.py +16 -0
  16. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0/src/houdini_node_library.egg-info}/PKG-INFO +14 -4
  17. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/houdini_node_library.egg-info/SOURCES.txt +2 -0
  18. houdini_node_library-0.3.0/src/hnl/houdini/export.py +0 -306
  19. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/LICENSE +0 -0
  20. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/MANIFEST.in +0 -0
  21. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/docs/format.md +0 -0
  22. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/docs/security.md +0 -0
  23. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/setup.cfg +0 -0
  24. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/__main__.py +0 -0
  25. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/OPmenu.xml +0 -0
  26. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/autostart.py +0 -0
  27. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/cmdio.py +0 -0
  28. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/export.py +0 -0
  29. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/extras.py +0 -0
  30. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/hdas.py +0 -0
  31. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/hipfile.py +0 -0
  32. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/importer.py +0 -0
  33. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/known_limits.py +0 -0
  34. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/progress.py +0 -0
  35. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/scan.py +0 -0
  36. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/server.py +0 -0
  37. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/structure.py +0 -0
  38. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python/hnl_bridge/userset.py +0 -0
  39. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python3.11libs/uiready.py +0 -0
  40. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/python3.13libs/uiready.py +0 -0
  41. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/_houdini/toolbar/hnl.shelf +0 -0
  42. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/app.py +0 -0
  43. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/__init__.py +0 -0
  44. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/cmdio.py +0 -0
  45. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/cmdscan.py +0 -0
  46. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/cmdtext.py +0 -0
  47. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/collect.py +0 -0
  48. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/index.py +0 -0
  49. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/library.py +0 -0
  50. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/limits.py +0 -0
  51. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/model.py +0 -0
  52. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/refrules.py +0 -0
  53. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/scenehip.py +0 -0
  54. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/settings.py +0 -0
  55. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/share/__init__.py +0 -0
  56. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/share/base.py +0 -0
  57. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/share/folder.py +0 -0
  58. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/share/service.py +0 -0
  59. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/share/svn.py +0 -0
  60. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/share/text.py +0 -0
  61. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/structure.py +0 -0
  62. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/transfer.py +0 -0
  63. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/trust.py +0 -0
  64. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/core/vocab.py +0 -0
  65. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/houdini/__init__.py +0 -0
  66. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/houdini/client.py +0 -0
  67. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/houdini/launcher.py +0 -0
  68. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/__init__.py +0 -0
  69. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/app_icon.py +0 -0
  70. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/detail_cmd.py +0 -0
  71. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/detail_header.py +0 -0
  72. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/detail_info.py +0 -0
  73. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/detail_panel.py +0 -0
  74. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/detail_tables.py +0 -0
  75. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/empty_state.py +0 -0
  76. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/grid.py +0 -0
  77. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/hou_icons.py +0 -0
  78. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/import_dialog.py +0 -0
  79. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/import_flow.py +0 -0
  80. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/import_logic.py +0 -0
  81. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/item_actions.py +0 -0
  82. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/item_model.py +0 -0
  83. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/item_table.py +0 -0
  84. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/limits_view.py +0 -0
  85. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/main_toolbar.py +0 -0
  86. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/main_window.py +0 -0
  87. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/md_pane.py +0 -0
  88. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/md_render.py +0 -0
  89. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/progress_dialog.py +0 -0
  90. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/rebuild.py +0 -0
  91. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/receive_dialog.py +0 -0
  92. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/__init__.py +0 -0
  93. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/capture_dialogs.py +0 -0
  94. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/dialog.py +0 -0
  95. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/logic.py +0 -0
  96. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/meta_form.py +0 -0
  97. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/picker.py +0 -0
  98. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/protocol.py +0 -0
  99. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/refs_tab.py +0 -0
  100. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/simple_tabs.py +0 -0
  101. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/structure_tab.py +0 -0
  102. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register/workers.py +0 -0
  103. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/register_flow.py +0 -0
  104. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/settings_dialog.py +0 -0
  105. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/share_dialog.py +0 -0
  106. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/share_flow.py +0 -0
  107. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/share_history.py +0 -0
  108. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/share_logic.py +0 -0
  109. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/sidebar.py +0 -0
  110. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/structure_view.py +0 -0
  111. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/tag_edit.py +0 -0
  112. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/theme.py +0 -0
  113. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/theme_icons.py +0 -0
  114. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/thumbs.py +0 -0
  115. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/vcs_controller.py +0 -0
  116. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/vcs_dialogs.py +0 -0
  117. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/vcs_history.py +0 -0
  118. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/vcs_ops.py +0 -0
  119. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/vcs_style.py +0 -0
  120. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/vocab_combo.py +0 -0
  121. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/ui/worker.py +0 -0
  122. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/vcs/__init__.py +0 -0
  123. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/vcs/base.py +0 -0
  124. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/vcs/none.py +0 -0
  125. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/hnl/vcs/svn.py +0 -0
  126. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/houdini_node_library.egg-info/dependency_links.txt +0 -0
  127. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/houdini_node_library.egg-info/entry_points.txt +0 -0
  128. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/houdini_node_library.egg-info/requires.txt +0 -0
  129. {houdini_node_library-0.3.0 → houdini_node_library-0.4.0}/src/houdini_node_library.egg-info/top_level.txt +0 -0
@@ -1,48 +1,60 @@
1
- # Changelog
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 を再起動してください」と案内する
16
- ## 0.2.0
17
-
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`
19
- - 追加: **ファイル転送の進捗ダイアログ**(登録時の収集、`$HIP` へのコピー、共有の送受信)。バイト数ベースのバー、ファイル数・容量、現在のファイル名、速度と残り時間、キャンセル。大きな 1 ファイルの途中でも進み、キャンセルしても書きかけを残さない。開始前の空き容量の確認、失敗時の「再試行 / スキップして続行 / 中止」、終了時の要約
20
- - 追加: **既知の制限の警告**(`known_limits.py`)。完全には再現できないノードを登録・共有時に照合し、`item.json` の `limitations` に保存。止めずにお知らせとして出す
21
- - 変更: **警告を「停止 / お知らせ / 情報」の 3 段階に整理**。本当に危険なとき(危険コマンド検査のヒット、環境変数名・extras の検証違反)だけ止め、そのほかは 1 行の要約(「注意 N 件」)にした
22
- - 追加: **信頼する場所**(ルートごと・共有用フォルダ / SVN は既定でオン、テキストコードは既定でオフ)。信頼する場所のアイテムは同梱 HDA の承認を求めない(危険コマンド検査は常に実行)
23
- - 変更: **インポートの確認ダイアログを必要なときだけ開く**(設定「インポートの確認」。Shift・右クリックの「オプションを指定してインポート...」で常に開く)。開かずに実行したときは、ステータスバーと Houdini のステータスメッセージに結果を出す
24
- - 変更: ハードロック・ノードグループの警告は、`warnings` から `limitations` へ移した(ブリッジの `export` の戻り値に `limitations` を追加。コマンド互換番号 `BRIDGE_VERSION = 4` は変更なし)
25
-
26
- ## 0.1.1
27
-
28
- ランチャーや共有フォルダ・SVN で使えるようにした版。
29
-
30
- - 追加: `hnl-houdini export <フォルダ>` — 場所を移しても動く一式(`hnl.json` + `hnl_package/`)を書き出す。出力は決定的(`.pyc` なし、LF、時刻なし)。更新時は `.svn` と `site_settings.json` に触れず、SVN 管理下の不要ファイルは一覧表示のみ。`--json-name` / `--no-json` / `--python` / `--prune` / `--dry-run` / `--init-site-settings`
31
- - 追加: `hnl-houdini env [--root] [--format bat|ps1|json|plain]` — ランチャーに登録する環境変数を表示
32
- - 追加: `hnl-houdini install|uninstall|status --packages-dir <フォルダ>`
33
- - 改善: `hnl-houdini status` が、`HOUDINI_PACKAGE_DIR` / `HOUDINI_USER_PREF_DIR` / `HOUDINI_PATH` により `hnl.json` が読まれない可能性を知らせる
34
- - 追加: Houdini の Python Shell で `import hnl_bridge; hnl_bridge.diagnose()` による状態確認
35
- - 追加: アプリの起動コマンドの解決順(`HNL_APP` > `HNL_PYTHON` > `hnl_package` の隣の `python/` `.venv/` > pip 導入環境 > `pyw`/`py` > PATH)
36
- - 追加: 依存ライブラリが足りないときの案内表示。Houdini のボタンから起動した場合は、起動直後の終了を検出してダイアログに理由を表示
37
- - 追加: 共有設定 `site_settings.json`(`HNL_SITE_SETTINGS`)。`roots` と `ref_excludes` の初期値(利用者が編集するまで)
38
- - Houdini ブリッジのコマンド互換番号は変更なし(`BRIDGE_VERSION = 4`)
39
-
40
- ## 0.1.0
41
-
42
- 最初の公開版。
43
-
44
- - Houdini のノードを Hscript (cmd) として 1 アイテム 1 フォルダで保存し、独立したブラウザアプリから呼び出す
45
- - 登録(選択 / ネットワーク / シーン)、インポート前の危険コマンド検査、HDA・外部ファイルの収集
46
- - タグ・プロジェクト・部署による分類、お気に入り、検索、Markdown の説明
47
- - SVN(`file:///` を含む)によるバージョン管理(任意)
48
- - `hnl-houdini install|uninstall|status` による Houdini package の導入
1
+ # Changelog
2
+
3
+ ## 0.4.0
4
+
5
+ 各 PC に Python を用意しなくても、Houdini に付属の Python でブラウザアプリを動かせるようにした版。
6
+
7
+ - 追加: **`hnl-houdini export <出力先> --runtime houdini`**。Houdini 21 以降の付属 Python(PySide6・Pillow 入り)でアプリが動き、各 PC への Python と `pip install` が不要になる。通常の出力に、`hnl_package/run_hnl.py`(起動ラッパー)、`hnl_package/vendor/`(Houdini に無い純 Python ライブラリ markdown-it-py・mdit-py-plugins・mdurl を、書き出しを実行した環境からコピー。C 拡張を含むものはエラーで止める)、`THIRD_PARTY_LICENSES.txt`(一覧とライセンス本文の場所)、`runtime.json`(`{"runtime": "houdini"}`)が加わる。出力は従来どおり決定的(`.pyc` なし・LF・絶対パスなし)。`--runtime` の値は書き出し先に記録され、省略した再書き出しでは前回の値を引き継ぐ(`--runtime python` で戻す)。既定は従来どおり `python`(`--runtime` も `runtime.json` も無いときの出力構成は変わらない)。`--python` とは同時に指定できない
8
+ - 追加: **`run_hnl.py`**(標準ライブラリのみ、Python 3.11〜3.13)。HFS を `--hfs` → 環境変数 `HFS` → 実行中の Python の場所から逆算で決め、`sys.path`(hnl_package → vendor → `site-packages-forced` → `site-packages`。実行中の Python と同じ版の `python3xx` だけ)、`os.add_dll_directory(<HFS>/bin)`、PySide6 自身の Qt プラグインの場所を整えてから `hnl.app.main()` を呼ぶ。`import hou` はしない(ライセンスを消費しない)。PySide6 が無い(PySide2 のみ)・Python が古い・vendor が無い・DLL を読めない・HFS が分からない、のときは理由を表示して終了コード 3(`pythonw.exe` ではメッセージボックス、Houdini のボタンからは Houdini のダイアログ)。`--hnl-probe` は準備だけして状態を JSON で表示する
9
+ - 追加: **起動経路**。ブリッジ `launcher.py` は、書き出し先の `runtime.json` が `houdini` のとき `<HFS>\python3xx\pythonw.exe` + `run_hnl.py --hfs <HFS>` で起動する(優先順は `HNL_APP` > `HNL_PYTHON` > runtime=houdini > 従来の探索)。子プロセスの環境からは `PYTHONHOME` / `PYTHONPATH` に加え、Houdini が自分の GUI 用に設定する `QT_*`(`QT_ENABLE_HIGHDPI_SCALING=0` は高 DPI 表示を壊す)・`QTWEBENGINE_*`・`HOUDINI_QT_*` を外す。`hnl.bat` は runtime=houdini のとき HFS を `HNL_HFS` → `HFS` → `C:\Program Files\Side Effects Software\Houdini *` のうち PySide6 を持つ最新の版、の順で探す(Houdini を起動していなくてもブラウザ単体で開ける)。単一インスタンス化(2 回目の起動が既存ウィンドウへ引数を渡す)と `--register` / `--share` / `--receive` / `--session` はこの経路でも動く
10
+ - 追加: `hnl-houdini env --root` / `hnl-houdini status [--root]` と `hnl_bridge.diagnose()` が、runtime・見つかった HFS・使う Python の版・PySide6 / Pillow の有無を表示する。`hnl_package/README.txt` と `requirements.txt` は runtime に合わせた内容(houdini は「各 PC での pip install は不要」と明記)
11
+ - 変更: **Pillow を任意の依存にした**。無い環境でもアプリは起動し、サムネイルの縮小・GIF 作成(ビューポート撮影・フリップブックから GIF・画面の領域・貼り付け)のボタンだけが無効になり「この環境では使えません」と出る(`hnl._deps` は必須と任意を分けた)。pip 導入では従来どおり Pillow も入る
12
+ - テスト: 実行環境の違いで落ちていたテストを直した(`test_main_window_menu_and_context_actions` が `menuBar().actions()[0].menu()` と一時オブジェクトを連鎖させており、PySide6 6.5〜6.8 で QMenu が先に破棄されることがあった)。アプリ本体の不具合ではない
13
+ - 対応する Houdini: 22.0(Python 3.13、PySide6 6.8)で動作確認。21.0(Python 3.11、PySide6 6.5)で起動と主要画面を確認。20.0 以前は PySide2 / Python 3.10 以下で、理由を表示して終了する
14
+
15
+ ## 0.3.0
16
+
17
+ - 修正: テスト通し実行・終了時にまれに起きるアクセス違反(ワーカースレッドで走った GC が Qt オブジェクトを破棄)を、GC のメインスレッド限定化(`ui/worker.py`)と、ワーカー完了通知の寿命管理で解消。詳細は `docs/stability-notes.md`
18
+ - 変更: **シーン全体は 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 として従来の経路で開ける
19
+ - 追加: 書き出しは作業中のシーンの名前・保存状態・`$HIP`・undo を変えない(hscript `mwrite -n`)。`structure.json` は最上位ごとに件数を分け、時間でも打ち切る
20
+ - 追加: 「シーンを開く」は、ライブラリのファイルを作業ファイルにしない。既定は「名前なしで開く」(保存していない新規シーン扱い)。「保存先を指定して開く」は、ライブラリのファイルを複製してから開く(既存のファイルは上書きしない)
21
+ - 追加: **現在のシーンにマージ**(`hou.hipFile.merge`)。同名のノードは上書きせず、新しい側が改名される
22
+ - 追加: hip の外部ファイル参照は、登録時の置き換え・収集の結果を `item.json` の `path_map`(ノードの絶対パス + パラメータ名 → 新しい値)に記録し、開いた後にパラメータを設定し直す。収集していない `$HIP` 相対のパスは、開くときに元の絶対パスへ展開できる(既定オン)
23
+ - 追加: hip は中身を検査できないため、信頼しない場所のアイテムは開く前の確認ダイアログ内で 1 行の説明を出し、初回だけ承認を求める(承認の記憶は `scene.hip` と `path_map` を含む内容のハッシュ)。テキストコードの共有ではシーン全体を選べない(理由を表示)
24
+ - 追加: 非商用・限定ライセンスで保存した hip の「お知らせ」(登録時、および開く側の Houdini のライセンスが上位のとき)
25
+ - 追加: **長い処理の進行表示とキャンセル**。ブリッジに `progress` / `cancel` を追加。登録ダイアログの読み込み画面に段階と経過時間、キャンセルを出す。固定の 300 秒タイムアウトをやめた(最終上限 1 時間)。Houdini 側もステータスバーに段階を出す。キャンセルは確認点で止まり、Houdini のシーンは処理前のまま
26
+ - 改善: ノード単体・ノード群の書き出しの高速化。同じ HDA 型の「出荷時の見本」を型ごとに 1 つだけ作る(インスタンスごとに作り直していた)、ファイル参照の列挙で `hou.fileReferences()`(シーン全体を走査)をやめて書き出し対象の下だけを調べる。ロックされた HDA を多用する大きなシーンから約 380 ノードを選択した書き出しが 47.3 秒から 3.7 秒になった。読み込みは hscript の `source` が支配的で変わらない(約 16 秒)
27
+ - 変更: Houdini ブリッジのコマンド互換番号を `BRIDGE_VERSION = 5`、アプリの必要最小を `REQUIRED_BRIDGE_VERSION = 5` に上げた(`open_hip` / `progress` / `cancel` の追加、`export` の scope=scene の戻り値)。古いブリッジでは「Houdini を再起動してください」と案内する
28
+ ## 0.2.0
29
+
30
+ - 追加: **ライブラリに載せない直接共有**。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`
31
+ - 追加: **ファイル転送の進捗ダイアログ**(登録時の収集、`$HIP` へのコピー、共有の送受信)。バイト数ベースのバー、ファイル数・容量、現在のファイル名、速度と残り時間、キャンセル。大きな 1 ファイルの途中でも進み、キャンセルしても書きかけを残さない。開始前の空き容量の確認、失敗時の「再試行 / スキップして続行 / 中止」、終了時の要約
32
+ - 追加: **既知の制限の警告**(`known_limits.py`)。完全には再現できないノードを登録・共有時に照合し、`item.json` の `limitations` に保存。止めずにお知らせとして出す
33
+ - 変更: **警告を「停止 / お知らせ / 情報」の 3 段階に整理**。本当に危険なとき(危険コマンド検査のヒット、環境変数名・extras の検証違反)だけ止め、そのほかは 1 行の要約(「注意 N 件」)にした
34
+ - 追加: **信頼する場所**(ルートごと・共有用フォルダ / SVN は既定でオン、テキストコードは既定でオフ)。信頼する場所のアイテムは同梱 HDA の承認を求めない(危険コマンド検査は常に実行)
35
+ - 変更: **インポートの確認ダイアログを必要なときだけ開く**(設定「インポートの確認」。Shift・右クリックの「オプションを指定してインポート...」で常に開く)。開かずに実行したときは、ステータスバーと Houdini のステータスメッセージに結果を出す
36
+ - 変更: ハードロック・ノードグループの警告は、`warnings` から `limitations` へ移した(ブリッジの `export` の戻り値に `limitations` を追加。コマンド互換番号 `BRIDGE_VERSION = 4` は変更なし)
37
+
38
+ ## 0.1.1
39
+
40
+ ランチャーや共有フォルダ・SVN で使えるようにした版。
41
+
42
+ - 追加: `hnl-houdini export <フォルダ>` — 場所を移しても動く一式(`hnl.json` + `hnl_package/`)を書き出す。出力は決定的(`.pyc` なし、LF、時刻なし)。更新時は `.svn` と `site_settings.json` に触れず、SVN 管理下の不要ファイルは一覧表示のみ。`--json-name` / `--no-json` / `--python` / `--prune` / `--dry-run` / `--init-site-settings`
43
+ - 追加: `hnl-houdini env [--root] [--format bat|ps1|json|plain]` — ランチャーに登録する環境変数を表示
44
+ - 追加: `hnl-houdini install|uninstall|status --packages-dir <フォルダ>`
45
+ - 改善: `hnl-houdini status` が、`HOUDINI_PACKAGE_DIR` / `HOUDINI_USER_PREF_DIR` / `HOUDINI_PATH` により `hnl.json` が読まれない可能性を知らせる
46
+ - 追加: Houdini の Python Shell で `import hnl_bridge; hnl_bridge.diagnose()` による状態確認
47
+ - 追加: アプリの起動コマンドの解決順(`HNL_APP` > `HNL_PYTHON` > `hnl_package` の隣の `python/` `.venv/` > pip 導入環境 > `pyw`/`py` > PATH)
48
+ - 追加: 依存ライブラリが足りないときの案内表示。Houdini のボタンから起動した場合は、起動直後の終了を検出してダイアログに理由を表示
49
+ - 追加: 共有設定 `site_settings.json`(`HNL_SITE_SETTINGS`)。`roots` と `ref_excludes` の初期値(利用者が編集するまで)
50
+ - Houdini ブリッジのコマンド互換番号は変更なし(`BRIDGE_VERSION = 4`)
51
+
52
+ ## 0.1.0
53
+
54
+ 最初の公開版。
55
+
56
+ - Houdini のノードを Hscript (cmd) として 1 アイテム 1 フォルダで保存し、独立したブラウザアプリから呼び出す
57
+ - 登録(選択 / ネットワーク / シーン)、インポート前の危険コマンド検査、HDA・外部ファイルの収集
58
+ - タグ・プロジェクト・部署による分類、お気に入り、検索、Markdown の説明
59
+ - SVN(`file:///` を含む)によるバージョン管理(任意)
60
+ - `hnl-houdini install|uninstall|status` による Houdini package の導入
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: houdini-node-library
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
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
@@ -37,7 +37,7 @@ Houdini のノードを Hscript (`nodes.cmd`) として保存し、独立した
37
37
 
38
38
  - Windows
39
39
  - Houdini 20.5 / 21.0 / 22.0(動作確認は 22.0.429。20.5 と 21.0 は Python 3.11 用の起動フックを同梱しています)
40
- - Python 3.11 以降(アプリ本体用。Houdini 内蔵の Python とは別です)
40
+ - Python 3.11 以降(アプリ本体用。Houdini 内蔵の Python とは別です)。**Houdini 21 以降なら、付属の Python でアプリを動かせるので、各 PC への Python のインストールは不要です**(下の「Houdini 付属の Python で使う」)
41
41
  - TortoiseSVN(任意。SVN でバージョン管理するときだけ。コミット・履歴・差分の画面に使います)
42
42
 
43
43
  ## インストール
@@ -83,6 +83,16 @@ Houdini でノードを選んで「Share Selection」を押すと短い共有コ
83
83
 
84
84
  詳しい使い方は [docs/user-guide.md](docs/user-guide.md)、保存形式は [docs/format.md](docs/format.md)、セキュリティと信頼モデルは [docs/security.md](docs/security.md) を見てください。
85
85
 
86
+ ## Houdini 付属の Python で使う(各 PC に Python 不要・0.4.0)
87
+
88
+ Houdini 21 以降には PySide6 と Pillow が付属の Python に入っています。書き出しに `--runtime houdini` を付けると、その Python でアプリが動き、各 PC への Python と `pip install` が要らなくなります。
89
+
90
+ ```
91
+ hnl-houdini export <出力先フォルダ> --runtime houdini
92
+ ```
93
+
94
+ 1 台で `pip install` して書き出し → ランチャーの管理領域か SVN に置く → 各 PC は Houdini を起動するだけ、です。`hnl_package\hnl.bat` をダブルクリックすれば、Houdini を起動していなくてもブラウザを開けます。書き出しには、Houdini に入っていない純 Python ライブラリ(markdown-it-py、mdit-py-plugins、mdurl。約 0.4 MB)が `vendor/` に入り、ライセンスは `THIRD_PARTY_LICENSES.txt` に一覧されます。`hou` は読み込まないので、アプリを開いても Houdini のライセンスは追加で消費しません。対応は Houdini 22.0(全機能)と 21.0(PySide6 6.5。起動と主要画面を確認)で、PySide6 の無い版では不足の理由を表示して終了します。手順・更新・制限は [docs/getting-started.md](docs/getting-started.md) の「11.1 Houdini 付属の Python で使う」を見てください。
95
+
86
96
  ## ランチャーや共有フォルダ・SVN で使う場合
87
97
 
88
98
  会社のランチャーが Houdini の環境変数やパッケージを管理していて `Documents\houdini<版>\packages\hnl.json` が読まれないときや、共通の SVN で全員に配りたいときは、一式を任意のフォルダへ書き出します。
@@ -100,8 +110,8 @@ hnl-houdini export <出力先フォルダ>
100
110
  ```
101
111
 
102
112
  - 場所を移しても、別の PC へコピーしても、SVN で共有しても動きます。出力は決定的(`.pyc` なし、テキストは LF、時刻やマシン名なし)なので、再実行しても無駄な差分は出ません。
103
- - Python と依存ライブラリ(`requirements.txt`)は各 PC に用意します。起動に使う Python は、環境変数 `HNL_APP`(完全なコマンド)、`HNL_PYTHON`(`python.exe` のパス)、出力先と同じ階層の `python\` や `.venv\`、pip 導入環境、`pyw`/`py`、PATH 上の `pythonw`/`python` の順で決まります。全 PC で Python の場所が同じなら `--python <パス>` で `hnl.json` に `HNL_PYTHON` を書けます。ライブラリが足りないときは、不足分と `pip install -r requirements.txt` の案内が出ます。
104
- - オプション: `--json-name <名前>`、`--no-json`(ランチャーが環境変数を直接設定する場合)、`--dry-run`、`--prune`、`--init-site-settings`。`hnl-houdini env [--root <出力先>] [--format bat|ps1|json|plain]` で、ランチャーに登録する `HOUDINI_PATH`(既定の検索パスを表す末尾の `&` を残す)・`PYTHONPATH`・`HNL_PYTHON` の値を表示します。
113
+ - (既定の `--runtime python` では)Python と依存ライブラリ(`requirements.txt`)は各 PC に用意します。`--runtime houdini` なら不要です(上の節)。起動に使う Python は、環境変数 `HNL_APP`(完全なコマンド)、`HNL_PYTHON`(`python.exe` のパス)、出力先と同じ階層の `python\` や `.venv\`、pip 導入環境、`pyw`/`py`、PATH 上の `pythonw`/`python` の順で決まります。全 PC で Python の場所が同じなら `--python <パス>` で `hnl.json` に `HNL_PYTHON` を書けます。ライブラリが足りないときは、不足分と `pip install -r requirements.txt` の案内が出ます。
114
+ - オプション: `--runtime python|houdini`(前回の値を引き継ぐ)、`--json-name <名前>`、`--no-json`(ランチャーが環境変数を直接設定する場合)、`--dry-run`、`--prune`、`--init-site-settings`。`hnl-houdini env [--root <出力先>] [--format bat|ps1|json|plain]` で、ランチャーに登録する `HOUDINI_PATH`(既定の検索パスを表す末尾の `&` を残す)・`PYTHONPATH`・`HNL_PYTHON` の値を表示します。
105
115
  - 共有の `hnl.json` を置く場所が分かっているときは `hnl-houdini install --packages-dir <フォルダ>` でも作れます。`hnl-houdini status` は、`HOUDINI_PACKAGE_DIR` などの環境変数で既定の場所の `hnl.json` が読まれない可能性があるときに知らせます。
106
116
  - 共通ライブラリを最初から見せたいときは、`hnl_package/site_settings.json`(または環境変数 `HNL_SITE_SETTINGS`)に `roots` と `ref_excludes` の既定値を書きます。利用者がルートを 1 つも持たない間だけ初期値として使われ、利用者が編集した後は上書きされません。`export` はこのファイルを上書きも削除もしません。
107
117
  - 更新: 新しい版を pip で入れる → 同じ出力先へ `hnl-houdini export` → SVN にコミット。SVN 管理下で不要になったファイルは一覧表示だけです(`svn delete` は利用者が行う。`--prune` で作業コピーから消せます)。
@@ -1,129 +1,139 @@
1
- # Houdini Node Library (HNL)
2
-
3
- Houdini のノードを Hscript (`nodes.cmd`) として保存し、独立したブラウザアプリから呼び出すツールです。
4
- 選択ノード、ネットワーク全体、シーン全体を登録できます。登録した内容は、現在のネットワークへの追加、新規シーンへのインポート、シーンを開く、現在のシーンへのマージ、のいずれかで復元します。
5
- ノード単体・ノード群は Hscript(cmd)で、**シーン全体は hip のまま**保存します(大きなシーンでも数秒で登録・開けるため。0.3.0 から)。
6
-
7
- ## 必要環境
8
-
9
- - Windows
10
- - Houdini 20.5 / 21.0 / 22.0(動作確認は 22.0.429。20.5 と 21.0 は Python 3.11 用の起動フックを同梱しています)
11
- - Python 3.11 以降(アプリ本体用。Houdini 内蔵の Python とは別です)
12
- - TortoiseSVN(任意。SVN でバージョン管理するときだけ。コミット・履歴・差分の画面に使います)
13
-
14
- ## インストール
15
-
16
- 1. pip で導入します(仮想環境の利用をおすすめします)。PySide6 などの依存も一緒に入ります。
17
-
18
- ```
19
- python -m venv hnl-env
20
- hnl-env\Scripts\pip install houdini-node-library
21
- ```
22
-
23
- 2. Houdini のユーザー設定に package を導入します。
24
-
25
- ```
26
- hnl-env\Scripts\hnl-houdini install
27
- ```
28
-
29
- `Documents\houdini22.0\packages\hnl.json` が作られます。別の版は `--houdini-version 21.0`、設定フォルダが標準の場所に無いときは `--prefs-dir <フォルダ>` で指定します。`hnl-houdini status` で導入状態を、`hnl-houdini uninstall` で撤去(`hnl.json` の削除)ができます。
30
-
31
- 3. Houdini を再起動します。通常どおり起動した Houdini(GUI)では、起動時にブリッジが自動で立ち上がります。ブリッジは `127.0.0.1` だけで待ち受けます。
32
-
33
- 4. アプリを起動します。
34
-
35
- ```
36
- hnl-env\Scripts\hnl
37
- ```
38
-
39
- コンソールは出ません。`python -m hnl` でも起動できます。起動済みのときは、新しいウィンドウを作らず既存のウィンドウが前面に出ます。Houdini のシェルフ「HNL」の `Open Library` からも起動できます。
40
-
41
- `hnl.json` には、いま使っている Python の場所が書かれます。Python の環境を作り直したり移動したりしたときは、`hnl-houdini install` をやり直してください。
42
-
43
- ## ライブラリに載せない直接共有(0.2.0)
44
-
45
- Houdini でノードを選んで「Share Selection」を押すと短い共有コード(テキスト `HNL1:...`、共有フォルダ `K7Q2-M9XD`、SVN `r1234`)が出ます。相手は「Receive」でコードを貼って内容を確認し、取り込みます。使い方は [docs/user-guide.md](docs/user-guide.md) の「共有コード」を見てください。
46
-
47
- ## 5 分で試す
48
-
49
- 1. `hnl` で起動します。「ルートフォルダを追加してください」と出るので「設定を開く」を押します。
50
- 2. 「追加...」で空のフォルダを選び、OK を押します。これがライブラリのルートです。
51
- 3. Houdini(package 導入済み)でノードを作って選択し、シェルフ「HNL」の `Register to Library` を押します。ノードを右クリックして `HNL: Register to Library` でも開けます。
52
- 4. 登録画面が開くので、名前(必要ならプロジェクト・部署・タグ)を確認して「登録」を押します。
53
- 5. ブラウザでアイテムを選び、「現在のネットワークへ追加」を押します。確認ダイアログで「インポート」を押すと、Houdini にノードが復元されます。
54
-
55
- 詳しい使い方は [docs/user-guide.md](docs/user-guide.md)、保存形式は [docs/format.md](docs/format.md)、セキュリティと信頼モデルは [docs/security.md](docs/security.md) を見てください。
56
-
57
- ## ランチャーや共有フォルダ・SVN で使う場合
58
-
59
- 会社のランチャーが Houdini の環境変数やパッケージを管理していて `Documents\houdini<版>\packages\hnl.json` が読まれないときや、共通の SVN で全員に配りたいときは、一式を任意のフォルダへ書き出します。
60
-
61
- ```
62
- hnl-houdini export <出力先フォルダ>
63
- ```
64
-
65
- ```
66
- <出力先>/
67
- hnl.json Houdini パッケージ定義(相対指定。絶対パスを含まない)
68
- hnl_package/
69
- hnl/ アプリ本体 + Houdini 側ファイル
70
- requirements.txt hnl.bat VERSION README.txt
71
- ```
72
-
73
- - 場所を移しても、別の PC へコピーしても、SVN で共有しても動きます。出力は決定的(`.pyc` なし、テキストは LF、時刻やマシン名なし)なので、再実行しても無駄な差分は出ません。
74
- - Python と依存ライブラリ(`requirements.txt`)は各 PC に用意します。起動に使う Python は、環境変数 `HNL_APP`(完全なコマンド)、`HNL_PYTHON`(`python.exe` のパス)、出力先と同じ階層の `python\` や `.venv\`、pip 導入環境、`pyw`/`py`、PATH 上の `pythonw`/`python` の順で決まります。全 PC で Python の場所が同じなら `--python <パス>` で `hnl.json` に `HNL_PYTHON` を書けます。ライブラリが足りないときは、不足分と `pip install -r requirements.txt` の案内が出ます。
75
- - オプション: `--json-name <名前>`、`--no-json`(ランチャーが環境変数を直接設定する場合)、`--dry-run`、`--prune`、`--init-site-settings`。`hnl-houdini env [--root <出力先>] [--format bat|ps1|json|plain]` で、ランチャーに登録する `HOUDINI_PATH`(既定の検索パスを表す末尾の `&` を残す)・`PYTHONPATH`・`HNL_PYTHON` の値を表示します。
76
- - 共有の `hnl.json` を置く場所が分かっているときは `hnl-houdini install --packages-dir <フォルダ>` でも作れます。`hnl-houdini status` は、`HOUDINI_PACKAGE_DIR` などの環境変数で既定の場所の `hnl.json` が読まれない可能性があるときに知らせます。
77
- - 共通ライブラリを最初から見せたいときは、`hnl_package/site_settings.json`(または環境変数 `HNL_SITE_SETTINGS`)に `roots` と `ref_excludes` の既定値を書きます。利用者がルートを 1 つも持たない間だけ初期値として使われ、利用者が編集した後は上書きされません。`export` はこのファイルを上書きも削除もしません。
78
- - 更新: 新しい版を pip で入れる → 同じ出力先へ `hnl-houdini export` → SVN にコミット。SVN 管理下で不要になったファイルは一覧表示だけです(`svn delete` は利用者が行う。`--prune` で作業コピーから消せます)。
79
- - Houdini の Python Shell で `import hnl_bridge; hnl_bridge.diagnose()` と打つと、ブリッジの場所・サーバーの状態・アプリの起動コマンド・シェルフが `HOUDINI_PATH` 上にあるかを確認できます。
80
-
81
- 詳しくは [docs/getting-started.md](docs/getting-started.md) を見てください。
82
-
83
- ## 開発者向け
84
-
85
- ソースから動かすときの手順です。
86
-
87
- ```
88
- python -m venv .venv
89
- .venv\Scripts\pip install -e .[dev]
90
- .venv\Scripts\hnl-houdini install # ソースの Houdini 側ファイルを読む hnl.json を作る
91
- HNL.bat # または .venv\Scripts\python -m hnl
92
- ```
93
-
94
- フォルダ構成:
95
-
96
- ```
97
- src/hnl/ アプリ本体 (core / vcs / houdini / ui)
98
- src/hnl/_houdini/ Houdini 側ファイル一式(python/hnl_bridge, python3.11libs, python3.13libs, toolbar, OPmenu.xml)。wheel にも同梱される
99
- tests/ pytest(tests/houdini は Houdini を使う検証スクリプト)
100
- tools/ デモライブラリ生成などの補助スクリプト
101
- docs/ 利用者向け文書、設計メモ、検証結果
102
- HNL.bat 開発用の起動バッチ(リポジトリの .venv を使う)
103
- ```
104
-
105
- テストの実行:
106
-
107
- ```
108
- .venv\Scripts\python -m pytest -q --ignore=tests/houdini
109
- "%HFS%\bin\hython.exe" tests\houdini\run_tests.py
110
- ```
111
-
112
- `tests/houdini/` のスクリプトは Houdini が必要です。`run_tests.py` は `hython.exe` で、`run_e2e.py` などは `.venv\Scripts\python` で実行します(実行すると Houdini が起動するものがあります)。
113
-
114
- 配布物(wheel と sdist)は `python -m build` で作ります(`pip install build` が必要)。
115
-
116
- ## 既知の制限
117
-
118
- - 保存形式は cmd のみです。`.hip` ファイルは扱いません。
119
- - 完全には再現できないノード・構造があります(ハードロックのジオメトリ、ノードグループ、VOP 内蔵ノードなど)。登録・共有時に自動で照合し、お知らせとして出します(止めません)。一覧と対処は [docs/getting-started.md](docs/getting-started.md) の「保存されないもの・制限」を見てください。
120
- - 選択外のノードからの入力接続は、復元後に失われます。選択外へのチャンネル参照は参照切れになります。
121
- - 絶対パスで書いたエクスプレッションは、復元後も元のパスを指します。
122
- - ビューポート撮影の画像に Houdini のロゴ透かしが入ることがあります(Apprentice など、ライセンスの種類によります)。
123
- - バージョン管理は SVN のみです。
124
- - Windows 専用です。
125
- - cmd は実行されるコードです。危険な記述が見つかったときだけインポートを止めます(検査は補助です)。信頼する場所・検査・限界の詳細は [docs/security.md](docs/security.md) を見てください。
126
-
127
- ## ライセンス
128
-
129
- MIT License です。全文は `LICENSE` を参照してください。
1
+ # Houdini Node Library (HNL)
2
+
3
+ Houdini のノードを Hscript (`nodes.cmd`) として保存し、独立したブラウザアプリから呼び出すツールです。
4
+ 選択ノード、ネットワーク全体、シーン全体を登録できます。登録した内容は、現在のネットワークへの追加、新規シーンへのインポート、シーンを開く、現在のシーンへのマージ、のいずれかで復元します。
5
+ ノード単体・ノード群は Hscript(cmd)で、**シーン全体は hip のまま**保存します(大きなシーンでも数秒で登録・開けるため。0.3.0 から)。
6
+
7
+ ## 必要環境
8
+
9
+ - Windows
10
+ - Houdini 20.5 / 21.0 / 22.0(動作確認は 22.0.429。20.5 と 21.0 は Python 3.11 用の起動フックを同梱しています)
11
+ - Python 3.11 以降(アプリ本体用。Houdini 内蔵の Python とは別です)。**Houdini 21 以降なら、付属の Python でアプリを動かせるので、各 PC への Python のインストールは不要です**(下の「Houdini 付属の Python で使う」)
12
+ - TortoiseSVN(任意。SVN でバージョン管理するときだけ。コミット・履歴・差分の画面に使います)
13
+
14
+ ## インストール
15
+
16
+ 1. pip で導入します(仮想環境の利用をおすすめします)。PySide6 などの依存も一緒に入ります。
17
+
18
+ ```
19
+ python -m venv hnl-env
20
+ hnl-env\Scripts\pip install houdini-node-library
21
+ ```
22
+
23
+ 2. Houdini のユーザー設定に package を導入します。
24
+
25
+ ```
26
+ hnl-env\Scripts\hnl-houdini install
27
+ ```
28
+
29
+ `Documents\houdini22.0\packages\hnl.json` が作られます。別の版は `--houdini-version 21.0`、設定フォルダが標準の場所に無いときは `--prefs-dir <フォルダ>` で指定します。`hnl-houdini status` で導入状態を、`hnl-houdini uninstall` で撤去(`hnl.json` の削除)ができます。
30
+
31
+ 3. Houdini を再起動します。通常どおり起動した Houdini(GUI)では、起動時にブリッジが自動で立ち上がります。ブリッジは `127.0.0.1` だけで待ち受けます。
32
+
33
+ 4. アプリを起動します。
34
+
35
+ ```
36
+ hnl-env\Scripts\hnl
37
+ ```
38
+
39
+ コンソールは出ません。`python -m hnl` でも起動できます。起動済みのときは、新しいウィンドウを作らず既存のウィンドウが前面に出ます。Houdini のシェルフ「HNL」の `Open Library` からも起動できます。
40
+
41
+ `hnl.json` には、いま使っている Python の場所が書かれます。Python の環境を作り直したり移動したりしたときは、`hnl-houdini install` をやり直してください。
42
+
43
+ ## ライブラリに載せない直接共有(0.2.0)
44
+
45
+ Houdini でノードを選んで「Share Selection」を押すと短い共有コード(テキスト `HNL1:...`、共有フォルダ `K7Q2-M9XD`、SVN `r1234`)が出ます。相手は「Receive」でコードを貼って内容を確認し、取り込みます。使い方は [docs/user-guide.md](docs/user-guide.md) の「共有コード」を見てください。
46
+
47
+ ## 5 分で試す
48
+
49
+ 1. `hnl` で起動します。「ルートフォルダを追加してください」と出るので「設定を開く」を押します。
50
+ 2. 「追加...」で空のフォルダを選び、OK を押します。これがライブラリのルートです。
51
+ 3. Houdini(package 導入済み)でノードを作って選択し、シェルフ「HNL」の `Register to Library` を押します。ノードを右クリックして `HNL: Register to Library` でも開けます。
52
+ 4. 登録画面が開くので、名前(必要ならプロジェクト・部署・タグ)を確認して「登録」を押します。
53
+ 5. ブラウザでアイテムを選び、「現在のネットワークへ追加」を押します。確認ダイアログで「インポート」を押すと、Houdini にノードが復元されます。
54
+
55
+ 詳しい使い方は [docs/user-guide.md](docs/user-guide.md)、保存形式は [docs/format.md](docs/format.md)、セキュリティと信頼モデルは [docs/security.md](docs/security.md) を見てください。
56
+
57
+ ## Houdini 付属の Python で使う(各 PC に Python 不要・0.4.0)
58
+
59
+ Houdini 21 以降には PySide6 と Pillow が付属の Python に入っています。書き出しに `--runtime houdini` を付けると、その Python でアプリが動き、各 PC への Python と `pip install` が要らなくなります。
60
+
61
+ ```
62
+ hnl-houdini export <出力先フォルダ> --runtime houdini
63
+ ```
64
+
65
+ 1 台で `pip install` して書き出し → ランチャーの管理領域か SVN に置く → 各 PC は Houdini を起動するだけ、です。`hnl_package\hnl.bat` をダブルクリックすれば、Houdini を起動していなくてもブラウザを開けます。書き出しには、Houdini に入っていない純 Python ライブラリ(markdown-it-py、mdit-py-plugins、mdurl。約 0.4 MB)が `vendor/` に入り、ライセンスは `THIRD_PARTY_LICENSES.txt` に一覧されます。`hou` は読み込まないので、アプリを開いても Houdini のライセンスは追加で消費しません。対応は Houdini 22.0(全機能)と 21.0(PySide6 6.5。起動と主要画面を確認)で、PySide6 の無い版では不足の理由を表示して終了します。手順・更新・制限は [docs/getting-started.md](docs/getting-started.md) の「11.1 Houdini 付属の Python で使う」を見てください。
66
+
67
+ ## ランチャーや共有フォルダ・SVN で使う場合
68
+
69
+ 会社のランチャーが Houdini の環境変数やパッケージを管理していて `Documents\houdini<版>\packages\hnl.json` が読まれないときや、共通の SVN で全員に配りたいときは、一式を任意のフォルダへ書き出します。
70
+
71
+ ```
72
+ hnl-houdini export <出力先フォルダ>
73
+ ```
74
+
75
+ ```
76
+ <出力先>/
77
+ hnl.json Houdini パッケージ定義(相対指定。絶対パスを含まない)
78
+ hnl_package/
79
+ hnl/ アプリ本体 + Houdini 側ファイル
80
+ requirements.txt hnl.bat VERSION README.txt
81
+ ```
82
+
83
+ - 場所を移しても、別の PC へコピーしても、SVN で共有しても動きます。出力は決定的(`.pyc` なし、テキストは LF、時刻やマシン名なし)なので、再実行しても無駄な差分は出ません。
84
+ - (既定の `--runtime python` では)Python と依存ライブラリ(`requirements.txt`)は各 PC に用意します。`--runtime houdini` なら不要です(上の節)。起動に使う Python は、環境変数 `HNL_APP`(完全なコマンド)、`HNL_PYTHON`(`python.exe` のパス)、出力先と同じ階層の `python\` や `.venv\`、pip 導入環境、`pyw`/`py`、PATH 上の `pythonw`/`python` の順で決まります。全 PC で Python の場所が同じなら `--python <パス>` で `hnl.json` に `HNL_PYTHON` を書けます。ライブラリが足りないときは、不足分と `pip install -r requirements.txt` の案内が出ます。
85
+ - オプション: `--runtime python|houdini`(前回の値を引き継ぐ)、`--json-name <名前>`、`--no-json`(ランチャーが環境変数を直接設定する場合)、`--dry-run`、`--prune`、`--init-site-settings`。`hnl-houdini env [--root <出力先>] [--format bat|ps1|json|plain]` で、ランチャーに登録する `HOUDINI_PATH`(既定の検索パスを表す末尾の `&` を残す)・`PYTHONPATH`・`HNL_PYTHON` の値を表示します。
86
+ - 共有の `hnl.json` を置く場所が分かっているときは `hnl-houdini install --packages-dir <フォルダ>` でも作れます。`hnl-houdini status` は、`HOUDINI_PACKAGE_DIR` などの環境変数で既定の場所の `hnl.json` が読まれない可能性があるときに知らせます。
87
+ - 共通ライブラリを最初から見せたいときは、`hnl_package/site_settings.json`(または環境変数 `HNL_SITE_SETTINGS`)に `roots` と `ref_excludes` の既定値を書きます。利用者がルートを 1 つも持たない間だけ初期値として使われ、利用者が編集した後は上書きされません。`export` はこのファイルを上書きも削除もしません。
88
+ - 更新: 新しい版を pip で入れる → 同じ出力先へ `hnl-houdini export` → SVN にコミット。SVN 管理下で不要になったファイルは一覧表示だけです(`svn delete` は利用者が行う。`--prune` で作業コピーから消せます)。
89
+ - Houdini の Python Shell で `import hnl_bridge; hnl_bridge.diagnose()` と打つと、ブリッジの場所・サーバーの状態・アプリの起動コマンド・シェルフが `HOUDINI_PATH` 上にあるかを確認できます。
90
+
91
+ 詳しくは [docs/getting-started.md](docs/getting-started.md) を見てください。
92
+
93
+ ## 開発者向け
94
+
95
+ ソースから動かすときの手順です。
96
+
97
+ ```
98
+ python -m venv .venv
99
+ .venv\Scripts\pip install -e .[dev]
100
+ .venv\Scripts\hnl-houdini install # ソースの Houdini 側ファイルを読む hnl.json を作る
101
+ HNL.bat # または .venv\Scripts\python -m hnl
102
+ ```
103
+
104
+ フォルダ構成:
105
+
106
+ ```
107
+ src/hnl/ アプリ本体 (core / vcs / houdini / ui)
108
+ src/hnl/_houdini/ Houdini 側ファイル一式(python/hnl_bridge, python3.11libs, python3.13libs, toolbar, OPmenu.xml)。wheel にも同梱される
109
+ tests/ pytest(tests/houdini は Houdini を使う検証スクリプト)
110
+ tools/ デモライブラリ生成などの補助スクリプト
111
+ docs/ 利用者向け文書、設計メモ、検証結果
112
+ HNL.bat 開発用の起動バッチ(リポジトリの .venv を使う)
113
+ ```
114
+
115
+ テストの実行:
116
+
117
+ ```
118
+ .venv\Scripts\python -m pytest -q --ignore=tests/houdini
119
+ "%HFS%\bin\hython.exe" tests\houdini\run_tests.py
120
+ ```
121
+
122
+ `tests/houdini/` のスクリプトは Houdini が必要です。`run_tests.py` は `hython.exe` で、`run_e2e.py` などは `.venv\Scripts\python` で実行します(実行すると Houdini が起動するものがあります)。
123
+
124
+ 配布物(wheel と sdist)は `python -m build` で作ります(`pip install build` が必要)。
125
+
126
+ ## 既知の制限
127
+
128
+ - 保存形式は cmd のみです。`.hip` ファイルは扱いません。
129
+ - 完全には再現できないノード・構造があります(ハードロックのジオメトリ、ノードグループ、VOP 内蔵ノードなど)。登録・共有時に自動で照合し、お知らせとして出します(止めません)。一覧と対処は [docs/getting-started.md](docs/getting-started.md) の「保存されないもの・制限」を見てください。
130
+ - 選択外のノードからの入力接続は、復元後に失われます。選択外へのチャンネル参照は参照切れになります。
131
+ - 絶対パスで書いたエクスプレッションは、復元後も元のパスを指します。
132
+ - ビューポート撮影の画像に Houdini のロゴ透かしが入ることがあります(Apprentice など、ライセンスの種類によります)。
133
+ - バージョン管理は SVN のみです。
134
+ - Windows 専用です。
135
+ - cmd は実行されるコードです。危険な記述が見つかったときだけインポートを止めます(検査は補助です)。信頼する場所・検査・限界の詳細は [docs/security.md](docs/security.md) を見てください。
136
+
137
+ ## ライセンス
138
+
139
+ MIT License です。全文は `LICENSE` を参照してください。