#![forbid(unsafe_code)]
#![warn(missing_docs)]
pub mod error;
pub mod extension;
pub mod extensions;
#[cfg(feature = "mesh-ops")]
pub mod mesh_ops;
pub mod model;
pub mod opc;
pub mod parser;
#[cfg(feature = "polygon-ops")]
pub mod polygon_clipping;
#[cfg(feature = "polygon-ops")]
pub mod polygon_triangulation;
pub mod streaming;
pub mod validator;
mod writer;
#[cfg(feature = "crypto")]
pub mod decryption;
pub mod key_provider;
pub use error::{Error, Result};
pub use extension::{ExtensionHandler, ExtensionRegistry};
pub use extensions::{
BeamLatticeExtensionHandler, BooleanOperationsExtensionHandler, DisplacementExtensionHandler,
MaterialExtensionHandler, ProductionExtensionHandler, SecureContentExtensionHandler,
SliceExtensionHandler, create_default_registry, register_all_handlers,
};
pub use key_provider::KeyProvider;
#[cfg(feature = "mesh-ops")]
pub use mesh_ops::{
Point2D, SubdivisionMethod, SubdivisionOptions, assemble_contours,
collect_intersection_segments, subdivide, subdivide_simple, triangle_plane_intersection,
};
pub use model::{
AccessRight, BaseMaterial, BaseMaterialGroup, Beam, BeamCapMode, BeamSet, BlendMethod,
BooleanOpType, BooleanRef, BooleanShape, Build, BuildItem, CEKParams, Channel, ColorGroup,
Component, Composite, CompositeMaterials, Consumer, CustomElementHandler, CustomElementResult,
CustomExtensionContext, CustomExtensionInfo, CustomValidationHandler, Disp2DCoords,
Disp2DGroup, Displacement2D, DisplacementMesh, DisplacementTriangle, Extension, FilterMode,
ImplicitVolume, KEKParams, Material, Mesh, MetadataEntry, Model, Multi, MultiProperties,
NormVector, NormVectorGroup, Object, ObjectType, ParserConfig, ProductionInfo, ResourceData,
ResourceDataGroup, Resources, SecureContentInfo, Slice, SlicePolygon, SliceRef, SliceSegment,
SliceStack, SpecConformance, Tex2Coord, Texture2D, Texture2DGroup, Thumbnail, TileStyle,
Triangle, Vertex, Vertex2D, VolumetricBoundary, VolumetricData, VolumetricProperty,
VolumetricPropertyGroup, Voxel, VoxelGrid,
};
use std::io::Read;
impl Model {
pub fn from_reader<R: Read + std::io::Seek>(reader: R) -> Result<Self> {
Self::from_reader_with_config(reader, ParserConfig::with_all_extensions())
}
pub fn from_reader_with_config<R: Read + std::io::Seek>(
reader: R,
config: ParserConfig,
) -> Result<Self> {
parser::parse_3mf_with_config(reader, config)
}
pub fn read_thumbnail<R: Read + std::io::Seek>(reader: R) -> Result<Option<Vec<u8>>> {
parser::read_thumbnail(reader)
}
pub fn to_writer<W: std::io::Write + std::io::Seek>(self, writer: W) -> Result<W> {
let mut xml_buffer = Vec::new();
writer::write_model_xml(&self, &mut xml_buffer)?;
let model_xml = String::from_utf8(xml_buffer)
.map_err(|e| Error::xml_write(format!("Failed to convert XML to UTF-8: {}", e)))?;
opc::create_package(writer, &model_xml)
}
pub fn to_writer_with_registry<W: std::io::Write + std::io::Seek>(
mut self,
writer: W,
registry: &ExtensionRegistry,
) -> Result<W> {
registry.pre_write_all(&mut self)?;
let mut xml_buffer = Vec::new();
writer::write_model_xml(&self, &mut xml_buffer)?;
let model_xml = String::from_utf8(xml_buffer)
.map_err(|e| Error::xml_write(format!("Failed to convert XML to UTF-8: {}", e)))?;
opc::create_package(writer, &model_xml)
}
pub fn write_to_file<P: AsRef<std::path::Path>>(self, path: P) -> Result<()> {
let file = std::fs::File::create(path)?;
self.to_writer(file)?;
Ok(())
}
pub fn write_to_file_with_registry<P: AsRef<std::path::Path>>(
self,
path: P,
registry: &ExtensionRegistry,
) -> Result<()> {
let file = std::fs::File::create(path)?;
self.to_writer_with_registry(file, registry)?;
Ok(())
}
}