use crate::topology::{
BrepSolid, CoedgeRecord, EdgeRecord, FaceRecord, LoopRecord, ShellRecord, VertexRecord,
};
use crate::{
build_pcurve_on_surface_range, make_arc, make_extrusion, make_hyperbola, make_line,
make_parabola, make_plane, make_revolution, offset_surface, transform_brep, AffineTransform,
NurbsCurve, NurbsSurface, Vec3, Vec4,
};
use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet};
use std::collections::VecDeque;
const TAU: f64 = std::f64::consts::TAU;
mod parse;
mod supplied;
mod bodies;
mod assembly;
mod assembly_pmi;
mod mapped;
mod builder;
mod geometry;
mod styles;
mod pmi;
mod precision;
mod trim_readings;
use crate::appearance::{BodyAppearance, ImportedColor};
use parse::*;
use supplied::*;
use bodies::*;
use mapped::*;
use builder::*;
use geometry::*;
use styles::*;
pub use assembly::{read_step_assembly, StepAssembly, StepOccurrence, StepProduct};
pub use assembly_pmi::{occurrence_ref_parts, rewrite_occurrence_refs, OCCURRENCE_REF_PREFIX};
pub use mapped::StepMappedItemError;
pub use pmi::read_step_pmi;
pub use precision::STATED_PRECISION_INCONSISTENCY_RATIO;
pub use trim_readings::{
import_step_trim_readings, StepBodyTrimReadings, StepEdgeReading, StepFaceReading,
StepSuppliedTrim, StepTrimReadings,
};
pub(crate) use pmi::decode_step_text as decode_step_text_for_tests;
pub fn import_step(text: &str) -> Result<Vec<BrepSolid>, String> {
Ok(import_step_with_appearance(text)?.0)
}
pub fn import_step_with_appearance(
text: &str,
) -> Result<(Vec<BrepSolid>, Vec<BodyAppearance>), String> {
let imported = collect_step_solids(text)?;
if imported.solids.is_empty() {
return Err(imported.first_error.unwrap_or_else(|| {
"step_import: no MANIFOLD_SOLID_BREP/FACETED_BREP/BREP_WITH_VOIDS body imported (unsupported or invalid representation)"
.into()
}));
}
Ok((imported.solids, imported.appearances))
}
#[derive(Clone, Debug)]
pub struct StepImportReport {
pub solids: Vec<BrepSolid>,
pub failed: usize,
pub first_error: Option<String>,
pub stated_precisions_mm: Vec<f64>,
pub diagnostics: crate::KernelDiagnostics,
}
pub fn import_step_report(text: &str) -> Result<StepImportReport, String> {
let imported = collect_step_solids(text)?;
let diagnostics =
precision::stated_precision_diagnostics(&imported.stated_precisions_mm, &imported.solids);
Ok(StepImportReport {
solids: imported.solids,
failed: imported.failed,
first_error: imported.first_error,
stated_precisions_mm: imported.stated_precisions_mm,
diagnostics,
})
}