bonsai-impl-drawing
Bonsai Drawing and Documentation — Implementation Guide
Version: Bonsai v0.8.x | Blender 4.2+ | Python 3.11 Module path:
bonsai.bim.module.drawing— NEVERblenderbim.bim.module.drawingDependencies: bonsai-core-architecture (Bonsai tool/core/operator pattern)
1. Critical Warnings
- ALWAYS use
bonsai.bim.module.drawing— NEVER useblenderbim.bim.module.drawing(legacy name) - ALWAYS activate a drawing camera before calling
bim.create_drawing - NEVER edit generated SVG files directly — ALWAYS modify annotations in Blender and regenerate
- ALWAYS install InkScape before using sheet composition or PDF export
- Annotations are ONLY generated for orthographic camera views — NEVER for perspective views
- ALWAYS sync IFC data before generating drawings (
sync=Trueor save first) - ALWAYS use project-relative paths for titleblock SVG templates
2. Architecture Overview
The drawing module follows Bonsai's core/tool/operator pattern:
bonsai/core/drawing.py → Pure logic (no Blender imports)
bonsai/tool/drawing.py → Blender-specific implementation
bonsai/bim/module/drawing/
├── operator.py → 40+ Blender operators
├── prop.py → Property definitions
├── ui.py → Panel UI
├── annotation.py → Annotator class (geometry creation)
├── svgwriter.py → SvgWriter class (SVG engine)
├── sheeter.py → SheetBuilder class (sheet composition)
├── decoration.py → Viewport decorations
├── gizmos.py → Interactive annotation gizmos
├── handler.py → Event handlers
├── helper.py → Utilities (format_distance, BoundingBox)
├── scheduler.py → Schedule/table generation
├── shaders.py → GPU shaders for viewport
├── workspace.py → AnnotationTool workspace + keymaps
└── data.py → Data loading and caching
3. Drawing Types Decision Tree
What type of drawing do you need?
│
├─ Floor plan (top-down view) → target_view="PLAN_VIEW"
├─ Vertical section (cut through) → target_view="SECTION_VIEW"
├─ Facade/external view → target_view="ELEVATION_VIEW"
├─ Reflected ceiling plan → target_view="REFLECTED_PLAN_VIEW"
└─ 3D perspective/axonometric → target_view="MODEL_VIEW"
Each drawing is backed by:
- An
IfcAnnotationentity in anIfcGroup - Properties in
EPset_Drawingproperty set:TargetView— one of the five view typesScale— diagram scale (e.g., "1:100")HumanScale— display string for scaleHasUnderlay— render-based background image toggleHasLinework— vector line drawing toggleHasAnnotation— annotation overlay toggle
4. Complete Drawing Pipeline
4.1 Step 1: Create a Drawing
# Bonsai v0.8.x — Add a plan view drawing
import bpy
bpy.ops.bim.add_drawing(
target_view="PLAN_VIEW",
location_hint=0 # 0 = auto-detect from active storey
)
Location hint rules:
PLAN_VIEW/REFLECTED_PLAN_VIEW:location_hintmaps to building storey indexSECTION_VIEW/ELEVATION_VIEW:location_hintrepresents direction (N/S/E/W)MODEL_VIEW:location_hintis ignored
Core function (bonsai/core/drawing.py):
# Bonsai v0.8.x — add_drawing creates:
# 1. Unique drawing name from target_view
# 2. Camera matrix from target_view + location_hint
# 3. IfcAnnotation via ifcopenshell.api.run("root.create_entity")
# 4. IfcGroup for annotations
# 5. IfcDocumentReference to SVG output path
# 6. EPset_Drawing properties (TargetView, Scale, etc.)
# 7. Blender camera object assigned to collection
4.2 Step 2: Configure Camera Properties
# Bonsai v0.8.x — Camera/drawing configuration
# Access via camera object's BIMCameraProperties
# Scale options (metric):
# 1:5000, 1:2000, 1:1000, 1:500, 1:200, 1:100, 1:50,
# 1:20, 1:10, 1:5, 1:2, 1:1, CUSTOM
# Custom scale: custom_scale_numerator / custom_scale_denominator
# Camera type: ORTHO (orthographic) | PERSP (perspective)
# Raster resolution: raster_x, raster_y (default 1000 px each)
# DPI: default 75
# View dimensions: width, height (default 50 m each)
# NTS flag: is_nts (Not To Scale)
Layer toggles (control what the drawing contains):
has_underlay— render-based background imagehas_linework— vector line drawinghas_annotation— annotation overlays
Filter mode: NONE or include/exclude filter groups for element visibility control.
4.3 Step 3: Add Annotations
# Bonsai v0.8.x — Add annotations to the active drawing
import bpy
# PREREQUISITE: MUST have active drawing (camera view)
# Add a text annotation
bpy.ops.bim.add_annotation(object_type="TEXT")
# Add a dimension with type reference
bpy.ops.bim.add_annotation(
object_type="DIMENSION",
relating_type_id=42 # IFC ID of annotation type
)
Supported annotation types:
| Type | Description | Blender Data |
|---|---|---|
TEXT |
Text labels | Mesh |
TEXT_LEADER |
Text with leader line | Curve |
DIMENSION |
Linear dimensions | Mesh |
ANGLE |
Angular dimensions | Mesh |
SECTION_LEVEL |
Section cut markers | Mesh |
PLAN_LEVEL |
Level indicators | Mesh |
ELEVATION |
Elevation markers (SVG symbols) | Mesh |
GRID |
Grid line references | Mesh |
FILL_AREA |
Hatching and fills | Mesh |
STAIR_ARROW |
Stair direction indicators | Mesh |
HIDDEN_LINE |
Hidden/dashed lines | Mesh |
BREAKLINE |
Break line symbols | Mesh |
Text properties (BIMTextProperties):
- Font sizes (mm): 1.8, 2.5, 3.5, 5.0, 7.0
- Horizontal alignment: left, middle, right
- Vertical alignment: top, middle, bottom
- Literals support 16 categories: Basic, Attributes, Property Sets, Material, Task, Cost, etc.
- SVG output supports markdown: bold, italic, links, bullet points
4.4 Step 4: Generate SVG Drawing
# Bonsai v0.8.x — Generate SVG from active drawing
bpy.ops.bim.create_drawing(
sync=True, # Pre-sync IFC data (ALWAYS recommended)
print_all=False, # False = active drawing only; True = all checked drawings
open_viewer=False # Launch viewer after generation
)
SVG generation pipeline:
CreateDrawing Pipeline (bim.create_drawing):
1. Initialize camera and drawing metadata
2. Sync IFC file (if sync=True)
3. Generate UNDERLAY (raster render → PNG → embedded in SVG)
4. Generate LINEWORK (vector):
├─ OPENCASCADE mode → HLR via OCC library (precise, slower)
└─ FREESTYLE mode → Blender Freestyle SVG Exporter (artistic, faster)
5. Generate ANNOTATIONS (via SvgWriter, orthographic only)
6. Combine all SVG layers into final output
Linework mode decision:
| Situation | Use |
|---|---|
| Precise hidden-line removal needed | OPENCASCADE mode |
| Artistic line styles preferred | FREESTYLE mode |
| FREESTYLE mode selected | ALWAYS verify Freestyle SVG Exporter add-on is enabled |
Fill modes (fill_mode): NONE, SHAPELY (polygon fills), SVGFILL (SVG-native patterns)
Cut modes (cut_mode): BISECT (Blender mesh bisect), OPENCASCADE (OCC section cutting)
4.5 Step 5: Compose Sheets
# Bonsai v0.8.x — Sheet composition pipeline
# Step 1: Create sheet with titleblock
bpy.ops.bim.add_sheet()
# Creates IfcDocumentInformation + IfcDocumentReference
# Generates base SVG layout from titleblock template
# Step 2: Add drawings to sheet
bpy.ops.bim.add_drawing_to_sheet()
# Links drawing (IfcDocumentReference) to the sheet
# Step 3: Build final sheet
bpy.ops.bim.create_sheets()
# Composes all drawings into sheet SVG
# Optionally exports to PDF/DXF (requires InkScape)
SheetBuilder (sheeter.py) composition process:
- Titleblock Processing: embeds titleblock SVG, applies geolocation data
- Drawing Integration: embeds drawing SVGs with style isolation via
ensure_drawing_unique_styles()(prefixes CSS classes), applies clipping paths - Document Assembly: incorporates schedules, resolves mustache-syntax template variables
Auto-layout (next_drawing_location()):
- Default start: (30, 30) mm
- Padding: 10 mm between drawings
- Horizontal placement within rows, new row when exceeding titleblock width
- Default titleblock width: 840 mm
4.6 Step 6: Export and Open
# Bonsai v0.8.x — Open generated outputs
bpy.ops.bim.open_drawing() # Open SVG with system viewer
bpy.ops.bim.open_sheet() # Open sheet with system viewer
bpy.ops.bim.open_layout() # Open SVG layout file
5. SVG Coordinate Pipeline
The SvgWriter converts 3D model coordinates to SVG canvas:
3D world coordinates
→ project_point_onto_camera() (plane intersection)
→ camera-space coordinates
→ offset to canvas center, scale by (diagram_scale × 1000)
→ SVG canvas coordinates (millimeters)
Unit conversion: IFC meters → SVG millimeters.
convert_to_mm() normalizes CSS length units (cm, in, pt, px, Q, pc) to millimeters for positioning.
6. Key Operator Reference
| Operator | bl_idname | Purpose |
|---|---|---|
| AddDrawing | bim.add_drawing |
Create new drawing view with camera |
| CreateDrawing | bim.create_drawing |
Generate/refresh SVG |
| DuplicateDrawing | bim.duplicate_drawing |
Copy drawing (optional annotation copy) |
| AddAnnotation | bim.add_annotation |
Add annotation to active drawing |
| AddAnnotationType | bim.add_annotation_type |
Create annotation type template |
| AddSheet | bim.add_sheet |
Create new sheet document |
| CreateSheets | bim.create_sheets |
Build sheets with PDF/DXF export |
| AddDrawingToSheet | bim.add_drawing_to_sheet |
Link drawing to sheet |
| OpenSheet | bim.open_sheet |
Open sheet with viewer |
| OpenDrawing | bim.open_drawing |
Open SVG with viewer |
| OpenLayout | bim.open_layout |
Open SVG layout file |
| ActivateModel | bim.activate_model |
Switch to 3D model view |
| SelectAllDrawings | bim.select_all_drawings |
Batch select drawings |
| SelectAllSheets | bim.select_all_sheets |
Batch select sheets |
7. Annotation Workspace
The AnnotationTool workspace provides dedicated annotation editing:
| Shortcut | Action |
|---|---|
Shift+A |
Add new annotation |
Shift+T |
Bulk tag (auto-adjust to selected objects) |
Shift+G |
Readjust tags based on assigned products |
Shift+E |
Edit text annotations |
8. Drawing Style Configuration
DrawingStyle PropertyGroup controls rendering appearance:
render_type:DEFAULT(Blender render settings) orVIEWPORT(viewport shading)raster_style: JSON-formatted render configuration string
9. Reference Files
- references/methods.md — Complete drawing API signatures
- references/examples.md — Working drawing workflow examples
- references/anti-patterns.md — Drawing anti-patterns and mistakes to avoid
10. Dependencies
- InkScape: REQUIRED for sheet composition and PDF/DXF export
- OpenCASCADE (via ifcopenshell): REQUIRED for OPENCASCADE linework/cut modes
- Shapely: REQUIRED for SHAPELY fill mode and polygon operations
- Freestyle SVG Exporter: REQUIRED when using FREESTYLE linework mode (Blender add-on)
More from openaec-foundation/computational-design-day-delft-march-2026
blender-core-api
Guides Blender Python API usage including bpy module structure, RNA data access, context system, dependency graph, and operator invocation. Activates when writing bpy scripts, creating Blender addons, or accessing Blender data blocks programmatically.
1blender-syntax-panels
Defines Blender UI panel creation including bpy.types.Panel, draw() method, UILayout API (row/column/box/split), bl_space_type, bl_region_type, bl_category, sub-panels, draw_header, menus, and UIList. Activates when creating custom Blender panels, building addon interfaces, or working with UILayout elements.
1ifcos-syntax-api
Documents the ifcopenshell.api module system with all 30+ API modules, invocation patterns via api.run() and direct module calls, parameter conventions, and module categorization. Activates when creating IFC entities, modifying properties, managing spatial structure, or using any ifcopenshell.api function.
1bonsai-impl-bcf
Guides implementation of BIM Collaboration Format (BCF) workflows in Bonsai including creating BCF topics, adding viewpoints with camera snapshots, managing comments, importing/exporting BCF files (v2.1 and v3.0), and integrating BCF issue tracking with IFC element references. Activates when working with BCF files, BIM issue tracking, clash report management, or collaboration workflows in Bonsai.
1ifcos-impl-cost
Guides IFC cost management using ifcopenshell.api.cost including cost schedules, cost items, cost values, cost quantities, and 5D BIM workflows. Activates when implementing cost estimation in IFC models, creating cost schedules, or linking quantities to cost items.
1bonsai-impl-qto
Implements Bonsai quantity takeoff (QTO) workflows including calculating quantities from IFC element geometry, using QtoCalculator for automated base quantity computation, managing IfcElementQuantity sets (area, length, volume, weight), custom quantity set definitions, and bulk quantity operations across building elements. Covers the complete QTO pipeline from geometry analysis to quantity export.
1