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.10 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 \
--encoding cp932 --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
TABLEScontains LAYER, LTYPE, and STYLE records from IR tables.- GENERIC dimensions expand to their preserved visual primitives by default.
- R12 declares
$DWGCODEPAGE=ANSI_932and file output uses CP932 by default; LWPOLYLINE becomes POLYLINE/VERTEX, MTEXT becomes TEXT, ELLIPSE/SPLINE become sampled polylines, and HATCH becomes 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
constraintsare IR-only and are diagnosed when omitted from DXF.- A complete affine
INSERT.transformcannot be represented by plain DXF INSERT and is diagnosed when omitted. - R12 has no true-color, lineweight, or
$INSUNITSequivalent 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cad2d_ir-0.6.0.tar.gz.
File metadata
- Download URL: cad2d_ir-0.6.0.tar.gz
- Upload date:
- Size: 59.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11115bb9703b3898fe778eb04257c6a13e354a74eb813df8e10528d958dd07fd
|
|
| MD5 |
46828ddefa7a35abe09dae31d094318c
|
|
| BLAKE2b-256 |
937cb6bec41b5619546a773949e999dd966ce7528223131942fd49299052423a
|
File details
Details for the file cad2d_ir-0.6.0-py3-none-any.whl.
File metadata
- Download URL: cad2d_ir-0.6.0-py3-none-any.whl
- Upload date:
- Size: 68.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a71e3dd6d37cbf934991d580c9056da19007e305ec5ffa99fb7fae8594660346
|
|
| MD5 |
1eb5f62d2d5286b25202df8feff74c89
|
|
| BLAKE2b-256 |
5a6a3cc3971b02d89ac9c99ac65dc96c74c8c9f4d80923ad477499a86c1aef73
|