Blender 4.5+ Extension

3DQuads Print Ready
Documentation

Complete reference for every feature, operator, parameter, and workflow in the extension.

Version 1.0.0
Blender 4.5+
License GPL-3.0
By 3DQuads

1 Overview

3DQuads Print Ready is a Blender extension that adds a complete 3D print preparation pipeline directly inside the 3D Viewport's N-panel. Instead of switching between external tools or running manual checks, the extension walks you through seven guided steps — from selecting a printer to exporting a print-ready file — without ever leaving Blender.

Mesh objects only. The extension operates on the active mesh object. NURBS, curves, empties, and other object types are not supported. All operators are disabled when no mesh is selected.

Requirements

  • Blender 4.5 or newer (Extension system required)
  • No external Python packages — only built-in Blender APIs (bpy, bmesh, mathutils)
  • GPL-3.0-or-later license

Where to find it

Once installed, the extension lives in the N-panel of the 3D Viewport under the tab named Print Ready. Press N inside the 3D Viewport to open the panel, then click the Print Ready tab.

Print Ready panel overview

2 Features

13 Printer Presets
Bambu, Prusa, Creality, Elegoo, Anycubic, Artillery, Voron + Custom
Scale Fixer
Auto-corrects scene units and unapplied object transforms
5-Check Mesh Health
Non-manifold, normals, zero faces, loose verts, self-intersections
Wall Thickness Heatmap
BVHTree ray-cast analysis with live overlay and face selection
Overhang Detection
Configurable angle threshold, heatmap overlay, orientation suggester
Model Splitter
Bisect-based splitting with capped faces and build volume preview
STL / 3MF / OBJ Export
Correct mm-scale output, modifier baking, split-part awareness
Zero Dependencies
Pure Python — no pip installs, no external tools needed

3 Installation

  1. Download the print_ready-1.0.0.zip file.
  2. Open Blender 4.5 or newer.
  3. Go to Edit → Preferences → Extensions.
  4. Click Install from Disk (top-right dropdown) and select the ZIP file.
  5. The extension will appear in the list. Ensure the toggle is enabled.
  6. Open the 3D Viewport, press N, and click the Print Ready tab.
Do not extract the ZIP. Blender installs directly from the ZIP file — extracting it first will cause the installation to fail.

4 Quick Start

Get a model ready for printing in five steps:

  1. Select the mesh object you want to prepare.
  2. In the Print Ready tab → Step 1: pick your printer from the preset dropdown. All fields auto-fill.
  3. Step 2: click Validate Scale. If warnings appear, click Fix Scale to Millimeters.
  4. Step 3: click Run All Checks. If issues are found, click Fix All Issues.
  5. Step 7: set an export directory, then click Export for Printing.
Steps 4–6 (wall thickness, overhangs, splitting) are optional — run them only if your print requires tighter quality control or if the model exceeds your printer's build volume.

5 Usage Guide

Each step in the N-panel is a collapsible sub-panel. They work independently — you can run any step at any time, though the recommended order maximises accuracy.

Step 1 — Printer Profile

Select your printer to automatically fill all dimensional parameters used by subsequent steps.

Built-in presets (13)

  • FDM: Bambu Lab P1S, X1 Carbon, A1 · Prusa MK4S, Mini+ · Creality Ender 3 V3, K1 Max · Anycubic Kobra 3 · Artillery Sidewinder X4 Plus · Voron 2.4 350mm
  • Resin: Elegoo Mars 4 Ultra, Saturn 4 Ultra
  • Custom: all fields are left editable — enter your own values manually

Selecting a preset auto-fills: Printer Type, Build Volume (X/Y/Z), Nozzle Diameter, Min Wall Thickness, Layer Height, and — importantly — the Thickness Threshold used in Step 4.

Always set the printer preset first. It seeds the correct values into every downstream step, including wall thickness analysis and the build volume visualisation in the splitter.

Step 2 — Scale & Units

Ensures the Blender scene and the object's transform are configured correctly for real-world millimetre output.

Validate Scale

Checks three conditions simultaneously:

  • Scene unit system is Metric
  • Scene unit_scale is 0.001 (so 1 Blender Unit = 1 mm)
  • The active object has no unapplied scale (all axes = 1.0)

