fix cache and imports (#6647)
* updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix clippy Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
		@ -474,3 +474,79 @@ extrude(profile001, length = 100)
 | 
			
		||||
    result.first().unwrap();
 | 
			
		||||
    result.last().unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(feature = "artifact-graph")]
 | 
			
		||||
#[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
async fn kcl_test_cache_multi_file_other_file_only_change() {
 | 
			
		||||
    let code = r#"import "toBeImported.kcl" as importedCube
 | 
			
		||||
 | 
			
		||||
importedCube
 | 
			
		||||
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
profile001 = startProfile(sketch001, at = [-134.53, -56.17])
 | 
			
		||||
  |> angledLine(angle = 0, length = 79.05, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 76.28)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001), tag = $seg01)
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg02)
 | 
			
		||||
  |> close()
 | 
			
		||||
extrude001 = extrude(profile001, length = 100)
 | 
			
		||||
sketch003 = startSketchOn(extrude001, face = seg02)
 | 
			
		||||
sketch002 = startSketchOn(extrude001, face = seg01)
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    let other_file = (
 | 
			
		||||
        std::path::PathBuf::from("toBeImported.kcl"),
 | 
			
		||||
        r#"sketch001 = startSketchOn(XZ)
 | 
			
		||||
profile001 = startProfile(sketch001, at = [281.54, 305.81])
 | 
			
		||||
  |> angledLine(angle = 0, length = 123.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 85.99)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
extrude(profile001, length = 100)
 | 
			
		||||
"#
 | 
			
		||||
        .to_string(),
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    let other_file2 = (
 | 
			
		||||
        std::path::PathBuf::from("toBeImported.kcl"),
 | 
			
		||||
        r#"sketch001 = startSketchOn(XZ)
 | 
			
		||||
profile001 = startProfile(sketch001, at = [281.54, 305.81])
 | 
			
		||||
  |> angledLine(angle = 0, length = 123.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 85.99)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
extrude(profile001, length = 100)
 | 
			
		||||
    |> translate(z = 100)
 | 
			
		||||
"#
 | 
			
		||||
        .to_string(),
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    let result = cache_test(
 | 
			
		||||
        "multi_file_other_file_only_change",
 | 
			
		||||
        vec![
 | 
			
		||||
            Variation {
 | 
			
		||||
                code,
 | 
			
		||||
                other_files: vec![other_file],
 | 
			
		||||
                settings: &Default::default(),
 | 
			
		||||
            },
 | 
			
		||||
            Variation {
 | 
			
		||||
                code,
 | 
			
		||||
                other_files: vec![other_file2],
 | 
			
		||||
                settings: &Default::default(),
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
    )
 | 
			
		||||
    .await;
 | 
			
		||||
 | 
			
		||||
    let r1 = result.first().unwrap();
 | 
			
		||||
    let r2 = result.last().unwrap();
 | 
			
		||||
 | 
			
		||||
    assert!(r1.1 != r2.1, "The images should be different");
 | 
			
		||||
    // Make sure the outcomes are different.
 | 
			
		||||
    assert!(
 | 
			
		||||
        r1.2.artifact_graph != r2.2.artifact_graph,
 | 
			
		||||
        "The outcomes artifact graphs should be different"
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 35 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 33 KiB  | 
@ -80,6 +80,15 @@ pub(super) enum CacheResult {
 | 
			
		||||
        /// The program that needs to be executed.
 | 
			
		||||
        program: Node<Program>,
 | 
			
		||||
    },
 | 
			
		||||
    /// Check only the imports, and not the main program.
 | 
			
		||||
    /// Before sending this we already checked the main program and it is the same.
 | 
			
		||||
    /// And we made sure the import statements > 0.
 | 
			
		||||
    CheckImportsOnly {
 | 
			
		||||
        /// Argument is whether we need to reapply settings.
 | 
			
		||||
        reapply_settings: bool,
 | 
			
		||||
        /// The ast of the main file, which did not change.
 | 
			
		||||
        ast: Node<Program>,
 | 
			
		||||
    },
 | 
			
		||||
    /// Argument is whether we need to reapply settings.
 | 
			
		||||
    NoAction(bool),
 | 
			
		||||
}
 | 
			
		||||
@ -105,7 +114,19 @@ pub(super) async fn get_changed_program(old: CacheInformation<'_>, new: CacheInf
 | 
			
		||||
    // If the ASTs are the EXACT same we return None.
 | 
			
		||||
    // We don't even need to waste time computing the digests.
 | 
			
		||||
    if old.ast == new.ast {
 | 
			
		||||
        return CacheResult::NoAction(reapply_settings);
 | 
			
		||||
        // First we need to make sure an imported file didn't change it's ast.
 | 
			
		||||
        // We know they have the same imports because the ast is the same.
 | 
			
		||||
        // If we have no imports, we can skip this.
 | 
			
		||||
        if !old.ast.has_import_statements() {
 | 
			
		||||
            println!("No imports, no need to check.");
 | 
			
		||||
            return CacheResult::NoAction(reapply_settings);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Tell the CacheResult we need to check all the imports, but the main ast is the same.
 | 
			
		||||
        return CacheResult::CheckImportsOnly {
 | 
			
		||||
            reapply_settings,
 | 
			
		||||
            ast: old.ast.clone(),
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // We have to clone just because the digests are stored inline :-(
 | 
			
		||||
@ -119,7 +140,19 @@ pub(super) async fn get_changed_program(old: CacheInformation<'_>, new: CacheInf
 | 
			
		||||
 | 
			
		||||
    // Check if the digest is the same.
 | 
			
		||||
    if old_ast.digest == new_ast.digest {
 | 
			
		||||
        return CacheResult::NoAction(reapply_settings);
 | 
			
		||||
        // First we need to make sure an imported file didn't change it's ast.
 | 
			
		||||
        // We know they have the same imports because the ast is the same.
 | 
			
		||||
        // If we have no imports, we can skip this.
 | 
			
		||||
        if !old.ast.has_import_statements() {
 | 
			
		||||
            println!("No imports, no need to check.");
 | 
			
		||||
            return CacheResult::NoAction(reapply_settings);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Tell the CacheResult we need to check all the imports, but the main ast is the same.
 | 
			
		||||
        return CacheResult::CheckImportsOnly {
 | 
			
		||||
            reapply_settings,
 | 
			
		||||
            ast: old.ast.clone(),
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Check if the annotations are different.
 | 
			
		||||
@ -242,6 +275,8 @@ fn generate_changed_program(old_ast: Node<Program>, mut new_ast: Node<Program>,
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use pretty_assertions::assert_eq;
 | 
			
		||||
 | 
			
		||||
    use super::*;
 | 
			
		||||
    use crate::execution::{parse_execute, parse_execute_with_project_dir, ExecTestResults};
 | 
			
		||||
 | 
			
		||||
@ -658,6 +693,92 @@ extrude(profile001, length = 100)"#
 | 
			
		||||
        )
 | 
			
		||||
        .await;
 | 
			
		||||
 | 
			
		||||
        assert_eq!(result, CacheResult::NoAction(false));
 | 
			
		||||
        let CacheResult::CheckImportsOnly { reapply_settings, .. } = result else {
 | 
			
		||||
            panic!("Expected CheckImportsOnly, got {:?}", result);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        assert_eq!(reapply_settings, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
    async fn test_cache_multi_file_only_other_file_changes_should_reexecute() {
 | 
			
		||||
        let code = r#"import "toBeImported.kcl" as importedCube
 | 
			
		||||
 | 
			
		||||
importedCube
 | 
			
		||||
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
profile001 = startProfile(sketch001, at = [-134.53, -56.17])
 | 
			
		||||
  |> angledLine(angle = 0, length = 79.05, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 76.28)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001), tag = $seg01)
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg02)
 | 
			
		||||
  |> close()
 | 
			
		||||
extrude001 = extrude(profile001, length = 100)
 | 
			
		||||
sketch003 = startSketchOn(extrude001, face = seg02)
 | 
			
		||||
sketch002 = startSketchOn(extrude001, face = seg01)
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
        let other_file = (
 | 
			
		||||
            std::path::PathBuf::from("toBeImported.kcl"),
 | 
			
		||||
            r#"sketch001 = startSketchOn(XZ)
 | 
			
		||||
profile001 = startProfile(sketch001, at = [281.54, 305.81])
 | 
			
		||||
  |> angledLine(angle = 0, length = 123.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 85.99)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
extrude(profile001, length = 100)"#
 | 
			
		||||
                .to_string(),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        let other_file2 = (
 | 
			
		||||
            std::path::PathBuf::from("toBeImported.kcl"),
 | 
			
		||||
            r#"sketch001 = startSketchOn(XZ)
 | 
			
		||||
profile001 = startProfile(sketch001, at = [281.54, 305.81])
 | 
			
		||||
  |> angledLine(angle = 0, length = 123.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 85.99)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
extrude(profile001, length = 100)
 | 
			
		||||
|> translate(z=100) 
 | 
			
		||||
"#
 | 
			
		||||
            .to_string(),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        let tmp_dir = std::env::temp_dir();
 | 
			
		||||
        let tmp_dir = tmp_dir.join(uuid::Uuid::new_v4().to_string());
 | 
			
		||||
 | 
			
		||||
        // Create a temporary file for each of the other files.
 | 
			
		||||
        let tmp_file = tmp_dir.join(other_file.0);
 | 
			
		||||
        std::fs::create_dir_all(tmp_file.parent().unwrap()).unwrap();
 | 
			
		||||
        std::fs::write(&tmp_file, other_file.1).unwrap();
 | 
			
		||||
 | 
			
		||||
        let ExecTestResults { program, exec_ctxt, .. } =
 | 
			
		||||
            parse_execute_with_project_dir(code, Some(tmp_dir)).await.unwrap();
 | 
			
		||||
 | 
			
		||||
        // Change the other file.
 | 
			
		||||
        std::fs::write(tmp_file, other_file2.1).unwrap();
 | 
			
		||||
 | 
			
		||||
        let mut new_program = crate::Program::parse_no_errs(code).unwrap();
 | 
			
		||||
        new_program.compute_digest();
 | 
			
		||||
 | 
			
		||||
        let result = get_changed_program(
 | 
			
		||||
            CacheInformation {
 | 
			
		||||
                ast: &program.ast,
 | 
			
		||||
                settings: &exec_ctxt.settings,
 | 
			
		||||
            },
 | 
			
		||||
            CacheInformation {
 | 
			
		||||
                ast: &new_program.ast,
 | 
			
		||||
                settings: &exec_ctxt.settings,
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
        .await;
 | 
			
		||||
 | 
			
		||||
        let CacheResult::CheckImportsOnly { reapply_settings, .. } = result else {
 | 
			
		||||
            panic!("Expected CheckImportsOnly, got {:?}", result);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        assert_eq!(reapply_settings, false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2791,13 +2791,12 @@ d = b + c
 | 
			
		||||
        let mut exec_state = ExecState::new(&exec_ctxt);
 | 
			
		||||
 | 
			
		||||
        exec_ctxt
 | 
			
		||||
            .run_concurrent(
 | 
			
		||||
            .run(
 | 
			
		||||
                &crate::Program {
 | 
			
		||||
                    ast: main.clone(),
 | 
			
		||||
                    original_file_contents: "".to_owned(),
 | 
			
		||||
                },
 | 
			
		||||
                &mut exec_state,
 | 
			
		||||
                false,
 | 
			
		||||
            )
 | 
			
		||||
            .await
 | 
			
		||||
            .unwrap();
 | 
			
		||||
 | 
			
		||||
@ -42,6 +42,7 @@ use crate::{
 | 
			
		||||
    parsing::ast::types::{Expr, ImportPath, NodeRef},
 | 
			
		||||
    source_range::SourceRange,
 | 
			
		||||
    std::StdLib,
 | 
			
		||||
    walk::{Universe, UniverseMap},
 | 
			
		||||
    CompilationError, ExecError, KclErrorWithOutputs,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -586,7 +587,7 @@ impl ExecutorContext {
 | 
			
		||||
    pub async fn run_with_caching(&self, program: crate::Program) -> Result<ExecOutcome, KclErrorWithOutputs> {
 | 
			
		||||
        assert!(!self.is_mock());
 | 
			
		||||
 | 
			
		||||
        let (program, mut exec_state, preserve_mem) = if let Some(OldAstState {
 | 
			
		||||
        let (program, mut exec_state, preserve_mem, imports_info) = if let Some(OldAstState {
 | 
			
		||||
            ast: old_ast,
 | 
			
		||||
            exec_state: mut old_state,
 | 
			
		||||
            settings: old_settings,
 | 
			
		||||
@ -603,7 +604,7 @@ impl ExecutorContext {
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            // Get the program that actually changed from the old and new information.
 | 
			
		||||
            let (clear_scene, program) = match cache::get_changed_program(old, new).await {
 | 
			
		||||
            let (clear_scene, program, import_check_info) = match cache::get_changed_program(old, new).await {
 | 
			
		||||
                CacheResult::ReExecute {
 | 
			
		||||
                    clear_scene,
 | 
			
		||||
                    reapply_settings,
 | 
			
		||||
@ -616,7 +617,7 @@ impl ExecutorContext {
 | 
			
		||||
                            .await
 | 
			
		||||
                            .is_err()
 | 
			
		||||
                    {
 | 
			
		||||
                        (true, program)
 | 
			
		||||
                        (true, program, None)
 | 
			
		||||
                    } else {
 | 
			
		||||
                        (
 | 
			
		||||
                            clear_scene,
 | 
			
		||||
@ -624,6 +625,52 @@ impl ExecutorContext {
 | 
			
		||||
                                ast: changed_program,
 | 
			
		||||
                                original_file_contents: program.original_file_contents,
 | 
			
		||||
                            },
 | 
			
		||||
                            None,
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                CacheResult::CheckImportsOnly {
 | 
			
		||||
                    reapply_settings,
 | 
			
		||||
                    ast: changed_program,
 | 
			
		||||
                } => {
 | 
			
		||||
                    if reapply_settings
 | 
			
		||||
                        && self
 | 
			
		||||
                            .engine
 | 
			
		||||
                            .reapply_settings(&self.settings, Default::default(), old_state.id_generator())
 | 
			
		||||
                            .await
 | 
			
		||||
                            .is_err()
 | 
			
		||||
                    {
 | 
			
		||||
                        (true, program, None)
 | 
			
		||||
                    } else {
 | 
			
		||||
                        // We need to check our imports to see if they changed.
 | 
			
		||||
                        let mut new_exec_state = ExecState::new(self);
 | 
			
		||||
                        let (new_universe, new_universe_map) = self.get_universe(&program, &mut new_exec_state).await?;
 | 
			
		||||
                        let mut clear_scene = false;
 | 
			
		||||
 | 
			
		||||
                        let mut keys = new_universe.keys().clone().collect::<Vec<_>>();
 | 
			
		||||
                        keys.sort();
 | 
			
		||||
                        for key in keys {
 | 
			
		||||
                            let (_, id, _, _) = &new_universe[key];
 | 
			
		||||
                            let old_source = old_state.get_source(*id);
 | 
			
		||||
                            let new_source = new_exec_state.get_source(*id);
 | 
			
		||||
                            if old_source != new_source {
 | 
			
		||||
                                clear_scene = true;
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        (
 | 
			
		||||
                            clear_scene,
 | 
			
		||||
                            crate::Program {
 | 
			
		||||
                                ast: changed_program,
 | 
			
		||||
                                original_file_contents: program.original_file_contents,
 | 
			
		||||
                            },
 | 
			
		||||
                            // We only care about this if we are clearing the scene.
 | 
			
		||||
                            if clear_scene {
 | 
			
		||||
                                Some((new_universe, new_universe_map, new_exec_state))
 | 
			
		||||
                            } else {
 | 
			
		||||
                                None
 | 
			
		||||
                            },
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@ -646,7 +693,7 @@ impl ExecutorContext {
 | 
			
		||||
                        let outcome = old_state.to_exec_outcome(result_env).await;
 | 
			
		||||
                        return Ok(outcome);
 | 
			
		||||
                    }
 | 
			
		||||
                    (true, program)
 | 
			
		||||
                    (true, program, None)
 | 
			
		||||
                }
 | 
			
		||||
                CacheResult::NoAction(false) => {
 | 
			
		||||
                    let outcome = old_state.to_exec_outcome(result_env).await;
 | 
			
		||||
@ -654,34 +701,42 @@ impl ExecutorContext {
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            let (exec_state, preserve_mem) = if clear_scene {
 | 
			
		||||
                // Pop the execution state, since we are starting fresh.
 | 
			
		||||
                let mut exec_state = old_state;
 | 
			
		||||
                exec_state.reset(self);
 | 
			
		||||
            let (exec_state, preserve_mem, universe_info) =
 | 
			
		||||
                if let Some((new_universe, new_universe_map, mut new_exec_state)) = import_check_info {
 | 
			
		||||
                    // Clear the scene if the imports changed.
 | 
			
		||||
                    self.send_clear_scene(&mut new_exec_state, Default::default())
 | 
			
		||||
                        .await
 | 
			
		||||
                        .map_err(KclErrorWithOutputs::no_outputs)?;
 | 
			
		||||
 | 
			
		||||
                // We don't do this in mock mode since there is no engine connection
 | 
			
		||||
                // anyways and from the TS side we override memory and don't want to clear it.
 | 
			
		||||
                self.send_clear_scene(&mut exec_state, Default::default())
 | 
			
		||||
                    .await
 | 
			
		||||
                    .map_err(KclErrorWithOutputs::no_outputs)?;
 | 
			
		||||
                    (new_exec_state, false, Some((new_universe, new_universe_map)))
 | 
			
		||||
                } else if clear_scene {
 | 
			
		||||
                    // Pop the execution state, since we are starting fresh.
 | 
			
		||||
                    let mut exec_state = old_state;
 | 
			
		||||
                    exec_state.reset(self);
 | 
			
		||||
 | 
			
		||||
                (exec_state, false)
 | 
			
		||||
            } else {
 | 
			
		||||
                old_state.mut_stack().restore_env(result_env);
 | 
			
		||||
                    self.send_clear_scene(&mut exec_state, Default::default())
 | 
			
		||||
                        .await
 | 
			
		||||
                        .map_err(KclErrorWithOutputs::no_outputs)?;
 | 
			
		||||
 | 
			
		||||
                (old_state, true)
 | 
			
		||||
            };
 | 
			
		||||
                    (exec_state, false, None)
 | 
			
		||||
                } else {
 | 
			
		||||
                    old_state.mut_stack().restore_env(result_env);
 | 
			
		||||
 | 
			
		||||
            (program, exec_state, preserve_mem)
 | 
			
		||||
                    (old_state, true, None)
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
            (program, exec_state, preserve_mem, universe_info)
 | 
			
		||||
        } else {
 | 
			
		||||
            let mut exec_state = ExecState::new(self);
 | 
			
		||||
            self.send_clear_scene(&mut exec_state, Default::default())
 | 
			
		||||
                .await
 | 
			
		||||
                .map_err(KclErrorWithOutputs::no_outputs)?;
 | 
			
		||||
            (program, exec_state, false)
 | 
			
		||||
            (program, exec_state, false, None)
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let result = self.run_concurrent(&program, &mut exec_state, preserve_mem).await;
 | 
			
		||||
        let result = self
 | 
			
		||||
            .run_concurrent(&program, &mut exec_state, imports_info, preserve_mem)
 | 
			
		||||
            .await;
 | 
			
		||||
 | 
			
		||||
        if result.is_err() {
 | 
			
		||||
            cache::bust_cache().await;
 | 
			
		||||
@ -714,7 +769,7 @@ impl ExecutorContext {
 | 
			
		||||
        program: &crate::Program,
 | 
			
		||||
        exec_state: &mut ExecState,
 | 
			
		||||
    ) -> Result<(EnvironmentRef, Option<ModelingSessionData>), KclErrorWithOutputs> {
 | 
			
		||||
        self.run_concurrent(program, exec_state, false).await
 | 
			
		||||
        self.run_concurrent(program, exec_state, None, false).await
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Perform the execution of a program using a concurrent
 | 
			
		||||
@ -728,47 +783,24 @@ impl ExecutorContext {
 | 
			
		||||
        &self,
 | 
			
		||||
        program: &crate::Program,
 | 
			
		||||
        exec_state: &mut ExecState,
 | 
			
		||||
        universe_info: Option<(Universe, UniverseMap)>,
 | 
			
		||||
        preserve_mem: bool,
 | 
			
		||||
    ) -> Result<(EnvironmentRef, Option<ModelingSessionData>), KclErrorWithOutputs> {
 | 
			
		||||
        exec_state.add_root_module_contents(program);
 | 
			
		||||
        // Reuse our cached universe if we have one.
 | 
			
		||||
        #[allow(unused_variables)]
 | 
			
		||||
        let (universe, universe_map) = if let Some((universe, universe_map)) = universe_info {
 | 
			
		||||
            (universe, universe_map)
 | 
			
		||||
        } else {
 | 
			
		||||
            self.get_universe(program, exec_state).await?
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let default_planes = self.engine.get_default_planes().read().await.clone();
 | 
			
		||||
 | 
			
		||||
        // Run the prelude to set up the engine.
 | 
			
		||||
        self.eval_prelude(exec_state, SourceRange::synthetic())
 | 
			
		||||
            .await
 | 
			
		||||
            .map_err(KclErrorWithOutputs::no_outputs)?;
 | 
			
		||||
 | 
			
		||||
        let mut universe = std::collections::HashMap::new();
 | 
			
		||||
 | 
			
		||||
        let default_planes = self.engine.get_default_planes().read().await.clone();
 | 
			
		||||
        #[cfg_attr(not(feature = "artifact-graph"), expect(unused_variables))]
 | 
			
		||||
        let root_imports = crate::walk::import_universe(
 | 
			
		||||
            self,
 | 
			
		||||
            &ModuleRepr::Kcl(program.ast.clone(), None),
 | 
			
		||||
            &mut universe,
 | 
			
		||||
            exec_state,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .map_err(|err| {
 | 
			
		||||
            println!("Error: {err:?}");
 | 
			
		||||
            let module_id_to_module_path: IndexMap<ModuleId, ModulePath> = exec_state
 | 
			
		||||
                .global
 | 
			
		||||
                .path_to_source_id
 | 
			
		||||
                .iter()
 | 
			
		||||
                .map(|(k, v)| ((*v), k.clone()))
 | 
			
		||||
                .collect();
 | 
			
		||||
 | 
			
		||||
            KclErrorWithOutputs::new(
 | 
			
		||||
                err,
 | 
			
		||||
                #[cfg(feature = "artifact-graph")]
 | 
			
		||||
                exec_state.global.operations.clone(),
 | 
			
		||||
                #[cfg(feature = "artifact-graph")]
 | 
			
		||||
                exec_state.global.artifact_commands.clone(),
 | 
			
		||||
                #[cfg(feature = "artifact-graph")]
 | 
			
		||||
                exec_state.global.artifact_graph.clone(),
 | 
			
		||||
                module_id_to_module_path,
 | 
			
		||||
                exec_state.global.id_to_source.clone(),
 | 
			
		||||
                default_planes.clone(),
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
 | 
			
		||||
        for modules in crate::walk::import_graph(&universe, self)
 | 
			
		||||
            .map_err(|err| {
 | 
			
		||||
                let module_id_to_module_path: IndexMap<ModuleId, ModulePath> = exec_state
 | 
			
		||||
@ -821,7 +853,7 @@ impl ExecutorContext {
 | 
			
		||||
                    ModulePath::Local { value, .. } => {
 | 
			
		||||
                        // We only want to display the top-level module imports in
 | 
			
		||||
                        // the Feature Tree, not transitive imports.
 | 
			
		||||
                        if root_imports.contains_key(value) {
 | 
			
		||||
                        if universe_map.contains_key(value) {
 | 
			
		||||
                            exec_state.global.operations.push(Operation::GroupBegin {
 | 
			
		||||
                                group: Group::ModuleInstance {
 | 
			
		||||
                                    name: value.file_name().unwrap_or_default().to_string_lossy().into_owned(),
 | 
			
		||||
@ -974,6 +1006,52 @@ impl ExecutorContext {
 | 
			
		||||
        self.inner_run(program, exec_state, preserve_mem).await
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Get the universe & universe map of the program.
 | 
			
		||||
    /// And see if any of the imports changed.
 | 
			
		||||
    async fn get_universe(
 | 
			
		||||
        &self,
 | 
			
		||||
        program: &crate::Program,
 | 
			
		||||
        exec_state: &mut ExecState,
 | 
			
		||||
    ) -> Result<(Universe, UniverseMap), KclErrorWithOutputs> {
 | 
			
		||||
        exec_state.add_root_module_contents(program);
 | 
			
		||||
 | 
			
		||||
        let mut universe = std::collections::HashMap::new();
 | 
			
		||||
 | 
			
		||||
        let default_planes = self.engine.get_default_planes().read().await.clone();
 | 
			
		||||
 | 
			
		||||
        let root_imports = crate::walk::import_universe(
 | 
			
		||||
            self,
 | 
			
		||||
            &ModuleRepr::Kcl(program.ast.clone(), None),
 | 
			
		||||
            &mut universe,
 | 
			
		||||
            exec_state,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .map_err(|err| {
 | 
			
		||||
            println!("Error: {err:?}");
 | 
			
		||||
            let module_id_to_module_path: IndexMap<ModuleId, ModulePath> = exec_state
 | 
			
		||||
                .global
 | 
			
		||||
                .path_to_source_id
 | 
			
		||||
                .iter()
 | 
			
		||||
                .map(|(k, v)| ((*v), k.clone()))
 | 
			
		||||
                .collect();
 | 
			
		||||
 | 
			
		||||
            KclErrorWithOutputs::new(
 | 
			
		||||
                err,
 | 
			
		||||
                #[cfg(feature = "artifact-graph")]
 | 
			
		||||
                exec_state.global.operations.clone(),
 | 
			
		||||
                #[cfg(feature = "artifact-graph")]
 | 
			
		||||
                exec_state.global.artifact_commands.clone(),
 | 
			
		||||
                #[cfg(feature = "artifact-graph")]
 | 
			
		||||
                exec_state.global.artifact_graph.clone(),
 | 
			
		||||
                module_id_to_module_path,
 | 
			
		||||
                exec_state.global.id_to_source.clone(),
 | 
			
		||||
                default_planes,
 | 
			
		||||
            )
 | 
			
		||||
        })?;
 | 
			
		||||
 | 
			
		||||
        Ok((universe, root_imports))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Perform the execution of a program.  Accept all possible parameters and
 | 
			
		||||
    /// output everything.
 | 
			
		||||
    async fn inner_run(
 | 
			
		||||
 | 
			
		||||
@ -238,6 +238,10 @@ impl ExecState {
 | 
			
		||||
        self.global.id_to_source.insert(id, source.clone());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(super) fn get_source(&self, id: ModuleId) -> Option<&ModuleSource> {
 | 
			
		||||
        self.global.id_to_source.get(&id)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(super) fn add_module(&mut self, id: ModuleId, path: ModulePath, repr: ModuleRepr) {
 | 
			
		||||
        debug_assert!(self.global.path_to_source_id.contains_key(&path));
 | 
			
		||||
        let module_info = ModuleInfo { id, repr, path };
 | 
			
		||||
 | 
			
		||||
@ -542,6 +542,16 @@ impl Program {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Checks if the ast has any import statements.    
 | 
			
		||||
    pub fn has_import_statements(&self) -> bool {
 | 
			
		||||
        for item in &self.body {
 | 
			
		||||
            if let BodyItem::ImportStatement(_) = item {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn in_comment(&self, pos: usize) -> bool {
 | 
			
		||||
        // Check if its in the body.
 | 
			
		||||
        if self.non_code_meta.in_comment(pos) {
 | 
			
		||||
 | 
			
		||||
@ -21,8 +21,9 @@ type Dependency = (String, String);
 | 
			
		||||
 | 
			
		||||
type Graph = Vec<Dependency>;
 | 
			
		||||
 | 
			
		||||
type DependencyInfo = (AstNode<ImportStatement>, ModuleId, ModulePath, ModuleRepr);
 | 
			
		||||
type Universe = HashMap<String, DependencyInfo>;
 | 
			
		||||
pub(crate) type DependencyInfo = (AstNode<ImportStatement>, ModuleId, ModulePath, ModuleRepr);
 | 
			
		||||
pub(crate) type UniverseMap = HashMap<PathBuf, AstNode<ImportStatement>>;
 | 
			
		||||
pub(crate) type Universe = HashMap<String, DependencyInfo>;
 | 
			
		||||
 | 
			
		||||
/// Process a number of programs, returning the graph of dependencies.
 | 
			
		||||
///
 | 
			
		||||
@ -184,7 +185,7 @@ pub(crate) async fn import_universe(
 | 
			
		||||
    repr: &ModuleRepr,
 | 
			
		||||
    out: &mut Universe,
 | 
			
		||||
    exec_state: &mut ExecState,
 | 
			
		||||
) -> Result<HashMap<PathBuf, crate::parsing::ast::types::Node<ImportStatement>>, KclError> {
 | 
			
		||||
) -> Result<UniverseMap, KclError> {
 | 
			
		||||
    let modules = import_dependencies(repr, ctx)?;
 | 
			
		||||
    let mut module_imports = HashMap::new();
 | 
			
		||||
    for (filename, import_stmt, module_path) in modules {
 | 
			
		||||
 | 
			
		||||
@ -9,4 +9,4 @@ pub use ast_node::Node;
 | 
			
		||||
pub use ast_visitor::Visitable;
 | 
			
		||||
pub use ast_walk::walk;
 | 
			
		||||
pub use import_graph::import_graph;
 | 
			
		||||
pub(crate) use import_graph::import_universe;
 | 
			
		||||
pub(crate) use import_graph::{import_universe, Universe, UniverseMap};
 | 
			
		||||
 | 
			
		||||
@ -1,27 +1,27 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path3 [Path]
 | 
			
		||||
    3["Path<br>[74, 114, 8]"]
 | 
			
		||||
    5["Segment<br>[120, 137, 8]"]
 | 
			
		||||
    6["Segment<br>[143, 161, 8]"]
 | 
			
		||||
    7["Segment<br>[167, 185, 8]"]
 | 
			
		||||
    8["Segment<br>[191, 247, 8]"]
 | 
			
		||||
    9["Segment<br>[253, 260, 8]"]
 | 
			
		||||
    3["Path<br>[74, 114, 1]"]
 | 
			
		||||
    5["Segment<br>[120, 137, 1]"]
 | 
			
		||||
    6["Segment<br>[143, 161, 1]"]
 | 
			
		||||
    7["Segment<br>[167, 185, 1]"]
 | 
			
		||||
    8["Segment<br>[191, 247, 1]"]
 | 
			
		||||
    9["Segment<br>[253, 260, 1]"]
 | 
			
		||||
    15[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path4 [Path]
 | 
			
		||||
    4["Path<br>[74, 112, 9]"]
 | 
			
		||||
    10["Segment<br>[118, 135, 9]"]
 | 
			
		||||
    11["Segment<br>[141, 159, 9]"]
 | 
			
		||||
    12["Segment<br>[165, 183, 9]"]
 | 
			
		||||
    13["Segment<br>[189, 245, 9]"]
 | 
			
		||||
    14["Segment<br>[251, 258, 9]"]
 | 
			
		||||
    4["Path<br>[74, 112, 2]"]
 | 
			
		||||
    10["Segment<br>[118, 135, 2]"]
 | 
			
		||||
    11["Segment<br>[141, 159, 2]"]
 | 
			
		||||
    12["Segment<br>[165, 183, 2]"]
 | 
			
		||||
    13["Segment<br>[189, 245, 2]"]
 | 
			
		||||
    14["Segment<br>[251, 258, 2]"]
 | 
			
		||||
    16[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[47, 64, 8]"]
 | 
			
		||||
  2["Plane<br>[47, 64, 9]"]
 | 
			
		||||
  17["Sweep Extrusion<br>[266, 288, 8]"]
 | 
			
		||||
  18["Sweep Extrusion<br>[264, 286, 9]"]
 | 
			
		||||
  1["Plane<br>[47, 64, 1]"]
 | 
			
		||||
  2["Plane<br>[47, 64, 2]"]
 | 
			
		||||
  17["Sweep Extrusion<br>[266, 288, 1]"]
 | 
			
		||||
  18["Sweep Extrusion<br>[264, 286, 2]"]
 | 
			
		||||
  19[Wall]
 | 
			
		||||
  20[Wall]
 | 
			
		||||
  21[Wall]
 | 
			
		||||
@ -66,44 +66,44 @@ flowchart LR
 | 
			
		||||
  4 --- 14
 | 
			
		||||
  4 --- 16
 | 
			
		||||
  4 ---- 18
 | 
			
		||||
  5 --- 24
 | 
			
		||||
  5 x--> 27
 | 
			
		||||
  5 --- 37
 | 
			
		||||
  5 --- 46
 | 
			
		||||
  6 --- 25
 | 
			
		||||
  6 x--> 27
 | 
			
		||||
  6 --- 35
 | 
			
		||||
  5 --- 25
 | 
			
		||||
  5 x--> 28
 | 
			
		||||
  5 --- 36
 | 
			
		||||
  5 --- 43
 | 
			
		||||
  6 --- 24
 | 
			
		||||
  6 x--> 28
 | 
			
		||||
  6 --- 37
 | 
			
		||||
  6 --- 45
 | 
			
		||||
  7 --- 26
 | 
			
		||||
  7 x--> 27
 | 
			
		||||
  7 --- 36
 | 
			
		||||
  7 --- 23
 | 
			
		||||
  7 x--> 28
 | 
			
		||||
  7 --- 35
 | 
			
		||||
  7 --- 44
 | 
			
		||||
  8 --- 23
 | 
			
		||||
  8 x--> 27
 | 
			
		||||
  8 --- 26
 | 
			
		||||
  8 x--> 28
 | 
			
		||||
  8 --- 38
 | 
			
		||||
  8 --- 43
 | 
			
		||||
  8 --- 46
 | 
			
		||||
  10 --- 19
 | 
			
		||||
  10 x--> 28
 | 
			
		||||
  10 x--> 27
 | 
			
		||||
  10 --- 31
 | 
			
		||||
  10 --- 39
 | 
			
		||||
  10 --- 40
 | 
			
		||||
  11 --- 22
 | 
			
		||||
  11 x--> 28
 | 
			
		||||
  11 --- 34
 | 
			
		||||
  11 x--> 27
 | 
			
		||||
  11 --- 33
 | 
			
		||||
  11 --- 41
 | 
			
		||||
  12 --- 21
 | 
			
		||||
  12 x--> 28
 | 
			
		||||
  12 x--> 27
 | 
			
		||||
  12 --- 32
 | 
			
		||||
  12 --- 42
 | 
			
		||||
  12 --- 39
 | 
			
		||||
  13 --- 20
 | 
			
		||||
  13 x--> 28
 | 
			
		||||
  13 --- 33
 | 
			
		||||
  13 --- 40
 | 
			
		||||
  13 x--> 27
 | 
			
		||||
  13 --- 34
 | 
			
		||||
  13 --- 42
 | 
			
		||||
  17 --- 23
 | 
			
		||||
  17 --- 24
 | 
			
		||||
  17 --- 25
 | 
			
		||||
  17 --- 26
 | 
			
		||||
  17 --- 27
 | 
			
		||||
  17 --- 29
 | 
			
		||||
  17 --- 28
 | 
			
		||||
  17 --- 30
 | 
			
		||||
  17 --- 35
 | 
			
		||||
  17 --- 36
 | 
			
		||||
  17 --- 37
 | 
			
		||||
@ -116,8 +116,8 @@ flowchart LR
 | 
			
		||||
  18 --- 20
 | 
			
		||||
  18 --- 21
 | 
			
		||||
  18 --- 22
 | 
			
		||||
  18 --- 28
 | 
			
		||||
  18 --- 30
 | 
			
		||||
  18 --- 27
 | 
			
		||||
  18 --- 29
 | 
			
		||||
  18 --- 31
 | 
			
		||||
  18 --- 32
 | 
			
		||||
  18 --- 33
 | 
			
		||||
@ -127,35 +127,35 @@ flowchart LR
 | 
			
		||||
  18 --- 41
 | 
			
		||||
  18 --- 42
 | 
			
		||||
  31 <--x 19
 | 
			
		||||
  39 <--x 19
 | 
			
		||||
  40 <--x 19
 | 
			
		||||
  33 <--x 20
 | 
			
		||||
  40 <--x 20
 | 
			
		||||
  42 <--x 19
 | 
			
		||||
  34 <--x 20
 | 
			
		||||
  39 <--x 20
 | 
			
		||||
  42 <--x 20
 | 
			
		||||
  32 <--x 21
 | 
			
		||||
  39 <--x 21
 | 
			
		||||
  41 <--x 21
 | 
			
		||||
  42 <--x 21
 | 
			
		||||
  34 <--x 22
 | 
			
		||||
  39 <--x 22
 | 
			
		||||
  33 <--x 22
 | 
			
		||||
  40 <--x 22
 | 
			
		||||
  41 <--x 22
 | 
			
		||||
  38 <--x 23
 | 
			
		||||
  43 <--x 23
 | 
			
		||||
  35 <--x 23
 | 
			
		||||
  44 <--x 23
 | 
			
		||||
  45 <--x 23
 | 
			
		||||
  37 <--x 24
 | 
			
		||||
  43 <--x 24
 | 
			
		||||
  46 <--x 24
 | 
			
		||||
  35 <--x 25
 | 
			
		||||
  45 <--x 25
 | 
			
		||||
  45 <--x 24
 | 
			
		||||
  36 <--x 25
 | 
			
		||||
  43 <--x 25
 | 
			
		||||
  46 <--x 25
 | 
			
		||||
  36 <--x 26
 | 
			
		||||
  38 <--x 26
 | 
			
		||||
  44 <--x 26
 | 
			
		||||
  45 <--x 26
 | 
			
		||||
  35 <--x 29
 | 
			
		||||
  36 <--x 29
 | 
			
		||||
  37 <--x 29
 | 
			
		||||
  38 <--x 29
 | 
			
		||||
  31 <--x 30
 | 
			
		||||
  32 <--x 30
 | 
			
		||||
  33 <--x 30
 | 
			
		||||
  34 <--x 30
 | 
			
		||||
  46 <--x 26
 | 
			
		||||
  31 <--x 29
 | 
			
		||||
  32 <--x 29
 | 
			
		||||
  33 <--x 29
 | 
			
		||||
  34 <--x 29
 | 
			
		||||
  35 <--x 30
 | 
			
		||||
  36 <--x 30
 | 
			
		||||
  37 <--x 30
 | 
			
		||||
  38 <--x 30
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -5,10 +5,10 @@ description: Variables in memory after executing assembly_mixed_units_cubes.kcl
 | 
			
		||||
{
 | 
			
		||||
  "cubeIn": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  },
 | 
			
		||||
  "cubeMm": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 9
 | 
			
		||||
    "value": 2
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,21 +1,21 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path3 [Path]
 | 
			
		||||
    3["Path<br>[195, 230, 8]"]
 | 
			
		||||
    5["Segment<br>[195, 230, 8]"]
 | 
			
		||||
    7[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path4 [Path]
 | 
			
		||||
    4["Path<br>[111, 146, 10]"]
 | 
			
		||||
    6["Segment<br>[111, 146, 10]"]
 | 
			
		||||
    3["Path<br>[195, 230, 1]"]
 | 
			
		||||
    5["Segment<br>[195, 230, 1]"]
 | 
			
		||||
    8[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[172, 189, 8]"]
 | 
			
		||||
  2["Plane<br>[88, 105, 10]"]
 | 
			
		||||
  subgraph path4 [Path]
 | 
			
		||||
    4["Path<br>[111, 146, 3]"]
 | 
			
		||||
    6["Segment<br>[111, 146, 3]"]
 | 
			
		||||
    7[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[172, 189, 1]"]
 | 
			
		||||
  2["Plane<br>[88, 105, 3]"]
 | 
			
		||||
  1 --- 3
 | 
			
		||||
  2 --- 4
 | 
			
		||||
  3 --- 5
 | 
			
		||||
  3 --- 7
 | 
			
		||||
  3 --- 8
 | 
			
		||||
  4 --- 6
 | 
			
		||||
  4 --- 8
 | 
			
		||||
  4 --- 7
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -5,10 +5,10 @@ description: Variables in memory after executing assembly_non_default_units.kcl
 | 
			
		||||
{
 | 
			
		||||
  "other1": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  },
 | 
			
		||||
  "other2": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 10
 | 
			
		||||
    "value": 3
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3598,7 +3598,7 @@ description: Variables in memory after executing import_async.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "screw": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  },
 | 
			
		||||
  "start": {
 | 
			
		||||
    "type": "Sketch",
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ description: Variables in memory after executing import_foreign.kcl
 | 
			
		||||
{
 | 
			
		||||
  "cube": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  },
 | 
			
		||||
  "model": {
 | 
			
		||||
    "type": "ImportedGeometry",
 | 
			
		||||
 | 
			
		||||
@ -1,19 +1,19 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path2 [Path]
 | 
			
		||||
    2["Path<br>[75, 101, 8]"]
 | 
			
		||||
    3["Segment<br>[107, 125, 8]"]
 | 
			
		||||
    4["Segment<br>[131, 150, 8]"]
 | 
			
		||||
    5["Segment<br>[156, 175, 8]"]
 | 
			
		||||
    6["Segment<br>[181, 200, 8]"]
 | 
			
		||||
    7["Segment<br>[206, 231, 8]"]
 | 
			
		||||
    8["Segment<br>[237, 258, 8]"]
 | 
			
		||||
    9["Segment<br>[264, 283, 8]"]
 | 
			
		||||
    10["Segment<br>[289, 296, 8]"]
 | 
			
		||||
    2["Path<br>[75, 101, 1]"]
 | 
			
		||||
    3["Segment<br>[107, 125, 1]"]
 | 
			
		||||
    4["Segment<br>[131, 150, 1]"]
 | 
			
		||||
    5["Segment<br>[156, 175, 1]"]
 | 
			
		||||
    6["Segment<br>[181, 200, 1]"]
 | 
			
		||||
    7["Segment<br>[206, 231, 1]"]
 | 
			
		||||
    8["Segment<br>[237, 258, 1]"]
 | 
			
		||||
    9["Segment<br>[264, 283, 1]"]
 | 
			
		||||
    10["Segment<br>[289, 296, 1]"]
 | 
			
		||||
    11[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[52, 69, 8]"]
 | 
			
		||||
  12["Sweep Revolve<br>[302, 319, 8]"]
 | 
			
		||||
  1["Plane<br>[52, 69, 1]"]
 | 
			
		||||
  12["Sweep Revolve<br>[302, 319, 1]"]
 | 
			
		||||
  13[Wall]
 | 
			
		||||
  14[Wall]
 | 
			
		||||
  15[Wall]
 | 
			
		||||
@ -41,29 +41,29 @@ flowchart LR
 | 
			
		||||
  2 --- 11
 | 
			
		||||
  2 ---- 12
 | 
			
		||||
  12 <--x 3
 | 
			
		||||
  3 --- 15
 | 
			
		||||
  3 --- 16
 | 
			
		||||
  3 x--> 26
 | 
			
		||||
  12 <--x 4
 | 
			
		||||
  4 --- 18
 | 
			
		||||
  4 --- 15
 | 
			
		||||
  4 --- 26
 | 
			
		||||
  12 <--x 5
 | 
			
		||||
  5 --- 20
 | 
			
		||||
  5 --- 22
 | 
			
		||||
  5 --- 13
 | 
			
		||||
  5 --- 24
 | 
			
		||||
  12 <--x 6
 | 
			
		||||
  6 --- 13
 | 
			
		||||
  6 --- 24
 | 
			
		||||
  6 --- 20
 | 
			
		||||
  6 --- 25
 | 
			
		||||
  12 <--x 7
 | 
			
		||||
  7 --- 16
 | 
			
		||||
  7 --- 21
 | 
			
		||||
  7 --- 17
 | 
			
		||||
  7 --- 22
 | 
			
		||||
  12 <--x 8
 | 
			
		||||
  8 --- 17
 | 
			
		||||
  8 --- 23
 | 
			
		||||
  8 --- 19
 | 
			
		||||
  8 --- 21
 | 
			
		||||
  12 <--x 9
 | 
			
		||||
  9 --- 14
 | 
			
		||||
  9 --- 27
 | 
			
		||||
  12 <--x 10
 | 
			
		||||
  10 --- 19
 | 
			
		||||
  10 --- 25
 | 
			
		||||
  10 --- 18
 | 
			
		||||
  10 --- 23
 | 
			
		||||
  12 --- 13
 | 
			
		||||
  12 --- 14
 | 
			
		||||
  12 --- 15
 | 
			
		||||
@ -79,18 +79,18 @@ flowchart LR
 | 
			
		||||
  12 --- 25
 | 
			
		||||
  12 --- 26
 | 
			
		||||
  12 --- 27
 | 
			
		||||
  22 <--x 13
 | 
			
		||||
  24 <--x 13
 | 
			
		||||
  23 <--x 14
 | 
			
		||||
  21 <--x 14
 | 
			
		||||
  27 <--x 14
 | 
			
		||||
  25 <--x 15
 | 
			
		||||
  26 <--x 15
 | 
			
		||||
  21 <--x 16
 | 
			
		||||
  24 <--x 16
 | 
			
		||||
  21 <--x 17
 | 
			
		||||
  23 <--x 17
 | 
			
		||||
  26 <--x 18
 | 
			
		||||
  25 <--x 19
 | 
			
		||||
  27 <--x 19
 | 
			
		||||
  22 <--x 20
 | 
			
		||||
  23 <--x 16
 | 
			
		||||
  26 <--x 16
 | 
			
		||||
  22 <--x 17
 | 
			
		||||
  25 <--x 17
 | 
			
		||||
  23 <--x 18
 | 
			
		||||
  27 <--x 18
 | 
			
		||||
  21 <--x 19
 | 
			
		||||
  22 <--x 19
 | 
			
		||||
  24 <--x 20
 | 
			
		||||
  25 <--x 20
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,11 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path2 [Path]
 | 
			
		||||
    2["Path<br>[100, 136, 8]"]
 | 
			
		||||
    3["Segment<br>[100, 136, 8]"]
 | 
			
		||||
    2["Path<br>[100, 136, 1]"]
 | 
			
		||||
    3["Segment<br>[100, 136, 1]"]
 | 
			
		||||
    4[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[77, 94, 8]"]
 | 
			
		||||
  1["Plane<br>[77, 94, 1]"]
 | 
			
		||||
  1 --- 2
 | 
			
		||||
  2 --- 3
 | 
			
		||||
  2 --- 4
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,6 @@ description: Variables in memory after executing import_transform.kcl
 | 
			
		||||
{
 | 
			
		||||
  "screw": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl-lib/src/simulation_tests.rs
 | 
			
		||||
description: Artifact graph flowchart import_whole.kcl
 | 
			
		||||
description: Artifact graph flowchart import_whole_simple.kcl
 | 
			
		||||
extension: md
 | 
			
		||||
snapshot_kind: binary
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,12 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path2 [Path]
 | 
			
		||||
    2["Path<br>[82, 118, 8]"]
 | 
			
		||||
    3["Segment<br>[82, 118, 8]"]
 | 
			
		||||
    2["Path<br>[82, 118, 1]"]
 | 
			
		||||
    3["Segment<br>[82, 118, 1]"]
 | 
			
		||||
    4[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[59, 76, 8]"]
 | 
			
		||||
  5["Sweep Extrusion<br>[124, 144, 8]"]
 | 
			
		||||
  1["Plane<br>[59, 76, 1]"]
 | 
			
		||||
  5["Sweep Extrusion<br>[124, 144, 1]"]
 | 
			
		||||
  6[Wall]
 | 
			
		||||
  7["Cap Start"]
 | 
			
		||||
  8["Cap End"]
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl-lib/src/simulation_tests.rs
 | 
			
		||||
description: Variables in memory after executing import_whole.kcl
 | 
			
		||||
description: Variables in memory after executing import_whole_simple.kcl
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "bar": {
 | 
			
		||||
@ -113,6 +113,6 @@ description: Variables in memory after executing import_whole.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "foo": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,12 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path2 [Path]
 | 
			
		||||
    2["Path<br>[101, 137, 8]"]
 | 
			
		||||
    3["Segment<br>[101, 137, 8]"]
 | 
			
		||||
    2["Path<br>[101, 137, 1]"]
 | 
			
		||||
    3["Segment<br>[101, 137, 1]"]
 | 
			
		||||
    4[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[78, 95, 8]"]
 | 
			
		||||
  5["Sweep Extrusion<br>[143, 163, 8]"]
 | 
			
		||||
  1["Plane<br>[78, 95, 1]"]
 | 
			
		||||
  5["Sweep Extrusion<br>[143, 163, 1]"]
 | 
			
		||||
  6[Wall]
 | 
			
		||||
  7["Cap Start"]
 | 
			
		||||
  8["Cap End"]
 | 
			
		||||
 | 
			
		||||
@ -113,6 +113,6 @@ description: Variables in memory after executing import_whole_transitive_import.
 | 
			
		||||
  },
 | 
			
		||||
  "part": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -5,14 +5,14 @@ description: Variables in memory after executing axial-fan.kcl
 | 
			
		||||
{
 | 
			
		||||
  "fan": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 11
 | 
			
		||||
    "value": 4
 | 
			
		||||
  },
 | 
			
		||||
  "fanHousing": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  },
 | 
			
		||||
  "motor": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 10
 | 
			
		||||
    "value": 3
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,235 +1,235 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path24 [Path]
 | 
			
		||||
    24["Path<br>[362, 395, 8]"]
 | 
			
		||||
    44["Segment<br>[403, 429, 8]"]
 | 
			
		||||
    49["Segment<br>[437, 499, 8]"]
 | 
			
		||||
    57["Segment<br>[507, 569, 8]"]
 | 
			
		||||
    62["Segment<br>[577, 640, 8]"]
 | 
			
		||||
    69["Segment<br>[648, 673, 8]"]
 | 
			
		||||
    70["Segment<br>[681, 701, 8]"]
 | 
			
		||||
    79["Segment<br>[709, 733, 8]"]
 | 
			
		||||
    84["Segment<br>[741, 803, 8]"]
 | 
			
		||||
    88["Segment<br>[811, 836, 8]"]
 | 
			
		||||
    98["Segment<br>[844, 864, 8]"]
 | 
			
		||||
    104["Segment<br>[872, 896, 8]"]
 | 
			
		||||
    107["Segment<br>[904, 965, 8]"]
 | 
			
		||||
    112["Segment<br>[973, 1034, 8]"]
 | 
			
		||||
    122["Segment<br>[1042, 1067, 8]"]
 | 
			
		||||
    129["Segment<br>[1075, 1099, 8]"]
 | 
			
		||||
    133["Segment<br>[1107, 1169, 8]"]
 | 
			
		||||
    141["Segment<br>[1177, 1202, 8]"]
 | 
			
		||||
    144["Segment<br>[1210, 1237, 8]"]
 | 
			
		||||
    149["Segment<br>[1245, 1306, 8]"]
 | 
			
		||||
    155["Segment<br>[1314, 1358, 8]"]
 | 
			
		||||
    160["Segment<br>[1366, 1373, 8]"]
 | 
			
		||||
    24["Path<br>[362, 395, 1]"]
 | 
			
		||||
    44["Segment<br>[403, 429, 1]"]
 | 
			
		||||
    49["Segment<br>[437, 499, 1]"]
 | 
			
		||||
    57["Segment<br>[507, 569, 1]"]
 | 
			
		||||
    62["Segment<br>[577, 640, 1]"]
 | 
			
		||||
    69["Segment<br>[648, 673, 1]"]
 | 
			
		||||
    70["Segment<br>[681, 701, 1]"]
 | 
			
		||||
    79["Segment<br>[709, 733, 1]"]
 | 
			
		||||
    84["Segment<br>[741, 803, 1]"]
 | 
			
		||||
    88["Segment<br>[811, 836, 1]"]
 | 
			
		||||
    98["Segment<br>[844, 864, 1]"]
 | 
			
		||||
    104["Segment<br>[872, 896, 1]"]
 | 
			
		||||
    107["Segment<br>[904, 965, 1]"]
 | 
			
		||||
    112["Segment<br>[973, 1034, 1]"]
 | 
			
		||||
    122["Segment<br>[1042, 1067, 1]"]
 | 
			
		||||
    129["Segment<br>[1075, 1099, 1]"]
 | 
			
		||||
    133["Segment<br>[1107, 1169, 1]"]
 | 
			
		||||
    141["Segment<br>[1177, 1202, 1]"]
 | 
			
		||||
    144["Segment<br>[1210, 1237, 1]"]
 | 
			
		||||
    149["Segment<br>[1245, 1306, 1]"]
 | 
			
		||||
    155["Segment<br>[1314, 1358, 1]"]
 | 
			
		||||
    160["Segment<br>[1366, 1373, 1]"]
 | 
			
		||||
    212[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path25 [Path]
 | 
			
		||||
    25["Path<br>[362, 395, 8]"]
 | 
			
		||||
    40["Segment<br>[403, 429, 8]"]
 | 
			
		||||
    51["Segment<br>[437, 499, 8]"]
 | 
			
		||||
    56["Segment<br>[507, 569, 8]"]
 | 
			
		||||
    59["Segment<br>[577, 640, 8]"]
 | 
			
		||||
    67["Segment<br>[648, 673, 8]"]
 | 
			
		||||
    74["Segment<br>[681, 701, 8]"]
 | 
			
		||||
    81["Segment<br>[709, 733, 8]"]
 | 
			
		||||
    82["Segment<br>[741, 803, 8]"]
 | 
			
		||||
    90["Segment<br>[811, 836, 8]"]
 | 
			
		||||
    99["Segment<br>[844, 864, 8]"]
 | 
			
		||||
    105["Segment<br>[872, 896, 8]"]
 | 
			
		||||
    109["Segment<br>[904, 965, 8]"]
 | 
			
		||||
    113["Segment<br>[973, 1034, 8]"]
 | 
			
		||||
    119["Segment<br>[1042, 1067, 8]"]
 | 
			
		||||
    124["Segment<br>[1075, 1099, 8]"]
 | 
			
		||||
    132["Segment<br>[1107, 1169, 8]"]
 | 
			
		||||
    140["Segment<br>[1177, 1202, 8]"]
 | 
			
		||||
    143["Segment<br>[1210, 1237, 8]"]
 | 
			
		||||
    150["Segment<br>[1245, 1306, 8]"]
 | 
			
		||||
    154["Segment<br>[1314, 1358, 8]"]
 | 
			
		||||
    164["Segment<br>[1366, 1373, 8]"]
 | 
			
		||||
    25["Path<br>[362, 395, 1]"]
 | 
			
		||||
    40["Segment<br>[403, 429, 1]"]
 | 
			
		||||
    51["Segment<br>[437, 499, 1]"]
 | 
			
		||||
    56["Segment<br>[507, 569, 1]"]
 | 
			
		||||
    59["Segment<br>[577, 640, 1]"]
 | 
			
		||||
    67["Segment<br>[648, 673, 1]"]
 | 
			
		||||
    74["Segment<br>[681, 701, 1]"]
 | 
			
		||||
    81["Segment<br>[709, 733, 1]"]
 | 
			
		||||
    82["Segment<br>[741, 803, 1]"]
 | 
			
		||||
    90["Segment<br>[811, 836, 1]"]
 | 
			
		||||
    99["Segment<br>[844, 864, 1]"]
 | 
			
		||||
    105["Segment<br>[872, 896, 1]"]
 | 
			
		||||
    109["Segment<br>[904, 965, 1]"]
 | 
			
		||||
    113["Segment<br>[973, 1034, 1]"]
 | 
			
		||||
    119["Segment<br>[1042, 1067, 1]"]
 | 
			
		||||
    124["Segment<br>[1075, 1099, 1]"]
 | 
			
		||||
    132["Segment<br>[1107, 1169, 1]"]
 | 
			
		||||
    140["Segment<br>[1177, 1202, 1]"]
 | 
			
		||||
    143["Segment<br>[1210, 1237, 1]"]
 | 
			
		||||
    150["Segment<br>[1245, 1306, 1]"]
 | 
			
		||||
    154["Segment<br>[1314, 1358, 1]"]
 | 
			
		||||
    164["Segment<br>[1366, 1373, 1]"]
 | 
			
		||||
    217[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path26 [Path]
 | 
			
		||||
    26["Path<br>[362, 395, 8]"]
 | 
			
		||||
    43["Segment<br>[403, 429, 8]"]
 | 
			
		||||
    50["Segment<br>[437, 499, 8]"]
 | 
			
		||||
    54["Segment<br>[507, 569, 8]"]
 | 
			
		||||
    61["Segment<br>[577, 640, 8]"]
 | 
			
		||||
    65["Segment<br>[648, 673, 8]"]
 | 
			
		||||
    71["Segment<br>[681, 701, 8]"]
 | 
			
		||||
    80["Segment<br>[709, 733, 8]"]
 | 
			
		||||
    87["Segment<br>[741, 803, 8]"]
 | 
			
		||||
    92["Segment<br>[811, 836, 8]"]
 | 
			
		||||
    94["Segment<br>[844, 864, 8]"]
 | 
			
		||||
    101["Segment<br>[872, 896, 8]"]
 | 
			
		||||
    111["Segment<br>[904, 965, 8]"]
 | 
			
		||||
    117["Segment<br>[973, 1034, 8]"]
 | 
			
		||||
    123["Segment<br>[1042, 1067, 8]"]
 | 
			
		||||
    125["Segment<br>[1075, 1099, 8]"]
 | 
			
		||||
    134["Segment<br>[1107, 1169, 8]"]
 | 
			
		||||
    136["Segment<br>[1177, 1202, 8]"]
 | 
			
		||||
    147["Segment<br>[1210, 1237, 8]"]
 | 
			
		||||
    148["Segment<br>[1245, 1306, 8]"]
 | 
			
		||||
    156["Segment<br>[1314, 1358, 8]"]
 | 
			
		||||
    165["Segment<br>[1366, 1373, 8]"]
 | 
			
		||||
    26["Path<br>[362, 395, 1]"]
 | 
			
		||||
    43["Segment<br>[403, 429, 1]"]
 | 
			
		||||
    50["Segment<br>[437, 499, 1]"]
 | 
			
		||||
    54["Segment<br>[507, 569, 1]"]
 | 
			
		||||
    61["Segment<br>[577, 640, 1]"]
 | 
			
		||||
    65["Segment<br>[648, 673, 1]"]
 | 
			
		||||
    71["Segment<br>[681, 701, 1]"]
 | 
			
		||||
    80["Segment<br>[709, 733, 1]"]
 | 
			
		||||
    87["Segment<br>[741, 803, 1]"]
 | 
			
		||||
    92["Segment<br>[811, 836, 1]"]
 | 
			
		||||
    94["Segment<br>[844, 864, 1]"]
 | 
			
		||||
    101["Segment<br>[872, 896, 1]"]
 | 
			
		||||
    111["Segment<br>[904, 965, 1]"]
 | 
			
		||||
    117["Segment<br>[973, 1034, 1]"]
 | 
			
		||||
    123["Segment<br>[1042, 1067, 1]"]
 | 
			
		||||
    125["Segment<br>[1075, 1099, 1]"]
 | 
			
		||||
    134["Segment<br>[1107, 1169, 1]"]
 | 
			
		||||
    136["Segment<br>[1177, 1202, 1]"]
 | 
			
		||||
    147["Segment<br>[1210, 1237, 1]"]
 | 
			
		||||
    148["Segment<br>[1245, 1306, 1]"]
 | 
			
		||||
    156["Segment<br>[1314, 1358, 1]"]
 | 
			
		||||
    165["Segment<br>[1366, 1373, 1]"]
 | 
			
		||||
    218[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path27 [Path]
 | 
			
		||||
    27["Path<br>[362, 395, 8]"]
 | 
			
		||||
    42["Segment<br>[403, 429, 8]"]
 | 
			
		||||
    47["Segment<br>[437, 499, 8]"]
 | 
			
		||||
    53["Segment<br>[507, 569, 8]"]
 | 
			
		||||
    58["Segment<br>[577, 640, 8]"]
 | 
			
		||||
    68["Segment<br>[648, 673, 8]"]
 | 
			
		||||
    73["Segment<br>[681, 701, 8]"]
 | 
			
		||||
    77["Segment<br>[709, 733, 8]"]
 | 
			
		||||
    83["Segment<br>[741, 803, 8]"]
 | 
			
		||||
    91["Segment<br>[811, 836, 8]"]
 | 
			
		||||
    95["Segment<br>[844, 864, 8]"]
 | 
			
		||||
    100["Segment<br>[872, 896, 8]"]
 | 
			
		||||
    108["Segment<br>[904, 965, 8]"]
 | 
			
		||||
    114["Segment<br>[973, 1034, 8]"]
 | 
			
		||||
    120["Segment<br>[1042, 1067, 8]"]
 | 
			
		||||
    126["Segment<br>[1075, 1099, 8]"]
 | 
			
		||||
    135["Segment<br>[1107, 1169, 8]"]
 | 
			
		||||
    139["Segment<br>[1177, 1202, 8]"]
 | 
			
		||||
    142["Segment<br>[1210, 1237, 8]"]
 | 
			
		||||
    151["Segment<br>[1245, 1306, 8]"]
 | 
			
		||||
    157["Segment<br>[1314, 1358, 8]"]
 | 
			
		||||
    161["Segment<br>[1366, 1373, 8]"]
 | 
			
		||||
    27["Path<br>[362, 395, 1]"]
 | 
			
		||||
    42["Segment<br>[403, 429, 1]"]
 | 
			
		||||
    47["Segment<br>[437, 499, 1]"]
 | 
			
		||||
    53["Segment<br>[507, 569, 1]"]
 | 
			
		||||
    58["Segment<br>[577, 640, 1]"]
 | 
			
		||||
    68["Segment<br>[648, 673, 1]"]
 | 
			
		||||
    73["Segment<br>[681, 701, 1]"]
 | 
			
		||||
    77["Segment<br>[709, 733, 1]"]
 | 
			
		||||
    83["Segment<br>[741, 803, 1]"]
 | 
			
		||||
    91["Segment<br>[811, 836, 1]"]
 | 
			
		||||
    95["Segment<br>[844, 864, 1]"]
 | 
			
		||||
    100["Segment<br>[872, 896, 1]"]
 | 
			
		||||
    108["Segment<br>[904, 965, 1]"]
 | 
			
		||||
    114["Segment<br>[973, 1034, 1]"]
 | 
			
		||||
    120["Segment<br>[1042, 1067, 1]"]
 | 
			
		||||
    126["Segment<br>[1075, 1099, 1]"]
 | 
			
		||||
    135["Segment<br>[1107, 1169, 1]"]
 | 
			
		||||
    139["Segment<br>[1177, 1202, 1]"]
 | 
			
		||||
    142["Segment<br>[1210, 1237, 1]"]
 | 
			
		||||
    151["Segment<br>[1245, 1306, 1]"]
 | 
			
		||||
    157["Segment<br>[1314, 1358, 1]"]
 | 
			
		||||
    161["Segment<br>[1366, 1373, 1]"]
 | 
			
		||||
    219[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path28 [Path]
 | 
			
		||||
    28["Path<br>[362, 395, 8]"]
 | 
			
		||||
    45["Segment<br>[403, 429, 8]"]
 | 
			
		||||
    46["Segment<br>[437, 499, 8]"]
 | 
			
		||||
    52["Segment<br>[507, 569, 8]"]
 | 
			
		||||
    63["Segment<br>[577, 640, 8]"]
 | 
			
		||||
    66["Segment<br>[648, 673, 8]"]
 | 
			
		||||
    72["Segment<br>[681, 701, 8]"]
 | 
			
		||||
    78["Segment<br>[709, 733, 8]"]
 | 
			
		||||
    86["Segment<br>[741, 803, 8]"]
 | 
			
		||||
    89["Segment<br>[811, 836, 8]"]
 | 
			
		||||
    96["Segment<br>[844, 864, 8]"]
 | 
			
		||||
    102["Segment<br>[872, 896, 8]"]
 | 
			
		||||
    106["Segment<br>[904, 965, 8]"]
 | 
			
		||||
    116["Segment<br>[973, 1034, 8]"]
 | 
			
		||||
    118["Segment<br>[1042, 1067, 8]"]
 | 
			
		||||
    128["Segment<br>[1075, 1099, 8]"]
 | 
			
		||||
    130["Segment<br>[1107, 1169, 8]"]
 | 
			
		||||
    137["Segment<br>[1177, 1202, 8]"]
 | 
			
		||||
    145["Segment<br>[1210, 1237, 8]"]
 | 
			
		||||
    152["Segment<br>[1245, 1306, 8]"]
 | 
			
		||||
    158["Segment<br>[1314, 1358, 8]"]
 | 
			
		||||
    162["Segment<br>[1366, 1373, 8]"]
 | 
			
		||||
    28["Path<br>[362, 395, 1]"]
 | 
			
		||||
    45["Segment<br>[403, 429, 1]"]
 | 
			
		||||
    46["Segment<br>[437, 499, 1]"]
 | 
			
		||||
    52["Segment<br>[507, 569, 1]"]
 | 
			
		||||
    63["Segment<br>[577, 640, 1]"]
 | 
			
		||||
    66["Segment<br>[648, 673, 1]"]
 | 
			
		||||
    72["Segment<br>[681, 701, 1]"]
 | 
			
		||||
    78["Segment<br>[709, 733, 1]"]
 | 
			
		||||
    86["Segment<br>[741, 803, 1]"]
 | 
			
		||||
    89["Segment<br>[811, 836, 1]"]
 | 
			
		||||
    96["Segment<br>[844, 864, 1]"]
 | 
			
		||||
    102["Segment<br>[872, 896, 1]"]
 | 
			
		||||
    106["Segment<br>[904, 965, 1]"]
 | 
			
		||||
    116["Segment<br>[973, 1034, 1]"]
 | 
			
		||||
    118["Segment<br>[1042, 1067, 1]"]
 | 
			
		||||
    128["Segment<br>[1075, 1099, 1]"]
 | 
			
		||||
    130["Segment<br>[1107, 1169, 1]"]
 | 
			
		||||
    137["Segment<br>[1177, 1202, 1]"]
 | 
			
		||||
    145["Segment<br>[1210, 1237, 1]"]
 | 
			
		||||
    152["Segment<br>[1245, 1306, 1]"]
 | 
			
		||||
    158["Segment<br>[1314, 1358, 1]"]
 | 
			
		||||
    162["Segment<br>[1366, 1373, 1]"]
 | 
			
		||||
    220[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path29 [Path]
 | 
			
		||||
    29["Path<br>[362, 395, 8]"]
 | 
			
		||||
    41["Segment<br>[403, 429, 8]"]
 | 
			
		||||
    48["Segment<br>[437, 499, 8]"]
 | 
			
		||||
    55["Segment<br>[507, 569, 8]"]
 | 
			
		||||
    60["Segment<br>[577, 640, 8]"]
 | 
			
		||||
    64["Segment<br>[648, 673, 8]"]
 | 
			
		||||
    75["Segment<br>[681, 701, 8]"]
 | 
			
		||||
    76["Segment<br>[709, 733, 8]"]
 | 
			
		||||
    85["Segment<br>[741, 803, 8]"]
 | 
			
		||||
    93["Segment<br>[811, 836, 8]"]
 | 
			
		||||
    97["Segment<br>[844, 864, 8]"]
 | 
			
		||||
    103["Segment<br>[872, 896, 8]"]
 | 
			
		||||
    110["Segment<br>[904, 965, 8]"]
 | 
			
		||||
    115["Segment<br>[973, 1034, 8]"]
 | 
			
		||||
    121["Segment<br>[1042, 1067, 8]"]
 | 
			
		||||
    127["Segment<br>[1075, 1099, 8]"]
 | 
			
		||||
    131["Segment<br>[1107, 1169, 8]"]
 | 
			
		||||
    138["Segment<br>[1177, 1202, 8]"]
 | 
			
		||||
    146["Segment<br>[1210, 1237, 8]"]
 | 
			
		||||
    153["Segment<br>[1245, 1306, 8]"]
 | 
			
		||||
    159["Segment<br>[1314, 1358, 8]"]
 | 
			
		||||
    163["Segment<br>[1366, 1373, 8]"]
 | 
			
		||||
    29["Path<br>[362, 395, 1]"]
 | 
			
		||||
    41["Segment<br>[403, 429, 1]"]
 | 
			
		||||
    48["Segment<br>[437, 499, 1]"]
 | 
			
		||||
    55["Segment<br>[507, 569, 1]"]
 | 
			
		||||
    60["Segment<br>[577, 640, 1]"]
 | 
			
		||||
    64["Segment<br>[648, 673, 1]"]
 | 
			
		||||
    75["Segment<br>[681, 701, 1]"]
 | 
			
		||||
    76["Segment<br>[709, 733, 1]"]
 | 
			
		||||
    85["Segment<br>[741, 803, 1]"]
 | 
			
		||||
    93["Segment<br>[811, 836, 1]"]
 | 
			
		||||
    97["Segment<br>[844, 864, 1]"]
 | 
			
		||||
    103["Segment<br>[872, 896, 1]"]
 | 
			
		||||
    110["Segment<br>[904, 965, 1]"]
 | 
			
		||||
    115["Segment<br>[973, 1034, 1]"]
 | 
			
		||||
    121["Segment<br>[1042, 1067, 1]"]
 | 
			
		||||
    127["Segment<br>[1075, 1099, 1]"]
 | 
			
		||||
    131["Segment<br>[1107, 1169, 1]"]
 | 
			
		||||
    138["Segment<br>[1177, 1202, 1]"]
 | 
			
		||||
    146["Segment<br>[1210, 1237, 1]"]
 | 
			
		||||
    153["Segment<br>[1245, 1306, 1]"]
 | 
			
		||||
    159["Segment<br>[1314, 1358, 1]"]
 | 
			
		||||
    163["Segment<br>[1366, 1373, 1]"]
 | 
			
		||||
    221[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path30 [Path]
 | 
			
		||||
    30["Path<br>[1765, 1789, 8]"]
 | 
			
		||||
    30["Path<br>[1765, 1789, 1]"]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path31 [Path]
 | 
			
		||||
    31["Path<br>[1765, 1789, 8]"]
 | 
			
		||||
    31["Path<br>[1765, 1789, 1]"]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path32 [Path]
 | 
			
		||||
    32["Path<br>[1797, 1923, 8]"]
 | 
			
		||||
    169["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    170["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    171["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    172["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    176["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    178["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    179["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    32["Path<br>[1797, 1923, 1]"]
 | 
			
		||||
    169["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    170["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    171["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    172["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    176["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    178["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    179["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    215[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path33 [Path]
 | 
			
		||||
    33["Path<br>[1797, 1923, 8]"]
 | 
			
		||||
    166["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    167["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    168["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    173["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    174["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    175["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    177["Segment<br>[1797, 1923, 8]"]
 | 
			
		||||
    33["Path<br>[1797, 1923, 1]"]
 | 
			
		||||
    166["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    167["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    168["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    173["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    174["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    175["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    177["Segment<br>[1797, 1923, 1]"]
 | 
			
		||||
    222[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path34 [Path]
 | 
			
		||||
    34["Path<br>[2217, 2244, 8]"]
 | 
			
		||||
    180["Segment<br>[2252, 2274, 8]"]
 | 
			
		||||
    181["Segment<br>[2282, 2304, 8]"]
 | 
			
		||||
    182["Segment<br>[2312, 2334, 8]"]
 | 
			
		||||
    183["Segment<br>[2342, 2365, 8]"]
 | 
			
		||||
    184["Segment<br>[2373, 2396, 8]"]
 | 
			
		||||
    185["Segment<br>[2404, 2439, 8]"]
 | 
			
		||||
    186["Segment<br>[2447, 2454, 8]"]
 | 
			
		||||
    34["Path<br>[2217, 2244, 1]"]
 | 
			
		||||
    180["Segment<br>[2252, 2274, 1]"]
 | 
			
		||||
    181["Segment<br>[2282, 2304, 1]"]
 | 
			
		||||
    182["Segment<br>[2312, 2334, 1]"]
 | 
			
		||||
    183["Segment<br>[2342, 2365, 1]"]
 | 
			
		||||
    184["Segment<br>[2373, 2396, 1]"]
 | 
			
		||||
    185["Segment<br>[2404, 2439, 1]"]
 | 
			
		||||
    186["Segment<br>[2447, 2454, 1]"]
 | 
			
		||||
    223[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path35 [Path]
 | 
			
		||||
    35["Path<br>[2728, 2757, 8]"]
 | 
			
		||||
    187["Segment<br>[2765, 2800, 8]"]
 | 
			
		||||
    188["Segment<br>[2808, 2833, 8]"]
 | 
			
		||||
    189["Segment<br>[2841, 2877, 8]"]
 | 
			
		||||
    190["Segment<br>[2885, 2909, 8]"]
 | 
			
		||||
    191["Segment<br>[2917, 2951, 8]"]
 | 
			
		||||
    192["Segment<br>[2959, 2994, 8]"]
 | 
			
		||||
    193["Segment<br>[3002, 3009, 8]"]
 | 
			
		||||
    35["Path<br>[2728, 2757, 1]"]
 | 
			
		||||
    187["Segment<br>[2765, 2800, 1]"]
 | 
			
		||||
    188["Segment<br>[2808, 2833, 1]"]
 | 
			
		||||
    189["Segment<br>[2841, 2877, 1]"]
 | 
			
		||||
    190["Segment<br>[2885, 2909, 1]"]
 | 
			
		||||
    191["Segment<br>[2917, 2951, 1]"]
 | 
			
		||||
    192["Segment<br>[2959, 2994, 1]"]
 | 
			
		||||
    193["Segment<br>[3002, 3009, 1]"]
 | 
			
		||||
    214[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path36 [Path]
 | 
			
		||||
    36["Path<br>[3286, 3313, 8]"]
 | 
			
		||||
    195["Segment<br>[3321, 3340, 8]"]
 | 
			
		||||
    197["Segment<br>[3348, 3397, 8]"]
 | 
			
		||||
    36["Path<br>[3286, 3313, 1]"]
 | 
			
		||||
    195["Segment<br>[3321, 3340, 1]"]
 | 
			
		||||
    197["Segment<br>[3348, 3397, 1]"]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path37 [Path]
 | 
			
		||||
    37["Path<br>[3286, 3313, 8]"]
 | 
			
		||||
    194["Segment<br>[3321, 3340, 8]"]
 | 
			
		||||
    196["Segment<br>[3348, 3397, 8]"]
 | 
			
		||||
    37["Path<br>[3286, 3313, 1]"]
 | 
			
		||||
    194["Segment<br>[3321, 3340, 1]"]
 | 
			
		||||
    196["Segment<br>[3348, 3397, 1]"]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path38 [Path]
 | 
			
		||||
    38["Path<br>[3498, 3531, 8]"]
 | 
			
		||||
    199["Segment<br>[3539, 3558, 8]"]
 | 
			
		||||
    200["Segment<br>[3566, 3588, 8]"]
 | 
			
		||||
    202["Segment<br>[3596, 3619, 8]"]
 | 
			
		||||
    204["Segment<br>[3627, 3647, 8]"]
 | 
			
		||||
    206["Segment<br>[3655, 3679, 8]"]
 | 
			
		||||
    209["Segment<br>[3687, 3710, 8]"]
 | 
			
		||||
    211["Segment<br>[3718, 3725, 8]"]
 | 
			
		||||
    38["Path<br>[3498, 3531, 1]"]
 | 
			
		||||
    199["Segment<br>[3539, 3558, 1]"]
 | 
			
		||||
    200["Segment<br>[3566, 3588, 1]"]
 | 
			
		||||
    202["Segment<br>[3596, 3619, 1]"]
 | 
			
		||||
    204["Segment<br>[3627, 3647, 1]"]
 | 
			
		||||
    206["Segment<br>[3655, 3679, 1]"]
 | 
			
		||||
    209["Segment<br>[3687, 3710, 1]"]
 | 
			
		||||
    211["Segment<br>[3718, 3725, 1]"]
 | 
			
		||||
    213[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path39 [Path]
 | 
			
		||||
    39["Path<br>[3498, 3531, 8]"]
 | 
			
		||||
    198["Segment<br>[3539, 3558, 8]"]
 | 
			
		||||
    201["Segment<br>[3566, 3588, 8]"]
 | 
			
		||||
    203["Segment<br>[3596, 3619, 8]"]
 | 
			
		||||
    205["Segment<br>[3627, 3647, 8]"]
 | 
			
		||||
    207["Segment<br>[3655, 3679, 8]"]
 | 
			
		||||
    208["Segment<br>[3687, 3710, 8]"]
 | 
			
		||||
    210["Segment<br>[3718, 3725, 8]"]
 | 
			
		||||
    39["Path<br>[3498, 3531, 1]"]
 | 
			
		||||
    198["Segment<br>[3539, 3558, 1]"]
 | 
			
		||||
    201["Segment<br>[3566, 3588, 1]"]
 | 
			
		||||
    203["Segment<br>[3596, 3619, 1]"]
 | 
			
		||||
    205["Segment<br>[3627, 3647, 1]"]
 | 
			
		||||
    207["Segment<br>[3655, 3679, 1]"]
 | 
			
		||||
    208["Segment<br>[3687, 3710, 1]"]
 | 
			
		||||
    210["Segment<br>[3718, 3725, 1]"]
 | 
			
		||||
    216[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[823, 864, 0]"]
 | 
			
		||||
@ -237,39 +237,39 @@ flowchart LR
 | 
			
		||||
  3["Plane<br>[975, 1017, 0]"]
 | 
			
		||||
  4["Plane<br>[1077, 1144, 0]"]
 | 
			
		||||
  5["Plane<br>[1223, 1290, 0]"]
 | 
			
		||||
  6["Plane<br>[334, 354, 8]"]
 | 
			
		||||
  7["Plane<br>[334, 354, 8]"]
 | 
			
		||||
  8["Plane<br>[3807, 3842, 8]"]
 | 
			
		||||
  9["Plane<br>[3807, 3842, 8]"]
 | 
			
		||||
  10["Plane<br>[3871, 3900, 8]"]
 | 
			
		||||
  11["Plane<br>[3871, 3900, 8]"]
 | 
			
		||||
  12["StartSketchOnPlane<br>[2700, 2720, 8]"]
 | 
			
		||||
  13["StartSketchOnPlane<br>[1737, 1757, 8]"]
 | 
			
		||||
  14["StartSketchOnPlane<br>[3258, 3278, 8]"]
 | 
			
		||||
  15["StartSketchOnPlane<br>[1737, 1757, 8]"]
 | 
			
		||||
  16["StartSketchOnPlane<br>[334, 354, 8]"]
 | 
			
		||||
  17["StartSketchOnPlane<br>[3470, 3490, 8]"]
 | 
			
		||||
  18["StartSketchOnPlane<br>[3470, 3490, 8]"]
 | 
			
		||||
  19["StartSketchOnPlane<br>[334, 354, 8]"]
 | 
			
		||||
  20["StartSketchOnPlane<br>[334, 354, 8]"]
 | 
			
		||||
  21["StartSketchOnPlane<br>[3258, 3278, 8]"]
 | 
			
		||||
  22["StartSketchOnPlane<br>[334, 354, 8]"]
 | 
			
		||||
  23["StartSketchOnPlane<br>[2189, 2209, 8]"]
 | 
			
		||||
  224["Sweep Extrusion<br>[1462, 1500, 8]"]
 | 
			
		||||
  225["Sweep Extrusion<br>[1462, 1500, 8]"]
 | 
			
		||||
  226["Sweep Extrusion<br>[1462, 1500, 8]"]
 | 
			
		||||
  227["Sweep Extrusion<br>[1538, 1577, 8]"]
 | 
			
		||||
  228["Sweep Extrusion<br>[1538, 1577, 8]"]
 | 
			
		||||
  229["Sweep Extrusion<br>[1538, 1577, 8]"]
 | 
			
		||||
  230["Sweep Extrusion<br>[2034, 2058, 8]"]
 | 
			
		||||
  231["Sweep Extrusion<br>[2108, 2132, 8]"]
 | 
			
		||||
  232["Sweep Extrusion<br>[2618, 2642, 8]"]
 | 
			
		||||
  233["Sweep Extrusion<br>[2618, 2642, 8]"]
 | 
			
		||||
  234["Sweep Extrusion<br>[2618, 2642, 8]"]
 | 
			
		||||
  235["Sweep Extrusion<br>[3180, 3204, 8]"]
 | 
			
		||||
  236["Sweep Extrusion<br>[3180, 3204, 8]"]
 | 
			
		||||
  237["Sweep Sweep<br>[3922, 3949, 8]"]
 | 
			
		||||
  238["Sweep Sweep<br>[3922, 3949, 8]"]
 | 
			
		||||
  6["Plane<br>[334, 354, 1]"]
 | 
			
		||||
  7["Plane<br>[334, 354, 1]"]
 | 
			
		||||
  8["Plane<br>[3807, 3842, 1]"]
 | 
			
		||||
  9["Plane<br>[3807, 3842, 1]"]
 | 
			
		||||
  10["Plane<br>[3871, 3900, 1]"]
 | 
			
		||||
  11["Plane<br>[3871, 3900, 1]"]
 | 
			
		||||
  12["StartSketchOnPlane<br>[2700, 2720, 1]"]
 | 
			
		||||
  13["StartSketchOnPlane<br>[1737, 1757, 1]"]
 | 
			
		||||
  14["StartSketchOnPlane<br>[3258, 3278, 1]"]
 | 
			
		||||
  15["StartSketchOnPlane<br>[1737, 1757, 1]"]
 | 
			
		||||
  16["StartSketchOnPlane<br>[334, 354, 1]"]
 | 
			
		||||
  17["StartSketchOnPlane<br>[3470, 3490, 1]"]
 | 
			
		||||
  18["StartSketchOnPlane<br>[3470, 3490, 1]"]
 | 
			
		||||
  19["StartSketchOnPlane<br>[334, 354, 1]"]
 | 
			
		||||
  20["StartSketchOnPlane<br>[334, 354, 1]"]
 | 
			
		||||
  21["StartSketchOnPlane<br>[3258, 3278, 1]"]
 | 
			
		||||
  22["StartSketchOnPlane<br>[334, 354, 1]"]
 | 
			
		||||
  23["StartSketchOnPlane<br>[2189, 2209, 1]"]
 | 
			
		||||
  224["Sweep Extrusion<br>[1462, 1500, 1]"]
 | 
			
		||||
  225["Sweep Extrusion<br>[1462, 1500, 1]"]
 | 
			
		||||
  226["Sweep Extrusion<br>[1462, 1500, 1]"]
 | 
			
		||||
  227["Sweep Extrusion<br>[1538, 1577, 1]"]
 | 
			
		||||
  228["Sweep Extrusion<br>[1538, 1577, 1]"]
 | 
			
		||||
  229["Sweep Extrusion<br>[1538, 1577, 1]"]
 | 
			
		||||
  230["Sweep Extrusion<br>[2034, 2058, 1]"]
 | 
			
		||||
  231["Sweep Extrusion<br>[2108, 2132, 1]"]
 | 
			
		||||
  232["Sweep Extrusion<br>[2618, 2642, 1]"]
 | 
			
		||||
  233["Sweep Extrusion<br>[2618, 2642, 1]"]
 | 
			
		||||
  234["Sweep Extrusion<br>[2618, 2642, 1]"]
 | 
			
		||||
  235["Sweep Extrusion<br>[3180, 3204, 1]"]
 | 
			
		||||
  236["Sweep Extrusion<br>[3180, 3204, 1]"]
 | 
			
		||||
  237["Sweep Sweep<br>[3922, 3949, 1]"]
 | 
			
		||||
  238["Sweep Sweep<br>[3922, 3949, 1]"]
 | 
			
		||||
  239[Wall]
 | 
			
		||||
  240[Wall]
 | 
			
		||||
  241[Wall]
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -31,7 +31,7 @@ description: Variables in memory after executing car-wheel-assembly.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "brakeCaliper": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 11
 | 
			
		||||
    "value": 4
 | 
			
		||||
  },
 | 
			
		||||
  "c1": {
 | 
			
		||||
    "type": "TagIdentifier",
 | 
			
		||||
@ -105,15 +105,15 @@ description: Variables in memory after executing car-wheel-assembly.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "carRotor": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 10
 | 
			
		||||
    "value": 3
 | 
			
		||||
  },
 | 
			
		||||
  "carTire": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 13
 | 
			
		||||
    "value": 6
 | 
			
		||||
  },
 | 
			
		||||
  "carWheel": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  },
 | 
			
		||||
  "drillAndSlotCount": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
@ -183,7 +183,7 @@ description: Variables in memory after executing car-wheel-assembly.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "lugNut": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 12
 | 
			
		||||
    "value": 5
 | 
			
		||||
  },
 | 
			
		||||
  "lugSpacing": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
 | 
			
		||||
@ -608,7 +608,7 @@ flowchart LR
 | 
			
		||||
  83 --- 246
 | 
			
		||||
  83 --- 289
 | 
			
		||||
  90 --- 159
 | 
			
		||||
  90 x--> 193
 | 
			
		||||
  90 x--> 192
 | 
			
		||||
  90 --- 226
 | 
			
		||||
  90 --- 271
 | 
			
		||||
  104 --- 151
 | 
			
		||||
@ -910,7 +910,7 @@ flowchart LR
 | 
			
		||||
  211 <--x 191
 | 
			
		||||
  212 <--x 191
 | 
			
		||||
  213 <--x 191
 | 
			
		||||
  226 <--x 192
 | 
			
		||||
  226 <--x 193
 | 
			
		||||
  239 <--x 195
 | 
			
		||||
  240 <--x 195
 | 
			
		||||
  241 <--x 195
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -5,18 +5,18 @@ description: Variables in memory after executing multi-axis-robot.kcl
 | 
			
		||||
{
 | 
			
		||||
  "j2RobotArm": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 11
 | 
			
		||||
    "value": 4
 | 
			
		||||
  },
 | 
			
		||||
  "j3RobotArm": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 12
 | 
			
		||||
    "value": 5
 | 
			
		||||
  },
 | 
			
		||||
  "robotArmBase": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  },
 | 
			
		||||
  "rotatingBase": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 10
 | 
			
		||||
    "value": 3
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,173 +1,173 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path23 [Path]
 | 
			
		||||
    23["Path<br>[422, 484, 9]"]
 | 
			
		||||
    46["Segment<br>[422, 484, 9]"]
 | 
			
		||||
    93[Solid2d]
 | 
			
		||||
    23["Path<br>[422, 484, 2]"]
 | 
			
		||||
    46["Segment<br>[422, 484, 2]"]
 | 
			
		||||
    94[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path24 [Path]
 | 
			
		||||
    24["Path<br>[622, 682, 9]"]
 | 
			
		||||
    47["Segment<br>[622, 682, 9]"]
 | 
			
		||||
    84[Solid2d]
 | 
			
		||||
    24["Path<br>[622, 682, 2]"]
 | 
			
		||||
    47["Segment<br>[622, 682, 2]"]
 | 
			
		||||
    92[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path25 [Path]
 | 
			
		||||
    25["Path<br>[595, 688, 10]"]
 | 
			
		||||
    48["Segment<br>[595, 688, 10]"]
 | 
			
		||||
    88[Solid2d]
 | 
			
		||||
    25["Path<br>[595, 688, 3]"]
 | 
			
		||||
    48["Segment<br>[595, 688, 3]"]
 | 
			
		||||
    87[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path26 [Path]
 | 
			
		||||
    26["Path<br>[595, 688, 10]"]
 | 
			
		||||
    49["Segment<br>[595, 688, 10]"]
 | 
			
		||||
    90[Solid2d]
 | 
			
		||||
    26["Path<br>[595, 688, 3]"]
 | 
			
		||||
    49["Segment<br>[595, 688, 3]"]
 | 
			
		||||
    89[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path27 [Path]
 | 
			
		||||
    27["Path<br>[917, 972, 10]"]
 | 
			
		||||
    51["Segment<br>[917, 972, 10]"]
 | 
			
		||||
    85[Solid2d]
 | 
			
		||||
    27["Path<br>[917, 972, 3]"]
 | 
			
		||||
    51["Segment<br>[917, 972, 3]"]
 | 
			
		||||
    84[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path28 [Path]
 | 
			
		||||
    28["Path<br>[917, 972, 10]"]
 | 
			
		||||
    50["Segment<br>[917, 972, 10]"]
 | 
			
		||||
    28["Path<br>[917, 972, 3]"]
 | 
			
		||||
    50["Segment<br>[917, 972, 3]"]
 | 
			
		||||
    100[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path29 [Path]
 | 
			
		||||
    29["Path<br>[1202, 1261, 10]"]
 | 
			
		||||
    53["Segment<br>[1202, 1261, 10]"]
 | 
			
		||||
    86[Solid2d]
 | 
			
		||||
    29["Path<br>[1202, 1261, 3]"]
 | 
			
		||||
    53["Segment<br>[1202, 1261, 3]"]
 | 
			
		||||
    85[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path30 [Path]
 | 
			
		||||
    30["Path<br>[1202, 1261, 10]"]
 | 
			
		||||
    52["Segment<br>[1202, 1261, 10]"]
 | 
			
		||||
    30["Path<br>[1202, 1261, 3]"]
 | 
			
		||||
    52["Segment<br>[1202, 1261, 3]"]
 | 
			
		||||
    99[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path31 [Path]
 | 
			
		||||
    31["Path<br>[1368, 1428, 10]"]
 | 
			
		||||
    54["Segment<br>[1368, 1428, 10]"]
 | 
			
		||||
    31["Path<br>[1368, 1428, 3]"]
 | 
			
		||||
    54["Segment<br>[1368, 1428, 3]"]
 | 
			
		||||
    82[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path32 [Path]
 | 
			
		||||
    32["Path<br>[1368, 1428, 10]"]
 | 
			
		||||
    55["Segment<br>[1368, 1428, 10]"]
 | 
			
		||||
    32["Path<br>[1368, 1428, 3]"]
 | 
			
		||||
    55["Segment<br>[1368, 1428, 3]"]
 | 
			
		||||
    95[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path33 [Path]
 | 
			
		||||
    33["Path<br>[1590, 1643, 10]"]
 | 
			
		||||
    56["Segment<br>[1590, 1643, 10]"]
 | 
			
		||||
    33["Path<br>[1590, 1643, 3]"]
 | 
			
		||||
    56["Segment<br>[1590, 1643, 3]"]
 | 
			
		||||
    81[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path34 [Path]
 | 
			
		||||
    34["Path<br>[1590, 1643, 10]"]
 | 
			
		||||
    57["Segment<br>[1590, 1643, 10]"]
 | 
			
		||||
    34["Path<br>[1590, 1643, 3]"]
 | 
			
		||||
    57["Segment<br>[1590, 1643, 3]"]
 | 
			
		||||
    98[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path35 [Path]
 | 
			
		||||
    35["Path<br>[411, 463, 11]"]
 | 
			
		||||
    58["Segment<br>[411, 463, 11]"]
 | 
			
		||||
    94[Solid2d]
 | 
			
		||||
    35["Path<br>[411, 463, 4]"]
 | 
			
		||||
    58["Segment<br>[411, 463, 4]"]
 | 
			
		||||
    93[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path36 [Path]
 | 
			
		||||
    36["Path<br>[601, 653, 11]"]
 | 
			
		||||
    59["Segment<br>[601, 653, 11]"]
 | 
			
		||||
    36["Path<br>[601, 653, 4]"]
 | 
			
		||||
    59["Segment<br>[601, 653, 4]"]
 | 
			
		||||
    101[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path37 [Path]
 | 
			
		||||
    37["Path<br>[439, 509, 12]"]
 | 
			
		||||
    60["Segment<br>[439, 509, 12]"]
 | 
			
		||||
    92[Solid2d]
 | 
			
		||||
    37["Path<br>[439, 509, 5]"]
 | 
			
		||||
    60["Segment<br>[439, 509, 5]"]
 | 
			
		||||
    91[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path38 [Path]
 | 
			
		||||
    38["Path<br>[778, 865, 12]"]
 | 
			
		||||
    61["Segment<br>[873, 924, 12]"]
 | 
			
		||||
    62["Segment<br>[932, 983, 12]"]
 | 
			
		||||
    63["Segment<br>[991, 1042, 12]"]
 | 
			
		||||
    64["Segment<br>[1050, 1100, 12]"]
 | 
			
		||||
    65["Segment<br>[1108, 1158, 12]"]
 | 
			
		||||
    66["Segment<br>[1166, 1173, 12]"]
 | 
			
		||||
    38["Path<br>[778, 865, 5]"]
 | 
			
		||||
    61["Segment<br>[873, 924, 5]"]
 | 
			
		||||
    62["Segment<br>[932, 983, 5]"]
 | 
			
		||||
    63["Segment<br>[991, 1042, 5]"]
 | 
			
		||||
    64["Segment<br>[1050, 1100, 5]"]
 | 
			
		||||
    65["Segment<br>[1108, 1158, 5]"]
 | 
			
		||||
    66["Segment<br>[1166, 1173, 5]"]
 | 
			
		||||
    83[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path39 [Path]
 | 
			
		||||
    39["Path<br>[1312, 1381, 12]"]
 | 
			
		||||
    67["Segment<br>[1312, 1381, 12]"]
 | 
			
		||||
    39["Path<br>[1312, 1381, 5]"]
 | 
			
		||||
    67["Segment<br>[1312, 1381, 5]"]
 | 
			
		||||
    96[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path40 [Path]
 | 
			
		||||
    40["Path<br>[425, 515, 13]"]
 | 
			
		||||
    68["Segment<br>[523, 573, 13]"]
 | 
			
		||||
    69["Segment<br>[581, 631, 13]"]
 | 
			
		||||
    70["Segment<br>[639, 689, 13]"]
 | 
			
		||||
    71["Segment<br>[697, 746, 13]"]
 | 
			
		||||
    72["Segment<br>[754, 803, 13]"]
 | 
			
		||||
    73["Segment<br>[811, 818, 13]"]
 | 
			
		||||
    87[Solid2d]
 | 
			
		||||
    40["Path<br>[425, 515, 6]"]
 | 
			
		||||
    68["Segment<br>[523, 573, 6]"]
 | 
			
		||||
    69["Segment<br>[581, 631, 6]"]
 | 
			
		||||
    70["Segment<br>[639, 689, 6]"]
 | 
			
		||||
    71["Segment<br>[697, 746, 6]"]
 | 
			
		||||
    72["Segment<br>[754, 803, 6]"]
 | 
			
		||||
    73["Segment<br>[811, 818, 6]"]
 | 
			
		||||
    86[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path41 [Path]
 | 
			
		||||
    41["Path<br>[967, 1019, 13]"]
 | 
			
		||||
    74["Segment<br>[967, 1019, 13]"]
 | 
			
		||||
    41["Path<br>[967, 1019, 6]"]
 | 
			
		||||
    74["Segment<br>[967, 1019, 6]"]
 | 
			
		||||
    97[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path42 [Path]
 | 
			
		||||
    42["Path<br>[325, 383, 14]"]
 | 
			
		||||
    75["Segment<br>[325, 383, 14]"]
 | 
			
		||||
    42["Path<br>[325, 383, 7]"]
 | 
			
		||||
    75["Segment<br>[325, 383, 7]"]
 | 
			
		||||
    80[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path43 [Path]
 | 
			
		||||
    43["Path<br>[325, 383, 14]"]
 | 
			
		||||
    76["Segment<br>[325, 383, 14]"]
 | 
			
		||||
    91[Solid2d]
 | 
			
		||||
    43["Path<br>[325, 383, 7]"]
 | 
			
		||||
    76["Segment<br>[325, 383, 7]"]
 | 
			
		||||
    90[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path44 [Path]
 | 
			
		||||
    44["Path<br>[527, 582, 14]"]
 | 
			
		||||
    78["Segment<br>[527, 582, 14]"]
 | 
			
		||||
    44["Path<br>[527, 582, 7]"]
 | 
			
		||||
    78["Segment<br>[527, 582, 7]"]
 | 
			
		||||
    79[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path45 [Path]
 | 
			
		||||
    45["Path<br>[527, 582, 14]"]
 | 
			
		||||
    77["Segment<br>[527, 582, 14]"]
 | 
			
		||||
    89[Solid2d]
 | 
			
		||||
    45["Path<br>[527, 582, 7]"]
 | 
			
		||||
    77["Segment<br>[527, 582, 7]"]
 | 
			
		||||
    88[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[399, 416, 9]"]
 | 
			
		||||
  2["Plane<br>[570, 587, 10]"]
 | 
			
		||||
  3["Plane<br>[570, 587, 10]"]
 | 
			
		||||
  4["Plane<br>[892, 909, 10]"]
 | 
			
		||||
  5["Plane<br>[892, 909, 10]"]
 | 
			
		||||
  6["Plane<br>[386, 403, 11]"]
 | 
			
		||||
  7["Plane<br>[414, 431, 12]"]
 | 
			
		||||
  8["Plane<br>[400, 417, 13]"]
 | 
			
		||||
  9["Plane<br>[300, 317, 14]"]
 | 
			
		||||
  10["Plane<br>[300, 317, 14]"]
 | 
			
		||||
  11["StartSketchOnFace<br>[1323, 1360, 10]"]
 | 
			
		||||
  12["StartSketchOnFace<br>[1544, 1582, 10]"]
 | 
			
		||||
  13["StartSketchOnFace<br>[922, 959, 13]"]
 | 
			
		||||
  14["StartSketchOnFace<br>[484, 519, 14]"]
 | 
			
		||||
  15["StartSketchOnFace<br>[1544, 1582, 10]"]
 | 
			
		||||
  16["StartSketchOnFace<br>[1155, 1194, 10]"]
 | 
			
		||||
  17["StartSketchOnFace<br>[733, 770, 12]"]
 | 
			
		||||
  18["StartSketchOnFace<br>[1269, 1304, 12]"]
 | 
			
		||||
  19["StartSketchOnFace<br>[556, 593, 11]"]
 | 
			
		||||
  20["StartSketchOnFace<br>[1155, 1194, 10]"]
 | 
			
		||||
  21["StartSketchOnFace<br>[1323, 1360, 10]"]
 | 
			
		||||
  22["StartSketchOnFace<br>[484, 519, 14]"]
 | 
			
		||||
  102["Sweep Extrusion<br>[490, 526, 9]"]
 | 
			
		||||
  103["Sweep Extrusion<br>[688, 725, 9]"]
 | 
			
		||||
  104["Sweep Extrusion<br>[1020, 1060, 10]"]
 | 
			
		||||
  105["Sweep Extrusion<br>[1020, 1060, 10]"]
 | 
			
		||||
  106["Sweep Extrusion<br>[1269, 1306, 10]"]
 | 
			
		||||
  107["Sweep Extrusion<br>[1269, 1306, 10]"]
 | 
			
		||||
  108["Sweep Extrusion<br>[1436, 1474, 10]"]
 | 
			
		||||
  109["Sweep Extrusion<br>[1436, 1474, 10]"]
 | 
			
		||||
  110["Sweep Extrusion<br>[1651, 1693, 10]"]
 | 
			
		||||
  111["Sweep Extrusion<br>[1651, 1693, 10]"]
 | 
			
		||||
  112["Sweep Extrusion<br>[471, 504, 11]"]
 | 
			
		||||
  113["Sweep Extrusion<br>[661, 698, 11]"]
 | 
			
		||||
  114["Sweep Extrusion<br>[517, 550, 12]"]
 | 
			
		||||
  115["Sweep Extrusion<br>[1181, 1221, 12]"]
 | 
			
		||||
  116["Sweep Extrusion<br>[1389, 1417, 12]"]
 | 
			
		||||
  117["Sweep Extrusion<br>[826, 859, 13]"]
 | 
			
		||||
  118["Sweep Extrusion<br>[1027, 1064, 13]"]
 | 
			
		||||
  119["Sweep Extrusion<br>[391, 422, 14]"]
 | 
			
		||||
  120["Sweep Extrusion<br>[391, 422, 14]"]
 | 
			
		||||
  121["Sweep Extrusion<br>[590, 622, 14]"]
 | 
			
		||||
  122["Sweep Extrusion<br>[590, 622, 14]"]
 | 
			
		||||
  1["Plane<br>[399, 416, 2]"]
 | 
			
		||||
  2["Plane<br>[570, 587, 3]"]
 | 
			
		||||
  3["Plane<br>[570, 587, 3]"]
 | 
			
		||||
  4["Plane<br>[892, 909, 3]"]
 | 
			
		||||
  5["Plane<br>[892, 909, 3]"]
 | 
			
		||||
  6["Plane<br>[386, 403, 4]"]
 | 
			
		||||
  7["Plane<br>[414, 431, 5]"]
 | 
			
		||||
  8["Plane<br>[400, 417, 6]"]
 | 
			
		||||
  9["Plane<br>[300, 317, 7]"]
 | 
			
		||||
  10["Plane<br>[300, 317, 7]"]
 | 
			
		||||
  11["StartSketchOnFace<br>[1323, 1360, 3]"]
 | 
			
		||||
  12["StartSketchOnFace<br>[1544, 1582, 3]"]
 | 
			
		||||
  13["StartSketchOnFace<br>[922, 959, 6]"]
 | 
			
		||||
  14["StartSketchOnFace<br>[484, 519, 7]"]
 | 
			
		||||
  15["StartSketchOnFace<br>[1544, 1582, 3]"]
 | 
			
		||||
  16["StartSketchOnFace<br>[1155, 1194, 3]"]
 | 
			
		||||
  17["StartSketchOnFace<br>[733, 770, 5]"]
 | 
			
		||||
  18["StartSketchOnFace<br>[1269, 1304, 5]"]
 | 
			
		||||
  19["StartSketchOnFace<br>[556, 593, 4]"]
 | 
			
		||||
  20["StartSketchOnFace<br>[1155, 1194, 3]"]
 | 
			
		||||
  21["StartSketchOnFace<br>[1323, 1360, 3]"]
 | 
			
		||||
  22["StartSketchOnFace<br>[484, 519, 7]"]
 | 
			
		||||
  102["Sweep Extrusion<br>[490, 526, 2]"]
 | 
			
		||||
  103["Sweep Extrusion<br>[688, 725, 2]"]
 | 
			
		||||
  104["Sweep Extrusion<br>[1020, 1060, 3]"]
 | 
			
		||||
  105["Sweep Extrusion<br>[1020, 1060, 3]"]
 | 
			
		||||
  106["Sweep Extrusion<br>[1269, 1306, 3]"]
 | 
			
		||||
  107["Sweep Extrusion<br>[1269, 1306, 3]"]
 | 
			
		||||
  108["Sweep Extrusion<br>[1436, 1474, 3]"]
 | 
			
		||||
  109["Sweep Extrusion<br>[1436, 1474, 3]"]
 | 
			
		||||
  110["Sweep Extrusion<br>[1651, 1693, 3]"]
 | 
			
		||||
  111["Sweep Extrusion<br>[1651, 1693, 3]"]
 | 
			
		||||
  112["Sweep Extrusion<br>[471, 504, 4]"]
 | 
			
		||||
  113["Sweep Extrusion<br>[661, 698, 4]"]
 | 
			
		||||
  114["Sweep Extrusion<br>[517, 550, 5]"]
 | 
			
		||||
  115["Sweep Extrusion<br>[1181, 1221, 5]"]
 | 
			
		||||
  116["Sweep Extrusion<br>[1389, 1417, 5]"]
 | 
			
		||||
  117["Sweep Extrusion<br>[826, 859, 6]"]
 | 
			
		||||
  118["Sweep Extrusion<br>[1027, 1064, 6]"]
 | 
			
		||||
  119["Sweep Extrusion<br>[391, 422, 7]"]
 | 
			
		||||
  120["Sweep Extrusion<br>[391, 422, 7]"]
 | 
			
		||||
  121["Sweep Extrusion<br>[590, 622, 7]"]
 | 
			
		||||
  122["Sweep Extrusion<br>[590, 622, 7]"]
 | 
			
		||||
  123[Wall]
 | 
			
		||||
  124[Wall]
 | 
			
		||||
  125[Wall]
 | 
			
		||||
@ -283,8 +283,8 @@ flowchart LR
 | 
			
		||||
  235["SweepEdge Adjacent"]
 | 
			
		||||
  236["SweepEdge Adjacent"]
 | 
			
		||||
  237["SweepEdge Adjacent"]
 | 
			
		||||
  238["EdgeCut Fillet<br>[558, 624, 12]"]
 | 
			
		||||
  239["EdgeCut Fillet<br>[558, 624, 12]"]
 | 
			
		||||
  238["EdgeCut Fillet<br>[558, 624, 5]"]
 | 
			
		||||
  239["EdgeCut Fillet<br>[558, 624, 5]"]
 | 
			
		||||
  1 --- 23
 | 
			
		||||
  2 --- 25
 | 
			
		||||
  3 --- 26
 | 
			
		||||
@ -308,24 +308,24 @@ flowchart LR
 | 
			
		||||
  170 x--> 21
 | 
			
		||||
  171 x--> 22
 | 
			
		||||
  23 --- 46
 | 
			
		||||
  23 --- 93
 | 
			
		||||
  23 --- 94
 | 
			
		||||
  23 ---- 102
 | 
			
		||||
  24 --- 47
 | 
			
		||||
  24 --- 84
 | 
			
		||||
  24 --- 92
 | 
			
		||||
  24 ---- 103
 | 
			
		||||
  164 --- 24
 | 
			
		||||
  25 --- 48
 | 
			
		||||
  25 --- 88
 | 
			
		||||
  25 --- 87
 | 
			
		||||
  26 --- 49
 | 
			
		||||
  26 --- 90
 | 
			
		||||
  26 --- 89
 | 
			
		||||
  27 --- 51
 | 
			
		||||
  27 --- 85
 | 
			
		||||
  27 --- 84
 | 
			
		||||
  27 ---- 104
 | 
			
		||||
  28 --- 50
 | 
			
		||||
  28 --- 100
 | 
			
		||||
  28 ---- 105
 | 
			
		||||
  29 --- 53
 | 
			
		||||
  29 --- 86
 | 
			
		||||
  29 --- 85
 | 
			
		||||
  29 ---- 107
 | 
			
		||||
  159 --- 29
 | 
			
		||||
  30 --- 52
 | 
			
		||||
@ -349,14 +349,14 @@ flowchart LR
 | 
			
		||||
  34 ---- 111
 | 
			
		||||
  169 --- 34
 | 
			
		||||
  35 --- 58
 | 
			
		||||
  35 --- 94
 | 
			
		||||
  35 --- 93
 | 
			
		||||
  35 ---- 112
 | 
			
		||||
  36 --- 59
 | 
			
		||||
  36 --- 101
 | 
			
		||||
  36 ---- 113
 | 
			
		||||
  173 --- 36
 | 
			
		||||
  37 --- 60
 | 
			
		||||
  37 --- 92
 | 
			
		||||
  37 --- 91
 | 
			
		||||
  37 ---- 114
 | 
			
		||||
  38 --- 61
 | 
			
		||||
  38 --- 62
 | 
			
		||||
@ -377,7 +377,7 @@ flowchart LR
 | 
			
		||||
  40 --- 71
 | 
			
		||||
  40 --- 72
 | 
			
		||||
  40 --- 73
 | 
			
		||||
  40 --- 87
 | 
			
		||||
  40 --- 86
 | 
			
		||||
  40 ---- 117
 | 
			
		||||
  41 --- 74
 | 
			
		||||
  41 --- 97
 | 
			
		||||
@ -387,24 +387,24 @@ flowchart LR
 | 
			
		||||
  42 --- 80
 | 
			
		||||
  42 ---- 120
 | 
			
		||||
  43 --- 76
 | 
			
		||||
  43 --- 91
 | 
			
		||||
  43 --- 90
 | 
			
		||||
  43 ---- 119
 | 
			
		||||
  44 --- 78
 | 
			
		||||
  44 --- 79
 | 
			
		||||
  44 ---- 121
 | 
			
		||||
  165 --- 44
 | 
			
		||||
  45 --- 77
 | 
			
		||||
  45 --- 89
 | 
			
		||||
  45 --- 88
 | 
			
		||||
  45 ---- 122
 | 
			
		||||
  171 --- 45
 | 
			
		||||
  46 --- 152
 | 
			
		||||
  46 --- 142
 | 
			
		||||
  46 x--> 154
 | 
			
		||||
  46 --- 205
 | 
			
		||||
  46 --- 236
 | 
			
		||||
  47 --- 145
 | 
			
		||||
  46 --- 195
 | 
			
		||||
  46 --- 226
 | 
			
		||||
  47 --- 152
 | 
			
		||||
  47 x--> 164
 | 
			
		||||
  47 --- 198
 | 
			
		||||
  47 --- 229
 | 
			
		||||
  47 --- 205
 | 
			
		||||
  47 --- 236
 | 
			
		||||
  50 --- 153
 | 
			
		||||
  50 x--> 156
 | 
			
		||||
  50 --- 206
 | 
			
		||||
@ -413,14 +413,14 @@ flowchart LR
 | 
			
		||||
  51 x--> 159
 | 
			
		||||
  51 --- 180
 | 
			
		||||
  51 --- 211
 | 
			
		||||
  52 --- 143
 | 
			
		||||
  52 --- 144
 | 
			
		||||
  52 x--> 156
 | 
			
		||||
  52 --- 196
 | 
			
		||||
  52 --- 227
 | 
			
		||||
  53 --- 144
 | 
			
		||||
  52 --- 197
 | 
			
		||||
  52 --- 228
 | 
			
		||||
  53 --- 145
 | 
			
		||||
  53 x--> 159
 | 
			
		||||
  53 --- 197
 | 
			
		||||
  53 --- 228
 | 
			
		||||
  53 --- 198
 | 
			
		||||
  53 --- 229
 | 
			
		||||
  54 --- 134
 | 
			
		||||
  54 x--> 170
 | 
			
		||||
  54 --- 187
 | 
			
		||||
@ -433,10 +433,10 @@ flowchart LR
 | 
			
		||||
  56 x--> 174
 | 
			
		||||
  56 --- 179
 | 
			
		||||
  56 --- 210
 | 
			
		||||
  57 --- 142
 | 
			
		||||
  57 --- 143
 | 
			
		||||
  57 x--> 169
 | 
			
		||||
  57 --- 195
 | 
			
		||||
  57 --- 226
 | 
			
		||||
  57 --- 196
 | 
			
		||||
  57 --- 227
 | 
			
		||||
  58 --- 124
 | 
			
		||||
  58 x--> 162
 | 
			
		||||
  58 --- 177
 | 
			
		||||
@ -522,14 +522,14 @@ flowchart LR
 | 
			
		||||
  78 x--> 165
 | 
			
		||||
  78 --- 183
 | 
			
		||||
  78 --- 214
 | 
			
		||||
  102 --- 152
 | 
			
		||||
  102 --- 142
 | 
			
		||||
  102 --- 154
 | 
			
		||||
  102 --- 164
 | 
			
		||||
  102 --- 205
 | 
			
		||||
  102 --- 236
 | 
			
		||||
  103 --- 145
 | 
			
		||||
  103 --- 198
 | 
			
		||||
  103 --- 229
 | 
			
		||||
  102 --- 195
 | 
			
		||||
  102 --- 226
 | 
			
		||||
  103 --- 152
 | 
			
		||||
  103 --- 205
 | 
			
		||||
  103 --- 236
 | 
			
		||||
  104 --- 127
 | 
			
		||||
  104 --- 159
 | 
			
		||||
  104 --- 170
 | 
			
		||||
@ -540,14 +540,14 @@ flowchart LR
 | 
			
		||||
  105 --- 166
 | 
			
		||||
  105 --- 206
 | 
			
		||||
  105 --- 237
 | 
			
		||||
  106 --- 143
 | 
			
		||||
  106 --- 144
 | 
			
		||||
  106 --- 163
 | 
			
		||||
  106 --- 196
 | 
			
		||||
  106 --- 227
 | 
			
		||||
  107 --- 144
 | 
			
		||||
  106 --- 197
 | 
			
		||||
  106 --- 228
 | 
			
		||||
  107 --- 145
 | 
			
		||||
  107 --- 167
 | 
			
		||||
  107 --- 197
 | 
			
		||||
  107 --- 228
 | 
			
		||||
  107 --- 198
 | 
			
		||||
  107 --- 229
 | 
			
		||||
  108 --- 125
 | 
			
		||||
  108 --- 169
 | 
			
		||||
  108 --- 178
 | 
			
		||||
@ -559,9 +559,9 @@ flowchart LR
 | 
			
		||||
  110 --- 126
 | 
			
		||||
  110 --- 179
 | 
			
		||||
  110 --- 210
 | 
			
		||||
  111 --- 142
 | 
			
		||||
  111 --- 195
 | 
			
		||||
  111 --- 226
 | 
			
		||||
  111 --- 143
 | 
			
		||||
  111 --- 196
 | 
			
		||||
  111 --- 227
 | 
			
		||||
  112 --- 124
 | 
			
		||||
  112 --- 162
 | 
			
		||||
  112 --- 173
 | 
			
		||||
@ -710,7 +710,7 @@ flowchart LR
 | 
			
		||||
  236 <--x 152
 | 
			
		||||
  206 <--x 153
 | 
			
		||||
  237 <--x 153
 | 
			
		||||
  198 <--x 154
 | 
			
		||||
  205 <--x 154
 | 
			
		||||
  183 <--x 155
 | 
			
		||||
  185 <--x 157
 | 
			
		||||
  199 <--x 158
 | 
			
		||||
@ -721,13 +721,13 @@ flowchart LR
 | 
			
		||||
  204 <--x 158
 | 
			
		||||
  186 <--x 160
 | 
			
		||||
  182 <--x 162
 | 
			
		||||
  195 <--x 163
 | 
			
		||||
  196 <--x 163
 | 
			
		||||
  205 <--x 164
 | 
			
		||||
  197 <--x 163
 | 
			
		||||
  195 <--x 164
 | 
			
		||||
  184 <--x 165
 | 
			
		||||
  206 <--x 166
 | 
			
		||||
  179 <--x 167
 | 
			
		||||
  197 <--x 167
 | 
			
		||||
  198 <--x 167
 | 
			
		||||
  188 <--x 168
 | 
			
		||||
  189 <--x 168
 | 
			
		||||
  190 <--x 168
 | 
			
		||||
 | 
			
		||||
@ -198,7 +198,7 @@ description: Variables in memory after executing pipe-flange-assembly.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "gasket": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 9
 | 
			
		||||
    "value": 2
 | 
			
		||||
  },
 | 
			
		||||
  "gasketInnerDiameter": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -5,7 +5,7 @@ description: Variables in memory after executing walkie-talkie.kcl
 | 
			
		||||
{
 | 
			
		||||
  "antenna": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 12
 | 
			
		||||
    "value": 5
 | 
			
		||||
  },
 | 
			
		||||
  "antennaBaseHeight": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
@ -74,7 +74,7 @@ description: Variables in memory after executing walkie-talkie.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "body": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 9
 | 
			
		||||
    "value": 2
 | 
			
		||||
  },
 | 
			
		||||
  "button": {
 | 
			
		||||
    "type": "Function"
 | 
			
		||||
@ -120,7 +120,7 @@ description: Variables in memory after executing walkie-talkie.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "case": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 10
 | 
			
		||||
    "value": 3
 | 
			
		||||
  },
 | 
			
		||||
  "caseTolerance": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
@ -163,7 +163,7 @@ description: Variables in memory after executing walkie-talkie.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "knob": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 14
 | 
			
		||||
    "value": 7
 | 
			
		||||
  },
 | 
			
		||||
  "knobDiameter": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
@ -330,7 +330,7 @@ description: Variables in memory after executing walkie-talkie.kcl
 | 
			
		||||
  },
 | 
			
		||||
  "talkButton": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 13
 | 
			
		||||
    "value": 6
 | 
			
		||||
  },
 | 
			
		||||
  "talkButtonHeight": {
 | 
			
		||||
    "type": "Number",
 | 
			
		||||
 | 
			
		||||
@ -1,16 +1,16 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path2 [Path]
 | 
			
		||||
    2["Path<br>[80, 105, 8]"]
 | 
			
		||||
    3["Segment<br>[111, 128, 8]"]
 | 
			
		||||
    4["Segment<br>[134, 151, 8]"]
 | 
			
		||||
    5["Segment<br>[157, 175, 8]"]
 | 
			
		||||
    6["Segment<br>[181, 199, 8]"]
 | 
			
		||||
    7["Segment<br>[205, 213, 8]"]
 | 
			
		||||
    2["Path<br>[80, 105, 1]"]
 | 
			
		||||
    3["Segment<br>[111, 128, 1]"]
 | 
			
		||||
    4["Segment<br>[134, 151, 1]"]
 | 
			
		||||
    5["Segment<br>[157, 175, 1]"]
 | 
			
		||||
    6["Segment<br>[181, 199, 1]"]
 | 
			
		||||
    7["Segment<br>[205, 213, 1]"]
 | 
			
		||||
    8[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[57, 74, 8]"]
 | 
			
		||||
  9["Sweep Extrusion<br>[219, 238, 8]"]
 | 
			
		||||
  1["Plane<br>[57, 74, 1]"]
 | 
			
		||||
  9["Sweep Extrusion<br>[219, 238, 1]"]
 | 
			
		||||
  10[Wall]
 | 
			
		||||
  11[Wall]
 | 
			
		||||
  12[Wall]
 | 
			
		||||
@ -33,22 +33,22 @@ flowchart LR
 | 
			
		||||
  2 --- 7
 | 
			
		||||
  2 --- 8
 | 
			
		||||
  2 ---- 9
 | 
			
		||||
  3 --- 11
 | 
			
		||||
  3 --- 12
 | 
			
		||||
  3 x--> 14
 | 
			
		||||
  3 --- 19
 | 
			
		||||
  3 --- 20
 | 
			
		||||
  4 --- 12
 | 
			
		||||
  3 --- 23
 | 
			
		||||
  4 --- 11
 | 
			
		||||
  4 x--> 14
 | 
			
		||||
  4 --- 17
 | 
			
		||||
  4 --- 16
 | 
			
		||||
  4 --- 21
 | 
			
		||||
  5 --- 13
 | 
			
		||||
  5 --- 10
 | 
			
		||||
  5 x--> 14
 | 
			
		||||
  5 --- 16
 | 
			
		||||
  5 --- 18
 | 
			
		||||
  5 --- 22
 | 
			
		||||
  6 --- 10
 | 
			
		||||
  6 --- 13
 | 
			
		||||
  6 x--> 14
 | 
			
		||||
  6 --- 18
 | 
			
		||||
  6 --- 23
 | 
			
		||||
  6 --- 17
 | 
			
		||||
  6 --- 20
 | 
			
		||||
  9 --- 10
 | 
			
		||||
  9 --- 11
 | 
			
		||||
  9 --- 12
 | 
			
		||||
@ -64,16 +64,16 @@ flowchart LR
 | 
			
		||||
  9 --- 22
 | 
			
		||||
  9 --- 23
 | 
			
		||||
  18 <--x 10
 | 
			
		||||
  21 <--x 10
 | 
			
		||||
  22 <--x 10
 | 
			
		||||
  23 <--x 10
 | 
			
		||||
  19 <--x 11
 | 
			
		||||
  20 <--x 11
 | 
			
		||||
  16 <--x 11
 | 
			
		||||
  21 <--x 11
 | 
			
		||||
  23 <--x 11
 | 
			
		||||
  17 <--x 12
 | 
			
		||||
  19 <--x 12
 | 
			
		||||
  20 <--x 12
 | 
			
		||||
  21 <--x 12
 | 
			
		||||
  16 <--x 13
 | 
			
		||||
  21 <--x 13
 | 
			
		||||
  23 <--x 12
 | 
			
		||||
  17 <--x 13
 | 
			
		||||
  20 <--x 13
 | 
			
		||||
  22 <--x 13
 | 
			
		||||
  16 <--x 15
 | 
			
		||||
  17 <--x 15
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,6 @@ description: Variables in memory after executing module_return_using_var.kcl
 | 
			
		||||
{
 | 
			
		||||
  "cube": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,11 +5,11 @@ description: Variables in memory after executing multiple-foreign-imports-all-re
 | 
			
		||||
{
 | 
			
		||||
  "anothercube": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 10
 | 
			
		||||
    "value": 3
 | 
			
		||||
  },
 | 
			
		||||
  "cube": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 8
 | 
			
		||||
    "value": 1
 | 
			
		||||
  },
 | 
			
		||||
  "model": {
 | 
			
		||||
    "type": "ImportedGeometry",
 | 
			
		||||
@ -20,6 +20,6 @@ description: Variables in memory after executing multiple-foreign-imports-all-re
 | 
			
		||||
  },
 | 
			
		||||
  "othercube": {
 | 
			
		||||
    "type": "Module",
 | 
			
		||||
    "value": 9
 | 
			
		||||
    "value": 2
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,31 +1,31 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path3 [Path]
 | 
			
		||||
    3["Path<br>[63, 90, 8]"]
 | 
			
		||||
    5["Segment<br>[98, 116, 8]"]
 | 
			
		||||
    8["Segment<br>[124, 143, 8]"]
 | 
			
		||||
    10["Segment<br>[151, 170, 8]"]
 | 
			
		||||
    11["Segment<br>[178, 185, 8]"]
 | 
			
		||||
    3["Path<br>[63, 90, 1]"]
 | 
			
		||||
    5["Segment<br>[98, 116, 1]"]
 | 
			
		||||
    7["Segment<br>[124, 143, 1]"]
 | 
			
		||||
    9["Segment<br>[151, 170, 1]"]
 | 
			
		||||
    12["Segment<br>[178, 185, 1]"]
 | 
			
		||||
    13[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path4 [Path]
 | 
			
		||||
    4["Path<br>[63, 90, 8]"]
 | 
			
		||||
    6["Segment<br>[98, 116, 8]"]
 | 
			
		||||
    7["Segment<br>[124, 143, 8]"]
 | 
			
		||||
    9["Segment<br>[151, 170, 8]"]
 | 
			
		||||
    12["Segment<br>[178, 185, 8]"]
 | 
			
		||||
    4["Path<br>[63, 90, 1]"]
 | 
			
		||||
    6["Segment<br>[98, 116, 1]"]
 | 
			
		||||
    8["Segment<br>[124, 143, 1]"]
 | 
			
		||||
    10["Segment<br>[151, 170, 1]"]
 | 
			
		||||
    11["Segment<br>[178, 185, 1]"]
 | 
			
		||||
    14[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[38, 55, 8]"]
 | 
			
		||||
  2["Plane<br>[38, 55, 8]"]
 | 
			
		||||
  15["Sweep Extrusion<br>[342, 376, 8]"]
 | 
			
		||||
  16["Sweep Extrusion<br>[342, 376, 8]"]
 | 
			
		||||
  17["Sweep Extrusion<br>[342, 376, 8]"]
 | 
			
		||||
  18["Sweep Extrusion<br>[342, 376, 8]"]
 | 
			
		||||
  19["Sweep Extrusion<br>[342, 376, 8]"]
 | 
			
		||||
  20["Sweep Extrusion<br>[342, 376, 8]"]
 | 
			
		||||
  21["Sweep Extrusion<br>[342, 376, 8]"]
 | 
			
		||||
  22["Sweep Extrusion<br>[342, 376, 8]"]
 | 
			
		||||
  1["Plane<br>[38, 55, 1]"]
 | 
			
		||||
  2["Plane<br>[38, 55, 1]"]
 | 
			
		||||
  15["Sweep Extrusion<br>[342, 376, 1]"]
 | 
			
		||||
  16["Sweep Extrusion<br>[342, 376, 1]"]
 | 
			
		||||
  17["Sweep Extrusion<br>[342, 376, 1]"]
 | 
			
		||||
  18["Sweep Extrusion<br>[342, 376, 1]"]
 | 
			
		||||
  19["Sweep Extrusion<br>[342, 376, 1]"]
 | 
			
		||||
  20["Sweep Extrusion<br>[342, 376, 1]"]
 | 
			
		||||
  21["Sweep Extrusion<br>[342, 376, 1]"]
 | 
			
		||||
  22["Sweep Extrusion<br>[342, 376, 1]"]
 | 
			
		||||
  23[Wall]
 | 
			
		||||
  24[Wall]
 | 
			
		||||
  25[Wall]
 | 
			
		||||
@ -57,63 +57,63 @@ flowchart LR
 | 
			
		||||
  1 --- 3
 | 
			
		||||
  2 --- 4
 | 
			
		||||
  3 --- 5
 | 
			
		||||
  3 --- 8
 | 
			
		||||
  3 --- 10
 | 
			
		||||
  3 --- 11
 | 
			
		||||
  3 --- 7
 | 
			
		||||
  3 --- 9
 | 
			
		||||
  3 --- 12
 | 
			
		||||
  3 --- 13
 | 
			
		||||
  3 ---- 22
 | 
			
		||||
  4 --- 6
 | 
			
		||||
  4 --- 7
 | 
			
		||||
  4 --- 9
 | 
			
		||||
  4 --- 12
 | 
			
		||||
  4 --- 8
 | 
			
		||||
  4 --- 10
 | 
			
		||||
  4 --- 11
 | 
			
		||||
  4 --- 14
 | 
			
		||||
  4 ---- 17
 | 
			
		||||
  5 --- 28
 | 
			
		||||
  4 ---- 16
 | 
			
		||||
  5 --- 29
 | 
			
		||||
  5 x--> 32
 | 
			
		||||
  5 --- 42
 | 
			
		||||
  5 --- 47
 | 
			
		||||
  5 --- 50
 | 
			
		||||
  6 --- 26
 | 
			
		||||
  6 x--> 31
 | 
			
		||||
  6 --- 35
 | 
			
		||||
  6 --- 46
 | 
			
		||||
  7 --- 24
 | 
			
		||||
  7 x--> 31
 | 
			
		||||
  7 --- 38
 | 
			
		||||
  7 --- 44
 | 
			
		||||
  8 --- 29
 | 
			
		||||
  8 x--> 32
 | 
			
		||||
  8 --- 40
 | 
			
		||||
  8 --- 48
 | 
			
		||||
  9 --- 23
 | 
			
		||||
  9 x--> 31
 | 
			
		||||
  9 --- 37
 | 
			
		||||
  9 --- 45
 | 
			
		||||
  10 --- 30
 | 
			
		||||
  10 x--> 32
 | 
			
		||||
  10 --- 39
 | 
			
		||||
  10 --- 49
 | 
			
		||||
  11 --- 27
 | 
			
		||||
  11 x--> 32
 | 
			
		||||
  11 --- 41
 | 
			
		||||
  11 --- 50
 | 
			
		||||
  12 --- 25
 | 
			
		||||
  12 x--> 31
 | 
			
		||||
  12 --- 36
 | 
			
		||||
  12 --- 43
 | 
			
		||||
  17 --- 23
 | 
			
		||||
  17 --- 24
 | 
			
		||||
  17 --- 25
 | 
			
		||||
  17 --- 26
 | 
			
		||||
  17 --- 31
 | 
			
		||||
  17 --- 33
 | 
			
		||||
  17 --- 35
 | 
			
		||||
  17 --- 36
 | 
			
		||||
  17 --- 37
 | 
			
		||||
  17 --- 38
 | 
			
		||||
  17 --- 43
 | 
			
		||||
  17 --- 44
 | 
			
		||||
  17 --- 45
 | 
			
		||||
  17 --- 46
 | 
			
		||||
  7 --- 28
 | 
			
		||||
  7 x--> 32
 | 
			
		||||
  7 --- 39
 | 
			
		||||
  7 --- 48
 | 
			
		||||
  8 --- 24
 | 
			
		||||
  8 x--> 31
 | 
			
		||||
  8 --- 38
 | 
			
		||||
  8 --- 44
 | 
			
		||||
  9 --- 27
 | 
			
		||||
  9 x--> 32
 | 
			
		||||
  9 --- 41
 | 
			
		||||
  9 --- 49
 | 
			
		||||
  10 --- 23
 | 
			
		||||
  10 x--> 31
 | 
			
		||||
  10 --- 37
 | 
			
		||||
  10 --- 45
 | 
			
		||||
  11 --- 25
 | 
			
		||||
  11 x--> 31
 | 
			
		||||
  11 --- 36
 | 
			
		||||
  11 --- 43
 | 
			
		||||
  12 --- 30
 | 
			
		||||
  12 x--> 32
 | 
			
		||||
  12 --- 40
 | 
			
		||||
  12 --- 47
 | 
			
		||||
  16 --- 23
 | 
			
		||||
  16 --- 24
 | 
			
		||||
  16 --- 25
 | 
			
		||||
  16 --- 26
 | 
			
		||||
  16 --- 31
 | 
			
		||||
  16 --- 33
 | 
			
		||||
  16 --- 35
 | 
			
		||||
  16 --- 36
 | 
			
		||||
  16 --- 37
 | 
			
		||||
  16 --- 38
 | 
			
		||||
  16 --- 43
 | 
			
		||||
  16 --- 44
 | 
			
		||||
  16 --- 45
 | 
			
		||||
  16 --- 46
 | 
			
		||||
  22 --- 27
 | 
			
		||||
  22 --- 28
 | 
			
		||||
  22 --- 29
 | 
			
		||||
@ -141,16 +141,16 @@ flowchart LR
 | 
			
		||||
  43 <--x 26
 | 
			
		||||
  46 <--x 26
 | 
			
		||||
  41 <--x 27
 | 
			
		||||
  48 <--x 27
 | 
			
		||||
  49 <--x 27
 | 
			
		||||
  50 <--x 27
 | 
			
		||||
  42 <--x 28
 | 
			
		||||
  47 <--x 28
 | 
			
		||||
  39 <--x 28
 | 
			
		||||
  48 <--x 28
 | 
			
		||||
  50 <--x 28
 | 
			
		||||
  40 <--x 29
 | 
			
		||||
  42 <--x 29
 | 
			
		||||
  47 <--x 29
 | 
			
		||||
  48 <--x 29
 | 
			
		||||
  39 <--x 30
 | 
			
		||||
  48 <--x 30
 | 
			
		||||
  50 <--x 29
 | 
			
		||||
  40 <--x 30
 | 
			
		||||
  47 <--x 30
 | 
			
		||||
  49 <--x 30
 | 
			
		||||
  35 <--x 33
 | 
			
		||||
  36 <--x 33
 | 
			
		||||
 | 
			
		||||
@ -1,31 +1,31 @@
 | 
			
		||||
```mermaid
 | 
			
		||||
flowchart LR
 | 
			
		||||
  subgraph path3 [Path]
 | 
			
		||||
    3["Path<br>[54, 89, 8]"]
 | 
			
		||||
    5["Segment<br>[54, 89, 8]"]
 | 
			
		||||
    3["Path<br>[54, 89, 1]"]
 | 
			
		||||
    5["Segment<br>[54, 89, 1]"]
 | 
			
		||||
    7[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  subgraph path4 [Path]
 | 
			
		||||
    4["Path<br>[54, 89, 8]"]
 | 
			
		||||
    6["Segment<br>[54, 89, 8]"]
 | 
			
		||||
    4["Path<br>[54, 89, 1]"]
 | 
			
		||||
    6["Segment<br>[54, 89, 1]"]
 | 
			
		||||
    8[Solid2d]
 | 
			
		||||
  end
 | 
			
		||||
  1["Plane<br>[29, 46, 8]"]
 | 
			
		||||
  2["Plane<br>[29, 46, 8]"]
 | 
			
		||||
  9["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  10["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  11["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  12["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  13["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  14["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  15["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  16["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  17["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  18["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  19["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  20["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  21["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  22["Sweep Extrusion<br>[200, 219, 8]"]
 | 
			
		||||
  1["Plane<br>[29, 46, 1]"]
 | 
			
		||||
  2["Plane<br>[29, 46, 1]"]
 | 
			
		||||
  9["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  10["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  11["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  12["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  13["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  14["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  15["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  16["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  17["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  18["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  19["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  20["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  21["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  22["Sweep Extrusion<br>[200, 219, 1]"]
 | 
			
		||||
  23[Wall]
 | 
			
		||||
  24[Wall]
 | 
			
		||||
  25["Cap Start"]
 | 
			
		||||
@ -40,32 +40,32 @@ flowchart LR
 | 
			
		||||
  2 --- 4
 | 
			
		||||
  3 --- 5
 | 
			
		||||
  3 --- 7
 | 
			
		||||
  3 ---- 20
 | 
			
		||||
  3 ---- 10
 | 
			
		||||
  4 --- 6
 | 
			
		||||
  4 --- 8
 | 
			
		||||
  4 ---- 13
 | 
			
		||||
  5 --- 24
 | 
			
		||||
  4 ---- 15
 | 
			
		||||
  5 --- 23
 | 
			
		||||
  5 x--> 25
 | 
			
		||||
  5 --- 30
 | 
			
		||||
  5 --- 32
 | 
			
		||||
  6 --- 23
 | 
			
		||||
  5 --- 29
 | 
			
		||||
  5 --- 31
 | 
			
		||||
  6 --- 24
 | 
			
		||||
  6 x--> 26
 | 
			
		||||
  6 --- 29
 | 
			
		||||
  6 --- 31
 | 
			
		||||
  13 --- 23
 | 
			
		||||
  13 --- 26
 | 
			
		||||
  13 --- 28
 | 
			
		||||
  13 --- 29
 | 
			
		||||
  13 --- 31
 | 
			
		||||
  20 --- 24
 | 
			
		||||
  20 --- 25
 | 
			
		||||
  20 --- 27
 | 
			
		||||
  20 --- 30
 | 
			
		||||
  20 --- 32
 | 
			
		||||
  6 --- 30
 | 
			
		||||
  6 --- 32
 | 
			
		||||
  10 --- 23
 | 
			
		||||
  10 --- 25
 | 
			
		||||
  10 --- 27
 | 
			
		||||
  10 --- 29
 | 
			
		||||
  10 --- 31
 | 
			
		||||
  15 --- 24
 | 
			
		||||
  15 --- 26
 | 
			
		||||
  15 --- 28
 | 
			
		||||
  15 --- 30
 | 
			
		||||
  15 --- 32
 | 
			
		||||
  29 <--x 23
 | 
			
		||||
  31 <--x 23
 | 
			
		||||
  30 <--x 24
 | 
			
		||||
  32 <--x 24
 | 
			
		||||
  30 <--x 27
 | 
			
		||||
  29 <--x 28
 | 
			
		||||
  29 <--x 27
 | 
			
		||||
  30 <--x 28
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user