use lib3mf_core::error::Result;
use lib3mf_core::model::{
BaseMaterial, BaseMaterialsGroup, BlendMethod, Color, Composite, CompositeMaterials, Model,
Multi, MultiProperties, ResourceId, Texture2DCoord, Texture2DGroup, Unit,
};
fn main() -> Result<()> {
println!("Advanced Materials Example");
println!("==========================");
let mut model = Model {
unit: Unit::Millimeter,
..Default::default()
};
let base_group = BaseMaterialsGroup {
id: ResourceId(1),
materials: vec![
BaseMaterial {
name: "Red Plastic".to_string(),
display_color: Color::new(255, 0, 0, 255),
},
BaseMaterial {
name: "Blue Plastic".to_string(),
display_color: Color::new(0, 0, 255, 255),
},
],
};
model.resources.add_base_materials(base_group)?;
let tex_group = Texture2DGroup {
id: ResourceId(2),
texture_id: ResourceId(100), coords: vec![
Texture2DCoord { u: 0.0, v: 0.0 },
Texture2DCoord { u: 1.0, v: 0.0 },
Texture2DCoord { u: 1.0, v: 1.0 },
Texture2DCoord { u: 0.0, v: 1.0 },
],
};
model.resources.add_texture_2d_group(tex_group)?;
println!("Added Texture2DGroup (ID: 2) with 4 coordinates");
let comp_group = CompositeMaterials {
id: ResourceId(3),
base_material_id: ResourceId(1), indices: vec![0, 1], composites: vec![
Composite {
values: vec![0.5, 0.5],
}, Composite {
values: vec![0.2, 0.8],
}, ],
};
model.resources.add_composite_materials(comp_group)?;
println!("Added CompositeMaterials (ID: 3) with 2 mixing ratios");
let multi_prop = MultiProperties {
id: ResourceId(4),
pids: vec![ResourceId(1), ResourceId(2)], blend_methods: vec![BlendMethod::Mix, BlendMethod::Multiply],
multis: vec![
Multi {
pindices: vec![0, 0],
}, Multi {
pindices: vec![1, 2],
}, ],
};
model.resources.add_multi_properties(multi_prop)?;
println!("Added MultiProperties (ID: 4) combining Base Materials and Textures");
let resources = &model.resources;
println!("\nSummary of model resources:");
println!(
" Base Material Groups: {}",
resources.base_material_groups_count()
);
println!(
" Texture 2D Groups: {}",
resources.texture_2d_groups_count()
);
println!(
" Composite Materials: {}",
resources.composite_materials_count()
);
println!(
" Multi Properties: {}",
resources.multi_properties_count()
);
if let Some(mg) = resources.get_multi_properties(ResourceId(4)) {
println!("\nInspecting MultiProperties ID 4:");
for (i, m) in mg.multis.iter().enumerate() {
println!(
" Property {}: references pids {:?} with indices {:?}",
i, mg.pids, m.pindices
);
}
}
Ok(())
}