Fix Scale to Millimeters

Corrects all three conditions in a single click: sets Metric, sets scale_length = 0.001, applies the object's scale transform. Supports undo.

Target Unit

Controls how the object dimensions are displayed in the panel. Internally everything stays in Blender Units (= mm). Options: Millimeters, Centimeters, Inches.

Build volume fit

After validation, the panel shows the object's dimensions alongside the printer's build volume. If the model overflows an axis, a warning indicates which axis to address — either by scaling the model or by splitting it in Step 6.

Step 3 — Mesh Health

Runs five targeted mesh checks that are the most common causes of slicer failures and print defects.

Print Ready panel overview

The five checks

CheckWhat it detectsAuto-fixable?
Non-Manifold EdgesEdges connected to more or fewer than 2 faces (holes, internal faces, T-junctions)Yes
Flipped NormalsFaces whose normals are inconsistent with their neighbours (dot product < −0.5)Yes
Zero-Area FacesDegenerate faces with area < 1×10⁻⁸ (collapsed triangles/quads)Yes
Loose VerticesVertices not connected to any edgeYes
Self-IntersectionsFace pairs that geometrically penetrate each other (BVHTree overlap)No

Fix order (Fix All)

When Fix All Issues is used, repairs run in this order to avoid cascade failures:

  1. Delete loose vertices
  2. Delete zero-area faces
  3. Recalculate face normals outward
  4. Dissolve degenerate edges + fill boundary holes
Fix All is blocked if: the mesh has shape keys (topology changes would corrupt them), or the mesh data has multiple users (linked copies). In either case, the operator reports the reason. See Troubleshooting for solutions.
!
Self-intersections are detected but not fixed automatically. They require manual geometry editing — use a Boolean → Union modifier or sculpt tools to resolve geometry that passes through itself.

Step 4 — Wall Thickness

Identifies areas of the mesh that are thinner than the printer's minimum printable wall thickness. Thin walls either fail to print entirely or collapse during printing.

How the analysis works

For each face, a ray is cast from the face's centre point in the direction of the inverted face normal (i.e., inward through the mesh). The distance to the first opposing surface it hits is recorded as the local wall thickness at that face.

Thickness Threshold

The minimum acceptable wall thickness in mm. Auto-populated from the printer preset's Min Wall Thickness value. Adjust manually for your specific filament or print settings.

Results

  • Number of faces below the threshold
  • Minimum thickness found (thinnest wall in the mesh)
  • Maximum thickness found

Thickness Overlay

Applies a vertex colour attribute (PrintReady_Thickness) to the mesh and enables it in the viewport. Requires Solid shading with Color: Attribute enabled in Viewport Shading options.

Red — below threshold
Yellow — up to 2× threshold
Green — acceptable

Select Thin Faces

Enters Edit Mode and selects all faces whose measured thickness is below the threshold. Use this to manually thicken those areas with the Solidify modifier, Shrink/Fatten (Alt+S), or manual modelling.

Limitations: The ray-cast only reaches surfaces visible from the outside. Internal cavities, hollow channels, and mesh features that are only accessible from the inside will not be measured. Run mesh health checks first — non-manifold geometry can cause incorrect ray-cast results.

Step 5 — Overhang Detection

Identifies faces that overhang at an angle steeper than the printer can bridge without support material. FDM printers typically handle up to 45–50°; resin printers vary more widely.

Overhang Angle

The threshold angle in degrees (0–90, default 45). Faces whose outward normal points more than this angle below horizontal are classified as overhangs. A value of 45° means any face steeper than 45° from the horizontal plane requires supports.

Overhang Overlay

Applies a PrintReady_Overhang vertex colour attribute. Requires Solid shading with Color: Attribute.

Green — safe (no overhang)
Yellow — mild overhang
Red — severe overhang
Blue — build plate face (bottom)

Suggest Best Orientation

Tests six candidate rotations of the object and reports which one produces the fewest overhang faces, along with the percentage improvement over the current orientation:

