Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 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
433cfa0
Merge branch 'main' of https://github.com/OmooLab/BioxelNodes into 5.0
icrdr Jul 8, 2026
3756330
feat: Implement CLI command registration for bioxelnodes_import_worke…
icrdr Jul 8, 2026
ea76d1a
chore: Update version to 2.0.2 in project files and dependencies
icrdr Jul 8, 2026
8116b24
feat: Enhance volumetric data parsing by adding progress updates and …
icrdr Jul 8, 2026
7d8481f
Merge branch 'main' of https://github.com/OmooLab/BioxelNodes into 5.0
icrdr Jul 8, 2026
77f9ec3
feat: Enhance asset library management with status checks and error h…
icrdr Jul 9, 2026
2b83588
feat: Update version to 2.0.3 and adjust dependencies in project files
icrdr Jul 9, 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
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "bioxelnodes"
version = "2.0.2"
version = "2.0.3"
description = ""
authors = [{ name = "MaNan", email = "icrdr2010@outlook.com" }]
requires-python = ">=3.11.0,<3.12.dev0"
Expand All @@ -18,7 +18,7 @@ dependencies = [

[dependency-groups]
dev = [
"bpy>=4.2.0,<5",
"bpy==5.0.0",
"pytest>=8.3.2,<9",
"pytest-dependency>=0.6.0,<0.7",
"pytest-cov>=5.0.0,<6",
Expand Down
2 changes: 2 additions & 0 deletions src/bioxelnodes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import bpy.utils.previews as previews

from .constants import PREVIEW_COLLECTIONS
from .asset_library import remove_bioxel_asset_library_if_exists
from .props import _bioxel_layer_items, _update_layer_gallery, _update_snapshot_z

from . import auto_load
Expand Down Expand Up @@ -47,6 +48,7 @@ def register():


def unregister():
remove_bioxel_asset_library_if_exists()
unregister_cli_commands()
menus.remove()
auto_load.unregister()
Expand Down
67 changes: 64 additions & 3 deletions src/bioxelnodes/asset_library.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
import bpy
from pathlib import Path

from .constants import NODE_LIB_DIRPATH
from .constants import LATEST_NODE_LIB_PATH, NODE_LIB_DIRPATH, NODE_LIB_FILENAME


ASSET_LIBRARY_NAME = "O Bioxel"
ASSET_LIBRARY_READY = "READY"
ASSET_LIBRARY_OUTDATED = "OUTDATED"
ASSET_LIBRARY_MISSING = "MISSING"

STATUS_MESSAGES = {
"missing": "O Bioxel asset library is not installed.",
"missing_blend": "O Bioxel node library file is missing.",
"outdated": "O Bioxel node library needs update.",
"ready": "O Bioxel asset library is ready.",
}


def _asset_library_path():
Expand All @@ -19,6 +29,26 @@ def _asset_libraries():
return bpy.context.preferences.filepaths.asset_libraries


def _find_bioxel_asset_library():
lib_path = _normalized_path(_asset_library_path())
named_lib = None

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

return named_lib


def _node_lib_path_for_library(lib):
return _normalized_path(lib.path) / NODE_LIB_FILENAME


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

Expand All @@ -32,16 +62,47 @@ def get_bioxel_asset_library():
return None


def get_bioxel_asset_library_status():
lib = _find_bioxel_asset_library()
lib_path = _normalized_path(_asset_library_path())

if lib is None:
return {"code": ASSET_LIBRARY_MISSING, "reason": "missing",
"message": STATUS_MESSAGES["missing"]}

try:
installed_lib_path = _normalized_path(lib.path)
except Exception:
return {"code": ASSET_LIBRARY_MISSING, "reason": "missing",
"message": STATUS_MESSAGES["missing"]}

if not _node_lib_path_for_library(lib).is_file():
return {"code": ASSET_LIBRARY_MISSING, "reason": "missing_blend",
"message": STATUS_MESSAGES["missing_blend"]}

if installed_lib_path != lib_path:
return {"code": ASSET_LIBRARY_OUTDATED, "reason": "outdated",
"message": STATUS_MESSAGES["outdated"]}

return {"code": ASSET_LIBRARY_READY, "reason": "ready",
"message": STATUS_MESSAGES["ready"]}


def has_bioxel_asset_library():
return get_bioxel_asset_library() is not None
return get_bioxel_asset_library_status()["code"] in {
ASSET_LIBRARY_READY,
ASSET_LIBRARY_OUTDATED,
}


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

prefs = _asset_libraries()
lib = get_bioxel_asset_library()
lib = _find_bioxel_asset_library()

if lib is None:
for item in prefs:
Expand Down
2 changes: 1 addition & 1 deletion src/bioxelnodes/blender_manifest.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
schema_version = "1.0.0"

id = "bioxelnodes"
version = "2.0.2"
version = "2.0.3"
name = "Bioxel Nodes"
tagline = "For scientific volumetric data visualization in Blender"
maintainer = "Nan <icrdr2010@outlook.com>"
Expand Down
2 changes: 1 addition & 1 deletion src/bioxelnodes/operators/io.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def start_worker_process(owner, command: str, payload: dict):
write_worker_json(config_path, config)
write_worker_json(
progress_path,
{"factor": 0.0, "text": "Starting background Blender..."},
{"factor": 0.0, "text": "Starting..."},
)

print(f"Starting Bioxel worker with addon module: {addon_name}")
Expand Down
6 changes: 6 additions & 0 deletions src/bioxelnodes/operators/layer.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import bpy

from ..asset_library import ASSET_LIBRARY_MISSING, get_bioxel_asset_library_status
from ..node import add_bioxel_node, get_layer_nodes, get_main_node_group
from ..utils import refresh_bioxel_panels
from ..layer import get_layer_caches, set_layer_caches
Expand Down Expand Up @@ -91,6 +92,11 @@ class AddLayerNode(bpy.types.Operator):
cache_id: bpy.props.StringProperty() # type: ignore # 图层ID

def execute(self, context):
status = get_bioxel_asset_library_status()
if status["code"] == ASSET_LIBRARY_MISSING:
self.report({"ERROR"}, status["message"])
return {"CANCELLED"}

# 获取图层数据
caches = get_layer_caches()

Expand Down
20 changes: 17 additions & 3 deletions src/bioxelnodes/operators/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
from pathlib import Path
import shutil

from ..asset_library import add_bioxel_asset_library
from ..asset_library import (
ASSET_LIBRARY_OUTDATED,
ASSET_LIBRARY_READY,
add_bioxel_asset_library,
get_bioxel_asset_library_status,
)
from ..constants import LATEST_NODE_LIB_PATH
from ..utils import (
get_all_layer_objs,
Expand Down Expand Up @@ -138,8 +143,17 @@ def execute(self, context):
if area.type == "NODE_EDITOR":
area.tag_redraw()

self.report({"INFO"}, "O Bioxel asset library is ready.")
return {"FINISHED"}
status = get_bioxel_asset_library_status()
if status["code"] == ASSET_LIBRARY_READY:
self.report({"INFO"}, status["message"])
return {"FINISHED"}

if status["code"] == ASSET_LIBRARY_OUTDATED:
self.report({"WARNING"}, status["message"])
return {"FINISHED"}

self.report({"ERROR"}, status["message"])
return {"CANCELLED"}


# 定义虚无化切换操作
Expand Down
19 changes: 17 additions & 2 deletions src/bioxelnodes/panels.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
from pathlib import Path
import bpy

from .asset_library import has_bioxel_asset_library
from .asset_library import (
ASSET_LIBRARY_OUTDATED,
ASSET_LIBRARY_READY,
get_bioxel_asset_library_status,
has_bioxel_asset_library,
)
from .node import get_layer_nodes, get_main_node_group
from .utils import load_icon
from .layer import get_layer_caches
Expand Down Expand Up @@ -78,13 +83,23 @@ class HeaderPanel(bpy.types.Panel, BioxelPanelBase):

def draw(self, context):
layout = self.layout
status = get_bioxel_asset_library_status()

if status["code"] == ASSET_LIBRARY_OUTDATED:
layout.operator(
AddAssetLibrary.bl_idname,
text="Update Nodes Library",
icon="ASSET_MANAGER",
)
layout.label(text=status["message"], icon="INFO")

if not has_bioxel_asset_library():
elif status["code"] != ASSET_LIBRARY_READY:
layout.operator(
AddAssetLibrary.bl_idname,
text="Add Nodes Library",
icon="ASSET_MANAGER",
)
layout.label(text=status["message"], icon="INFO")
return

layout.operator(
Expand Down
40 changes: 19 additions & 21 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading