v2.4.0 - #28
Conversation
Customs compose after Default in the specimen local frame, and the imaging pipeline applies and labels folders from the same orientation name.
…dering engine correctly
…r update the property appropriately
Merge pull request Imageomics#27 from calcharp/main
Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Pull request overview
This PR prepares TraitBlender v2.4.0, adding a more flexible orientation system (built-ins + config-defined custom Euler orientations), in-addon unit test support for validating config imports, render-engine configuration robustness across Blender versions, and accompanying documentation/version bumps.
Changes:
- Add custom Euler orientations (UI + YAML) and apply orientations by name via a shared core helper.
- Add in-addon unit tests (including
config_matches_scene) plus a UI operator to run them. - Update render.engine / Cycles / Eevee config handling and documentation; bump release/version metadata and VTK wheel pins.
Reviewed changes
Copilot reviewed 45 out of 47 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| traitblender/ui/properties/orientation_properties.py | Pass context through orientation lookup so dropdown includes custom orientations. |
| traitblender/ui/panels/main_panel.py | Sync imaging orientation checkbox list; add engine-specific render UI. |
| traitblender/ui/operators/unit_test/run_unit_test_op.py | Add operator to run core unit tests by name. |
| traitblender/ui/operators/unit_test/init.py | Export unit test operator module symbols. |
| traitblender/ui/operators/imaging_pipeline_op.py | Use a single source of truth for enabled orientations; apply by name. |
| traitblender/ui/operators/custom_orientation_ops.py | Add/remove custom orientation entries from the UI config. |
| traitblender/ui/operators/config_ops.py | Persist config path; apply render engine last; sync imaging orientations post-load. |
| traitblender/ui/operators/apply_orientation_op.py | Apply orientation via shared core helper; allow explicit orientation override. |
| traitblender/ui/operators/init.py | Register new operators (custom orientations, unit tests). |
| traitblender/mkdocs.yml | Add Unit Tests page to docs nav. |
| traitblender/docs/morphospaces/shell.md | Document orientations + custom Euler support for Shell. |
| traitblender/docs/morphospaces/overview.md | Add orientations overview and custom Euler semantics. |
| traitblender/docs/morphospaces/circle-grid.md | Document orientations + custom Euler support for Circle Grid. |
| traitblender/docs/morphospaces/atlas.md | Document custom Euler orientations for ATLAS. |
| traitblender/docs/index.md | Bump docs version references to v2.4.0. |
| traitblender/docs/getting-started/quick-start.md | Update quick start for config import persistence, custom orientations, and unit tests. |
| traitblender/docs/getting-started/installation.md | Bump installation examples/version to v2.4.0. |
| traitblender/docs/getting-started/blender-optimization.md | Add anchor for Python tooltips cross-reference. |
| traitblender/docs/documentation.md | Add links to configuration/unit test docs. |
| traitblender/docs/configuration/unit-tests.md | New documentation for in-addon unit tests. |
| traitblender/docs/configuration/config-files.md | Expand YAML schema docs for render blocks + custom orientations. |
| traitblender/docs/api/scene-assets.md | Document new operators/properties (configure_scene behavior, unit tests, custom orientations). |
| traitblender/core/unit_test/test_config_matches_scene.py | Implement config_matches_scene YAML-vs-live-scene comparison. |
| traitblender/core/unit_test/init.py | Add core unit test registry and runner helpers. |
| traitblender/core/morphospaces/get_orientations.py | Merge built-in morphospace orientations with custom Euler orientations from config. |
| traitblender/core/morphospaces/apply_orientation.py | New shared helper to apply an orientation by name. |
| traitblender/core/morphospaces/init.py | Export apply_orientation_by_name. |
| traitblender/core/helpers/render_engine_compat.py | Improve engine normalization/enum handling for Blender 5.1+ behavior. |
| traitblender/core/helpers/orientation_helpers.py | Add helper to build custom local-Euler orientation callables. |
| traitblender/core/helpers/init.py | Export make_euler_orientation. |
| traitblender/core/config/traitblender_config.py | Skip empty sections on YAML export; improve from_dict robustness/logging. |
| traitblender/core/config/templates/sample.py | Ignore YAML input for UI-only sample section. |
| traitblender/core/config/templates/render.py | Introduce engine-specific render blocks (cycles/eevee) and apply directly to scene RNA. |
| traitblender/core/config/templates/morphospace.py | Suppress morphospace update popups during config load. |
| traitblender/core/config/templates/imaging.py | Add custom orientations storage + orientation checkbox syncing. |
| traitblender/core/init.py | Export unit test APIs from core. |
| traitblender/blender_manifest.toml | Bump add-on version to 2.4.0; update VTK wheel path. |
| traitblender/assets/configs/default.yaml | Update default YAML example for new render schema. |
| requirements-wheels.txt | Bump VTK pin for CPython 3.13 wheels. |
| requirements-wheels-headless.txt | Bump VTK pin for headless wheels. |
| README.md | Bump version references and describe custom orientations. |
| CITATION.cff | Update release metadata for v2.4.0. |
| build_zips/blender_manifest.template.toml | Bump template manifest version to 2.4.0. |
| .zenodo.json | Update Zenodo metadata for v2.4.0. |
| .gitignore | Update embedded release checklist version references. |
| .github/workflows/release-zips.yml | Update workflow comment example tag to v2.4.0. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
egrace479
left a comment
There was a problem hiding this comment.
Missed the month change here.
Co-authored-by: Elizabeth Campolongo <38985481+egrace479@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Not ready to approve
Blender operator error reports in generate_morphospace_sample_op.py use {'Error'} instead of the expected {'ERROR'}, which may prevent failures from surfacing correctly to users.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Comments suppressed due to low confidence (2)
traitblender/ui/operators/generate_morphospace_sample_op.py:138
- Blender operator report levels are expected to be uppercase (e.g., {'ERROR'}). Using {'Error'} may be ignored or miscategorized by Blender, so failures here might not surface to the user.
traitblender/ui/operators/generate_morphospace_sample_op.py:130 - Blender operator report levels are expected to be uppercase (e.g., {'ERROR'}). Using {'Error'} may be ignored or miscategorized by Blender, so failures here might not surface to the user.
This issue also appears on line 138 of the same file.
- Files reviewed: 47/49 changed files
- Comments generated: 0 new
- Review effort level: Low
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
🟡 Not ready to approve
There are a couple of concrete behavioral bugs in the new orientation UI/operators (silent success on invalid explicit orientation names; and incorrect checkbox removal when custom names collide with built-ins).
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Comments suppressed due to low confidence (2)
traitblender/ui/operators/apply_orientation_op.py:42
- The operator currently swallows "orientation not found" errors and returns FINISHED even when an explicit
orientationargument was provided. That makes scripts/pipelines silently succeed with a typo and can lead to mismatched folder/log names vs the actual pose (or no pose applied). Only treat missing/unknown orientation as a quiet no-op when the operator is relying on the UI enum (i.e., no explicit argument was passed).
traitblender/ui/operators/custom_orientation_ops.py:58 - Removing a custom orientation currently removes the first matching entry from
imaging.orientation_optionsby name. If a user renames a custom orientation to collide with a built-in name (e.g. "Default"), this will temporarily remove the built-in checkbox entry until the next sync, and can also desync enabled flags. Prefer rebuildingorientation_optionsfrom the single source of truth viasync_orientation_options(...)after removal.
- Files reviewed: 47/49 changed files
- Comments generated: 0 new
- Review effort level: Low
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
Co-authored-by: Cursor <cursoragent@cursor.com>
Merge pull request Imageomics#28 from calcharp/main
Version 2.4.0 of TraitBlender. New, more flexible orienation framework for the ATLAS morphospace, some simple unit testing functionality to ensure the config gets imported properly, new VTK version that prevents TraitBlender from sometimes crashing on HPCs, and some bug fixes related to the config not being set correctly when imported.
The release is dated for tomorrow, 7/29/2026, in the docs.