Rotations tested (degrees):
  Current (0, 0, 0)
  Rotate X +90  →  front face down
  Rotate X −90  →  back face down
  Rotate Y +90  →  right face down
  Rotate Y −90  →  left face down
  Rotate Z +90  →  side orientation
The suggestion is a hint — apply the rotation manually using R → X/Y/Z → 90 in the viewport if you want to accept it. The operator does not rotate the object automatically.

Step 6 — Model Splitter

Splits a model that is too large for the printer's build volume into multiple pieces. Each piece has flat, capped faces at the cut plane so the parts can be glued or fastened together after printing.

Print Ready panel overview

Split Mode

The primary choice that determines how cuts are defined:

  • AUTO (default) — automatically detects which axes overflow the build volume and calculates the minimum cuts needed. Choose a split axis (X / Y / Z / Auto) and a piece count.
  • MANUAL — define each cut independently. For every cut you set its axis (X, Y, or Z), its position along the object, and an optional tilt angle. This lets you mix axes freely — e.g. one cut on X and another on Z.

AUTO Mode

Select Split Axis (X / Y / Z, or Auto to detect automatically) and Pieces (2–10). The extension calculates evenly-spaced cuts along each overflowing axis.

MANUAL Mode

Set Pieces to control how many cut controls appear (n pieces = n−1 cuts). For each cut:

  • Axis — which world axis this specific cut is perpendicular to (X, Y, or Z)
  • Position — slider from 0% to 100% of the object's extent along the chosen axis, with a live millimetre readout
  • Tilt (°) — tilts the cut plane up to ±85° away from perpendicular

Increasing the piece count only resets newly-added cut slots — existing configurations are preserved.

Validate Cuts

Available in MANUAL mode. Checks that every piece produced by the current cut settings fits within the build volume. Cuts on different axes are validated independently per axis — a cut on X does not constrain Y or Z spans.

If any span exceeds the build volume, a red error box appears in the panel identifying the exact gap (e.g. "X axis — gap between Cut 2 and Cut 3: 245.0 mm exceeds build volume 220 mm"). Fix the offending slider and click Validate again.

Preview Cuts

Toggles a GPU viewport overlay showing the build volume (orange wireframe) and cut planes (red translucent quads) directly in the 3D viewport. No objects are created in the Outliner. The overlay updates live as you move position or tilt sliders — no re-click required. Click the button again to hide the overlay.

Split Model

Triggers a confirmation dialog, then:

  1. Creates copies of the original mesh, one per piece
  2. Bisects each copy using bmesh.ops.bisect_plane
  3. Fills the open cut edges using edgeloop_fill (falls back to triangle_fill for complex shapes)
  4. Removes duplicate vertices and recalculates normals
  5. Places all parts in a "Print Ready Parts" collection
  6. Hides the original object (preserved for Undo Split)

Undo Split

Removes all objects from "Print Ready Parts", deletes the collection, and restores the original object's visibility.

Limitations:
— Interlocking connectors or alignment pins are not generated (planned for v2).
— Very thin geometry at the cut plane may produce open edges after bisection. If this happens, run Fix Non-Manifold on the affected part.
— Complex meshes with internal structures may require manual inspection after splitting.

Step 7 — Export

Exports the prepared model (or split parts) to a slicer-ready file format.

Formats

FormatBest forNotes
STLGeneral compatibilityUniversally supported by all slicers. Binary output. Most widely used.
3MFModern slicersPreserves more metadata. Smaller file size. Supported by PrusaSlicer, BambuStudio, Orca.
OBJBroad compatibilitySupported by most 3D tools. Larger file size than STL for print use.

Export Directory

The folder where files will be saved. If left empty and the .blend file is saved, the directory defaults to the same folder as the .blend file.

Apply Modifiers

When enabled (default), all modifiers on the mesh are baked into the exported geometry. Disable only if you want to export the base mesh without modifier effects.

File Name Prefix

Text prepended to every exported file name. Default: print_. Example output: print_MyObject.stl.

Export for Printing

Smart export: if the model has been split, exports every object in the "Print Ready Parts" collection as a separate file. Otherwise exports the active mesh object.

Quick Export (STL)

