From ae7868d410757f3de4686e68cd8a151edb89fbf0 Mon Sep 17 00:00:00 2001 From: Nan <7956213+icrdr@users.noreply.github.com> Date: Tue, 26 May 2026 16:01:29 +0800 Subject: [PATCH] 5.0 (#60) * feat: Add Bioxel asset catalog and layer management functionality - Introduced a new asset catalog definition file for Blender to manage Bioxel assets. - Implemented layer caching and snapshot functionality in `layer.py`, allowing for VDB file generation and low-resolution snapshots. - Created node management functions in `node.py` for handling Bioxel nodes within Blender's Geometry Node Editor. - Added an operator to extract mesh data from selected nodes in `structure.py`. - Developed UI panels in `panels.py` for layer management, including import options and layer library display. * Add unit tests for bioxel module and documentation - Created README.md for test instructions and categories. - Implemented comprehensive unit tests for the Data, Layer, and utility functions in the bioxel module. - Added tests for reading NRRD and DICOM formats, data properties, and edge cases. - Included tests for real data files to ensure functionality with actual datasets. * feat: Update .gitattributes and .gitignore for improved asset management and ignore patterns chore: Add app.json and omoolab.css for Obsidian integration refactor: Clean up AGENTS.md and remove outdated test files * feat: Update .gitignore to include scipy_ndimage directory * feat: Update release workflow and manifest for improved dependency management and layer handling * feat: Update .gitignore and add binary files for scipy_ndimage across multiple platforms * feat: Add OPSX commands for archiving, exploring, and proposing changes * feat: Refactor asset library management and update manifest for improved organization * feat: Downgrade h5py version to 3.14.0 in requirements and manifest * feat: Update Help operator and panel labels to use English terminology * Translate documentation to Chinese, add support format details, and enhance styling with new fonts. Update mkdocs configuration for multilingual support and improve package dependencies. * feat: Remove default version setting from extra configuration in mkdocs.yml * fix: Update documentation links to point to the correct URLs for Chinese and English versions * Add documentation for basic usage, supported formats, and performance tips - Created English and Chinese documentation for basic usage of the add-on, including data download, import, extraction, and rendering steps. - Added support format documentation listing compatible file types for the add-on. - Included links to open databases for volumetric data. - Provided performance improvement tips for voxel reconstruction and rendering, including settings for low-resolution previews and balanced rendering configurations. --- .claude/commands/opsx/apply.md | 152 ++++ .claude/commands/opsx/archive.md | 157 ++++ .claude/commands/opsx/explore.md | 173 ++++ .claude/commands/opsx/propose.md | 106 +++ .claude/skills/openspec-apply-change/SKILL.md | 156 ++++ .../skills/openspec-archive-change/SKILL.md | 114 +++ .claude/skills/openspec-explore/SKILL.md | 288 ++++++ .claude/skills/openspec-propose/SKILL.md | 110 +++ .gitattributes | 132 ++- .github/workflows/release.yml | 18 +- .gitignore | 302 ++++++- .obsidian/app.json | 22 + .obsidian/snippets/omoolab.css | 30 + .python-version | 1 + AGENTS.md | 19 + CLAUDE.md | 1 + README.md | 6 +- build.py | 31 +- docs/SARS-Cov-2.en.md | 99 +++ docs/SARS-Cov-2.md | 66 +- docs/advanced.en.md | 46 + docs/advanced.md | 49 ++ docs/advanced_usage.md | 118 --- docs/assets/add-o-layer.png | 3 + docs/assets/adjust-nodes.png | 3 + docs/assets/advanced_usage/image-1.png | Bin 42423 -> 0 bytes docs/assets/advanced_usage/image-10.png | Bin 189158 -> 0 bytes docs/assets/advanced_usage/image-11.png | Bin 334146 -> 0 bytes docs/assets/advanced_usage/image-12.png | Bin 294475 -> 0 bytes docs/assets/advanced_usage/image-13.png | Bin 421337 -> 0 bytes docs/assets/advanced_usage/image-2.png | Bin 345284 -> 0 bytes docs/assets/advanced_usage/image-3.png | Bin 335711 -> 0 bytes docs/assets/advanced_usage/image-4.png | Bin 516982 -> 0 bytes docs/assets/advanced_usage/image-5.png | Bin 347924 -> 0 bytes docs/assets/advanced_usage/image-6.png | Bin 377446 -> 0 bytes docs/assets/advanced_usage/image-7.png | Bin 350921 -> 0 bytes docs/assets/advanced_usage/image-8.png | Bin 345966 -> 0 bytes docs/assets/advanced_usage/image-9.png | Bin 359280 -> 0 bytes docs/assets/advanced_usage/image.png | Bin 78231 -> 0 bytes docs/assets/connect-nodes.png | 3 + docs/assets/cut-small-parts.png | 3 + docs/assets/cut-structure.png | 3 + docs/assets/cut-to-region.png | 3 + docs/assets/import-data.png | 3 + docs/assets/improve_performance/image-1.png | Bin 1330090 -> 0 bytes docs/assets/improve_performance/image-2.png | Bin 925066 -> 0 bytes docs/assets/improve_performance/image.png | Bin 128654 -> 0 bytes docs/assets/installation.png | 3 + docs/assets/installation/image.png | Bin 40778 -> 0 bytes docs/assets/render-performance.png | 3 + docs/assets/scalar-to-color-ramp.png | 3 + docs/assets/scalar-to-color.png | 3 + docs/assets/set-color-by-pos.png | 3 + docs/assets/step_by_step/image-1.png | Bin 181646 -> 0 bytes docs/assets/step_by_step/image-2.png | Bin 285092 -> 0 bytes docs/assets/step_by_step/image-3.png | Bin 290765 -> 0 bytes docs/assets/step_by_step/image-4.png | Bin 318486 -> 0 bytes docs/assets/step_by_step/image-5.png | Bin 378071 -> 0 bytes docs/assets/step_by_step/image-6.png | Bin 358779 -> 0 bytes docs/assets/step_by_step/image-7.png | Bin 327507 -> 0 bytes docs/assets/step_by_step/image-8.png | Bin 321894 -> 0 bytes docs/assets/step_by_step/image-9.png | Bin 85336 -> 0 bytes docs/assets/step_by_step/image.png | Bin 88130 -> 0 bytes docs/basics.en.md | 50 ++ docs/basics.md | 51 ++ docs/{support_format.md => dataset.en.md} | 0 docs/dataset.md | 39 + docs/faq.en.md | 15 + docs/faq.md | 16 +- .../__init__.py => docs/gallery.md | 0 docs/improve_performance.md | 39 - docs/index.en.md | 66 ++ docs/index.md | 72 +- docs/installation.en.md | 22 + docs/installation.md | 25 +- docs/performance.en.md | 25 + docs/performance.md | 25 + docs/step_by_step.md | 97 -- docs/stylesheets/extra.css | 24 +- mkdocs.yml | 38 +- openspec/config.yaml | 20 + pack.py | 92 ++ pyproject.toml | 5 + .../_nd_image.cpython-313-x86_64-linux-gnu.so | 3 + .../_nd_image.cpython-313-darwin.so | 3 + .../macos-x64/_nd_image.cpython-313-darwin.so | 3 + .../windows-x64/_nd_image.cp313-win_amd64.pyd | Bin 0 -> 177664 bytes src/bioxelnodes/__init__.py | 86 +- .../assets/Nodes/BioxelNodes_latest.blend | 3 - .../assets/Nodes/BioxelNodes_v0.2.9.blend | 3 - .../assets/Nodes/BioxelNodes_v0.3.3.blend | 3 - .../assets/O_Bioxel/O_Bioxel_Nodes.blend | 3 + .../assets/O_Bioxel/blender_assets.cats.txt | 12 + src/bioxelnodes/auto_load.py | 9 +- src/bioxelnodes/bioxel/__init__.py | 34 + src/bioxelnodes/bioxel/data.py | 831 ++++++++++++++++++ src/bioxelnodes/bioxel/layer.py | 43 +- src/bioxelnodes/bioxel/scipy/_filters.py | 28 +- .../bioxel/scipy/_interpolation.py | 3 +- src/bioxelnodes/bioxel/scipy/_ni_support.py | 3 +- src/bioxelnodes/bioxel/scipy/_utils.py | 2 +- src/bioxelnodes/bioxel/skimage/_warps.py | 1 + src/bioxelnodes/bioxel/skimage/dtype.py | 15 +- src/bioxelnodes/bioxelutils/common.py | 270 ------ src/bioxelnodes/bioxelutils/container.py | 186 ---- src/bioxelnodes/bioxelutils/layer.py | 215 ----- src/bioxelnodes/bioxelutils/node.py | 71 -- src/bioxelnodes/blender_manifest.toml | 35 +- src/bioxelnodes/constants.py | 256 +----- src/bioxelnodes/exceptions.py | 28 +- src/bioxelnodes/layer.py | 278 ++++++ src/bioxelnodes/menus.py | 398 +-------- src/bioxelnodes/node.py | 149 ++++ src/bioxelnodes/node_menu.py | 87 -- src/bioxelnodes/operators/container.py | 649 -------------- src/bioxelnodes/operators/io.py | 738 ++++++++-------- src/bioxelnodes/operators/layer.py | 827 ++++++----------- src/bioxelnodes/operators/misc.py | 398 ++++----- src/bioxelnodes/operators/node.py | 8 +- src/bioxelnodes/operators/structure.py | 107 +++ src/bioxelnodes/panels.py | 180 ++++ src/bioxelnodes/preferences.py | 14 +- src/bioxelnodes/props.py | 154 +++- src/bioxelnodes/utils.py | 342 ++++++- tests/__init__.py | 0 uv.lock | 787 +++++++++++------ 126 files changed, 6114 insertions(+), 4104 deletions(-) create mode 100644 .claude/commands/opsx/apply.md create mode 100644 .claude/commands/opsx/archive.md create mode 100644 .claude/commands/opsx/explore.md create mode 100644 .claude/commands/opsx/propose.md create mode 100644 .claude/skills/openspec-apply-change/SKILL.md create mode 100644 .claude/skills/openspec-archive-change/SKILL.md create mode 100644 .claude/skills/openspec-explore/SKILL.md create mode 100644 .claude/skills/openspec-propose/SKILL.md create mode 100644 .obsidian/app.json create mode 100644 .obsidian/snippets/omoolab.css create mode 100644 .python-version create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 docs/SARS-Cov-2.en.md create mode 100644 docs/advanced.en.md create mode 100644 docs/advanced.md delete mode 100644 docs/advanced_usage.md create mode 100644 docs/assets/add-o-layer.png create mode 100644 docs/assets/adjust-nodes.png delete mode 100644 docs/assets/advanced_usage/image-1.png delete mode 100644 docs/assets/advanced_usage/image-10.png delete mode 100644 docs/assets/advanced_usage/image-11.png delete mode 100644 docs/assets/advanced_usage/image-12.png delete mode 100644 docs/assets/advanced_usage/image-13.png delete mode 100644 docs/assets/advanced_usage/image-2.png delete mode 100644 docs/assets/advanced_usage/image-3.png delete mode 100644 docs/assets/advanced_usage/image-4.png delete mode 100644 docs/assets/advanced_usage/image-5.png delete mode 100644 docs/assets/advanced_usage/image-6.png delete mode 100644 docs/assets/advanced_usage/image-7.png delete mode 100644 docs/assets/advanced_usage/image-8.png delete mode 100644 docs/assets/advanced_usage/image-9.png delete mode 100644 docs/assets/advanced_usage/image.png create mode 100644 docs/assets/connect-nodes.png create mode 100644 docs/assets/cut-small-parts.png create mode 100644 docs/assets/cut-structure.png create mode 100644 docs/assets/cut-to-region.png create mode 100644 docs/assets/import-data.png delete mode 100644 docs/assets/improve_performance/image-1.png delete mode 100644 docs/assets/improve_performance/image-2.png delete mode 100644 docs/assets/improve_performance/image.png create mode 100644 docs/assets/installation.png delete mode 100644 docs/assets/installation/image.png create mode 100644 docs/assets/render-performance.png create mode 100644 docs/assets/scalar-to-color-ramp.png create mode 100644 docs/assets/scalar-to-color.png create mode 100644 docs/assets/set-color-by-pos.png delete mode 100644 docs/assets/step_by_step/image-1.png delete mode 100644 docs/assets/step_by_step/image-2.png delete mode 100644 docs/assets/step_by_step/image-3.png delete mode 100644 docs/assets/step_by_step/image-4.png delete mode 100644 docs/assets/step_by_step/image-5.png delete mode 100644 docs/assets/step_by_step/image-6.png delete mode 100644 docs/assets/step_by_step/image-7.png delete mode 100644 docs/assets/step_by_step/image-8.png delete mode 100644 docs/assets/step_by_step/image-9.png delete mode 100644 docs/assets/step_by_step/image.png create mode 100644 docs/basics.en.md create mode 100644 docs/basics.md rename docs/{support_format.md => dataset.en.md} (100%) create mode 100644 docs/dataset.md create mode 100644 docs/faq.en.md rename src/bioxelnodes/bioxelutils/__init__.py => docs/gallery.md (100%) delete mode 100644 docs/improve_performance.md create mode 100644 docs/index.en.md create mode 100644 docs/installation.en.md create mode 100644 docs/performance.en.md create mode 100644 docs/performance.md delete mode 100644 docs/step_by_step.md create mode 100644 openspec/config.yaml create mode 100644 pack.py create mode 100644 scipy_ndimage/linux-x64/_nd_image.cpython-313-x86_64-linux-gnu.so create mode 100644 scipy_ndimage/macos-arm64/_nd_image.cpython-313-darwin.so create mode 100644 scipy_ndimage/macos-x64/_nd_image.cpython-313-darwin.so create mode 100644 scipy_ndimage/windows-x64/_nd_image.cp313-win_amd64.pyd delete mode 100644 src/bioxelnodes/assets/Nodes/BioxelNodes_latest.blend delete mode 100644 src/bioxelnodes/assets/Nodes/BioxelNodes_v0.2.9.blend delete mode 100644 src/bioxelnodes/assets/Nodes/BioxelNodes_v0.3.3.blend create mode 100644 src/bioxelnodes/assets/O_Bioxel/O_Bioxel_Nodes.blend create mode 100644 src/bioxelnodes/assets/O_Bioxel/blender_assets.cats.txt create mode 100644 src/bioxelnodes/bioxel/data.py delete mode 100644 src/bioxelnodes/bioxelutils/common.py delete mode 100644 src/bioxelnodes/bioxelutils/container.py delete mode 100644 src/bioxelnodes/bioxelutils/layer.py delete mode 100644 src/bioxelnodes/bioxelutils/node.py create mode 100644 src/bioxelnodes/layer.py create mode 100644 src/bioxelnodes/node.py delete mode 100644 src/bioxelnodes/node_menu.py delete mode 100644 src/bioxelnodes/operators/container.py create mode 100644 src/bioxelnodes/operators/structure.py create mode 100644 src/bioxelnodes/panels.py delete mode 100644 tests/__init__.py diff --git a/.claude/commands/opsx/apply.md b/.claude/commands/opsx/apply.md new file mode 100644 index 0000000..ae14f0f --- /dev/null +++ b/.claude/commands/opsx/apply.md @@ -0,0 +1,152 @@ +--- +name: "OPSX: Apply" +description: Implement tasks from an OpenSpec change (Experimental) +category: Workflow +tags: [workflow, artifacts, experimental] +--- + +Implement tasks from an OpenSpec change. + +**Input**: Optionally specify a change name (e.g., `/opsx:apply add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes. + +**Steps** + +1. **Select the change** + + If a name is provided, use it. Otherwise: + - Infer from conversation context if the user mentioned a change + - Auto-select if only one active change exists + - If ambiguous, run `openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select + + Always announce: "Using change: " and how to override (e.g., `/opsx:apply `). + +2. **Check status to understand the schema** + ```bash + openspec status --change "" --json + ``` + Parse the JSON to understand: + - `schemaName`: The workflow being used (e.g., "spec-driven") + - Which artifact contains the tasks (typically "tasks" for spec-driven, check status for others) + +3. **Get apply instructions** + + ```bash + openspec instructions apply --change "" --json + ``` + + This returns: + - `contextFiles`: artifact ID -> array of concrete file paths (varies by schema) + - Progress (total, complete, remaining) + - Task list with status + - Dynamic instruction based on current state + + **Handle states:** + - If `state: "blocked"` (missing artifacts): show message, suggest using `/opsx:continue` + - If `state: "all_done"`: congratulate, suggest archive + - Otherwise: proceed to implementation + +4. **Read context files** + + Read every file path listed under `contextFiles` from the apply instructions output. + The files depend on the schema being used: + - **spec-driven**: proposal, specs, design, tasks + - Other schemas: follow the contextFiles from CLI output + +5. **Show current progress** + + Display: + - Schema being used + - Progress: "N/M tasks complete" + - Remaining tasks overview + - Dynamic instruction from CLI + +6. **Implement tasks (loop until done or blocked)** + + For each pending task: + - Show which task is being worked on + - Make the code changes required + - Keep changes minimal and focused + - Mark task complete in the tasks file: `- [ ]` → `- [x]` + - Continue to next task + + **Pause if:** + - Task is unclear → ask for clarification + - Implementation reveals a design issue → suggest updating artifacts + - Error or blocker encountered → report and wait for guidance + - User interrupts + +7. **On completion or pause, show status** + + Display: + - Tasks completed this session + - Overall progress: "N/M tasks complete" + - If all done: suggest archive + - If paused: explain why and wait for guidance + +**Output During Implementation** + +``` +## Implementing: (schema: ) + +Working on task 3/7: +[...implementation happening...] +✓ Task complete + +Working on task 4/7: +[...implementation happening...] +✓ Task complete +``` + +**Output On Completion** + +``` +## Implementation Complete + +**Change:** +**Schema:** +**Progress:** 7/7 tasks complete ✓ + +### Completed This Session +- [x] Task 1 +- [x] Task 2 +... + +All tasks complete! You can archive this change with `/opsx:archive`. +``` + +**Output On Pause (Issue Encountered)** + +``` +## Implementation Paused + +**Change:** +**Schema:** +**Progress:** 4/7 tasks complete + +### Issue Encountered + + +**Options:** +1.