pub struct StlImporter;Expand description
Imports binary STL files into 3MF Model structures.
The importer reads binary STL format and creates a single mesh object with ResourceId(1). Vertices are deduplicated using bitwise float comparison during import.
Implementations§
Source§impl StlImporter
impl StlImporter
Sourcepub fn read<R: Read>(reader: R) -> Result<Model>
pub fn read<R: Read>(reader: R) -> Result<Model>
Reads a binary STL file and converts it to a 3MF Model.
§Arguments
reader- Any type implementingReadcontaining binary STL data
§Returns
A Model containing:
- Single mesh object with ResourceId(1) named “STL Import”
- All triangles from the STL file
- Deduplicated vertices (using bitwise float comparison)
- Single build item referencing the mesh object
§Errors
Returns Lib3mfError::Io if:
- Cannot read 80-byte header
- Cannot read triangle count
- Cannot read triangle data (normals, vertices, attribute bytes)
Returns Lib3mfError::Validation if triangle count field cannot be parsed.
§Format Details
- Vertex deduplication: Uses HashMap with bitwise float comparison
[x.to_bits(), y.to_bits(), z.to_bits()]as key. Only exactly identical vertices (bitwise) are merged. - Normal vectors: Read from STL but ignored (not stored in Model).
- Attribute bytes: Read but ignored (2-byte field after each triangle).
§Examples
use lib3mf_converters::stl::StlImporter;
use std::fs::File;
let file = File::open("cube.stl")?;
let model = StlImporter::read(file)?;
// Access the imported mesh
let obj = model.resources.get_object(lib3mf_core::model::resources::ResourceId(1))
.expect("STL import creates object with ID 1");
if let lib3mf_core::model::Geometry::Mesh(mesh) = &obj.geometry {
println!("Imported {} vertices, {} triangles",
mesh.vertices.len(), mesh.triangles.len());
}Trait Implementations§
Auto Trait Implementations§
impl Freeze for StlImporter
impl RefUnwindSafe for StlImporter
impl Send for StlImporter
impl Sync for StlImporter
impl Unpin for StlImporter
impl UnwindSafe for StlImporter
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more