Skip to main content

geop_ops_sheetmetal/
examples.rs

1//! The examples of sheet metal an editor offers: a bracket flanged and cut.
2
3use geop_core_editor::registry::ExampleSet;
4use geop_core_math::primitives::FrameAxis;
5use geop_core_program::program::Program;
6use geop_core_sketch::CurveId;
7use geop_ops_model::datums::origin_plane;
8use geop_ops_model::sketch::{
9    Sketch, SketchPlane,
10    figures::{circle, rectangle, solved},
11    whole_sketch,
12};
13use geop_ops_sketch::AddSketchArgs;
14
15use crate::{
16    BaseFlangeArgs, Corner, EdgeFlangeArgs, FlangePosition, LengthReference, SheetCutArgs,
17    SheetMetalRules, edge,
18};
19
20/// The examples of this crate, by name.
21pub fn set() -> ExampleSet {
22    ExampleSet {
23        programs: vec![("sheet_metal_bracket", sheet_metal_bracket)],
24        workspaces: Vec::new(),
25    }
26}
27
28/// A sheet-metal mounting bracket: a 2 x 1.2 plate 0.08 thick (`plate`),
29/// a flange bent up along part of its front edge with reliefs beside it
30/// (`front`), one along all of its back edge (`back`), and two mounting
31/// holes cut through the plate after flanging (`mount`, drawn in `holes`)
32/// — the body is `sheet_cut(mount)`.
33pub fn sheet_metal_bracket() -> Program {
34    let on_z = || Some(SketchPlane::Datum(origin_plane(FrameAxis::Z)));
35    let mut program = Program::new();
36    let mut outline = Sketch::new();
37    let lines = rectangle(&mut outline, [0.0, 0.0], 2.0, 1.2);
38    program.push(
39        "outline",
40        AddSketchArgs {
41            plane: on_z(),
42            sketch: solved(outline),
43            ..Default::default()
44        },
45    );
46    program.push(
47        "plate",
48        BaseFlangeArgs {
49            sketch: whole_sketch("outline"),
50            rules: SheetMetalRules {
51                thickness: 0.08,
52                bend_radius: 0.08,
53                ..SheetMetalRules::default()
54            },
55            depth: 1.0.into(),
56            flip: false,
57        },
58    );
59    let flange = |line: CurveId, length: f64, offset: f64| EdgeFlangeArgs {
60        edge: Some(edge(format!("base_flange(plate,outline,{line},b)"))),
61        angle: 90.0.into(),
62        length: length.into(),
63        reference: LengthReference::OuterSharp,
64        position: FlangePosition::MaterialInside,
65        radius: None,
66        offset_start: offset,
67        offset_end: offset,
68        corner: Corner::Open,
69    };
70    program.push("front", flange(lines[0], 0.6, 0.3));
71    program.push("back", flange(lines[2], 0.4, 0.0));
72    let mut holes = Sketch::new();
73    circle(&mut holes, [0.5, 0.6], 0.15);
74    circle(&mut holes, [1.5, 0.6], 0.15);
75    program.push(
76        "holes",
77        AddSketchArgs {
78            plane: on_z(),
79            sketch: solved(holes),
80            ..Default::default()
81        },
82    );
83    program.push(
84        "mount",
85        SheetCutArgs {
86            sketch: whole_sketch("holes"),
87            face: None,
88        },
89    );
90    program
91}