Skip to content
Merged

5.0 #62

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
a558d1a
feat: Add Bioxel asset catalog and layer management functionality
icrdr Jan 21, 2026
ced0898
Add unit tests for bioxel module and documentation
icrdr Jan 22, 2026
b83dd0a
feat: Update .gitattributes and .gitignore for improved asset managem…
icrdr May 25, 2026
e06cadc
feat: Update .gitignore to include scipy_ndimage directory
icrdr May 25, 2026
cd00c2b
feat: Update release workflow and manifest for improved dependency ma…
icrdr May 25, 2026
9ba0c6a
feat: Update .gitignore and add binary files for scipy_ndimage across…
icrdr May 25, 2026
564a47d
feat: Add OPSX commands for archiving, exploring, and proposing changes
icrdr May 25, 2026
3a18d01
feat: Refactor asset library management and update manifest for impro…
icrdr May 25, 2026
2671f48
feat: Downgrade h5py version to 3.14.0 in requirements and manifest
icrdr May 25, 2026
5dbc246
feat: Update Help operator and panel labels to use English terminology
icrdr May 25, 2026
15c53fe
Translate documentation to Chinese, add support format details, and e…
icrdr May 25, 2026
1dd0847
feat: Remove default version setting from extra configuration in mkdo…
icrdr May 25, 2026
89dc08c
fix: Update documentation links to point to the correct URLs for Chin…
icrdr May 25, 2026
3879219
Add documentation for basic usage, supported formats, and performance…
icrdr May 26, 2026
720233b
Add OpenSpec skills for change management and exploration
icrdr Jul 6, 2026
7b91510
feat: Update version to 2.0.1, refactor asset library handling, and e…
icrdr Jul 7, 2026
6fe7e90
fix: downgrade scipy version to 1.16.3 in build.py and pyproject.toml
icrdr Jul 7, 2026
35faebb
Remove deprecated modules and functions from bioxel package
icrdr Jul 7, 2026
efb28ee
feat: Add SKIP_MODULE_NAMES to exclude specific modules during import…
icrdr Jul 7, 2026
0e71ff6
refactor: Remove known limitations section from documentation for EEV…
icrdr Jul 8, 2026
ec87d59
Merge remote-tracking branch 'origin/main' into 5.0
icrdr Jul 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
---
name: "OPSX: Apply"
description: Implement tasks from an OpenSpec change (Experimental)
category: Workflow
tags: [workflow, artifacts, experimental]
name: "source-command-opsx-apply"
description: "Implement tasks from an OpenSpec change (Experimental)"
---

# source-command-opsx-apply

Use this skill when the user asks to run the migrated source command `opsx-apply`.

## Command Template

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.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
---
name: "OPSX: Archive"
description: Archive a completed change in the experimental workflow
category: Workflow
tags: [workflow, archive, experimental]
name: "source-command-opsx-archive"
description: "Archive a completed change in the experimental workflow"
---

# source-command-opsx-archive

Use this skill when the user asks to run the migrated source command `opsx-archive`.

## Command Template

Archive a completed change in the experimental workflow.

