Skip to main content

Intermediate representation (IR) and importers for 2D CAD formats

Project description

cad2d-ir

cad2d-ir is a typed intermediate representation and conversion toolkit for 2D CAD data.

It provides:

  • a canonical JSON Schema for 2D CAD geometry and tables;
  • native DXF, DWG, JWW, and SXF import paths;
  • DXF R12 (AC1009) and R2010 (AC1024) export;
  • structured import/export diagnostics;
  • deterministic IR-entity to DXF-handle correspondence.

Installation

pip install cad2d-ir
pip install "cad2d-ir[dwg]"
pip install "cad2d-ir[jww]"
pip install "cad2d-ir[sxf]"
pip install "cad2d-ir[all]"

Python 3.13 or newer is required. The core wheel is pure Python; native format adapters are optional extras.

For development:

uv sync
uv sync --all-extras
uv run python -m pytest

Supported data

IR entities include LINE, CIRCLE, ARC, POINT, ELLIPSE, LWPOLYLINE, SPLINE, TEXT, MTEXT, INSERT, HATCH, and DIMENSION. Layer, linetype, text-style, dimension-style, and block tables are represented by the schema.

Import adapters:

Format Path Dependency
DXF built-in parser core
DWG native ezdwg model cad2d-ir[dwg]
JWW native ezjww model cad2d-ir[jww]
SXF SFC/P21 backend-neutral ezsxf drawing cad2d-ir[sxf]

Native adapters preserve source semantics and provenance rather than flattening through an intermediate DXF.

CLI

# Validate IR
cad2d-ir validate examples/ir/minimal.json

# DXF -> IR with BOM/codepage/UTF-8/CP932 detection
cad2d-ir dxf2ir drawing.dxf -o drawing.json --pretty
cad2d-ir dxf2ir drawing.dxf --encoding cp932 -o drawing.json

# Auto-detected DXF/DWG/JWW/SFC/P21 -> IR
cad2d-ir import drawing.JWW -o drawing.json --pretty
cad2d-ir import drawing.dwg -o drawing.json --pretty
cad2d-ir import drawing.p21 -o drawing.json --pretty

# IR -> R2010 or R12 DXF
cad2d-ir ir2dxf drawing.json --target-version AC1024 -o drawing-r2010.dxf
cad2d-ir ir2dxf drawing.json --target-version AC1009 \
  --curve-segments 128 -o drawing-r12.dxf

Python API

from cad2d_ir import convert_file_to_ir, convert_ir_to_dxf_text

imported = convert_file_to_ir("drawing.dxf", strict=False)
print(imported.statistics["encoding"])
for diagnostic in imported.diagnostics:
    print(diagnostic.code, diagnostic.as_dict())

exported = convert_ir_to_dxf_text(
    imported.document,
    target_version="AC1024",
    generic_dimensions="explode",
)
for entry in exported.entity_map:
    print(entry["ir_id"], entry["handle"], entry["dxf_type"])

R2010 output assigns deterministic handles and emits $HANDSEED. Re-importing the DXF records each handle in entity.source.id. R12 omits handles and retains deterministic index values in the entity map.

Export behavior

  • TABLES contains LAYER, LTYPE, and STYLE records from IR tables.
  • GENERIC dimensions expand to their preserved visual primitives by default.
  • R12 converts LWPOLYLINE to POLYLINE/VERTEX, MTEXT to TEXT, ELLIPSE/SPLINE to sampled polylines, and HATCH to boundary polylines.
  • Every skip, approximation, explosion, and normalization is represented by an ExportDiagnostic.
  • The same document and options produce byte-identical DXF and entity-map output within a package minor version.

Compatibility boundaries

  • constraints are IR-only and are diagnosed when omitted from DXF.
  • A complete affine INSERT.transform cannot be represented by plain DXF INSERT and is diagnosed when omitted.
  • R12 has no true-color, lineweight, or $INSUNITS equivalent with the same semantics; downgrade diagnostics disclose those losses.
  • HATCH support focuses on polyline-style loops.
  • Ellipse start/end parameters are radians independently of header.angle_unit.

See:

Repository layout

src/cad2d_ir/
  api.py
  cli.py
  diagnostics.py
  schema.py
  codecs/dxf.py
  importers/
  data/ir_schema.json
ir_schema.json
tests/
examples/
docs/

License

MIT (LICENSE).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cad2d_ir-0.3.0.tar.gz (58.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cad2d_ir-0.3.0-py3-none-any.whl (67.0 kB view details)

Uploaded Python 3

File details

Details for the file cad2d_ir-0.3.0.tar.gz.

File metadata

  • Download URL: cad2d_ir-0.3.0.tar.gz
  • Upload date:
  • Size: 58.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.15

File hashes

Hashes for cad2d_ir-0.3.0.tar.gz
Algorithm Hash digest
SHA256 bf9765a5a0bf52a942949255486ac9abdfd9632ef05e0efa8e54e5e0560b9425
MD5 8bcaa5f26c9e51ed309e2732d01e7b65
BLAKE2b-256 2d1b5a137ce252dcee8aa1fdfd95d023b68f6a3ca1b65e188b643695b448cb94

See more details on using hashes here.

File details

Details for the file cad2d_ir-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: cad2d_ir-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 67.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.15

File hashes

Hashes for cad2d_ir-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0ac01529c69387ffa5ee1124475d592329d012d31923b91eb969d46fb0d398bb
MD5 6034196e97b07403322ac4520ab3171e
BLAKE2b-256 01c25697b656953561d4d276cdd2fa5c1814be7abc559e64b47ec5abd674e8cb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page