use crate::feature_pipeline::features::common;
use crate::feature_pipeline::sheet_metal;
use crate::feature_pipeline::{FeatureContext, FeatureResult};
pub fn execute(ctx: &FeatureContext) -> FeatureResult {
match build(ctx) {
Ok(result) => result,
Err(error) => ctx.fail(error),
}
}
fn build(ctx: &FeatureContext) -> Result<FeatureResult, String> {
let Some(body_name) = ctx
.param("sheet")
.and_then(|v| v.as_array())
.and_then(|a| a.iter().find_map(|e| e.as_str().map(str::to_string)))
else {
return Ok(FeatureResult::empty(ctx.id.clone(), ctx.feature_type.clone()));
};
let Some(handle) = ctx.scene.resolve_solid(&body_name) else {
let mut result = FeatureResult::empty(ctx.id.clone(), ctx.feature_type.clone());
result.unresolved.push(body_name);
return Ok(result);
};
let Some(tree) = sheet_metal::get_tree(handle) else {
return Err("sheet-metal unfold: target is not a sheet-metal body".into());
};
let mut flat = sheet_metal::evaluate(&tree, 0.0)?;
common::namespace_copy_names(&mut flat, &ctx.id);
let added = common::register_added(flat, &ctx.id);
sheet_metal::put_tree(added.handle, tree);
let mut result = FeatureResult::empty(ctx.id.clone(), ctx.feature_type.clone());
result.added.push(added);
Ok(result)
}