DXF Generation from Python ezdxf vs CAD Projection Workflows: A Complete Comparison

The text-to-cad repository provides two distinct pipelines for converting CAD data into visual outputs: build_dxf_render_payload in skills/dxf/scripts/dxf/render_payload.py extracts 2-D entities from DXF files into JSON, while the snapshot CLI in skills/cad/scripts/snapshot/__main__.py applies projection matrices and view modifiers to full 3-D models.

Both workflows ultimately feed into the same viewer-side rendering engine (packages/implicitjs), but they serve fundamentally different use cases. Understanding when to use DXF generation from Python ezdxf sources versus CAD projection workflows helps you choose the right entry point for your application.


How DXF Generation with ezdxf Works

The DXF generation pipeline specializes in parsing legacy 2-D CAD files and converting them into a lightweight, viewer-ready JSON format. This path is ideal when you're working with flat drawings, laser-cutting profiles, or sheet-metal layouts.

Core Processing Steps in render_payload.py

The build_dxf_render_payload function in skills/dxf/scripts/dxf/render_payload.py executes a seven-stage pipeline:

  1. File ingestion — ezdxf.readfile loads the DXF into a Document object.
  2. Entity filtering — _load_dxf_entities scans document.modelspace() for SUPPORTED_ENTITY_TYPES: LINE, ARC, CIRCLE, and LWPOLYLINE.
  3. Layer normalization — _normalize_layer_name ensures valid layer strings, while _semantic_kind_for_layer tags layers as bend or cut based on naming conventions.
  4. Bounds calculation — Per-entity functions (_line_bounds, _arc_bounds, _circle_bounds) compute axis-aligned boxes, merged via _expand_bounds into global raw_bounds.
  5. Coordinate transformation — _screen_point inverts the Y-axis (CAD Y-up → screen Y-down) using the computed min/max extents.
  6. Path generation — Lines become "M x y L x y" strings; arcs convert to SVG-compatible "A rx ry 0 largeArcFlag sweepFlag x y" commands with proper sweep direction handling.
  7. Payload assembly — Final output includes schemaVersion, fileRef, bounds, counts, layers, raw geometry, and render-ready paths and circles.

All numeric values are rounded to six decimal places via _format_number. The function raises ValueError for unsupported entities or empty geometry.

Practical DXF Generation Example

from pathlib import Path
from skills.dxf.scripts.dxf.render_payload import build_dxf_render_payload

# Path to a DXF file on disk

dxf_path = Path("models/example.dxf")

# Build the JSON payload the viewer expects

payload = build_dxf_render_payload(dxf_path, file_ref="example.dxf")

# Access extracted data

print(payload["bounds"])  # Axis-aligned bounding box

print(f"Found {payload['counts']['paths']} path records")

This payload can be sent directly to the viewer API or cached for offline rendering. No camera manipulation or projection matrices are involved—the JSON describes pure 2-D geometry.


How CAD Projection Workflows Function

The CAD projection workflow operates on full 3-D scenes—STEP, URDF, GLB, and other formats—giving you explicit control over viewing parameters before rasterization.

Snapshot CLI Architecture

The entry point at skills/cad/scripts/snapshot/__main__.py processes a DISPLAY_OPTION_KEYS configuration set:

DISPLAY_OPTION_KEYS = {"projection", "mode", "clip", "exploded", "edges"}

Each key modifies the rendering pipeline:

  • projection — Selects "orthographic" or "perspective"; the implicit CAD runtime (packages/implicitjs) constructs the corresponding matrix.
  • mode — Sets shading style: solid, rendered, wireframe, etc.
  • clip — Defines near/far clipping planes.
  • exploded — Enables exploded views with enabled, axis, and spacing parameters.
  • edges — Overrides edge coloring for technical illustrations.

Running the Snapshot CLI with Projection Settings


# Capture a rendered orthographic snapshot with exploded view