One-click export as STL to the same folder as the .blend file. The button is greyed out if the .blend file has not been saved yet.

Scale correction

The exporter applies a scale factor of unit_scale × 1000. With the recommended scene setup (unit_scale = 0.001), this results in a scale factor of 1.0 — the file is exported at true millimetre size without any re-scaling.

After export, verify the file dimensions in your slicer match the expected measurements. If the model appears 1000× too large or too small, the scene units were not configured correctly — run Fix Scale to Millimeters first and re-export.

6 Operators

All 23 operators are listed below with their Python identifiers, descriptions, and activation requirements. All operators require an active mesh object unless noted as "—".

Operator ID Description Prerequisites
Validate Scale printready.validate_scale Check scene unit system, unit_scale, and object transform for print compatibility. Active mesh
Fix Scale to Millimeters printready.fix_scale Set scene to Metric + unit_scale 0.001, apply object scale. Supports undo. Active mesh
Run All Checks printready.run_health_checks Run all five mesh health checks in a single bmesh session. Stores counts in scene properties. Active mesh
Fix Non-Manifold printready.fix_non_manifold Dissolve degenerate edges + attempt to fill boundary holes (up to 4 sides). Re-runs health check on completion. Active mesh
Fix Normals printready.fix_normals Recalculate all face normals outward-facing. Re-runs health check on completion. Active mesh
Fix Zero Faces printready.fix_zero_faces Delete faces with area < 1×10⁻⁸. Re-runs health check on completion. Active mesh
Fix Loose Vertices printready.fix_loose_verts Delete vertices with no connected edges. Re-runs health check on completion. Active mesh
Fix All Issues printready.fix_all_issues Runs all four fixable repairs in the recommended order (loose verts → zero faces → normals → non-manifold). Supports undo. Active mesh; no shape keys; single-user mesh data
Analyze Thickness printready.analyze_thickness BVHTree ray-cast from each face centre along −normal to measure local wall thickness. Active mesh
Toggle Thickness Overlay printready.toggle_thickness_overlay Show or hide the red/yellow/green thickness heatmap vertex colour attribute. Thickness analysis must have been run
Select Thin Faces printready.select_thin_faces Enter Edit Mode and select all faces below the thickness threshold. Active mesh
Detect Overhangs printready.detect_overhangs Classify faces as overhanging based on world-space normal angle vs the overhang threshold. Active mesh
Toggle Overhang Overlay printready.toggle_overhang_overlay Show or hide the green/yellow/red/blue overhang heatmap vertex colour attribute. Overhang detection must have been run
Select Overhang Faces printready.select_overhangs Enter Edit Mode and select all overhang faces. Active mesh
Suggest Best Orientation printready.suggest_orientation Test six candidate rotations and report the one that minimises overhang face count. Active mesh
Toggle Build Volume printready.toggle_build_volume Toggle the GPU viewport overlay showing the printer's build volume and cut planes. Also callable via the Preview Cuts button. Active mesh
Preview Cuts printready.preview_cuts Toggle the GPU viewport overlay showing the build volume (orange wireframe) and cut planes (red quads) in real time. Updates live as cut settings change. Active mesh
Validate Cuts printready.validate_cuts Check that every piece produced by the current manual cut settings fits within the build volume. Reports the exact gap and cuts involved for any violation. Active mesh; Manual mode
Split Model printready.split_model Bisect model into pieces using bisect_plane + fill. Requires confirmation. Supports undo. Active mesh (confirmation dialog shown)
Undo Split printready.undo_split Delete all parts in "Print Ready Parts" collection and restore the original hidden object. Model must currently be split
Export for Printing printready.export Export active object or all split parts to the configured format and directory. Active mesh; export path set (or .blend file saved)
Quick Export (STL) printready.quick_export Export as STL to the same directory as the current .blend file. Active mesh; .blend file must be saved
Clean Up Print Ready Data printready.cleanup Remove thickness and overhang vertex colour attributes and reset all overlay flags. Supports undo.

7 Parameters

All parameters are stored on scene.print_ready (a PrintReadySettings PropertyGroup). Values persist per-scene for the lifetime of the .blend file.

