dstv 0.7.0

DSTV is a Rust library for parsing DSTV files and visualizing the parsed data.
Documentation
# DSTV: A Rust Crate for Parsing DSTV Files and Visualizing as SVG

## Overview

Welcome to the DSTV crate repository! This Rust crate is designed to parse DSTV (NC/NC1) files and visualize them as SVG (Scalable Vector Graphics). DSTV is a format extensively used in the steel industry for exchanging data about steel parts. 

## Features

- **Robust DSTV Parsing:** The DSTV crate can parse DSTV files quickly and accurately, tackling complex or large files with ease.
- **SVG Visualization:** The parsed DSTV data can be converted into SVG for convenient and scalable visualization.
- **High Performance:** Written in Rust, this crate is optimized for high performance and low resource usage.

## Installation

To install DSTV, add it to your `Cargo.toml` file:

```toml
[dependencies]
DSTV = "0.1.0"
```

Then run `cargo build` to download and compile the DSTV crate along with your project.

## Usage

Here's a basic example of how to use DSTV to parse a DSTV file and generate an SVG:

```rust
use dstv::prelude::*;
let dstv = Dstv::from_file("./tests/data/0008-SE0009.nc1");
assert_eq!(dstv.is_ok(), true);
// Declare the dstv as mutable, as `to_svg` will reorder the elements for the
// best representation
let mut dstv = dstv.unwrap();
assert_eq!(dstv.header.order_identification, "PROJECT-1");
let svg = dstv.to_svg();
```

To work with specific element types in a DSTV file, use the DstvElementType enum
to match each element and perform type-specific actions. Once you load the DSTV
file with Dstv::from_file, iterate over dstv.elements and use a match expression
to handle each variant, like OuterBorder, InnerBorder, or Hole, accessing their
unique fields and properties.

Here’s an example:
```rust
let dstv = Dstv::from_file("./tests/data/P1565.nc").unwrap();
for element in dstv.elements {
    match element {
        DstvElementType::OuterBorder(e) => 
        {
            assert!(e.contour.len() > 0);
        },
            DstvElementType::InnerBorder(e) => 
            {
                assert!(e.contour.len() > 0);
            },
            DstvElementType::Cut(e) => 
            {
                assert!(e.nor_vec_x > 0.0);
            },
            DstvElementType::Bend(e) => 
            {
                assert!(e.angle > 0.0);
            },
            DstvElementType::Slot(e) => 
            {
                assert!(e.angle > 0.0);
            },
            DstvElementType::Hole(e) => 
            {
                assert!(e.diameter > 0.0);
            },
            DstvElementType::Numeration(e) => 
            {
                assert_ne!(e.text, "");
            },
    }
}
```

### Examples

#### Single faced plates:
![image](./.images/P2663.svg)

#### Multi facing definitions such as rectangular tubes and U profiles
![image](./.images/SE0008.svg)
![image](./.images/SE0009.svg)

## Contribution

Contributions to the DSTV are welcome. If you find a bug or have a feature request, please open an issue. If you want to contribute code, please open a pull request.

## License

This project is licensed under the MIT License.

## Disclaimer

This library is provided as-is, and while we strive for quality, we cannot guarantee that there will never be any bugs or issues.

## Contact

If you have any questions or comments about DSTV, feel free to contact us.