Blender Python add-on rules for operators, panels, properties, registration, testing, and API-safe scripting
.cursorrules or .cursor/rules/blender-python-addon.mdc # Blender Python Add-on Rules
## Add-on Structure
- Keep add-on entry points in `__init__.py` with clear `register()` and `unregister()` functions.
- Group operators, panels, properties, preferences, and utilities into separate modules for non-trivial add-ons.
- Use `bl_info` or `blender_manifest.toml` according to the Blender version and packaging target.
- Keep UI labels concise and user-facing text translatable where appropriate.
## API Usage
- Use `bpy.types.Operator` for actions, `bpy.types.Panel` for UI, and `bpy.types.PropertyGroup` for grouped settings.
- Define `bl_idname`, `bl_label`, and `bl_options` explicitly.
- Validate context in `poll()` before enabling operators.
- Use `invoke()` for interactive setup and `execute()` for the actual operation.
- Return `{'FINISHED'}` or `{'CANCELLED'}` consistently.
- Use dependency graph updates and evaluated objects when reading final scene state.
## Data and Properties
- Register custom properties through `PropertyGroup` classes instead of loose global state.
- Store add-on preferences in `AddonPreferences`.
- Use `PointerProperty`, `CollectionProperty`, and typed properties with names and descriptions.
- Clean up custom properties and handlers during `unregister()`.
## Safety and Performance
- Do not run destructive scene operations without explicit user action.
- Avoid blocking UI work in modal operators; use timers or modal state machines for long operations.
- Batch mesh changes and use `bmesh` when editing mesh data programmatically.
- Avoid repeatedly scanning large scenes in draw methods.
- Keep file paths configurable and use Blender path utilities.
## Testing and Debugging
- Test scripts in a clean Blender profile and a representative production scene.
- Add smoke tests that import the add-on, register it, run core operators, and unregister cleanly.
- Log actionable messages with `self.report()` for user-facing operator feedback.
- Keep version-specific API differences isolated behind helper functions.
## Common Mistakes
- Do not forget to unregister classes, handlers, timers, and keymaps.
- Do not mutate Blender data from panel `draw()` methods.
- Do not assume an active object, selected object, or mode without checking context.
- Do not hardcode absolute asset paths. __init__.py with clear register() and unregister() functions.bl_info or blender_manifest.toml according to the Blender version and packaging target.bpy.types.Operator for actions, bpy.types.Panel for UI, and bpy.types.PropertyGroup for grouped settings.bl_idname, bl_label, and bl_options explicitly.poll() before enabling operators.invoke() for interactive setup and execute() for the actual operation.{'FINISHED'} or {'CANCELLED'} consistently.PropertyGroup classes instead of loose global state.AddonPreferences.PointerProperty, CollectionProperty, and typed properties with names and descriptions.unregister().bmesh when editing mesh data programmatically.self.report() for user-facing operator feedback.draw() methods.Cursor rules for VSCode extension development with Electron and TypeScript integration.
Guide Cursor to write modern C++ and CMake code with clear structure, RAII, const-correctness, and safe error handling.
Cursor rules for C++ development with programming guidelines integration.
Cursor rules for DragonRuby development with best practices integration.
Cursor rules for Elixir development with engineer guidelines.
Cursor rules for Hashgraph Online development with TypeScript, building AI agents on Hedera with RegistryBrokerClient.