Printer Profile

PropertyTypeDefaultRangeDescription
printer_presetEnum(first preset)13 options + CustomSelect a printer; triggers auto-fill of all profile fields
printer_typeEnumFDMFDM / RESINPrinter technology; affects min wall thickness recommendations
build_volume_xFloat (mm)256.01.0 – 2000.0Printer build area width
build_volume_yFloat (mm)256.01.0 – 2000.0Printer build area depth
build_volume_zFloat (mm)256.01.0 – 2000.0Printer build area height
nozzle_diameterFloat (mm)0.40.1 – 2.0FDM nozzle diameter; informational reference
min_wall_thicknessFloat (mm)0.80.1 – 10.0Minimum printable wall for this printer; seeds thickness_threshold
layer_heightFloat (mm)0.20.01 – 1.0Default layer height; informational reference

Scale & Units

PropertyTypeDefaultOptionsDescription
target_unitEnumMILLIMETERSMILLIMETERS / CENTIMETERS / INCHESUnit for displaying object dimensions in the panel

Wall Thickness

PropertyTypeDefaultRangeDescription
thickness_thresholdFloat (mm)0.80.01 – 10.0Minimum acceptable wall thickness; auto-set from preset's min_wall_thickness

Overhang

PropertyTypeDefaultRangeDescription
overhang_angleFloat (degrees)45.00.0 – 90.0Threshold angle from horizontal; faces steeper than this value are flagged as overhangs

Model Splitter

PropertyTypeDefaultRange / OptionsDescription
split_modeEnumAUTOAUTO / MANUALWhether cuts are calculated automatically or set manually per-cut
split_axisEnumAUTOX / Y / Z / AUTOAxis to split along (AUTO mode only); AUTO detects overflowing axes automatically
split_countInt22 – 10Number of pieces; in MANUAL mode, determines how many cut controls appear
cut_axis_1–9EnumXX / Y / ZPer-cut axis (MANUAL mode); each cut can use a different axis
cut_pos_1–9Floatvaries0.01 – 0.99Per-cut position as a fraction of the object's extent along that cut's axis
cut_rot_1–9Float0.0−85.0 – 85.0Per-cut tilt angle in degrees; tilts the cut plane away from perpendicular

Export

PropertyTypeDefaultOptionsDescription
export_formatEnumSTLSTL / 3MF / OBJOutput file format
export_pathString (dir)""Any directory pathDestination folder; defaults to .blend file directory if empty
export_apply_modifiersBoolTrueBake all modifiers into exported geometry
export_name_prefixString"print_"Any stringPrefix for exported file names (e.g. print_MyObject.stl)

8 Workflow

The recommended end-to-end workflow for preparing a model for printing. Steps 4–6 are optional depending on your print requirements.

1
Select your mesh object
Click the mesh in the viewport or outliner. All operators operate on the active object.
2
Step 1 — Pick a printer preset
Select from the dropdown. All dimensional values auto-fill including the thickness threshold.
3
Step 2 — Validate & fix scale
Click Validate Scale. If any warnings appear, click Fix Scale to Millimeters. Check that object dimensions read correctly.
4
Step 3 — Check and fix mesh health
Click Run All Checks. If issues are found, click Fix All Issues (or fix individually). Re-run checks until the status reads "Mesh is healthy".
5
Step 4 — Analyze wall thickness optional
Click Analyze Thickness. Toggle the overlay to inspect thin areas. Use Select Thin Faces + Edit Mode to thicken if needed.
6
Step 5 — Check overhangs optional
Click Detect Overhangs. If the overhang count is high, try Suggest Best Orientation or plan to add supports in your slicer.
7
Step 6 — Split if needed optional
If the model overflows the build volume (shown in Step 2), choose AUTO or MANUAL split mode, optionally click Validate Cuts to confirm all pieces fit, then click Split Model. Parts are placed in the "Print Ready Parts" collection.
8
Step 7 — Export
Set export directory and format, then click Export for Printing. Verify dimensions in your slicer before slicing.
9
Clean Up optional
If needed, click Clean Up Print Ready Data to remove thickness/overhang colour attributes and reset overlay flags.

