pub mod boundary;
pub mod brkga_packing;
pub mod extreme_point;
pub mod ga_packing;
pub mod geometry;
pub mod packer;
pub mod packing_utils;
pub mod physics;
pub mod sa_packing;
pub mod spatial_index;
pub mod stability;
pub use boundary::Boundary3D;
pub use geometry::Geometry3D;
pub use packer::Packer3D;
pub use physics::{PhysicsConfig, PhysicsResult, PhysicsSimulator};
pub use spatial_index::{Aabb3D, SpatialEntry3D, SpatialIndex3D};
pub use stability::{
PlacedBox, StabilityAnalyzer, StabilityConstraint, StabilityReport, StabilityResult,
};
pub use u_nesting_core::{Config, Error, Placement, Result, SolveResult, Solver, Strategy};
#[cfg(feature = "serde")]
pub fn build_pack3d_response(
result: &SolveResult<f64>,
geometries: &[Geometry3D],
) -> u_nesting_core::api_types::Pack3DResponse {
use std::collections::HashMap;
use u_nesting_core::api_types::{Pack3DResponse, Placement3DResponse, API_VERSION};
use u_nesting_core::geometry::Geometry;
let geom_by_id: HashMap<&str, &Geometry3D> =
geometries.iter().map(|g| (g.id().as_str(), g)).collect();
let placements = result
.placements
.iter()
.map(|p| {
let orientation = geom_by_id
.get(p.geometry_id.as_str())
.map(|g| g.orientation_label(p.rotation_index.unwrap_or(0)))
.unwrap_or_else(|| "xyz".to_string());
Placement3DResponse {
geometry_id: p.geometry_id.clone(),
instance: p.instance,
bin_index: p.boundary_index,
x: p.position.first().copied().unwrap_or(0.0),
y: p.position.get(1).copied().unwrap_or(0.0),
z: p.position.get(2).copied().unwrap_or(0.0),
orientation,
}
})
.collect();
Pack3DResponse {
version: API_VERSION.to_string(),
success: true,
error: None,
placements,
bins_used: result.boundaries_used,
utilization: result.utilization,
unplaced: result.unplaced.clone(),
elapsed_ms: result.computation_time_ms,
}
}