geop_cad_base/
registry.rs1use std::{collections::BTreeMap, rc::Rc};
8
9use geop_core_editor::{editor::Editor, output::Outputs, registry::Registry};
10use geop_core_math::geop_error::GeopResult;
11use geop_core_program::{
12 cache::Cache,
13 part::Part,
14 program::Program,
15 runner::Runner,
16 workspace::{self, FileStore, Files, Location},
17};
18use geop_lib_stdlib::WithStandardParts;
19
20pub fn registry() -> GeopResult<Registry> {
26 let r = Registry::default();
27 let r = geop_ops_model::register(r)?;
28 let r = geop_ops_sketch::register(r)?;
29 let r = geop_ops_reference_geometry::register(r)?;
30 let r = geop_ops_sketch3d::register(r)?;
31 let r = geop_ops_extrude_revolve::register(r)?;
32 let r = geop_ops_hole::register(r)?;
33 let r = geop_ops_fillet::register(r)?;
34 let r = geop_ops_shell::register(r)?;
35 let r = geop_ops_plastic::register(r)?;
36 let r = geop_ops_boolean::register(r)?;
37 let r = geop_ops_pattern::register(r)?;
38 let r = geop_ops_subd::register(r)?;
39 let r = geop_ops_surface::register(r)?;
40 let r = geop_ops_edit::register(r)?;
41 let r = geop_ops_assembly::register(r)?;
42 let r = geop_ops_harness::register(r)?;
43 let r = geop_ops_step::register(r)?;
44 let r = geop_ops_drawing::register(r)?;
45 let r = geop_ops_sheetmetal::register(r)?;
46 let r = geop_ops_inspect::register(r)?;
47 geop_ops_bom::register(r)
48}
49
50pub fn editor() -> Editor {
53 editor_with(Cache::new())
54}
55
56pub fn editor_with(cache: Cache) -> Editor {
58 let registry = registry().expect("the editor's extensions each have a name of their own");
59 Editor::with_cache(registry, WithStandardParts(BTreeMap::new()), cache)
60}
61
62pub fn outputs() -> GeopResult<Outputs> {
65 Ok(registry()?.into_outputs())
66}
67
68pub type Workspace<F = BTreeMap<String, String>> = Files<WithStandardParts<F>>;
71
72pub fn workspace<F: FileStore + 'static>(files: F) -> Rc<Workspace<F>> {
75 workspace_with(files, Cache::new())
76}
77
78pub fn workspace_with<F: FileStore + 'static>(files: F, cache: Cache) -> Rc<Workspace<F>> {
80 let registry = registry().expect("the editor's extensions each have a name of their own");
81 Workspace::with_cache(
82 WithStandardParts(files),
83 Rc::new(registry.operations()),
84 cache,
85 )
86}
87
88pub fn runner() -> Runner {
90 let registry = registry().expect("the editor's extensions each have a name of their own");
91 Runner::new(registry.operations())
92}
93
94pub struct BuiltPart {
96 pub runner: Runner,
97 pub part: Part,
98}
99
100pub fn build(
103 program: &Program,
104 file: &str,
105 workspace: Rc<dyn workspace::Workspace>,
106) -> GeopResult<BuiltPart> {
107 let mut runner = runner();
108 runner.workspace = Some(workspace);
109 runner.location = Location {
110 file: workspace::resolve("", file),
111 within: Vec::new(),
112 };
113 let mut part = Part::default();
114 program.run(&runner, &mut part)?;
115 Ok(BuiltPart { runner, part })
116}