9 Troubleshooting

SymptomCauseSolution
"Mesh has multiple users" The mesh data-block is shared between multiple objects (linked copies) Select the object → press U in the Properties panel → Make Single User → Object & Data, then retry.
"Cannot change topology on mesh with shape keys" Shape keys are present; topology-changing operations would corrupt them Delete shape keys in Properties → Object Data → Shape Keys, or bake them to the basis shape first.
Thickness overlay not visible after toggle Vertex colour attributes are not displayed in the current shading mode Switch viewport shading to Solid, then in the Viewport Shading popover (top-right sphere icon) set Color → Attribute. Also ensure analysis has been run first.
Overhang overlay not visible after toggle Same as thickness overlay — shading mode or analysis not run Run Detect Overhangs first, then enable Solid shading with Color: Attribute.
Quick Export (STL) is greyed out The .blend file has not been saved yet Save the file (Ctrl+S) and the button will become active. Alternatively, use the full Export panel and set a directory manually.
Export fails: "Set an export directory or save the .blend file first" No export path is configured and no .blend file path is available Either save the .blend file, or expand Step 7 and type a path into the Export Directory field.
Self-intersections remain after Fix All Auto-fix for self-intersections is not implemented Fix manually: add a Boolean → Union modifier (Object mode) to merge intersecting regions, or use sculpt tools. Then re-run health checks.
Split produces open edges on a piece Very thin or degenerate geometry at the cut plane cannot be filled cleanly Run Fix Non-Manifold on the affected part. If the problem persists, move the cut position slightly by adjusting build volume size or model placement before splitting.
Model appears 1000× too large or too small in slicer Scene units were not correct at export time Run Fix Scale to Millimeters (Step 2), then re-export. Verify: 1 Blender Unit should equal 1 mm in scene settings.
Build volume preview does not match expected printer size Build volume values in the printer profile do not match In Step 1, re-select the correct printer preset or manually correct Build Volume X/Y/Z. Then re-toggle the preview.
Thickness analysis warns about mesh health issues Non-manifold geometry or self-intersections affect ray-cast accuracy Complete Step 3 (Mesh Health) first to resolve non-manifold edges before running thickness analysis.

10 FAQ

Does it work with Blender 4.2 or earlier?
No. The extension uses Blender's new Extension system introduced in Blender 4.2 and fully supported from 4.5 onward. The blender_manifest.toml file and extension API are not available in older versions. Minimum requirement: Blender 4.5.
Can I use it on NURBS surfaces, curves, or other object types?
No. All operators require a mesh object as the active object. NURBS, curves, metaballs, and other types are not supported. Convert your object to a mesh first using Object → Convert → Mesh.
Can I analyse multiple objects at once?
No. The extension operates on the active object only. To analyse multiple objects, run each step on each object individually by switching the active selection.
Where are the split parts saved?
Split parts are stored as Blender objects inside a "Print Ready Parts" collection in the scene. They are not exported automatically — you must run the Export step to save them to disk. The original object is hidden but preserved until you use Undo Split.
Can I export a model that has not been split?
Yes. If no split has been performed, Export for Printing exports the active mesh object directly. The "Print Ready Parts" collection only affects export when it exists and contains objects.
Will the extension add connectors or interlocking pins to split parts?
Not in v1.0. Interlocking key connectors and alignment pins are planned for v2. Currently split faces are flat — you can add connectors manually or via Blender's Boolean tools after splitting.
Does Fix All fix self-intersections?
No. Self-intersections are detected and reported but not automatically repaired. They require manual geometry editing because automatic resolution would require destructive Boolean operations that may alter the intended shape. Use a Boolean → Union modifier or sculpt tools.
Do the heatmap overlays require a specific viewport shading mode?
Yes. Both the thickness and overhang overlays use Blender's Vertex Color Attributes system. To see them: set viewport shading to Solid, then open the shading popover (the sphere icon in the top-right of the viewport) and set Color → Attribute.
Will scene settings be permanently changed by Fix Scale?
Yes — Fix Scale modifies the scene's Unit System, Unit Scale, and the object's scale transform. These are real changes to the .blend file. The operation supports undo (Ctrl+Z).
Can I use a printer not in the preset list?
Yes. Select Custom from the printer preset dropdown. All fields (build volume, nozzle diameter, wall thickness, layer height) become fully editable. Enter your printer's specs manually.

