use crate::feature_pipeline::features::{common, transform_bake};
use crate::feature_pipeline::{FeatureContext, FeatureResult};
use crate::{make_box_brep, Vec3};
const FACE_SUFFIX: [&str; 6] = ["_NZ", "_PZ", "_NY", "_PY", "_NX", "_PX"];
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 size_x = ctx.number("sizeX")?;
let size_y = ctx.number("sizeY")?;
let size_z = ctx.number("sizeZ")?;
let corner = Vec3::new(size_x.min(0.0), size_y.min(0.0), size_z.min(0.0));
let mut solid = make_box_brep(corner, size_x.abs(), size_y.abs(), size_z.abs())?;
let faces = &mut solid
.shells
.get_mut(0)
.ok_or("box builder produced no shell")?
.faces;
if faces.len() != FACE_SUFFIX.len() {
return Err(format!("box builder produced {} faces, expected 6", faces.len()));
}
for (face, suffix) in faces.iter_mut().zip(FACE_SUFFIX) {
face.name = Some(format!("{}{}", ctx.id, suffix));
}
let solid = transform_bake::apply(ctx, solid)?;
Ok(common::finalize_solid(ctx, solid, &ctx.id))
}
pub fn context_applicable(_probe: &crate::feature_pipeline::SelectionProbe) -> bool {
false
}
pub fn schema() -> serde_json::Value {
serde_json::json!({
"type": "P.CU",
"shortName": "P.CU",
"longName": "Primitive Cube",
"displayBuilder": false,
"inputParamsSchema": {
"id": {
"type": "string",
"default_value": null,
"hint": "Unique identifier for the feature"
},
"sizeX": {
"type": "number",
"default_value": 10,
"hint": "Width along X"
},
"sizeY": {
"type": "number",
"default_value": 10,
"hint": "Height along Y"
},
"sizeZ": {
"type": "number",
"default_value": 10,
"hint": "Depth along Z"
},
"transform": common::primitive_transform_schema(),
"boolean": common::optional_boolean_schema()
}
})
}