BinaryStlExporter

Struct BinaryStlExporter 

Source
pub struct BinaryStlExporter;
Expand description

Exports 3MF Model structures to binary STL files.

The exporter flattens all mesh objects referenced in build items into a single STL file, applying build item transformations to vertex coordinates.

This was previously named StlExporter. If you were using StlExporter, update your code to use BinaryStlExporter.

Implementations§

Source§

impl BinaryStlExporter

Source

pub fn write<W: Write>(model: &Model, writer: W) -> Result<()>

Writes a 3MF Model to binary STL format.

§Arguments
  • model - The 3MF model to export
  • writer - Any type implementing Write to receive STL data
§Returns

Ok(()) on successful export.

§Errors

Returns Lib3mfError::Io if any write operation fails.

§Format Details
  • Header: 80 zero bytes (standard for most STL files)
  • Normals: Written as (0, 0, 0) - viewers must compute face normals
  • Transformations: Build item transforms are applied to vertex coordinates
  • Attribute bytes: Written as 0 (no extended attributes)
§Behavior
  • Only mesh objects from model.build.items are exported
  • Non-mesh geometries (Components, BooleanShape, etc.) are skipped
  • Each build item’s transformation matrix is applied to its mesh vertices
  • All triangles from all build items are combined into a single STL file
§Examples
use lib3mf_converters::stl::BinaryStlExporter;
use lib3mf_core::model::Model;
use std::fs::File;

let output = File::create("exported.stl")?;
BinaryStlExporter::write(&model, output)?;
println!("Model exported successfully");
Source

pub fn write_with_resolver<W: Write, A: ArchiveReader>( model: &Model, resolver: PartResolver<'_, A>, writer: W, ) -> Result<()>

Writes a 3MF Model to binary STL format with support for multi-part 3MF files.

This method extends write by recursively resolving component references and external model parts using a PartResolver. This is necessary for 3MF files with the Production Extension that reference objects from external model parts.

§Arguments
  • model - The root 3MF model to export
  • resolver - A PartResolver for loading external model parts from the 3MF archive
  • writer - Any type implementing Write to receive STL data
§Returns

Ok(()) on successful export.

§Errors

Returns Lib3mfError::Io if any write operation fails.

Returns errors from the resolver if external parts cannot be loaded.

§Behavior
  • Recursively resolves component hierarchies using the PartResolver
  • Follows external references via component path attributes
  • Applies accumulated transformations through the component tree
  • Flattens all resolved meshes into a single STL file
§Examples
use lib3mf_converters::stl::BinaryStlExporter;
use lib3mf_core::archive::ZipArchiver;
use lib3mf_core::model::resolver::PartResolver;
use std::fs::File;

let archive_file = File::open("multipart.3mf")?;
let mut archiver = ZipArchiver::new(archive_file)?;
let resolver = PartResolver::new(&mut archiver, model.clone());

let output = File::create("output.stl")?;
BinaryStlExporter::write_with_resolver(&model, resolver, output)?;

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V