11 Technical Details

Architecture

The extension is structured as a standard Blender 4.5+ Extension package with a blender_manifest.toml configuration file. All code is pure Python — no external packages, no compiled extensions.

print_ready/
  blender_manifest.toml   ← Extension manifest
  __init__.py             ← Entry point (register/unregister)
  core/
    printer_profiles.py   ← JSON preset loader
    scale_validator.py    ← Unit and transform checks
    mesh_health.py        ← bmesh analysis and repair
    wall_thickness.py     ← BVHTree ray-cast analysis
    overhang_detector.py  ← Face normal angle analysis
    model_splitter.py     ← Bisect-based splitting
    exporter.py           ← STL/3MF/OBJ export
  ui/
    properties.py         ← PrintReadySettings PropertyGroup
    operators.py          ← 23 operators
    panels.py             ← 8 N-panel sub-panels
  data/
    printer_presets.json  ← 13 printer preset definitions

Unit convention

The extension assumes and enforces the convention that 1 Blender Unit = 1 millimetre, achieved by setting the scene's unit_scale = 0.001. All internal mm calculations use:

mm = obj.dimensions[axis] * scene.unit_scale * 1000

The export scale factor is unit_scale × 1000.0 = 1.0, meaning files are exported at true millimetre scale with no rescaling needed.

Mesh operations

All mesh analysis and repair uses Blender's bmesh module. Every bmesh session is wrapped in a try/finally: bm.free() block to prevent memory leaks. The extension never leaves a bmesh instance open on error.

Wall thickness algorithm

For each face in the mesh:

  1. The face's world-space centre point and inverted normal direction are computed
  2. A ray is cast from that point in the -normal direction using BVHTree.ray_cast()
  3. The distance to the first hit is recorded as the local wall thickness
  4. Faces with no hit (boundary faces, outer shells) receive a thickness of 0

Self-intersection detection

Uses BVHTree.overlap(tree) to find all intersecting face pairs, then filters out:

  • Self-pairs (a == b)
  • Duplicate pairs (a > b)
  • Adjacent face pairs (faces sharing an edge) — these overlap by design at their shared boundary

Overhang algorithm

For each face, the world-space normal is compared to the downward direction (0, 0, -1) using a dot product. The angle from horizontal is derived from the dot product result. Faces where this angle exceeds the threshold are classified as overhangs.

Model splitting algorithm

Each cut uses the following sequence:

  1. bmesh.ops.bisect_plane — cuts the mesh at the specified plane
  2. bmesh.ops.edgeloop_fill — fills the open edge loop created by the cut (fallback: triangle_fill for complex loops)
  3. bmesh.ops.remove_doubles — merges any duplicate vertices at the cut
  4. bmesh.ops.recalc_face_normals — ensures outward-facing normals on the new cap face

Vertex colour attributes

  • Name: PrintReady_Thickness and PrintReady_Overhang
  • Type: FLOAT_COLOR, domain: CORNER (per-face-corner storage)
  • Removable via Properties → Object Data → Color Attributes, or via the Clean Up operator

Viewport overlay (GPU draw handler)

Build volume and cut plane previews are rendered using a SpaceView3D GPU draw callback registered via draw_handler_add. The callback runs on every viewport redraw, reads live settings from scene.print_ready, and draws using gpu.shader.from_builtin('UNIFORM_COLOR') and batch_for_shader(). No scene objects are created. The handler is registered by enable_overlay() and removed by disable_overlay() in model_splitter.py.

A bpy.app.handlers.load_post handler in __init__.py resets split_show_preview = False and calls disable_overlay() on file load, preventing stale overlay state after reopening a .blend file.

  • Print Ready Parts — collection holding post-split mesh objects

Properties location

All settings are stored on the Blender Scene object:

bpy.context.scene.print_ready  # → PrintReadySettings

They persist per-scene within the .blend file. Opening a new file resets all values to defaults.