**Input**: Optionally specify a change name after `/opsx:archive` (e.g., `/opsx:archive add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
---
name: "OPSX: Explore"
name: "source-command-opsx-explore"
description: "Enter explore mode - think through ideas, investigate problems, clarify requirements"
category: Workflow
tags: [workflow, explore, experimental, thinking]
---

# source-command-opsx-explore

Use this skill when the user asks to run the migrated source command `opsx-explore`.

## Command Template

Enter explore mode. Think deeply. Visualize freely. Follow the conversation wherever it goes.

**IMPORTANT: Explore mode is for thinking, not implementing.** You may read files, search code, and investigate the codebase, but you must NEVER write code or implement features. If the user asks you to implement something, remind them to exit explore mode first and create a change proposal. You MAY create OpenSpec artifacts (proposals, designs, specs) if the user asks—that's capturing thinking, not implementing.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
---
name: "OPSX: Propose"
description: Propose a new change - create it and generate all artifacts in one step
category: Workflow
tags: [workflow, artifacts, experimental]
name: "source-command-opsx-propose"
description: "Propose a new change - create it and generate all artifacts in one step"
---

# source-command-opsx-propose

Use this skill when the user asks to run the migrated source command `opsx-propose`.

## Command Template

Propose a new change - create the change and generate all artifacts in one step.

I'll create a change with artifacts:
Expand Down
12 changes: 4 additions & 8 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Tempary files
temp
sandbox.*
notes/
/notes/

# Environments
.env
Expand All @@ -22,11 +22,11 @@ secrets/
SECRETS/
secrets.bak/

# Claude
# Claude Code
.claude/settings.local.json
.claudian

# Obsidian

.obsidian/*
!.obsidian/snippets
!.obsidian/app.json
Expand Down Expand Up @@ -389,8 +389,4 @@ dist
# Vite files
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
.vite/


# Scipy
!scipy_ndimage/*/**
.vite/
1 change: 0 additions & 1 deletion CLAUDE.md

This file was deleted.

5 changes: 0 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,6 @@ If you want to cite this work, you can cite it from Zenodo:

[![DOI](https://zenodo.org/badge/786623459.svg)](https://zenodo.org/badge/latestdoi/786623459)

## Known Limitations

- Only one cutter supported in EEVEE render
- Shader fail to work when convert to mesh.
- Section surface cannot be generated when convert to mesh (will be supported soon)

## Roadmap

Expand Down
11 changes: 4 additions & 7 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ class Platform:
"transforms3d==0.4.2",
"tifffile==2024.7.24",
"matplotlib==3.10.7",
"pillow==11.2.1"]
"pillow==11.2.1",
"scipy==1.16.3"]


platforms = {"windows-x64": Platform(pypi_suffix="win_amd64",
Expand All @@ -33,7 +34,8 @@ class Platform:

packages_to_remove = {
"imagecodecs",
"numpy"
"numpy",
"packaging"
}


Expand All @@ -45,7 +47,6 @@ def run_python(args: str):
def build_extension(platform: Platform, python_version: str) -> None:
wheel_dirpath = Path("./src/bioxelnodes/wheels")
toml_filepath = Path("./src/bioxelnodes/blender_manifest.toml")
scipy_ndimage_dirpath = Path("./scipy_ndimage", platform.blender_tag)

# download required_packages
run_python(
Expand All @@ -62,10 +63,6 @@ def build_extension(platform: Platform, python_version: str) -> None:
and "universal2" in f.name
):
f.rename(Path(f.parent, f.name.replace("universal2", "arm64")))

for ndimage_filepath in scipy_ndimage_dirpath.iterdir():
to_filepath = Path("./src/bioxelnodes/bioxel/scipy", ndimage_filepath.name)
shutil.copy(ndimage_filepath, to_filepath)

# Load the TOML file
with toml_filepath.open("r") as file:
Expand Down
9 changes: 1 addition & 8 deletions docs/index.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,8 @@ Welcome to our [discord server](https://discord.gg/pYkNyq2TjE), if you have any

![eevee](https://omoolab.github.io/BioxelNodes/latest/assets/eevee.gif)

👍 EEVEE NEXT is absolutely AWESOME! Bioxel Nodes is fully support EEVEE NEXT now! However, there are some limitations:
👍 EEVEE NEXT is absolutely AWESOME! Bioxel Nodes is fully support EEVEE NEXT now!

1. Only one cutter supported.
2. EEVEE result is not that great as Cycles does.

## Known Limitations

- Only works with Cycles CPU , Cycles GPU (OptiX), EEVEE
- Section surface cannot be generated when convert to mesh (will be supported soon)

## Roadmap

Expand Down
10 changes: 1 addition & 9 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,7 @@ Bioxel Nodes 是一款用于科学体数据可视化的 Blender 插件。它利

![eevee](https://omoolab.github.io/BioxelNodes/latest/assets/eevee.gif)

EEVEE NEXT 太棒了!Bioxel Nodes 现在全面支持 EEVEE NEXT!但仍有以下限制:

1. 仅支持一个切割器
2. EEVEE 渲染效果不如 Cycles

## 已知限制

- 仅支持 Cycles CPU、Cycles GPU (OptiX)、EEVEE
- 转换为网格时无法生成剖面(即将支持)
EEVEE NEXT 太棒了!Bioxel Nodes 现在全面支持 EEVEE NEXT!

## 路线图

Expand Down
5 changes: 3 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[project]
name = "bioxelnodes"
version = "1.0.9"
version = "2.0.1"
description = ""
authors = [{ name = "Ma Nan", email = "icrdr2010@outlook.com" }]
authors = [{ name = "MaNan", email = "icrdr2010@outlook.com" }]
requires-python = ">=3.11.0,<3.12.dev0"
readme = "README.md"
license = "MIT"
Expand All @@ -13,6 +13,7 @@ dependencies = [
"h5py==3.11.0",
"transforms3d==0.4.2",
"matplotlib==3.10.7",
"scipy==1.16.3",
]

[dependency-groups]
Expand Down
Binary file not shown.

This file was deleted.

Binary file not shown.
3 changes: 0 additions & 3 deletions scipy_ndimage/macos-arm64/_nd_image.cpython-313-darwin.so

This file was deleted.

Binary file not shown.
3 changes: 0 additions & 3 deletions scipy_ndimage/macos-x64/_nd_image.cpython-313-darwin.so

This file was deleted.

Binary file not shown.
Binary file not shown.
36 changes: 1 addition & 35 deletions src/bioxelnodes/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import bpy
import bpy.utils.previews as previews

from .constants import NODE_LIB_DIRPATH, PREVIEW_COLLECTIONS
from .constants import PREVIEW_COLLECTIONS
from .props import _bioxel_layer_items, _update_layer_gallery, _update_snapshot_z

from . import auto_load
Expand All @@ -10,37 +10,6 @@
auto_load.init()


def add_asset_library():
"""Add Bioxel asset library, ensuring only one exists by removing duplicates first."""
if not NODE_LIB_DIRPATH.exists():
print(f"Node library path does not exist - {NODE_LIB_DIRPATH}")
return

lib_path_str = str(NODE_LIB_DIRPATH)
prefs = bpy.context.preferences.filepaths.asset_libraries

# Add new library
new_lib = prefs.new()
new_lib.name = "O Bioxel"
new_lib.path = lib_path_str
new_lib.import_method = "PACK"

print(f"Add Bioxel Nodes library: {lib_path_str}")


def remove_asset_library_if_exists():
"""Remove the Bioxel asset library entry if it was added (by path or name)."""
lib_path_str = str(NODE_LIB_DIRPATH)
prefs = bpy.context.preferences.filepaths.asset_libraries

for lib in list(prefs):
try:
if "Bioxel" in lib.name or lib.path == lib_path_str:
prefs.remove(lib)
except Exception:
continue


def register():
pcoll = previews.new()
pcoll.layer_previews = ()
Expand Down Expand Up @@ -72,12 +41,9 @@ def register():

auto_load.register()
menus.add()
remove_asset_library_if_exists()
add_asset_library()


def unregister():
remove_asset_library_if_exists()
menus.remove()
auto_load.unregister()

Expand Down
73 changes: 73 additions & 0 deletions src/bioxelnodes/asset_library.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import bpy
from pathlib import Path

from .constants import NODE_LIB_DIRPATH


ASSET_LIBRARY_NAME = "O Bioxel"


def _asset_library_path():
return str(NODE_LIB_DIRPATH)


def _normalized_path(path):
return Path(bpy.path.abspath(path)).resolve()


def _asset_libraries():
return bpy.context.preferences.filepaths.asset_libraries


def get_bioxel_asset_library():
lib_path = _normalized_path(_asset_library_path())

for lib in _asset_libraries():
try:
if _normalized_path(lib.path) == lib_path:
return lib
except Exception:
continue

return None


def has_bioxel_asset_library():
return get_bioxel_asset_library() is not None


def add_bioxel_asset_library():
if not NODE_LIB_DIRPATH.exists():
raise FileNotFoundError(f"Node library path does not exist: {NODE_LIB_DIRPATH}")

prefs = _asset_libraries()
lib = get_bioxel_asset_library()

if lib is None:
for item in prefs:
try:
if item.name == ASSET_LIBRARY_NAME:
lib = item
break
except Exception:
continue

if lib is None:
lib = prefs.new()

lib.name = ASSET_LIBRARY_NAME
lib.path = _asset_library_path()
lib.import_method = "PACK"
return lib


def remove_bioxel_asset_library_if_exists():
lib_path = _normalized_path(_asset_library_path())
prefs = _asset_libraries()

for lib in list(prefs):
try:
if "Bioxel" in lib.name or _normalized_path(lib.path) == lib_path:
prefs.remove(lib)
except Exception:
continue
4 changes: 2 additions & 2 deletions src/bioxelnodes/assets/O_Bioxel/O_Bioxel_Nodes.blend
Git LFS file not shown
5 changes: 5 additions & 0 deletions src/bioxelnodes/auto_load.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@

modules = None
ordered_classes = None
SKIP_MODULE_NAMES = {
"operators.io_worker",
}


def init():
Expand Down Expand Up @@ -57,6 +60,8 @@ def get_all_submodules(directory):

def iter_submodules(path, package_name):
for name in sorted(iter_submodule_names(path)):
if name in SKIP_MODULE_NAMES:
continue
yield importlib.import_module("." + name, package_name)


Expand Down
Loading
Loading