- 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.
6.1 KiB
6.1 KiB
BioxelNodes - Agent Development Guide
This file contains essential information for agentic coding agents working on the BioxelNodes codebase.
Project Overview
BioxelNodes is a Blender addon for scientific volumetric data visualization. It integrates with Blender's Geometry Nodes and Cycles rendering engine to process and visualize medical/scientific data.
Language: Python 3.11 Framework: Blender Python API (bpy) Package Manager: uv
Development Commands
Environment Setup
# Install dependencies
uv sync
Build Commands
# Build for specific platform
uv run build.py <platform> # platforms: windows-x64, linux-x64, macos-arm64, macos-x64
Unit Test
uv run pytest tests/
Code Quality
# Format code (autopep8)
autopep8 --in-place --recursive src/
Documentation
# Serve documentation locally
uv run mkdocs serve
# Build documentation
uv run mike deploy --push --update-aliases 0.2.x latest
Code Style Guidelines
Formatting
- 4-space indentation
- PEP 8 compliance enforced via autopep8
Naming Conventions
- snake_case for functions, variables, and files
- PascalCase for classes (Blender convention)
- UPPER_CASE for constants
- bioxel_ prefix for addon-specific properties
Import Organization
# Standard library imports first
import pathlib
import uuid
# Third-party imports
import bpy
import numpy as np
import SimpleITK as sitk
# Relative imports for internal modules
from ..exceptions import CancelledByUser
from ..utils import get_layer_obj
Type Hints
- Use sparingly, mainly for Blender property annotations
- Focus on function signatures and complex data structures
- Example:
def process_data(data: np.ndarray) -> np.ndarray:
Architecture Patterns
Auto-Registration System
- Uses
auto_load.pyfor automatic class registration - Classes are discovered automatically via reflection
- Registration order resolved via topological sorting
- All Blender classes must inherit from appropriate base types
Module Structure
src/bioxelnodes/
├── __init__.py # Addon entry point, asset library setup
├── auto_load.py # Auto-registration system
├── constants.py # Constants and paths
├── utils.py # Utility functions
├── preferences.py # Addon preferences
├── props.py # Blender properties
├── panels.py # UI panels
├── menus.py # UI menus
├── node.py # Node utilities
├── layer.py # Layer management
├── operators/ # Blender operators
├── bioxel/ # Core bioxel functionality
└── assets/ # Blender assets and node libraries
Blender Integration Patterns
Property Groups
class BioxelProperties(bpy.types.PropertyGroup):
bl_label = "Bioxel Properties"
bioxel_custom_prop: bpy.props.StringProperty(
name="Custom Property",
default="",
description="Description for UI"
)
Operators
class BIOXEL_OT_custom_operator(bpy.types.Operator):
bl_idname = "bioxel.custom_operator"
bl_label = "Custom Operator"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
# Operator logic here
return {'FINISHED'}
Panels
class BIOXEL_PT_custom_panel(bpy.types.Panel):
bl_label = "Custom Panel"
bl_idname = "BIOXEL_PT_custom_panel"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = "Bioxel"
def draw(self, context):
layout = self.layout
# UI drawing code here
Error Handling
Error Handling Patterns
- Use try-catch blocks for file operations
- Handle user cancellation gracefully
- Report progress for long operations using
bioxel_progress_factorandbioxel_progress_text - Log warnings with print statements for debugging
Key Dependencies
Core Libraries
- bpy (Blender Python API) - Core integration
- numpy - Array processing
- SimpleITK - Medical image processing
- h5py - HDF5 file handling
Scientific Libraries
- matplotlib - Plotting and visualization
- transforms3d - 3D transformations
- pyometiff - OME-TIFF support
- mrcfile - MRC file format support
Development Workflow
Making Changes
- Identify the appropriate module (operators, panels, bioxel, etc.)
- Follow existing naming conventions and patterns
- Use auto-registration - no manual registration needed
- Test with Blender's Python console
- Format code with autopep8 before committing
Adding New Features
- Create appropriate classes in relevant modules
- Use proper prefixes (BIOXEL_OT_, BIOXEL_PT_, etc.)
- Add to auto_load system automatically discovers new classes
- Update documentation if needed
File Operations
- Use
pathlib.Pathfor path operations - Check file existence before operations
- Handle permissions and missing files gracefully
- Use appropriate file formats (HDF5 for data, PNG for images)
Blender Integration Notes
Asset Library
- Automatically managed via
add_asset_library_if_missing() - Located at
NODE_LIB_DIRPATH - Uses "PACK" import method
- Name: "O Bioxel"
Progress Reporting
- Use
bioxel_progress_factor(0.0 to 1.0) for progress - Use
bioxel_progress_textfor status messages - Update via WindowManager properties
Layer Management
- Layers stored as HDF5 files
- Container objects manage multiple layers
- Use
layer.pyfor layer operations - Support for various medical image formats
Common Pitfalls
Blender API
- Always check context validity
- Handle different Blender versions (check
bpy.app.version) - Use proper property types for UI
- Register classes in correct order (auto_load handles this)
Performance
- Use NumPy for array operations
- Avoid expensive operations in UI draw calls
- Cache computed values where appropriate
- Use background threads for long operations
File I/O
- Always close file handles
- Use context managers for file operations
- Handle large files in chunks
- Validate file formats before processing