5 releases
| 0.1.8 | Feb 9, 2026 |
|---|---|
| 0.1.7 | Feb 9, 2026 |
| 0.1.6 | Feb 9, 2026 |
| 0.1.5 | Feb 9, 2026 |
| 0.1.4 | Feb 7, 2026 |
#601 in Parser implementations
1.5MB
31K
SLoC
acadrust
A pure Rust library for reading and writing CAD drawing exchange files (DXF).
acadrust provides comprehensive support for the DXF file format with a focus on correctness, type safety, and completeness. Inspired by ACadSharp, this library brings full-featured DXF file manipulation to the Rust ecosystem.
β¨ Features
Core Capabilities
- π Read & Write β Full support for both ASCII and Binary DXF formats
- π Type Safe β Leverages Rust's type system with strongly-typed entities, tables, and objects
- π Encoding Support β Automatic code page detection and character encoding for pre-2007 files (~40 code pages via
encoding_rs) - π‘οΈ Failsafe Mode β Optional error-tolerant parsing that collects diagnostics instead of aborting
- π Notifications β Structured diagnostic system reporting unsupported elements, warnings, and errors
- π Handle Resolution β Automatic owner handle assignment and handle tracking after read
- β Unknown Entity Preservation β Unrecognized entity types are preserved as
UnknownEntitywith common fields intact
File Version Support
| Version Code | AutoCAD Version |
|---|---|
| AC1012 | R13 |
| AC1014 | R14 |
| AC1015 | 2000 |
| AC1018 | 2004 |
| AC1021 | 2007 (UTF-8) |
| AC1024 | 2010 |
| AC1027 | 2013 |
| AC1032 | 2018+ |
Supported Entity Types (38)
Click to expand full entity list
Basic Entities
- Point β Single point in 3D space
- Line β Line segment between two points
- Circle β Circle defined by center and radius
- Arc β Circular arc with start and end angles
- Ellipse β Ellipse or elliptical arc
Polylines
- Polyline β 2D polyline with optional bulge
- Polyline3D β 3D polyline
- LwPolyline β Lightweight polyline (optimized 2D)
- PolyfaceMesh β 3D mesh defined by vertices and faces
- PolygonMesh β 3D polygon surface mesh (MΓN grid)
Text & Annotations
- Text β Single-line text
- MText β Multi-line formatted text
- AttributeDefinition β Block attribute template
- AttributeEntity β Block attribute instance
- Tolerance β Geometric tolerancing symbols
Dimensions & Leaders
- Dimension β Various dimension types (linear, angular, radial, etc.)
- Leader β Leader line with annotation
- MultiLeader β Modern multi-leader with advanced formatting
- Table β Table with cells, rows, and columns
Complex Entities
- Spline β NURBS curve
- Hatch β Filled region with pattern
- Solid β 2D filled polygon
- Face3D β 3D triangular/quadrilateral face
- Mesh β Subdivision mesh surface
Blocks & References
- Block / BlockEnd β Block definition markers
- Insert β Block reference (instance)
- Seqend β Sequence end marker for complex entities
Construction Geometry
- Ray β Semi-infinite line
- XLine β Infinite construction line
Advanced Entities
- Viewport β Paper space viewport
- RasterImage β Embedded or linked raster image
- Solid3D β 3D solid with ACIS data
- Region β 2D region with ACIS data
- Body β 3D body with ACIS data
- MLine β Multi-line with style
- Wipeout β Masking region
- Shape β Shape reference
- Underlay β PDF/DWF/DGN underlay reference
- Ole2Frame β OLE 2.0 embedded object
- UnknownEntity β Preserves common fields for unrecognized entity types
Table System
Complete support for all standard tables:
| Table | Description |
|---|---|
| Layer | Drawing layers with color, linetype, and visibility |
| LineType | Line patterns and dash definitions |
| TextStyle | Font and text formatting settings |
| DimStyle | Dimension appearance and behavior |
| BlockRecord | Block definition registry |
| AppId | Application identifier registry |
| View | Named view configurations |
| VPort | Viewport configurations |
| UCS | User coordinate system definitions |
Objects (Non-Graphical Elements)
- Dictionary / DictionaryWithDefault β Key-value storage for objects
- DictionaryVariable β Named variable in a dictionary
- Group β Named entity collections
- Layout β Model/paper space layout definitions
- MLineStyle β Multi-line style definitions
- MultiLeaderStyle β Multi-leader style definitions
- TableStyle β Table formatting styles
- PlotSettings β Print/plot configurations
- Scale β Annotation scale definitions
- ImageDefinition / ImageDefinitionReactor β Raster image definitions and reactors
- XRecord β Extended data records
- SortEntitiesTable β Entity draw order
- VisualStyle β 3D visual style definitions
- Material β Material definitions
- GeoData β Geolocation data
- SpatialFilter β Spatial clipping filter
- RasterVariables β Raster display settings
- BookColor β Color book (DBCOLOR) entries
- PlaceHolder β Placeholder objects
- WipeoutVariables β Wipeout display settings
CLASSES Section
Full support for the CLASSES section β reading, storing, and writing DXF class definitions with all standard fields (class name, DXF name, application name, proxy flags, instance count).
Extended Data (XData)
Full support for application-specific extended data:
- String, binary, and numeric values
- 3D points, directions, and displacements
- Layer references and database handles
- Nested data structures with control strings
Reactors & Extension Dictionaries
Full support for entity/object reactor chains (group code 102 {ACAD_REACTORS}) and extension dictionaries ({ACAD_XDICTIONARY}), read and written for all entity and object types.
π¦ Installation
Add acadrust to your Cargo.toml:
[dependencies]
acadrust = "0.1.8"
Or install via cargo:
cargo add acadrust
π Quick Start
Reading a DXF File
use acadrust::{CadDocument, DxfReader};
fn main() -> acadrust::Result<()> {
// Open and read a DXF file
let doc = DxfReader::from_file("drawing.dxf")?.read()?;
// Access document properties
println!("Version: {:?}", doc.header().version);
// Iterate over entities in model space
for entity in doc.entities() {
println!("Entity: {:?}", entity);
}
// Check parse notifications
for note in doc.notifications.iter() {
println!("[{:?}] {}", note.level, note.message);
}
Ok(())
}
Reading with Failsafe Mode
use acadrust::{DxfReader};
use acadrust::io::dxf::DxfReaderConfiguration;
fn main() -> acadrust::Result<()> {
let config = DxfReaderConfiguration { failsafe: true };
let doc = DxfReader::from_file("drawing.dxf")?
.with_configuration(config)
.read()?;
// Even if some sections had errors, the document is partially populated
println!("Entities read: {}", doc.entities().len());
println!("Notifications: {}", doc.notifications.len());
Ok(())
}
Writing a DXF File
use acadrust::{CadDocument, DxfWriter, Line, Layer, Vector3};
fn main() -> acadrust::Result<()> {
// Create a new document
let mut doc = CadDocument::new();
// Add a layer
let layer = Layer::new("MyLayer");
doc.layers_mut().add(layer)?;
// Create and add a line
let line = Line {
start: Vector3::new(0.0, 0.0, 0.0),
end: Vector3::new(100.0, 100.0, 0.0),
..Default::default()
};
doc.add_entity(line);
// Write to file
DxfWriter::new(&doc).write_to_file("output.dxf")?;
Ok(())
}
Working with Layers
use acadrust::{CadDocument, Layer, Color};
fn main() -> acadrust::Result<()> {
let mut doc = CadDocument::new();
// Create a custom layer
let mut layer = Layer::new("Annotations");
layer.color = Color::from_index(1); // Red
layer.is_frozen = false;
layer.is_locked = false;
doc.layers_mut().add(layer)?;
// Access existing layers
if let Some(layer) = doc.layers().get("0") {
println!("Default layer color: {:?}", layer.color);
}
Ok(())
}
Creating Complex Entities
use acadrust::{CadDocument, LwPolyline, LwVertex, Vector2, Circle, Arc};
fn main() -> acadrust::Result<()> {
let mut doc = CadDocument::new();
// Create a rectangle using LwPolyline
let mut polyline = LwPolyline::new();
polyline.vertices = vec![
LwVertex { position: Vector2::new(0.0, 0.0), ..Default::default() },
LwVertex { position: Vector2::new(100.0, 0.0), ..Default::default() },
LwVertex { position: Vector2::new(100.0, 50.0), ..Default::default() },
LwVertex { position: Vector2::new(0.0, 50.0), ..Default::default() },
];
polyline.is_closed = true;
doc.add_entity(polyline);
// Create a circle
let circle = Circle {
center: Vector3::new(50.0, 25.0, 0.0),
radius: 10.0,
..Default::default()
};
doc.add_entity(circle);
Ok(())
}
ποΈ Architecture
acadrust uses a trait-based design for maximum flexibility and extensibility:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CadDocument β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β βββββββββββββββ ββββββββββββββββ βββββββββββββββββββββββ β
β β Header β β Tables β β Entities β β
β β Variables β β β β β β
β βββββββββββββββ β - Layers β β - Lines, Circles β β
β β - LineTypes β β - Polylines, Arcs β β
β βββββββββββββββ β - Styles β β - Text, Dimensions β β
β β Blocks β β - DimStyles β β - Hatches, Splines β β
β β β β - VPorts β β - 3D, Mesh, Images β β
β βββββββββββββββ ββββββββββββββββ βββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββ β
β β Objects β β Notifications β β
β β Dictionaries, Groups, Styles, β β Warnings, Errorsβ β
β β Layouts, XRecords, Materials β β Diagnostics β β
β ββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Classes ββ
β β DXF class definitions (name, app, proxy flags, count) ββ
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Core Traits
| Trait | Purpose |
|---|---|
Entity |
Base trait for all graphical entities |
TableEntry |
Base trait for table entries (layers, styles, etc.) |
CadObject |
Common interface for all CAD objects |
Key Types
| Type | Description |
|---|---|
CadDocument |
Central document container |
DxfReader |
DXF file reader (ASCII and binary) |
DxfWriter |
DXF file writer |
DxfReaderConfiguration |
Reader options (failsafe mode) |
Handle |
Unique object identifier |
Vector2 / Vector3 |
2D and 3D coordinate types |
Color |
CAD color (indexed or true color) |
LineWeight |
Line thickness enumeration |
Transform |
Transformation matrices |
NotificationCollection |
Parse diagnostics and warnings |
βοΈ Dependencies
acadrust is built on a foundation of high-quality Rust crates:
| Crate | Purpose |
|---|---|
thiserror / anyhow |
Error handling |
nom |
Parser combinators for binary parsing |
byteorder |
Cross-platform byte order handling |
flate2 |
Compression/decompression |
nalgebra |
Linear algebra and transformations |
indexmap |
Ordered hash maps |
rayon |
Parallel iterators |
encoding_rs |
Character encoding support |
bitflags |
Type-safe bitflags |
π§ͺ Testing
Run the test suite:
# Run all tests
cargo test
# Run with output
cargo test -- --nocapture
# Run specific test
cargo test test_read_minimal_dxf
Run benchmarks:
cargo bench
οΈ Roadmap
- ASCII DXF read/write
- Binary DXF read/write
- Full entity, table, and object coverage
- CLASSES section support
- Character encoding / code page support
- Failsafe (error-tolerant) reading mode
- Unknown entity preservation
- Full DWG binary format support
- Geometric operations (offset, trim, extend)
- SVG/PDF export
- Spatial indexing for large drawings
π€ Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Setup
# Clone the repository
git clone https://github.com/hakanaktt/acadrust.git
cd acadrust
# Build the project
cargo build
# Run tests
cargo test
# Check formatting
cargo fmt --check
# Run clippy
cargo clippy
π License
This project is licensed under the MIT License - see the LICENSE file for details.
π Acknowledgments
- ACadSharp - The C# library that inspired this project
- The Rust community for excellent tooling and libraries
- All contributors who help improve this library
π Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Made with β€οΈ in Rust
Dependencies
~11MB
~276K SLoC