text-to-cad cad snapshot \
    --input models/assembly.step \
    --display '{"projection":"orthographic","mode":"rendered","exploded":{"enabled":true,"axis":"z","spacing":1.5}}' \
    --output snapshots/assembly_ortho.png

Behind the scenes:

  1. The CLI validates and parses the JSON display configuration.
  2. The implicit CAD runtime loads assembly.step into a scene graph.
  3. The orthographic projection matrix is applied, parts are displaced along Z per exploded settings, and the renderer executes a rasterization pass.
  4. Output is written to snapshots/assembly_ortho.png alongside a JSON job description recording the display settings.

Key Differences: ezdxf vs CAD Projection

Dimension DXF Generation (ezdxf) CAD Projection Workflow
Input format DXF files only STEP, URDF, GLB, and others
Dimensionality 2-D entities (LINE, ARC, CIRCLE, LWPOLYLINE) Full 3-D scenes with meshes and assemblies
Camera control None—geometry passes through verbatim Explicit projection, clip, exploded controls
Output type JSON payload for viewer consumption Raster images (PNG) or vector exports (GLB, STL, DXF)
Key file skills/dxf/scripts/dxf/render_payload.py skills/cad/scripts/snapshot/__main__.py
Use case Laser profiles, sheet-metal layouts, legacy drawing ingestion Assembly visualization, technical documentation, 3-D presentation

Choosing Between the Two Approaches

Select DXF generation from Python ezdxf sources when:

  • Your source data is already in DXF format.
  • You need fast, lightweight extraction of 2-D paths without camera manipulation.
  • You're building workflows for CNC, laser cutting, or vinyl cutting where exact geometry matters more than visual presentation.

Select CAD projection workflows when:

  • You're working with 3-D assemblies or parametric models.
  • You need explicit control over viewing angle, projection type, or exploded states.
  • Your output requirements include rendered images or multi-format exports.

Both paths converge on the packages/implicitjs rendering runtime, so you can migrate from lightweight DXF display to full 3-D projection without changing your downstream viewer integration.


Summary

  • build_dxf_render_payload in skills/dxf/scripts/dxf/render_payload.py parses DXF files using ezdxf, normalizes layers and bounds, and emits viewer-ready JSON with SVG-style paths.
  • The snapshot CLI in skills/cad/scripts/snapshot/__main__.py configures 3-D projection matrices, clipping, and view modifiers before rasterizing STEP/URDF/GLB inputs.
  • Shared runtime: Both feed packages/implicitjs, enabling consistent rendering regardless of entry point.
  • Entity limitations: The ezdxf path only handles LINE, ARC, CIRCLE, and LWPOLYLINE; unsupported entities raise ValueError.
  • Precision: DXF coordinates are rounded to six decimal places; CAD projection preserves full floating-point precision through the render pipeline.

Frequently Asked Questions

Can I convert a DXF file using the CAD projection workflow?

No—CAD projection workflows require 3-D model formats like STEP, URDF, or GLB. For DXF files, use build_dxf_render_payload in skills/dxf/scripts/dxf/render_payload.py instead. The DXF pipeline is purpose-built for 2-D entity extraction and lightweight JSON generation.

What happens if my DXF contains unsupported entities?

The build_dxf_render_payload function raises ValueError when encountering entities outside SUPPORTED_ENTITY_TYPES (LINE, ARC, CIRCLE, LWPOLYLINE). Pre-process your DXF in a CAD application to convert splines, text, or dimensions into supported primitives, or extend the entity handlers in render_payload.py.

How do I switch between orthographic and perspective views in the snapshot CLI?

Pass a JSON display string with the projection key set to "orthographic" or "perspective". For example: --display '{"projection":"perspective","mode":"rendered"}'. The implicit CAD runtime automatically constructs the appropriate projection matrix and applies it to the loaded scene.

Where does the actual rendering happen?

Both pipelines ultimately invoke packages/implicitjs, the viewer-side rendering engine. DXF-generated JSON feeds directly into this runtime as pre-computed paths, while the snapshot CLI configures the runtime's camera and scene graph before triggering a render pass.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →