Thanks to visit codestin.com
Credit goes to lib.rs

#dxf #vector-graphics #auto-cad #drawing #cad

acadrust

A pure Rust library for reading and writing CAD files in DXF format (ASCII and Binary)

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

MIT license

1.5MB
31K SLoC

acadrust

Crates.io Documentation License: MIT Rust

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 UnknownEntity with 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.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. 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


Made with ❀️ in Rust

Dependencies

~11MB
~276K SLoC