Compare commits
	
		
			40 Commits
		
	
	
		
			nightly-v2
			...
			jess/test-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f65a84b1dd | |||
| f00a7059a2 | |||
| 0f9bed70a6 | |||
| ff10275823 | |||
| 1da4667f5b | |||
| 1de64ea15c | |||
| 729ca08eef | |||
| cb2368dc17 | |||
| e943303434 | |||
| 8ce175f006 | |||
| 13aa178734 | |||
| de137ff13b | |||
| 3504b9246f | |||
| a035f7879b | |||
| d122d7a224 | |||
| 198e7c4bd2 | |||
| 14d8903acc | |||
| 275c23f294 | |||
| 0ac9ac3896 | |||
| 0220d0f9de | |||
| 4523dc209b | |||
| ea73eb011c | |||
| 0aa2824c20 | |||
| e66893c5d0 | |||
| 60274127df | |||
| a0d1750829 | |||
| 00ffa8c0bf | |||
| fafdf41093 | |||
| a2092e7ed6 | |||
| aa103d299c | |||
| aaaab495bc | |||
| 364e38fda2 | |||
| b085af139b | |||
| ec537cd8dc | |||
| 8debbc5241 | |||
| a590ed99cf | |||
| a002bb60a0 | |||
| 6ba01b8dfa | |||
| ca9e6e0944 | |||
| e85e54215c | 
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										20
									
								
								rust/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										20
									
								
								rust/Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -1907,6 +1907,7 @@ dependencies = [ | ||||
|  "serde_json", | ||||
|  "sha2", | ||||
|  "tabled", | ||||
|  "tempdir", | ||||
|  "thiserror 2.0.12", | ||||
|  "tokio", | ||||
|  "tokio-tungstenite", | ||||
| @ -3084,6 +3085,15 @@ version = "0.8.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" | ||||
|  | ||||
| [[package]] | ||||
| name = "remove_dir_all" | ||||
| version = "0.5.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" | ||||
| dependencies = [ | ||||
|  "winapi", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "reqwest" | ||||
| version = "0.12.15" | ||||
| @ -3779,6 +3789,16 @@ version = "0.13.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" | ||||
|  | ||||
| [[package]] | ||||
| name = "tempdir" | ||||
| version = "0.3.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" | ||||
| dependencies = [ | ||||
|  "rand 0.4.6", | ||||
|  "remove_dir_all", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "tempfile" | ||||
| version = "3.19.0" | ||||
|  | ||||
| @ -22,7 +22,6 @@ debug = 0 | ||||
|  | ||||
| [profile.dev.package] | ||||
| insta = { opt-level = 3 } | ||||
| similar = { opt-level = 3 } | ||||
|  | ||||
| [profile.test] | ||||
| debug = "line-tables-only" | ||||
|  | ||||
| @ -69,6 +69,7 @@ serde = { workspace = true } | ||||
| serde_json = { workspace = true } | ||||
| sha2 = "0.10.8" | ||||
| tabled = { version = "0.18.0", optional = true } | ||||
| tempdir = "0.3.7" | ||||
| thiserror = "2.0.0" | ||||
| toml = "0.8.19" | ||||
| ts-rs = { version = "10.1.0", features = [ | ||||
|  | ||||
| @ -18,7 +18,7 @@ use tokio::sync::{mpsc, oneshot, RwLock}; | ||||
| use tokio_tungstenite::tungstenite::Message as WsMsg; | ||||
| use uuid::Uuid; | ||||
|  | ||||
| use super::{EngineStats, ExecutionKind}; | ||||
| use super::EngineStats; | ||||
| use crate::{ | ||||
|     engine::EngineManager, | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
| @ -51,7 +51,6 @@ pub struct EngineConnection { | ||||
|     /// If the server sends session data, it'll be copied to here. | ||||
|     session_data: Arc<RwLock<Option<ModelingSessionData>>>, | ||||
|  | ||||
|     execution_kind: Arc<RwLock<ExecutionKind>>, | ||||
|     stats: EngineStats, | ||||
| } | ||||
|  | ||||
| @ -344,7 +343,6 @@ impl EngineConnection { | ||||
|             artifact_commands: Arc::new(RwLock::new(Vec::new())), | ||||
|             default_planes: Default::default(), | ||||
|             session_data, | ||||
|             execution_kind: Default::default(), | ||||
|             stats: Default::default(), | ||||
|         }) | ||||
|     } | ||||
| @ -368,18 +366,6 @@ impl EngineManager for EngineConnection { | ||||
|         self.artifact_commands.clone() | ||||
|     } | ||||
|  | ||||
|     async fn execution_kind(&self) -> ExecutionKind { | ||||
|         let guard = self.execution_kind.read().await; | ||||
|         *guard | ||||
|     } | ||||
|  | ||||
|     async fn replace_execution_kind(&self, execution_kind: ExecutionKind) -> ExecutionKind { | ||||
|         let mut guard = self.execution_kind.write().await; | ||||
|         let original = *guard; | ||||
|         *guard = execution_kind; | ||||
|         original | ||||
|     } | ||||
|  | ||||
|     fn stats(&self) -> &EngineStats { | ||||
|         &self.stats | ||||
|     } | ||||
|  | ||||
| @ -16,7 +16,7 @@ use kittycad_modeling_cmds::{self as kcmc}; | ||||
| use tokio::sync::RwLock; | ||||
| use uuid::Uuid; | ||||
|  | ||||
| use super::{EngineStats, ExecutionKind}; | ||||
| use super::EngineStats; | ||||
| use crate::{ | ||||
|     errors::KclError, | ||||
|     exec::DefaultPlanes, | ||||
| @ -29,7 +29,6 @@ pub struct EngineConnection { | ||||
|     batch: Arc<RwLock<Vec<(WebSocketRequest, SourceRange)>>>, | ||||
|     batch_end: Arc<RwLock<IndexMap<uuid::Uuid, (WebSocketRequest, SourceRange)>>>, | ||||
|     artifact_commands: Arc<RwLock<Vec<ArtifactCommand>>>, | ||||
|     execution_kind: Arc<RwLock<ExecutionKind>>, | ||||
|     /// The default planes for the scene. | ||||
|     default_planes: Arc<RwLock<Option<DefaultPlanes>>>, | ||||
|     stats: EngineStats, | ||||
| @ -41,7 +40,6 @@ impl EngineConnection { | ||||
|             batch: Arc::new(RwLock::new(Vec::new())), | ||||
|             batch_end: Arc::new(RwLock::new(IndexMap::new())), | ||||
|             artifact_commands: Arc::new(RwLock::new(Vec::new())), | ||||
|             execution_kind: Default::default(), | ||||
|             default_planes: Default::default(), | ||||
|             stats: Default::default(), | ||||
|         }) | ||||
| @ -70,18 +68,6 @@ impl crate::engine::EngineManager for EngineConnection { | ||||
|         self.artifact_commands.clone() | ||||
|     } | ||||
|  | ||||
|     async fn execution_kind(&self) -> ExecutionKind { | ||||
|         let guard = self.execution_kind.read().await; | ||||
|         *guard | ||||
|     } | ||||
|  | ||||
|     async fn replace_execution_kind(&self, execution_kind: ExecutionKind) -> ExecutionKind { | ||||
|         let mut guard = self.execution_kind.write().await; | ||||
|         let original = *guard; | ||||
|         *guard = execution_kind; | ||||
|         original | ||||
|     } | ||||
|  | ||||
|     fn get_default_planes(&self) -> Arc<RwLock<Option<DefaultPlanes>>> { | ||||
|         self.default_planes.clone() | ||||
|     } | ||||
|  | ||||
| @ -11,7 +11,7 @@ use uuid::Uuid; | ||||
| use wasm_bindgen::prelude::*; | ||||
|  | ||||
| use crate::{ | ||||
|     engine::{EngineStats, ExecutionKind}, | ||||
|     engine::EngineStats, | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     execution::{ArtifactCommand, DefaultPlanes, IdGenerator}, | ||||
|     SourceRange, | ||||
| @ -42,7 +42,6 @@ pub struct EngineConnection { | ||||
|     batch_end: Arc<RwLock<IndexMap<uuid::Uuid, (WebSocketRequest, SourceRange)>>>, | ||||
|     responses: Arc<RwLock<IndexMap<Uuid, WebSocketResponse>>>, | ||||
|     artifact_commands: Arc<RwLock<Vec<ArtifactCommand>>>, | ||||
|     execution_kind: Arc<RwLock<ExecutionKind>>, | ||||
|     /// The default planes for the scene. | ||||
|     default_planes: Arc<RwLock<Option<DefaultPlanes>>>, | ||||
|     stats: EngineStats, | ||||
| @ -61,7 +60,6 @@ impl EngineConnection { | ||||
|             batch_end: Arc::new(RwLock::new(IndexMap::new())), | ||||
|             responses: Arc::new(RwLock::new(IndexMap::new())), | ||||
|             artifact_commands: Arc::new(RwLock::new(Vec::new())), | ||||
|             execution_kind: Default::default(), | ||||
|             default_planes: Default::default(), | ||||
|             stats: Default::default(), | ||||
|         }) | ||||
| @ -164,18 +162,6 @@ impl crate::engine::EngineManager for EngineConnection { | ||||
|         self.artifact_commands.clone() | ||||
|     } | ||||
|  | ||||
|     async fn execution_kind(&self) -> ExecutionKind { | ||||
|         let guard = self.execution_kind.read().await; | ||||
|         *guard | ||||
|     } | ||||
|  | ||||
|     async fn replace_execution_kind(&self, execution_kind: ExecutionKind) -> ExecutionKind { | ||||
|         let mut guard = self.execution_kind.write().await; | ||||
|         let original = *guard; | ||||
|         *guard = execution_kind; | ||||
|         original | ||||
|     } | ||||
|  | ||||
|     fn get_default_planes(&self) -> Arc<RwLock<Option<DefaultPlanes>>> { | ||||
|         self.default_planes.clone() | ||||
|     } | ||||
| @ -218,11 +204,6 @@ impl crate::engine::EngineManager for EngineConnection { | ||||
|             .do_send_modeling_cmd(id, source_range, cmd, id_to_source_range) | ||||
|             .await?; | ||||
|  | ||||
|         // In isolated mode, we don't save the response. | ||||
|         if self.execution_kind().await.is_isolated() { | ||||
|             return Ok(ws_result); | ||||
|         } | ||||
|  | ||||
|         let mut responses = self.responses.write().await; | ||||
|         responses.insert(id, ws_result.clone()); | ||||
|         drop(responses); | ||||
|  | ||||
| @ -47,23 +47,6 @@ lazy_static::lazy_static! { | ||||
|     pub static ref GRID_SCALE_TEXT_OBJECT_ID: uuid::Uuid = uuid::Uuid::parse_str("10782f33-f588-4668-8bcd-040502d26590").unwrap(); | ||||
| } | ||||
|  | ||||
| /// The mode of execution.  When isolated, like during an import, attempting to | ||||
| /// send a command results in an error. | ||||
| #[derive(Debug, Default, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS, JsonSchema)] | ||||
| #[ts(export)] | ||||
| #[serde(rename_all = "camelCase")] | ||||
| pub enum ExecutionKind { | ||||
|     #[default] | ||||
|     Normal, | ||||
|     Isolated, | ||||
| } | ||||
|  | ||||
| impl ExecutionKind { | ||||
|     pub fn is_isolated(&self) -> bool { | ||||
|         matches!(self, ExecutionKind::Isolated) | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Default, Debug)] | ||||
| pub struct EngineStats { | ||||
|     pub commands_batched: AtomicUsize, | ||||
| @ -84,9 +67,17 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { | ||||
|     /// Get the batch of commands to be sent to the engine. | ||||
|     fn batch(&self) -> Arc<RwLock<Vec<(WebSocketRequest, SourceRange)>>>; | ||||
|  | ||||
|     async fn take_batch(&self) -> Vec<(WebSocketRequest, SourceRange)> { | ||||
|         std::mem::take(&mut *self.batch().write().await) | ||||
|     } | ||||
|  | ||||
|     /// Get the batch of end commands to be sent to the engine. | ||||
|     fn batch_end(&self) -> Arc<RwLock<IndexMap<uuid::Uuid, (WebSocketRequest, SourceRange)>>>; | ||||
|  | ||||
|     async fn take_batch_end(&self) -> IndexMap<uuid::Uuid, (WebSocketRequest, SourceRange)> { | ||||
|         std::mem::take(&mut *self.batch_end().write().await) | ||||
|     } | ||||
|  | ||||
|     /// Get the command responses from the engine. | ||||
|     fn responses(&self) -> Arc<RwLock<IndexMap<Uuid, WebSocketResponse>>>; | ||||
|  | ||||
| @ -108,13 +99,6 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { | ||||
|         std::mem::take(&mut *self.responses().write().await) | ||||
|     } | ||||
|  | ||||
|     /// Get the current execution kind. | ||||
|     async fn execution_kind(&self) -> ExecutionKind; | ||||
|  | ||||
|     /// Replace the current execution kind with a new value and return the | ||||
|     /// existing value. | ||||
|     async fn replace_execution_kind(&self, execution_kind: ExecutionKind) -> ExecutionKind; | ||||
|  | ||||
|     /// Get the default planes. | ||||
|     fn get_default_planes(&self) -> Arc<RwLock<Option<DefaultPlanes>>>; | ||||
|  | ||||
| @ -279,11 +263,6 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { | ||||
|         source_range: SourceRange, | ||||
|         cmd: &ModelingCmd, | ||||
|     ) -> Result<(), crate::errors::KclError> { | ||||
|         // In isolated mode, we don't send the command to the engine. | ||||
|         if self.execution_kind().await.is_isolated() { | ||||
|             return Ok(()); | ||||
|         } | ||||
|  | ||||
|         let req = WebSocketRequest::ModelingCmdReq(ModelingCmdReq { | ||||
|             cmd: cmd.clone(), | ||||
|             cmd_id: id.into(), | ||||
| @ -305,11 +284,6 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { | ||||
|         source_range: SourceRange, | ||||
|         cmds: &[ModelingCmdReq], | ||||
|     ) -> Result<(), crate::errors::KclError> { | ||||
|         // In isolated mode, we don't send the command to the engine. | ||||
|         if self.execution_kind().await.is_isolated() { | ||||
|             return Ok(()); | ||||
|         } | ||||
|  | ||||
|         // Add cmds to the batch. | ||||
|         let mut extended_cmds = Vec::with_capacity(cmds.len()); | ||||
|         for cmd in cmds { | ||||
| @ -332,11 +306,6 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { | ||||
|         source_range: SourceRange, | ||||
|         cmd: &ModelingCmd, | ||||
|     ) -> Result<(), crate::errors::KclError> { | ||||
|         // In isolated mode, we don't send the command to the engine. | ||||
|         if self.execution_kind().await.is_isolated() { | ||||
|             return Ok(()); | ||||
|         } | ||||
|  | ||||
|         let req = WebSocketRequest::ModelingCmdReq(ModelingCmdReq { | ||||
|             cmd: cmd.clone(), | ||||
|             cmd_id: id.into(), | ||||
| @ -370,11 +339,11 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { | ||||
|         source_range: SourceRange, | ||||
|     ) -> Result<OkWebSocketResponseData, crate::errors::KclError> { | ||||
|         let all_requests = if batch_end { | ||||
|             let mut requests = self.batch().read().await.clone(); | ||||
|             requests.extend(self.batch_end().read().await.values().cloned()); | ||||
|             let mut requests = self.take_batch().await.clone(); | ||||
|             requests.extend(self.take_batch_end().await.values().cloned()); | ||||
|             requests | ||||
|         } else { | ||||
|             self.batch().read().await.clone() | ||||
|             self.take_batch().await.clone() | ||||
|         }; | ||||
|  | ||||
|         // Return early if we have no commands to send. | ||||
| @ -443,10 +412,6 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { | ||||
|         } | ||||
|  | ||||
|         // Throw away the old batch queue. | ||||
|         self.batch().write().await.clear(); | ||||
|         if batch_end { | ||||
|             self.batch_end().write().await.clear(); | ||||
|         } | ||||
|         self.stats().batches_sent.fetch_add(1, Ordering::Relaxed); | ||||
|  | ||||
|         // We pop off the responses to cleanup our mappings. | ||||
|  | ||||
| @ -5,7 +5,6 @@ use indexmap::IndexMap; | ||||
|  | ||||
| use super::{cad_op::Group, kcl_value::TypeDef, types::PrimitiveType}; | ||||
| use crate::{ | ||||
|     engine::ExecutionKind, | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     execution::{ | ||||
|         annotations, | ||||
| @ -62,15 +61,13 @@ impl ExecutorContext { | ||||
|                         exec_state.mod_local.explicit_length_units = true; | ||||
|                     } | ||||
|                     let new_units = exec_state.length_unit(); | ||||
|                     if !self.engine.execution_kind().await.is_isolated() { | ||||
|                         self.engine | ||||
|                             .set_units( | ||||
|                                 new_units.into(), | ||||
|                                 annotation.as_source_range(), | ||||
|                                 exec_state.id_generator(), | ||||
|                             ) | ||||
|                             .await?; | ||||
|                     } | ||||
|                     self.engine | ||||
|                         .set_units( | ||||
|                             new_units.into(), | ||||
|                             annotation.as_source_range(), | ||||
|                             exec_state.id_generator(), | ||||
|                         ) | ||||
|                         .await?; | ||||
|                 } else { | ||||
|                     exec_state.err(CompilationError::err( | ||||
|                         annotation.as_source_range(), | ||||
| @ -100,15 +97,13 @@ impl ExecutorContext { | ||||
|         &self, | ||||
|         program: &Node<Program>, | ||||
|         exec_state: &mut ExecState, | ||||
|         exec_kind: ExecutionKind, | ||||
|         preserve_mem: bool, | ||||
|         module_id: ModuleId, | ||||
|         path: &ModulePath, | ||||
|     ) -> Result<(Option<KclValue>, EnvironmentRef, Vec<String>), KclError> { | ||||
|         crate::log::log(format!("enter module {path} {} {exec_kind:?}", exec_state.stack())); | ||||
|         crate::log::log(format!("enter module {path} {}", exec_state.stack())); | ||||
|  | ||||
|         let old_units = exec_state.length_unit(); | ||||
|         let original_execution = self.engine.replace_execution_kind(exec_kind).await; | ||||
|  | ||||
|         let mut local_state = ModuleState::new(path.std_path(), exec_state.stack().memory.clone(), Some(module_id)); | ||||
|         if !preserve_mem { | ||||
| @ -141,12 +136,11 @@ impl ExecutorContext { | ||||
|         // If we reset at the end of the main path, then we just add on an extra | ||||
|         // command and we'd need to flush the batch again. | ||||
|         // This avoids that. | ||||
|         if !exec_kind.is_isolated() && new_units != old_units && *path != ModulePath::Main { | ||||
|         if new_units != old_units && *path != ModulePath::Main { | ||||
|             self.engine | ||||
|                 .set_units(old_units.into(), Default::default(), exec_state.id_generator()) | ||||
|                 .await?; | ||||
|         } | ||||
|         self.engine.replace_execution_kind(original_execution).await; | ||||
|  | ||||
|         crate::log::log(format!("leave {path}")); | ||||
|  | ||||
| @ -157,7 +151,7 @@ impl ExecutorContext { | ||||
|     #[async_recursion] | ||||
|     pub(super) async fn exec_block<'a>( | ||||
|         &'a self, | ||||
|         program: NodeRef<'a, crate::parsing::ast::types::Program>, | ||||
|         program: NodeRef<'a, Program>, | ||||
|         exec_state: &mut ExecState, | ||||
|         body_type: BodyType, | ||||
|     ) -> Result<Option<KclValue>, KclError> { | ||||
| @ -181,9 +175,8 @@ impl ExecutorContext { | ||||
|  | ||||
|                     match &import_stmt.selector { | ||||
|                         ImportSelector::List { items } => { | ||||
|                             let (env_ref, module_exports) = self | ||||
|                                 .exec_module_for_items(module_id, exec_state, ExecutionKind::Isolated, source_range) | ||||
|                                 .await?; | ||||
|                             let (env_ref, module_exports) = | ||||
|                                 self.exec_module_for_items(module_id, exec_state, source_range).await?; | ||||
|                             for import_item in items { | ||||
|                                 // Extract the item from the module. | ||||
|                                 let item = exec_state | ||||
| @ -224,9 +217,8 @@ impl ExecutorContext { | ||||
|                             } | ||||
|                         } | ||||
|                         ImportSelector::Glob(_) => { | ||||
|                             let (env_ref, module_exports) = self | ||||
|                                 .exec_module_for_items(module_id, exec_state, ExecutionKind::Isolated, source_range) | ||||
|                                 .await?; | ||||
|                             let (env_ref, module_exports) = | ||||
|                                 self.exec_module_for_items(module_id, exec_state, source_range).await?; | ||||
|                             for name in module_exports.iter() { | ||||
|                                 let item = exec_state | ||||
|                                     .stack() | ||||
| @ -417,7 +409,7 @@ impl ExecutorContext { | ||||
|         Ok(last_expr) | ||||
|     } | ||||
|  | ||||
|     pub(super) async fn open_module( | ||||
|     pub async fn open_module( | ||||
|         &self, | ||||
|         path: &ImportPath, | ||||
|         attrs: &[Node<Annotation>], | ||||
| @ -425,6 +417,7 @@ impl ExecutorContext { | ||||
|         source_range: SourceRange, | ||||
|     ) -> Result<ModuleId, KclError> { | ||||
|         let resolved_path = ModulePath::from_import_path(path, &self.settings.project_directory); | ||||
|  | ||||
|         match path { | ||||
|             ImportPath::Kcl { .. } => { | ||||
|                 exec_state.global.mod_loader.cycle_check(&resolved_path, source_range)?; | ||||
| @ -481,7 +474,6 @@ impl ExecutorContext { | ||||
|         &self, | ||||
|         module_id: ModuleId, | ||||
|         exec_state: &mut ExecState, | ||||
|         exec_kind: ExecutionKind, | ||||
|         source_range: SourceRange, | ||||
|     ) -> Result<(EnvironmentRef, Vec<String>), KclError> { | ||||
|         let path = exec_state.global.module_infos[&module_id].path.clone(); | ||||
| @ -490,12 +482,12 @@ impl ExecutorContext { | ||||
|  | ||||
|         let result = match &mut repr { | ||||
|             ModuleRepr::Root => Err(exec_state.circular_import_error(&path, source_range)), | ||||
|             ModuleRepr::Kcl(_, Some((env_ref, items))) => Ok((*env_ref, items.clone())), | ||||
|             ModuleRepr::Kcl(_, Some((_, env_ref, items))) => Ok((*env_ref, items.clone())), | ||||
|             ModuleRepr::Kcl(program, cache) => self | ||||
|                 .exec_module_from_ast(program, module_id, &path, exec_state, exec_kind, source_range) | ||||
|                 .exec_module_from_ast(program, module_id, &path, exec_state, source_range) | ||||
|                 .await | ||||
|                 .map(|(_, er, items)| { | ||||
|                     *cache = Some((er, items.clone())); | ||||
|                 .map(|(val, er, items)| { | ||||
|                     *cache = Some((val, er, items.clone())); | ||||
|                     (er, items) | ||||
|                 }), | ||||
|             ModuleRepr::Foreign(geom) => Err(KclError::Semantic(KclErrorDetails { | ||||
| @ -514,7 +506,6 @@ impl ExecutorContext { | ||||
|         module_id: ModuleId, | ||||
|         module_name: &BoxNode<Name>, | ||||
|         exec_state: &mut ExecState, | ||||
|         exec_kind: ExecutionKind, | ||||
|         source_range: SourceRange, | ||||
|     ) -> Result<Option<KclValue>, KclError> { | ||||
|         exec_state.global.operations.push(Operation::GroupBegin { | ||||
| @ -531,13 +522,14 @@ impl ExecutorContext { | ||||
|  | ||||
|         let result = match &mut repr { | ||||
|             ModuleRepr::Root => Err(exec_state.circular_import_error(&path, source_range)), | ||||
|             ModuleRepr::Kcl(_, Some((val, _, _))) => Ok(val.clone()), | ||||
|             ModuleRepr::Kcl(program, cached_items) => { | ||||
|                 let result = self | ||||
|                     .exec_module_from_ast(program, module_id, &path, exec_state, exec_kind, source_range) | ||||
|                     .exec_module_from_ast(program, module_id, &path, exec_state, source_range) | ||||
|                     .await; | ||||
|                 match result { | ||||
|                     Ok((val, env, items)) => { | ||||
|                         *cached_items = Some((env, items)); | ||||
|                         *cached_items = Some((val.clone(), env, items)); | ||||
|                         Ok(val) | ||||
|                     } | ||||
|                     Err(e) => Err(e), | ||||
| @ -556,19 +548,16 @@ impl ExecutorContext { | ||||
|         result | ||||
|     } | ||||
|  | ||||
|     async fn exec_module_from_ast( | ||||
|     pub async fn exec_module_from_ast( | ||||
|         &self, | ||||
|         program: &Node<Program>, | ||||
|         module_id: ModuleId, | ||||
|         path: &ModulePath, | ||||
|         exec_state: &mut ExecState, | ||||
|         exec_kind: ExecutionKind, | ||||
|         source_range: SourceRange, | ||||
|     ) -> Result<(Option<KclValue>, EnvironmentRef, Vec<String>), KclError> { | ||||
|         exec_state.global.mod_loader.enter_module(path); | ||||
|         let result = self | ||||
|             .exec_module_body(program, exec_state, exec_kind, false, module_id, path) | ||||
|             .await; | ||||
|         let result = self.exec_module_body(program, exec_state, false, module_id, path).await; | ||||
|         exec_state.global.mod_loader.leave_module(path); | ||||
|  | ||||
|         result.map_err(|err| { | ||||
| @ -604,7 +593,7 @@ impl ExecutorContext { | ||||
|             Expr::Name(name) => { | ||||
|                 let value = name.get_result(exec_state, self).await?.clone(); | ||||
|                 if let KclValue::Module { value: module_id, meta } = value { | ||||
|                     self.exec_module_for_result(module_id, name, exec_state, ExecutionKind::Normal, metadata.source_range) | ||||
|                     self.exec_module_for_result(module_id, name, exec_state,  metadata.source_range) | ||||
|                         .await? | ||||
|                         .unwrap_or_else(|| { | ||||
|                             exec_state.warn(CompilationError::err( | ||||
| @ -792,7 +781,7 @@ impl Node<Name> { | ||||
|             }; | ||||
|  | ||||
|             mem_spec = Some( | ||||
|                 ctx.exec_module_for_items(*module_id, exec_state, ExecutionKind::Normal, p.as_source_range()) | ||||
|                 ctx.exec_module_for_items(*module_id, exec_state, p.as_source_range()) | ||||
|                     .await?, | ||||
|             ); | ||||
|         } | ||||
| @ -1273,7 +1262,7 @@ impl Node<CallExpressionKw> { | ||||
|                     )); | ||||
|                 } | ||||
|  | ||||
|                 let op = if func.feature_tree_operation() && !ctx.is_isolated_execution().await { | ||||
|                 let op = if func.feature_tree_operation() { | ||||
|                     let op_labeled_args = args | ||||
|                         .kw_args | ||||
|                         .labeled | ||||
| @ -1359,7 +1348,7 @@ impl Node<CallExpressionKw> { | ||||
|                         e.add_source_ranges(vec![callsite]) | ||||
|                     })?; | ||||
|  | ||||
|                 if matches!(fn_src, FunctionSource::User { .. }) && !ctx.is_isolated_execution().await { | ||||
|                 if matches!(fn_src, FunctionSource::User { .. }) { | ||||
|                     // Track return operation. | ||||
|                     exec_state.global.operations.push(Operation::GroupEnd); | ||||
|                 } | ||||
| @ -1411,7 +1400,7 @@ impl Node<CallExpression> { | ||||
|                     )); | ||||
|                 } | ||||
|  | ||||
|                 let op = if func.feature_tree_operation() && !ctx.is_isolated_execution().await { | ||||
|                 let op = if func.feature_tree_operation() { | ||||
|                     let op_labeled_args = func | ||||
|                         .args(false) | ||||
|                         .iter() | ||||
| @ -1469,19 +1458,17 @@ impl Node<CallExpression> { | ||||
|                 // exec_state. | ||||
|                 let func = fn_name.get_result(exec_state, ctx).await?.clone(); | ||||
|  | ||||
|                 if !ctx.is_isolated_execution().await { | ||||
|                     // Track call operation. | ||||
|                     exec_state.global.operations.push(Operation::GroupBegin { | ||||
|                         group: Group::FunctionCall { | ||||
|                             name: Some(fn_name.to_string()), | ||||
|                             function_source_range: func.function_def_source_range().unwrap_or_default(), | ||||
|                             unlabeled_arg: None, | ||||
|                             // TODO: Add the arguments for legacy positional parameters. | ||||
|                             labeled_args: Default::default(), | ||||
|                         }, | ||||
|                         source_range: callsite, | ||||
|                     }); | ||||
|                 } | ||||
|                 // Track call operation. | ||||
|                 exec_state.global.operations.push(Operation::GroupBegin { | ||||
|                     group: Group::FunctionCall { | ||||
|                         name: Some(fn_name.to_string()), | ||||
|                         function_source_range: func.function_def_source_range().unwrap_or_default(), | ||||
|                         unlabeled_arg: None, | ||||
|                         // TODO: Add the arguments for legacy positional parameters. | ||||
|                         labeled_args: Default::default(), | ||||
|                     }, | ||||
|                     source_range: callsite, | ||||
|                 }); | ||||
|  | ||||
|                 let Some(fn_src) = func.as_fn() else { | ||||
|                     return Err(KclError::Semantic(KclErrorDetails { | ||||
| @ -1510,10 +1497,8 @@ impl Node<CallExpression> { | ||||
|                     }) | ||||
|                 })?; | ||||
|  | ||||
|                 if !ctx.is_isolated_execution().await { | ||||
|                     // Track return operation. | ||||
|                     exec_state.global.operations.push(Operation::GroupEnd); | ||||
|                 } | ||||
|                 // Track return operation. | ||||
|                 exec_state.global.operations.push(Operation::GroupEnd); | ||||
|  | ||||
|                 Ok(result) | ||||
|             } | ||||
| @ -2241,7 +2226,7 @@ impl FunctionSource { | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 let op = if props.include_in_feature_tree && !ctx.is_isolated_execution().await { | ||||
|                 let op = if props.include_in_feature_tree { | ||||
|                     let op_labeled_args = args | ||||
|                         .kw_args | ||||
|                         .labeled | ||||
| @ -2285,28 +2270,26 @@ impl FunctionSource { | ||||
|                 Ok(Some(result)) | ||||
|             } | ||||
|             FunctionSource::User { ast, memory, .. } => { | ||||
|                 if !ctx.is_isolated_execution().await { | ||||
|                     // Track call operation. | ||||
|                     let op_labeled_args = args | ||||
|                         .kw_args | ||||
|                         .labeled | ||||
|                         .iter() | ||||
|                         .map(|(k, arg)| (k.clone(), OpArg::new(OpKclValue::from(&arg.value), arg.source_range))) | ||||
|                         .collect(); | ||||
|                     exec_state.global.operations.push(Operation::GroupBegin { | ||||
|                         group: Group::FunctionCall { | ||||
|                             name: fn_name, | ||||
|                             function_source_range: ast.as_source_range(), | ||||
|                             unlabeled_arg: args | ||||
|                                 .kw_args | ||||
|                                 .unlabeled | ||||
|                                 .as_ref() | ||||
|                                 .map(|arg| OpArg::new(OpKclValue::from(&arg.value), arg.source_range)), | ||||
|                             labeled_args: op_labeled_args, | ||||
|                         }, | ||||
|                         source_range: callsite, | ||||
|                     }); | ||||
|                 } | ||||
|                 // Track call operation. | ||||
|                 let op_labeled_args = args | ||||
|                     .kw_args | ||||
|                     .labeled | ||||
|                     .iter() | ||||
|                     .map(|(k, arg)| (k.clone(), OpArg::new(OpKclValue::from(&arg.value), arg.source_range))) | ||||
|                     .collect(); | ||||
|                 exec_state.global.operations.push(Operation::GroupBegin { | ||||
|                     group: Group::FunctionCall { | ||||
|                         name: fn_name, | ||||
|                         function_source_range: ast.as_source_range(), | ||||
|                         unlabeled_arg: args | ||||
|                             .kw_args | ||||
|                             .unlabeled | ||||
|                             .as_ref() | ||||
|                             .map(|arg| OpArg::new(OpKclValue::from(&arg.value), arg.source_range)), | ||||
|                         labeled_args: op_labeled_args, | ||||
|                     }, | ||||
|                     source_range: callsite, | ||||
|                 }); | ||||
|  | ||||
|                 call_user_defined_function_kw(args.kw_args, *memory, ast, exec_state, ctx).await | ||||
|             } | ||||
| @ -2319,10 +2302,13 @@ impl FunctionSource { | ||||
| mod test { | ||||
|     use std::sync::Arc; | ||||
|  | ||||
|     use tokio::io::AsyncWriteExt; | ||||
|  | ||||
|     use super::*; | ||||
|     use crate::{ | ||||
|         execution::{memory::Stack, parse_execute, ContextType}, | ||||
|         parsing::ast::types::{DefaultParamVal, Identifier, Parameter}, | ||||
|         ExecutorSettings, | ||||
|     }; | ||||
|  | ||||
|     #[tokio::test(flavor = "multi_thread")] | ||||
| @ -2432,7 +2418,7 @@ mod test { | ||||
|             // Run each test. | ||||
|             let func_expr = &Node::no_src(FunctionExpression { | ||||
|                 params, | ||||
|                 body: crate::parsing::ast::types::Program::empty(), | ||||
|                 body: Program::empty(), | ||||
|                 return_type: None, | ||||
|                 digest: None, | ||||
|             }); | ||||
| @ -2534,4 +2520,100 @@ a = foo() | ||||
|         let result = parse_execute(program).await; | ||||
|         assert!(result.unwrap_err().to_string().contains("return")); | ||||
|     } | ||||
|  | ||||
|     #[tokio::test(flavor = "multi_thread")] | ||||
|     async fn load_all_modules() { | ||||
|         // program a.kcl | ||||
|         let programa_kcl = r#" | ||||
| export a = 1 | ||||
| "#; | ||||
|         // program b.kcl | ||||
|         let programb_kcl = r#" | ||||
| import a from 'a.kcl' | ||||
|  | ||||
| export b = a + 1 | ||||
| "#; | ||||
|         // program c.kcl | ||||
|         let programc_kcl = r#" | ||||
| import a from 'a.kcl' | ||||
|  | ||||
| export c = a + 2 | ||||
| "#; | ||||
|  | ||||
|         // program main.kcl | ||||
|         let main_kcl = r#" | ||||
| import b from 'b.kcl' | ||||
| import c from 'c.kcl' | ||||
|  | ||||
| d = b + c | ||||
| "#; | ||||
|  | ||||
|         let main = crate::parsing::parse_str(main_kcl, ModuleId::default()) | ||||
|             .parse_errs_as_err() | ||||
|             .unwrap(); | ||||
|  | ||||
|         let tmpdir = tempdir::TempDir::new("zma_kcl_load_all_modules").unwrap(); | ||||
|  | ||||
|         tokio::fs::File::create(tmpdir.path().join("main.kcl")) | ||||
|             .await | ||||
|             .unwrap() | ||||
|             .write_all(main_kcl.as_bytes()) | ||||
|             .await | ||||
|             .unwrap(); | ||||
|  | ||||
|         tokio::fs::File::create(tmpdir.path().join("a.kcl")) | ||||
|             .await | ||||
|             .unwrap() | ||||
|             .write_all(programa_kcl.as_bytes()) | ||||
|             .await | ||||
|             .unwrap(); | ||||
|  | ||||
|         tokio::fs::File::create(tmpdir.path().join("b.kcl")) | ||||
|             .await | ||||
|             .unwrap() | ||||
|             .write_all(programb_kcl.as_bytes()) | ||||
|             .await | ||||
|             .unwrap(); | ||||
|  | ||||
|         tokio::fs::File::create(tmpdir.path().join("c.kcl")) | ||||
|             .await | ||||
|             .unwrap() | ||||
|             .write_all(programc_kcl.as_bytes()) | ||||
|             .await | ||||
|             .unwrap(); | ||||
|  | ||||
|         let exec_ctxt = ExecutorContext { | ||||
|             engine: Arc::new(Box::new( | ||||
|                 crate::engine::conn_mock::EngineConnection::new() | ||||
|                     .await | ||||
|                     .map_err(|err| { | ||||
|                         KclError::Internal(crate::errors::KclErrorDetails { | ||||
|                             message: format!("Failed to create mock engine connection: {}", err), | ||||
|                             source_ranges: vec![SourceRange::default()], | ||||
|                         }) | ||||
|                     }) | ||||
|                     .unwrap(), | ||||
|             )), | ||||
|             fs: Arc::new(crate::fs::FileManager::new()), | ||||
|             settings: ExecutorSettings { | ||||
|                 project_directory: Some(tmpdir.path().into()), | ||||
|                 ..Default::default() | ||||
|             }, | ||||
|             stdlib: Arc::new(crate::std::StdLib::new()), | ||||
|             context_type: ContextType::Mock, | ||||
|         }; | ||||
|         let mut exec_state = ExecState::new(&exec_ctxt); | ||||
|  | ||||
|         exec_ctxt | ||||
|             .run_concurrent( | ||||
|                 &crate::Program { | ||||
|                     ast: main.clone(), | ||||
|                     original_file_contents: "".to_owned(), | ||||
|                 }, | ||||
|                 &mut exec_state, | ||||
|                 false, | ||||
|             ) | ||||
|             .await | ||||
|             .unwrap(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -4,13 +4,13 @@ use anyhow::Result; | ||||
| use schemars::JsonSchema; | ||||
| use serde::Serialize; | ||||
|  | ||||
| use super::{types::UnitLen, EnvironmentRef, ExecState, MetaSettings}; | ||||
| use crate::{ | ||||
|     errors::KclErrorDetails, | ||||
|     execution::{ | ||||
|         annotations::{SETTINGS, SETTINGS_UNIT_LENGTH}, | ||||
|         types::{NumericType, PrimitiveType, RuntimeType}, | ||||
|         Face, Helix, ImportedGeometry, Metadata, Plane, Sketch, Solid, TagIdentifier, | ||||
|         types::{NumericType, PrimitiveType, RuntimeType, UnitLen}, | ||||
|         EnvironmentRef, ExecState, Face, Helix, ImportedGeometry, MetaSettings, Metadata, Plane, Sketch, Solid, | ||||
|         TagIdentifier, | ||||
|     }, | ||||
|     parsing::ast::types::{ | ||||
|         DefaultParamVal, FunctionExpression, KclNone, Literal, LiteralValue, Node, TagDeclarator, TagNode, | ||||
|  | ||||
| @ -30,18 +30,18 @@ pub use state::{ExecState, MetaSettings}; | ||||
|  | ||||
| use crate::{ | ||||
|     engine::EngineManager, | ||||
|     errors::KclError, | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     execution::{ | ||||
|         artifact::build_artifact_graph, | ||||
|         cache::{CacheInformation, CacheResult}, | ||||
|         types::{UnitAngle, UnitLen}, | ||||
|     }, | ||||
|     fs::FileManager, | ||||
|     modules::{ModuleId, ModulePath}, | ||||
|     modules::{ModuleId, ModulePath, ModuleRepr}, | ||||
|     parsing::ast::types::{Expr, ImportPath, NodeRef}, | ||||
|     source_range::SourceRange, | ||||
|     std::StdLib, | ||||
|     CompilationError, ExecError, ExecutionKind, KclErrorWithOutputs, | ||||
|     CompilationError, ExecError, KclErrorWithOutputs, | ||||
| }; | ||||
|  | ||||
| pub(crate) mod annotations; | ||||
| @ -497,13 +497,9 @@ impl ExecutorContext { | ||||
|         self.context_type == ContextType::Mock || self.context_type == ContextType::MockCustomForwarded | ||||
|     } | ||||
|  | ||||
|     pub async fn is_isolated_execution(&self) -> bool { | ||||
|         self.engine.execution_kind().await.is_isolated() | ||||
|     } | ||||
|  | ||||
|     /// Returns true if we should not send engine commands for any reason. | ||||
|     pub async fn no_engine_commands(&self) -> bool { | ||||
|         self.is_mock() || self.is_isolated_execution().await | ||||
|         self.is_mock() | ||||
|     } | ||||
|  | ||||
|     pub async fn send_clear_scene( | ||||
| @ -674,7 +670,7 @@ impl ExecutorContext { | ||||
|             (program, exec_state, false) | ||||
|         }; | ||||
|  | ||||
|         let result = self.inner_run(&program, &mut exec_state, preserve_mem).await; | ||||
|         let result = self.run_concurrent(&program, &mut exec_state, preserve_mem).await; | ||||
|  | ||||
|         if result.is_err() { | ||||
|             cache::bust_cache().await; | ||||
| @ -707,7 +703,138 @@ impl ExecutorContext { | ||||
|         program: &crate::Program, | ||||
|         exec_state: &mut ExecState, | ||||
|     ) -> Result<(EnvironmentRef, Option<ModelingSessionData>), KclErrorWithOutputs> { | ||||
|         self.inner_run(program, exec_state, false).await | ||||
|         self.run_concurrent(program, exec_state, false).await | ||||
|     } | ||||
|  | ||||
|     /// Perform the execution of a program using an (experimental!) concurrent | ||||
|     /// execution model. This has the same signature as [Self::run]. | ||||
|     /// | ||||
|     /// For now -- do not use this unless you're willing to accept some | ||||
|     /// breakage. | ||||
|     /// | ||||
|     /// You can optionally pass in some initialization memory for partial | ||||
|     /// execution. | ||||
|     /// | ||||
|     /// To access non-fatal errors and warnings, extract them from the `ExecState`. | ||||
|     pub async fn run_concurrent( | ||||
|         &self, | ||||
|         program: &crate::Program, | ||||
|         exec_state: &mut ExecState, | ||||
|         preserve_mem: bool, | ||||
|     ) -> Result<(EnvironmentRef, Option<ModelingSessionData>), KclErrorWithOutputs> { | ||||
|         self.prepare_mem(exec_state).await.unwrap(); | ||||
|  | ||||
|         let mut universe = std::collections::HashMap::new(); | ||||
|  | ||||
|         crate::walk::import_universe(self, &program.ast, &mut universe, exec_state) | ||||
|             .await | ||||
|             .map_err(KclErrorWithOutputs::no_outputs)?; | ||||
|  | ||||
|         for modules in crate::walk::import_graph(&universe, self) | ||||
|             .map_err(KclErrorWithOutputs::no_outputs)? | ||||
|             .into_iter() | ||||
|         { | ||||
|             #[cfg(not(target_arch = "wasm32"))] | ||||
|             let mut set = tokio::task::JoinSet::new(); | ||||
|  | ||||
|             #[allow(clippy::type_complexity)] | ||||
|             let (results_tx, mut results_rx): ( | ||||
|                 tokio::sync::mpsc::Sender<( | ||||
|                     ModuleId, | ||||
|                     ModulePath, | ||||
|                     Result<(Option<KclValue>, EnvironmentRef, Vec<String>), KclError>, | ||||
|                 )>, | ||||
|                 tokio::sync::mpsc::Receiver<_>, | ||||
|             ) = tokio::sync::mpsc::channel(1); | ||||
|  | ||||
|             for module in modules { | ||||
|                 let Some((import_stmt, module_id, module_path, program)) = universe.get(&module) else { | ||||
|                     return Err(KclErrorWithOutputs::no_outputs(KclError::Internal(KclErrorDetails { | ||||
|                         message: format!("Module {module} not found in universe"), | ||||
|                         source_ranges: Default::default(), | ||||
|                     }))); | ||||
|                 }; | ||||
|                 let module_id = *module_id; | ||||
|                 let module_path = module_path.clone(); | ||||
|                 let program = program.clone(); | ||||
|                 let exec_state = exec_state.clone(); | ||||
|                 let exec_ctxt = self.clone(); | ||||
|                 let results_tx = results_tx.clone(); | ||||
|                 let source_range = SourceRange::from(import_stmt); | ||||
|  | ||||
|                 #[cfg(target_arch = "wasm32")] | ||||
|                 { | ||||
|                     wasm_bindgen_futures::spawn_local(async move { | ||||
|                         //set.spawn(async move { | ||||
|                         let mut exec_state = exec_state; | ||||
|                         let exec_ctxt = exec_ctxt; | ||||
|  | ||||
|                         let result = exec_ctxt | ||||
|                             .exec_module_from_ast(&program, module_id, &module_path, &mut exec_state, source_range) | ||||
|                             .await; | ||||
|  | ||||
|                         results_tx | ||||
|                             .send((module_id, module_path, result)) | ||||
|                             .await | ||||
|                             .unwrap_or_default(); | ||||
|                     }); | ||||
|                 } | ||||
|                 #[cfg(not(target_arch = "wasm32"))] | ||||
|                 { | ||||
|                     set.spawn(async move { | ||||
|                         let mut exec_state = exec_state; | ||||
|                         let exec_ctxt = exec_ctxt; | ||||
|  | ||||
|                         let result = exec_ctxt | ||||
|                             .exec_module_from_ast(&program, module_id, &module_path, &mut exec_state, source_range) | ||||
|                             .await; | ||||
|  | ||||
|                         results_tx | ||||
|                             .send((module_id, module_path, result)) | ||||
|                             .await | ||||
|                             .unwrap_or_default(); | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             drop(results_tx); | ||||
|  | ||||
|             while let Some((module_id, _, result)) = results_rx.recv().await { | ||||
|                 match result { | ||||
|                     Ok((val, session_data, variables)) => { | ||||
|                         let mut repr = exec_state.global.module_infos[&module_id].take_repr(); | ||||
|  | ||||
|                         let ModuleRepr::Kcl(_, cache) = &mut repr else { | ||||
|                             continue; | ||||
|                         }; | ||||
|                         *cache = Some((val, session_data, variables.clone())); | ||||
|  | ||||
|                         exec_state.global.module_infos[&module_id].restore_repr(repr); | ||||
|                     } | ||||
|                     Err(e) => { | ||||
|                         let module_id_to_module_path: IndexMap<ModuleId, ModulePath> = exec_state | ||||
|                             .global | ||||
|                             .path_to_source_id | ||||
|                             .iter() | ||||
|                             .map(|(k, v)| ((*v), k.clone())) | ||||
|                             .collect(); | ||||
|                         let default_planes = self.engine.get_default_planes().read().await.clone(); | ||||
|  | ||||
|                         return Err(KclErrorWithOutputs::new( | ||||
|                             e, | ||||
|                             exec_state.global.operations.clone(), | ||||
|                             exec_state.global.artifact_commands.clone(), | ||||
|                             exec_state.global.artifact_graph.clone(), | ||||
|                             module_id_to_module_path, | ||||
|                             exec_state.global.id_to_source.clone(), | ||||
|                             default_planes, | ||||
|                         )); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         self.inner_run(program, exec_state, preserve_mem).await | ||||
|     } | ||||
|  | ||||
|     /// Perform the execution of a program.  Accept all possible parameters and | ||||
| @ -758,11 +885,12 @@ impl ExecutorContext { | ||||
|             ) | ||||
|         })?; | ||||
|  | ||||
|         if !self.is_mock() { | ||||
|         // TODO: fix this | ||||
|         /* if !self.is_mock() { | ||||
|             let mut mem = exec_state.stack().deep_clone(); | ||||
|             mem.restore_env(env_ref); | ||||
|             cache::write_old_memory((mem, exec_state.global.module_infos.clone())).await; | ||||
|         } | ||||
|         }*/ | ||||
|         let session_data = self.engine.get_session_data().await; | ||||
|         Ok((env_ref, session_data)) | ||||
|     } | ||||
| @ -785,7 +913,6 @@ impl ExecutorContext { | ||||
|             .exec_module_body( | ||||
|                 program, | ||||
|                 exec_state, | ||||
|                 ExecutionKind::Normal, | ||||
|                 preserve_mem, | ||||
|                 ModuleId::default(), | ||||
|                 &ModulePath::Main, | ||||
| @ -839,9 +966,7 @@ impl ExecutorContext { | ||||
|                     source_range, | ||||
|                 ) | ||||
|                 .await?; | ||||
|             let (module_memory, _) = self | ||||
|                 .exec_module_for_items(id, exec_state, ExecutionKind::Isolated, source_range) | ||||
|                 .await?; | ||||
|             let (module_memory, _) = self.exec_module_for_items(id, exec_state, source_range).await?; | ||||
|  | ||||
|             exec_state.mut_stack().memory.set_std(module_memory); | ||||
|         } | ||||
|  | ||||
| @ -228,6 +228,10 @@ impl ExecState { | ||||
|         self.global.module_infos.insert(id, module_info); | ||||
|     } | ||||
|  | ||||
|     pub fn get_module(&mut self, id: ModuleId) -> Option<&ModuleInfo> { | ||||
|         self.global.module_infos.get(&id) | ||||
|     } | ||||
|  | ||||
|     pub fn length_unit(&self) -> UnitLen { | ||||
|         self.mod_local.settings.default_length_units | ||||
|     } | ||||
|  | ||||
| @ -76,12 +76,12 @@ pub mod std; | ||||
| pub mod test_server; | ||||
| mod thread; | ||||
| mod unparser; | ||||
| mod walk; | ||||
| pub mod walk; | ||||
| #[cfg(target_arch = "wasm32")] | ||||
| mod wasm; | ||||
|  | ||||
| pub use coredump::CoreDump; | ||||
| pub use engine::{EngineManager, EngineStats, ExecutionKind}; | ||||
| pub use engine::{EngineManager, EngineStats}; | ||||
| pub use errors::{ | ||||
|     CompilationError, ConnectionError, ExecError, KclError, KclErrorWithOutputs, Report, ReportWithOutputs, | ||||
| }; | ||||
|  | ||||
| @ -6,6 +6,7 @@ use serde::{Deserialize, Serialize}; | ||||
|  | ||||
| use crate::{ | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     exec::KclValue, | ||||
|     execution::{EnvironmentRef, PreImportedGeometry}, | ||||
|     fs::{FileManager, FileSystem}, | ||||
|     parsing::ast::types::{ImportPath, Node, Program}, | ||||
| @ -94,7 +95,7 @@ pub(crate) fn read_std(mod_name: &str) -> Option<&'static str> { | ||||
| } | ||||
|  | ||||
| /// Info about a module. | ||||
| #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] | ||||
| #[derive(Debug, Clone, PartialEq, Serialize)] | ||||
| pub struct ModuleInfo { | ||||
|     /// The ID of the module. | ||||
|     pub(crate) id: ModuleId, | ||||
| @ -117,11 +118,11 @@ impl ModuleInfo { | ||||
| } | ||||
|  | ||||
| #[allow(clippy::large_enum_variant)] | ||||
| #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] | ||||
| #[derive(Debug, Clone, PartialEq, Serialize)] | ||||
| pub enum ModuleRepr { | ||||
|     Root, | ||||
|     // AST, memory, exported names | ||||
|     Kcl(Node<Program>, Option<(EnvironmentRef, Vec<String>)>), | ||||
|     Kcl(Node<Program>, Option<(Option<KclValue>, EnvironmentRef, Vec<String>)>), | ||||
|     Foreign(PreImportedGeometry), | ||||
|     Dummy, | ||||
| } | ||||
|  | ||||
| @ -6,31 +6,37 @@ use std::{ | ||||
| use anyhow::Result; | ||||
|  | ||||
| use crate::{ | ||||
|     parsing::ast::types::{ImportPath, NodeRef, Program}, | ||||
|     errors::KclErrorDetails, | ||||
|     modules::{ModulePath, ModuleRepr}, | ||||
|     parsing::ast::types::{ImportPath, ImportStatement, Node as AstNode, NodeRef, Program}, | ||||
|     walk::{Node, Visitable}, | ||||
|     ExecState, ExecutorContext, KclError, ModuleId, | ||||
| }; | ||||
|  | ||||
| /// Specific dependency between two modules. The 0th element of this tuple | ||||
| /// Specific dependency between two modules. The 0th element of this info | ||||
| /// is the "importing" module, the 1st is the "imported" module. The 0th | ||||
| /// module *depends on* the 1st module. | ||||
| type Dependency = (String, String); | ||||
|  | ||||
| type Graph = Vec<Dependency>; | ||||
|  | ||||
| type DependencyInfo = (AstNode<ImportStatement>, ModuleId, ModulePath, AstNode<Program>); | ||||
| type Universe = HashMap<String, DependencyInfo>; | ||||
|  | ||||
| /// Process a number of programs, returning the graph of dependencies. | ||||
| /// | ||||
| /// This will (currently) return a list of lists of IDs that can be safely | ||||
| /// run concurrently. Each "stage" is blocking in this model, which will | ||||
| /// change in the future. Don't use this function widely, yet. | ||||
| #[allow(clippy::iter_over_hash_type)] | ||||
| pub fn import_graph(progs: HashMap<String, NodeRef<'_, Program>>) -> Result<Vec<Vec<String>>> { | ||||
| pub fn import_graph(progs: &Universe, ctx: &ExecutorContext) -> Result<Vec<Vec<String>>, KclError> { | ||||
|     let mut graph = Graph::new(); | ||||
|  | ||||
|     for (name, program) in progs.iter() { | ||||
|     for (name, (_, _, _, program)) in progs.iter() { | ||||
|         graph.extend( | ||||
|             import_dependencies(program)? | ||||
|             import_dependencies(program, ctx)? | ||||
|                 .into_iter() | ||||
|                 .map(|dependency| (name.clone(), dependency)) | ||||
|                 .map(|(dependency, _, _)| (name.clone(), dependency)) | ||||
|                 .collect::<Vec<_>>(), | ||||
|         ); | ||||
|     } | ||||
| @ -40,7 +46,10 @@ pub fn import_graph(progs: HashMap<String, NodeRef<'_, Program>>) -> Result<Vec< | ||||
| } | ||||
|  | ||||
| #[allow(clippy::iter_over_hash_type)] | ||||
| fn topsort(all_modules: &[&str], graph: Graph) -> Result<Vec<Vec<String>>> { | ||||
| fn topsort(all_modules: &[&str], graph: Graph) -> Result<Vec<Vec<String>>, KclError> { | ||||
|     if all_modules.is_empty() { | ||||
|         return Ok(vec![]); | ||||
|     } | ||||
|     let mut dep_map = HashMap::<String, Vec<String>>::new(); | ||||
|  | ||||
|     for (dependent, dependency) in graph.iter() { | ||||
| @ -83,7 +92,10 @@ fn topsort(all_modules: &[&str], graph: Graph) -> Result<Vec<Vec<String>>> { | ||||
|         } | ||||
|  | ||||
|         if stage_modules.is_empty() { | ||||
|             anyhow::bail!("imports are acyclic"); | ||||
|             return Err(KclError::Internal(KclErrorDetails { | ||||
|                 message: "Circular import detected".to_string(), | ||||
|                 source_ranges: Default::default(), | ||||
|             })); | ||||
|         } | ||||
|  | ||||
|         // not strictly needed here, but perhaps helpful to avoid thinking | ||||
| @ -101,33 +113,98 @@ fn topsort(all_modules: &[&str], graph: Graph) -> Result<Vec<Vec<String>>> { | ||||
|     Ok(order) | ||||
| } | ||||
|  | ||||
| pub(crate) fn import_dependencies(prog: NodeRef<'_, Program>) -> Result<Vec<String>> { | ||||
| type ImportDependencies = Vec<(String, AstNode<ImportStatement>, ModulePath)>; | ||||
|  | ||||
| pub(crate) fn import_dependencies( | ||||
|     prog: NodeRef<Program>, | ||||
|     ctx: &ExecutorContext, | ||||
| ) -> Result<ImportDependencies, KclError> { | ||||
|     let ret = Arc::new(Mutex::new(vec![])); | ||||
|  | ||||
|     fn walk(ret: Arc<Mutex<Vec<String>>>, node: Node<'_>) { | ||||
|     fn walk(ret: Arc<Mutex<ImportDependencies>>, node: Node<'_>, ctx: &ExecutorContext) -> Result<(), KclError> { | ||||
|         if let Node::ImportStatement(is) = node { | ||||
|             let dependency = match &is.path { | ||||
|                 ImportPath::Kcl { filename } => filename.to_string(), | ||||
|                 ImportPath::Foreign { path } => path.to_string(), | ||||
|                 ImportPath::Std { path } => path.join("::"), | ||||
|             }; | ||||
|             // We only care about Kcl imports for now. | ||||
|             if let ImportPath::Kcl { filename } = &is.path { | ||||
|                 let resolved_path = ModulePath::from_import_path(&is.path, &ctx.settings.project_directory); | ||||
|  | ||||
|             ret.lock().unwrap().push(dependency); | ||||
|                 // We need to lock the mutex to push the dependency. | ||||
|                 // This is a bit of a hack, but it works for now. | ||||
|                 ret.lock() | ||||
|                     .map_err(|err| { | ||||
|                         KclError::Internal(KclErrorDetails { | ||||
|                             message: format!("Failed to lock mutex: {}", err), | ||||
|                             source_ranges: Default::default(), | ||||
|                         }) | ||||
|                     })? | ||||
|                     .push((filename.to_string(), is.clone(), resolved_path)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         for child in node.children().iter() { | ||||
|             walk(ret.clone(), *child) | ||||
|             walk(ret.clone(), *child, ctx)?; | ||||
|         } | ||||
|  | ||||
|         Ok(()) | ||||
|     } | ||||
|  | ||||
|     walk(ret.clone(), prog.into()); | ||||
|     walk(ret.clone(), prog.into(), ctx)?; | ||||
|  | ||||
|     let ret = ret.lock().unwrap().clone(); | ||||
|     Ok(ret) | ||||
|     let ret = ret.lock().map_err(|err| { | ||||
|         KclError::Internal(KclErrorDetails { | ||||
|             message: format!("Failed to lock mutex: {}", err), | ||||
|             source_ranges: Default::default(), | ||||
|         }) | ||||
|     })?; | ||||
|  | ||||
|     Ok(ret.clone()) | ||||
| } | ||||
|  | ||||
| pub(crate) async fn import_universe( | ||||
|     ctx: &ExecutorContext, | ||||
|     prog: NodeRef<'_, Program>, | ||||
|     out: &mut Universe, | ||||
|     exec_state: &mut ExecState, | ||||
| ) -> Result<(), KclError> { | ||||
|     let modules = import_dependencies(prog, ctx)?; | ||||
|     for (filename, import_stmt, module_path) in modules { | ||||
|         if out.contains_key(&filename) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         let module_id = ctx | ||||
|             .open_module(&import_stmt.path, &[], exec_state, Default::default()) | ||||
|             .await?; | ||||
|  | ||||
|         let program = { | ||||
|             let Some(module_info) = exec_state.get_module(module_id) else { | ||||
|                 return Err(KclError::Internal(KclErrorDetails { | ||||
|                     message: format!("Module {} not found", module_id), | ||||
|                     source_ranges: Default::default(), | ||||
|                 })); | ||||
|             }; | ||||
|             let ModuleRepr::Kcl(program, _) = &module_info.repr else { | ||||
|                 return Err(KclError::Internal(KclErrorDetails { | ||||
|                     message: format!("Module {} is not a KCL module", module_id), | ||||
|                     source_ranges: Default::default(), | ||||
|                 })); | ||||
|             }; | ||||
|             program.clone() | ||||
|         }; | ||||
|  | ||||
|         out.insert( | ||||
|             filename.clone(), | ||||
|             (import_stmt.clone(), module_id, module_path.clone(), program.clone()), | ||||
|         ); | ||||
|         Box::pin(import_universe(ctx, &program, out, exec_state)).await?; | ||||
|     } | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|     use crate::parsing::ast::types::ImportSelector; | ||||
|  | ||||
|     macro_rules! kcl { | ||||
|         ( $kcl:expr ) => {{ | ||||
| @ -135,26 +212,41 @@ mod tests { | ||||
|         }}; | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn order_imports() { | ||||
|     fn into_module_info(program: AstNode<Program>) -> DependencyInfo { | ||||
|         ( | ||||
|             AstNode::no_src(ImportStatement { | ||||
|                 selector: ImportSelector::None { alias: None }, | ||||
|                 path: ImportPath::Kcl { filename: "".into() }, | ||||
|                 visibility: Default::default(), | ||||
|                 digest: None, | ||||
|             }), | ||||
|             ModuleId::default(), | ||||
|             ModulePath::Local { value: "".into() }, | ||||
|             program, | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     #[tokio::test] | ||||
|     async fn order_imports() { | ||||
|         let mut modules = HashMap::new(); | ||||
|  | ||||
|         let a = kcl!(""); | ||||
|         modules.insert("a.kcl".to_owned(), &a); | ||||
|         modules.insert("a.kcl".to_owned(), into_module_info(a)); | ||||
|  | ||||
|         let b = kcl!( | ||||
|             " | ||||
| import \"a.kcl\" | ||||
| " | ||||
|         ); | ||||
|         modules.insert("b.kcl".to_owned(), &b); | ||||
|         modules.insert("b.kcl".to_owned(), into_module_info(b)); | ||||
|  | ||||
|         let order = import_graph(modules).unwrap(); | ||||
|         let ctx = ExecutorContext::new_mock().await; | ||||
|         let order = import_graph(&modules, &ctx).unwrap(); | ||||
|         assert_eq!(vec![vec!["a.kcl".to_owned()], vec!["b.kcl".to_owned()]], order); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn order_imports_none() { | ||||
|     #[tokio::test] | ||||
|     async fn order_imports_none() { | ||||
|         let mut modules = HashMap::new(); | ||||
|  | ||||
|         let a = kcl!( | ||||
| @ -162,49 +254,51 @@ import \"a.kcl\" | ||||
| y = 2 | ||||
| " | ||||
|         ); | ||||
|         modules.insert("a.kcl".to_owned(), &a); | ||||
|         modules.insert("a.kcl".to_owned(), into_module_info(a)); | ||||
|  | ||||
|         let b = kcl!( | ||||
|             " | ||||
| x = 1 | ||||
| " | ||||
|         ); | ||||
|         modules.insert("b.kcl".to_owned(), &b); | ||||
|         modules.insert("b.kcl".to_owned(), into_module_info(b)); | ||||
|  | ||||
|         let order = import_graph(modules).unwrap(); | ||||
|         let ctx = ExecutorContext::new_mock().await; | ||||
|         let order = import_graph(&modules, &ctx).unwrap(); | ||||
|         assert_eq!(vec![vec!["a.kcl".to_owned(), "b.kcl".to_owned()]], order); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn order_imports_2() { | ||||
|     #[tokio::test] | ||||
|     async fn order_imports_2() { | ||||
|         let mut modules = HashMap::new(); | ||||
|  | ||||
|         let a = kcl!(""); | ||||
|         modules.insert("a.kcl".to_owned(), &a); | ||||
|         modules.insert("a.kcl".to_owned(), into_module_info(a)); | ||||
|  | ||||
|         let b = kcl!( | ||||
|             " | ||||
| import \"a.kcl\" | ||||
| " | ||||
|         ); | ||||
|         modules.insert("b.kcl".to_owned(), &b); | ||||
|         modules.insert("b.kcl".to_owned(), into_module_info(b)); | ||||
|  | ||||
|         let c = kcl!( | ||||
|             " | ||||
| import \"a.kcl\" | ||||
| " | ||||
|         ); | ||||
|         modules.insert("c.kcl".to_owned(), &c); | ||||
|         modules.insert("c.kcl".to_owned(), into_module_info(c)); | ||||
|  | ||||
|         let order = import_graph(modules).unwrap(); | ||||
|         let ctx = ExecutorContext::new_mock().await; | ||||
|         let order = import_graph(&modules, &ctx).unwrap(); | ||||
|         assert_eq!( | ||||
|             vec![vec!["a.kcl".to_owned()], vec!["b.kcl".to_owned(), "c.kcl".to_owned()]], | ||||
|             order | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn order_imports_cycle() { | ||||
|     #[tokio::test] | ||||
|     async fn order_imports_cycle() { | ||||
|         let mut modules = HashMap::new(); | ||||
|  | ||||
|         let a = kcl!( | ||||
| @ -212,15 +306,16 @@ import \"a.kcl\" | ||||
| import \"b.kcl\" | ||||
| " | ||||
|         ); | ||||
|         modules.insert("a.kcl".to_owned(), &a); | ||||
|         modules.insert("a.kcl".to_owned(), into_module_info(a)); | ||||
|  | ||||
|         let b = kcl!( | ||||
|             " | ||||
| import \"a.kcl\" | ||||
| " | ||||
|         ); | ||||
|         modules.insert("b.kcl".to_owned(), &b); | ||||
|         modules.insert("b.kcl".to_owned(), into_module_info(b)); | ||||
|  | ||||
|         import_graph(modules).unwrap_err(); | ||||
|         let ctx = ExecutorContext::new_mock().await; | ||||
|         import_graph(&modules, &ctx).unwrap_err(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -8,3 +8,5 @@ mod import_graph; | ||||
| 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; | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands angled_line.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands argument_error.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands array_elem_pop.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands array_elem_pop_empty_fail.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands array_elem_pop_fail.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands array_elem_push.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands array_elem_push_fail.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands array_index_oob.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands array_range_expr.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands array_range_negative_expr.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands artifact_graph_example_code1.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands artifact_graph_example_code_no_3d.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands artifact_graph_example_code_offset_planes.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands artifact_graph_sketch_on_face_etc.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -7,26 +7,16 @@ description: Artifact commands assembly_mixed_units_cubes.kcl | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "edge_lines_visible", | ||||
|       "hidden": false | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
| @ -42,7 +32,7 @@ description: Artifact commands assembly_mixed_units_cubes.kcl | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "in" | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
| @ -70,6 +60,74 @@ description: Artifact commands assembly_mixed_units_cubes.kcl | ||||
|       "hide": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "make_plane", | ||||
|       "origin": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "x_axis": { | ||||
|         "x": 1.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "y_axis": { | ||||
|         "x": 0.0, | ||||
|         "y": 1.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "size": 60.0, | ||||
|       "clobber": false, | ||||
|       "hide": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "enable_sketch_mode", | ||||
|       "entity_id": "[uuid]", | ||||
|       "ortho": false, | ||||
|       "animated": false, | ||||
|       "adjust_camera": false, | ||||
|       "planar_normal": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 1.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "start_path" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "move_path_pen", | ||||
|       "path": "[uuid]", | ||||
|       "to": { | ||||
|         "x": 10.0, | ||||
|         "y": 10.0, | ||||
|         "z": 0.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "sketch_mode_disable" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
| @ -130,6 +188,40 @@ description: Artifact commands assembly_mixed_units_cubes.kcl | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 5.0, | ||||
|           "y": 0.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 0.0, | ||||
|           "y": -5.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
| @ -164,6 +256,40 @@ description: Artifact commands assembly_mixed_units_cubes.kcl | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": -5.0, | ||||
|           "y": 0.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 10.0, | ||||
|           "y": 10.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": false | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
| @ -189,6 +315,14 @@ description: Artifact commands assembly_mixed_units_cubes.kcl | ||||
|       "path_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "close_path", | ||||
|       "path_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
| @ -239,6 +373,136 @@ description: Artifact commands assembly_mixed_units_cubes.kcl | ||||
|       "edge_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "enable_sketch_mode", | ||||
|       "entity_id": "[uuid]", | ||||
|       "ortho": false, | ||||
|       "animated": false, | ||||
|       "adjust_camera": false, | ||||
|       "planar_normal": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 1.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extrude", | ||||
|       "target": "[uuid]", | ||||
|       "distance": 5.0, | ||||
|       "faces": null | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "sketch_mode_disable" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_bring_to_front", | ||||
|       "object_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_extrusion_face_info", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
| @ -331,274 +595,26 @@ description: Artifact commands assembly_mixed_units_cubes.kcl | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "make_plane", | ||||
|       "origin": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "x_axis": { | ||||
|         "x": 1.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "y_axis": { | ||||
|         "x": 0.0, | ||||
|         "y": 1.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "size": 60.0, | ||||
|       "clobber": false, | ||||
|       "hide": true | ||||
|       "type": "edge_lines_visible", | ||||
|       "hidden": false | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "enable_sketch_mode", | ||||
|       "entity_id": "[uuid]", | ||||
|       "ortho": false, | ||||
|       "animated": false, | ||||
|       "adjust_camera": false, | ||||
|       "planar_normal": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 1.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "start_path" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "move_path_pen", | ||||
|       "path": "[uuid]", | ||||
|       "to": { | ||||
|         "x": 10.0, | ||||
|         "y": 10.0, | ||||
|         "z": 0.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "sketch_mode_disable" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 5.0, | ||||
|           "y": 0.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 0.0, | ||||
|           "y": -5.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": -5.0, | ||||
|           "y": 0.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 10.0, | ||||
|           "y": 10.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": false | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "close_path", | ||||
|       "path_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "enable_sketch_mode", | ||||
|       "entity_id": "[uuid]", | ||||
|       "ortho": false, | ||||
|       "animated": false, | ||||
|       "adjust_camera": false, | ||||
|       "planar_normal": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 1.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extrude", | ||||
|       "target": "[uuid]", | ||||
|       "distance": 5.0, | ||||
|       "faces": null | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "sketch_mode_disable" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_bring_to_front", | ||||
|       "object_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_extrusion_face_info", | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]" | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|  | ||||
| @ -1,47 +1,47 @@ | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   subgraph path2 [Path] | ||||
|     2["Path<br>[76, 113, 5]"] | ||||
|     3["Segment<br>[119, 136, 5]"] | ||||
|     4["Segment<br>[142, 160, 5]"] | ||||
|     5["Segment<br>[166, 184, 5]"] | ||||
|     6["Segment<br>[190, 246, 5]"] | ||||
|     7["Segment<br>[252, 259, 5]"] | ||||
|     8[Solid2d] | ||||
|   subgraph path3 [Path] | ||||
|     3["Path<br>[76, 111, 6]"] | ||||
|     5["Segment<br>[117, 134, 6]"] | ||||
|     7["Segment<br>[140, 158, 6]"] | ||||
|     9["Segment<br>[164, 182, 6]"] | ||||
|     11["Segment<br>[188, 244, 6]"] | ||||
|     13["Segment<br>[250, 257, 6]"] | ||||
|     14[Solid2d] | ||||
|   end | ||||
|   subgraph path25 [Path] | ||||
|     25["Path<br>[76, 111, 6]"] | ||||
|     26["Segment<br>[117, 134, 6]"] | ||||
|     27["Segment<br>[140, 158, 6]"] | ||||
|     28["Segment<br>[164, 182, 6]"] | ||||
|     29["Segment<br>[188, 244, 6]"] | ||||
|     30["Segment<br>[250, 257, 6]"] | ||||
|     31[Solid2d] | ||||
|   subgraph path4 [Path] | ||||
|     4["Path<br>[76, 113, 5]"] | ||||
|     6["Segment<br>[119, 136, 5]"] | ||||
|     8["Segment<br>[142, 160, 5]"] | ||||
|     10["Segment<br>[166, 184, 5]"] | ||||
|     12["Segment<br>[190, 246, 5]"] | ||||
|     15["Segment<br>[252, 259, 5]"] | ||||
|     16[Solid2d] | ||||
|   end | ||||
|   1["Plane<br>[47, 66, 5]"] | ||||
|   9["Sweep Extrusion<br>[265, 287, 5]"] | ||||
|   10[Wall] | ||||
|   11[Wall] | ||||
|   12[Wall] | ||||
|   13[Wall] | ||||
|   14["Cap Start"] | ||||
|   15["Cap End"] | ||||
|   16["SweepEdge Opposite"] | ||||
|   17["SweepEdge Adjacent"] | ||||
|   18["SweepEdge Opposite"] | ||||
|   19["SweepEdge Adjacent"] | ||||
|   20["SweepEdge Opposite"] | ||||
|   21["SweepEdge Adjacent"] | ||||
|   22["SweepEdge Opposite"] | ||||
|   23["SweepEdge Adjacent"] | ||||
|   24["Plane<br>[47, 66, 6]"] | ||||
|   32["Sweep Extrusion<br>[263, 285, 6]"] | ||||
|   33[Wall] | ||||
|   34[Wall] | ||||
|   35[Wall] | ||||
|   36[Wall] | ||||
|   37["Cap Start"] | ||||
|   38["Cap End"] | ||||
|   1["Plane<br>[47, 66, 6]"] | ||||
|   2["Plane<br>[47, 66, 5]"] | ||||
|   17["Sweep Extrusion<br>[263, 285, 6]"] | ||||
|   18[Wall] | ||||
|   19[Wall] | ||||
|   20[Wall] | ||||
|   21[Wall] | ||||
|   22["Cap Start"] | ||||
|   23["Cap End"] | ||||
|   24["Sweep Extrusion<br>[265, 287, 5]"] | ||||
|   25[Wall] | ||||
|   26[Wall] | ||||
|   27[Wall] | ||||
|   28[Wall] | ||||
|   29["Cap Start"] | ||||
|   30["Cap End"] | ||||
|   31["SweepEdge Opposite"] | ||||
|   32["SweepEdge Adjacent"] | ||||
|   33["SweepEdge Opposite"] | ||||
|   34["SweepEdge Adjacent"] | ||||
|   35["SweepEdge Opposite"] | ||||
|   36["SweepEdge Adjacent"] | ||||
|   37["SweepEdge Opposite"] | ||||
|   38["SweepEdge Adjacent"] | ||||
|   39["SweepEdge Opposite"] | ||||
|   40["SweepEdge Adjacent"] | ||||
|   41["SweepEdge Opposite"] | ||||
| @ -50,72 +50,72 @@ flowchart LR | ||||
|   44["SweepEdge Adjacent"] | ||||
|   45["SweepEdge Opposite"] | ||||
|   46["SweepEdge Adjacent"] | ||||
|   1 --- 2 | ||||
|   2 --- 3 | ||||
|   1 --- 3 | ||||
|   2 --- 4 | ||||
|   2 --- 5 | ||||
|   2 --- 6 | ||||
|   2 --- 7 | ||||
|   2 ---- 9 | ||||
|   2 --- 8 | ||||
|   3 --- 5 | ||||
|   3 --- 7 | ||||
|   3 --- 9 | ||||
|   3 --- 11 | ||||
|   3 --- 13 | ||||
|   3 --- 22 | ||||
|   3 --- 23 | ||||
|   3 ---- 17 | ||||
|   3 --- 14 | ||||
|   4 --- 6 | ||||
|   4 --- 8 | ||||
|   4 --- 10 | ||||
|   4 --- 12 | ||||
|   4 --- 20 | ||||
|   4 --- 21 | ||||
|   5 --- 11 | ||||
|   5 --- 18 | ||||
|   5 --- 19 | ||||
|   6 --- 10 | ||||
|   6 --- 16 | ||||
|   6 --- 17 | ||||
|   9 --- 10 | ||||
|   9 --- 11 | ||||
|   9 --- 12 | ||||
|   9 --- 13 | ||||
|   9 --- 14 | ||||
|   9 --- 15 | ||||
|   9 --- 16 | ||||
|   9 --- 17 | ||||
|   9 --- 18 | ||||
|   4 --- 15 | ||||
|   4 ---- 24 | ||||
|   4 --- 16 | ||||
|   5 --- 21 | ||||
|   5 --- 37 | ||||
|   5 --- 38 | ||||
|   6 --- 28 | ||||
|   6 --- 45 | ||||
|   6 --- 46 | ||||
|   7 --- 20 | ||||
|   7 --- 35 | ||||
|   7 --- 36 | ||||
|   8 --- 27 | ||||
|   8 --- 43 | ||||
|   8 --- 44 | ||||
|   9 --- 19 | ||||
|   9 --- 20 | ||||
|   9 --- 21 | ||||
|   9 --- 22 | ||||
|   9 --- 23 | ||||
|   9 --- 33 | ||||
|   9 --- 34 | ||||
|   10 --- 26 | ||||
|   10 --- 41 | ||||
|   10 --- 42 | ||||
|   11 --- 18 | ||||
|   11 --- 31 | ||||
|   11 --- 32 | ||||
|   12 --- 25 | ||||
|   12 --- 39 | ||||
|   12 --- 40 | ||||
|   17 --- 18 | ||||
|   17 --- 19 | ||||
|   17 --- 20 | ||||
|   17 --- 21 | ||||
|   17 --- 22 | ||||
|   17 --- 23 | ||||
|   17 --- 31 | ||||
|   17 --- 32 | ||||
|   17 --- 33 | ||||
|   17 --- 34 | ||||
|   17 --- 35 | ||||
|   17 --- 36 | ||||
|   17 --- 37 | ||||
|   17 --- 38 | ||||
|   24 --- 25 | ||||
|   25 --- 26 | ||||
|   25 --- 27 | ||||
|   25 --- 28 | ||||
|   25 --- 29 | ||||
|   25 --- 30 | ||||
|   25 ---- 32 | ||||
|   25 --- 31 | ||||
|   26 --- 36 | ||||
|   26 --- 45 | ||||
|   26 --- 46 | ||||
|   27 --- 35 | ||||
|   27 --- 43 | ||||
|   27 --- 44 | ||||
|   28 --- 34 | ||||
|   28 --- 41 | ||||
|   28 --- 42 | ||||
|   29 --- 33 | ||||
|   29 --- 39 | ||||
|   29 --- 40 | ||||
|   32 --- 33 | ||||
|   32 --- 34 | ||||
|   32 --- 35 | ||||
|   32 --- 36 | ||||
|   32 --- 37 | ||||
|   32 --- 38 | ||||
|   32 --- 39 | ||||
|   32 --- 40 | ||||
|   32 --- 41 | ||||
|   32 --- 42 | ||||
|   32 --- 43 | ||||
|   32 --- 44 | ||||
|   32 --- 45 | ||||
|   32 --- 46 | ||||
|   24 --- 26 | ||||
|   24 --- 27 | ||||
|   24 --- 28 | ||||
|   24 --- 29 | ||||
|   24 --- 30 | ||||
|   24 --- 39 | ||||
|   24 --- 40 | ||||
|   24 --- 41 | ||||
|   24 --- 42 | ||||
|   24 --- 43 | ||||
|   24 --- 44 | ||||
|   24 --- 45 | ||||
|   24 --- 46 | ||||
| ``` | ||||
|  | ||||
| @ -12,53 +12,6 @@ description: Operations executed assembly_mixed_units_cubes.kcl | ||||
|     }, | ||||
|     "sourceRange": [] | ||||
|   }, | ||||
|   { | ||||
|     "labeledArgs": { | ||||
|       "data": { | ||||
|         "value": { | ||||
|           "type": "String", | ||||
|           "value": "XY" | ||||
|         }, | ||||
|         "sourceRange": [] | ||||
|       } | ||||
|     }, | ||||
|     "name": "startSketchOn", | ||||
|     "sourceRange": [], | ||||
|     "type": "StdLibCall", | ||||
|     "unlabeledArg": null | ||||
|   }, | ||||
|   { | ||||
|     "labeledArgs": { | ||||
|       "length": { | ||||
|         "value": { | ||||
|           "type": "Number", | ||||
|           "value": 5.0, | ||||
|           "ty": { | ||||
|             "type": "Default", | ||||
|             "len": { | ||||
|               "type": "Inches" | ||||
|             }, | ||||
|             "angle": { | ||||
|               "type": "Degrees" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "sourceRange": [] | ||||
|       } | ||||
|     }, | ||||
|     "name": "extrude", | ||||
|     "sourceRange": [], | ||||
|     "type": "StdLibCall", | ||||
|     "unlabeledArg": { | ||||
|       "value": { | ||||
|         "type": "Sketch", | ||||
|         "value": { | ||||
|           "artifactId": "[uuid]" | ||||
|         } | ||||
|       }, | ||||
|       "sourceRange": [] | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "type": "GroupEnd" | ||||
|   }, | ||||
| @ -71,53 +24,6 @@ description: Operations executed assembly_mixed_units_cubes.kcl | ||||
|     }, | ||||
|     "sourceRange": [] | ||||
|   }, | ||||
|   { | ||||
|     "labeledArgs": { | ||||
|       "data": { | ||||
|         "value": { | ||||
|           "type": "String", | ||||
|           "value": "XY" | ||||
|         }, | ||||
|         "sourceRange": [] | ||||
|       } | ||||
|     }, | ||||
|     "name": "startSketchOn", | ||||
|     "sourceRange": [], | ||||
|     "type": "StdLibCall", | ||||
|     "unlabeledArg": null | ||||
|   }, | ||||
|   { | ||||
|     "labeledArgs": { | ||||
|       "length": { | ||||
|         "value": { | ||||
|           "type": "Number", | ||||
|           "value": 5.0, | ||||
|           "ty": { | ||||
|             "type": "Default", | ||||
|             "len": { | ||||
|               "type": "Mm" | ||||
|             }, | ||||
|             "angle": { | ||||
|               "type": "Degrees" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "sourceRange": [] | ||||
|       } | ||||
|     }, | ||||
|     "name": "extrude", | ||||
|     "sourceRange": [], | ||||
|     "type": "StdLibCall", | ||||
|     "unlabeledArg": { | ||||
|       "value": { | ||||
|         "type": "Sketch", | ||||
|         "value": { | ||||
|           "artifactId": "[uuid]" | ||||
|         } | ||||
|       }, | ||||
|       "sourceRange": [] | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "type": "GroupEnd" | ||||
|   } | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 36 KiB | 
| @ -7,26 +7,16 @@ description: Artifact commands assembly_non_default_units.kcl | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "edge_lines_visible", | ||||
|       "hidden": false | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
| @ -93,6 +83,131 @@ description: Artifact commands assembly_non_default_units.kcl | ||||
|       "type": "start_path" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "move_path_pen", | ||||
|       "path": "[uuid]", | ||||
|       "to": { | ||||
|         "x": 1.0, | ||||
|         "y": 2.0, | ||||
|         "z": 0.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "sketch_mode_disable" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "arc", | ||||
|         "center": { | ||||
|           "x": 0.0, | ||||
|           "y": 2.0 | ||||
|         }, | ||||
|         "radius": 1.0, | ||||
|         "start": { | ||||
|           "unit": "degrees", | ||||
|           "value": 0.0 | ||||
|         }, | ||||
|         "end": { | ||||
|           "unit": "degrees", | ||||
|           "value": 360.0 | ||||
|         }, | ||||
|         "relative": false | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "close_path", | ||||
|       "path_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "in" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "make_plane", | ||||
|       "origin": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "x_axis": { | ||||
|         "x": 1.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "y_axis": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 1.0 | ||||
|       }, | ||||
|       "size": 60.0, | ||||
|       "clobber": false, | ||||
|       "hide": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "enable_sketch_mode", | ||||
|       "entity_id": "[uuid]", | ||||
|       "ortho": false, | ||||
|       "animated": false, | ||||
|       "adjust_camera": false, | ||||
|       "planar_normal": { | ||||
|         "x": 0.0, | ||||
|         "y": -1.0, | ||||
|         "z": 0.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "start_path" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
| @ -146,6 +261,40 @@ description: Artifact commands assembly_non_default_units.kcl | ||||
|       "path_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "edge_lines_visible", | ||||
|       "hidden": false | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
| @ -153,106 +302,5 @@ description: Artifact commands assembly_non_default_units.kcl | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "in" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "make_plane", | ||||
|       "origin": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "x_axis": { | ||||
|         "x": 1.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "y_axis": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 1.0 | ||||
|       }, | ||||
|       "size": 60.0, | ||||
|       "clobber": false, | ||||
|       "hide": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "enable_sketch_mode", | ||||
|       "entity_id": "[uuid]", | ||||
|       "ortho": false, | ||||
|       "animated": false, | ||||
|       "adjust_camera": false, | ||||
|       "planar_normal": { | ||||
|         "x": 0.0, | ||||
|         "y": -1.0, | ||||
|         "z": 0.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "start_path" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "move_path_pen", | ||||
|       "path": "[uuid]", | ||||
|       "to": { | ||||
|         "x": 1.0, | ||||
|         "y": 2.0, | ||||
|         "z": 0.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "sketch_mode_disable" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "arc", | ||||
|         "center": { | ||||
|           "x": 0.0, | ||||
|           "y": 2.0 | ||||
|         }, | ||||
|         "radius": 1.0, | ||||
|         "start": { | ||||
|           "unit": "degrees", | ||||
|           "value": 0.0 | ||||
|         }, | ||||
|         "end": { | ||||
|           "unit": "degrees", | ||||
|           "value": 360.0 | ||||
|         }, | ||||
|         "relative": false | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "close_path", | ||||
|       "path_id": "[uuid]" | ||||
|     } | ||||
|   } | ||||
| ] | ||||
|  | ||||
| @ -1,17 +1,17 @@ | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   subgraph path2 [Path] | ||||
|     2["Path<br>[197, 232, 5]"] | ||||
|     3["Segment<br>[197, 232, 5]"] | ||||
|     2["Path<br>[113, 148, 7]"] | ||||
|     3["Segment<br>[113, 148, 7]"] | ||||
|     4[Solid2d] | ||||
|   end | ||||
|   subgraph path6 [Path] | ||||
|     6["Path<br>[113, 148, 6]"] | ||||
|     7["Segment<br>[113, 148, 6]"] | ||||
|     6["Path<br>[197, 232, 5]"] | ||||
|     7["Segment<br>[197, 232, 5]"] | ||||
|     8[Solid2d] | ||||
|   end | ||||
|   1["Plane<br>[172, 191, 5]"] | ||||
|   5["Plane<br>[88, 107, 6]"] | ||||
|   1["Plane<br>[88, 107, 7]"] | ||||
|   5["Plane<br>[172, 191, 5]"] | ||||
|   1 --- 2 | ||||
|   2 --- 3 | ||||
|   2 --- 4 | ||||
|  | ||||
| @ -12,21 +12,6 @@ description: Operations executed assembly_non_default_units.kcl | ||||
|     }, | ||||
|     "sourceRange": [] | ||||
|   }, | ||||
|   { | ||||
|     "labeledArgs": { | ||||
|       "data": { | ||||
|         "value": { | ||||
|           "type": "String", | ||||
|           "value": "XZ" | ||||
|         }, | ||||
|         "sourceRange": [] | ||||
|       } | ||||
|     }, | ||||
|     "name": "startSketchOn", | ||||
|     "sourceRange": [], | ||||
|     "type": "StdLibCall", | ||||
|     "unlabeledArg": null | ||||
|   }, | ||||
|   { | ||||
|     "type": "GroupEnd" | ||||
|   }, | ||||
| @ -35,25 +20,10 @@ description: Operations executed assembly_non_default_units.kcl | ||||
|     "group": { | ||||
|       "type": "ModuleInstance", | ||||
|       "name": "other2", | ||||
|       "moduleId": 6 | ||||
|       "moduleId": 7 | ||||
|     }, | ||||
|     "sourceRange": [] | ||||
|   }, | ||||
|   { | ||||
|     "labeledArgs": { | ||||
|       "data": { | ||||
|         "value": { | ||||
|           "type": "String", | ||||
|           "value": "XZ" | ||||
|         }, | ||||
|         "sourceRange": [] | ||||
|       } | ||||
|     }, | ||||
|     "name": "startSketchOn", | ||||
|     "sourceRange": [], | ||||
|     "type": "StdLibCall", | ||||
|     "unlabeledArg": null | ||||
|   }, | ||||
|   { | ||||
|     "type": "GroupEnd" | ||||
|   } | ||||
|  | ||||
| @ -9,6 +9,6 @@ description: Variables in memory after executing assembly_non_default_units.kcl | ||||
|   }, | ||||
|   "other2": { | ||||
|     "type": "Module", | ||||
|     "value": 6 | ||||
|     "value": 7 | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands bad_units_in_annotation.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands basic_fillet_cube_close_opposite.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands basic_fillet_cube_end.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands basic_fillet_cube_next_adjacent.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands basic_fillet_cube_previous_adjacent.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands basic_fillet_cube_start.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands big_number_angle_to_match_length_x.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands big_number_angle_to_match_length_y.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands boolean_logical_and.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands boolean_logical_multiple.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands boolean_logical_or.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands circle_three_point.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands circular_pattern3d_a_pattern.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands comparisons.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands comparisons_multiple.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands computed_var.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands crazy_multi_profile.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands cube.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands cube_with_error.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands double_map_fn.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands fillet-and-shell.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands flush_batch_on_end.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands function_sketch.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands function_sketch_with_position.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands helix_ccw.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands helix_simple.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands i_shape.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands if_else.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_constant.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_export.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -2,31 +2,4 @@ | ||||
| source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_file_not_exist_error.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "edge_lines_visible", | ||||
|       "hidden": false | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   } | ||||
| ] | ||||
| [] | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| --- | ||||
| source: kcl/src/simulation_tests.rs | ||||
| source: kcl-lib/src/simulation_tests.rs | ||||
| description: Error from executing import_file_not_exist_error.kcl | ||||
| --- | ||||
| KCL I/O error | ||||
| @ -8,6 +8,6 @@ KCL I/O error | ||||
|   │ exist.kcl`: No such file or directory (os error 2) | ||||
|    ╭──── | ||||
|  1 │ import hotdog from "not-exist.kcl" | ||||
|    · ─────────────────┬──────────────── | ||||
|    ·                  ╰── tests/import_file_not_exist_error/input.kcl | ||||
|    · ▲ | ||||
|    · ╰── main | ||||
|    ╰──── | ||||
|  | ||||
| @ -2,31 +2,4 @@ | ||||
| source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_file_parse_error.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "edge_lines_visible", | ||||
|       "hidden": false | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   } | ||||
| ] | ||||
| [] | ||||
|  | ||||
| @ -1,13 +1,12 @@ | ||||
| --- | ||||
| source: kcl/src/simulation_tests.rs | ||||
| source: kcl-lib/src/simulation_tests.rs | ||||
| description: Error from executing import_file_parse_error.kcl | ||||
| --- | ||||
| KCL Syntax error | ||||
|  | ||||
|   × syntax: Unexpected token: } | ||||
|    ╭─[3:1] | ||||
|  2 │   return  | ||||
|  3 │ } | ||||
|    · ┬ | ||||
|    · ╰── tests/import_file_parse_error/parse-failure.kcl | ||||
|    ╭──── | ||||
|  1 │ import hotdog from "parse-failure.kcl" | ||||
|    ·                                 ┬ | ||||
|    ·                                 ╰── main | ||||
|    ╰──── | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_foreign.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,426 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_function_not_sketch.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "make_plane", | ||||
|       "origin": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "x_axis": { | ||||
|         "x": 1.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "y_axis": { | ||||
|         "x": 0.0, | ||||
|         "y": 1.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "size": 60.0, | ||||
|       "clobber": false, | ||||
|       "hide": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "enable_sketch_mode", | ||||
|       "entity_id": "[uuid]", | ||||
|       "ortho": false, | ||||
|       "animated": false, | ||||
|       "adjust_camera": false, | ||||
|       "planar_normal": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 1.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "start_path" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "move_path_pen", | ||||
|       "path": "[uuid]", | ||||
|       "to": { | ||||
|         "x": 4.0, | ||||
|         "y": 12.0, | ||||
|         "z": 0.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "sketch_mode_disable" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 2.0, | ||||
|           "y": 0.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 0.0, | ||||
|           "y": -6.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 4.0, | ||||
|           "y": -6.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 0.0, | ||||
|           "y": -6.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": -3.75, | ||||
|           "y": -4.5, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": 0.0, | ||||
|           "y": -5.5, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "line", | ||||
|         "end": { | ||||
|           "x": -2.0, | ||||
|           "y": 0.0, | ||||
|           "z": 0.0 | ||||
|         }, | ||||
|         "relative": true | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "close_path", | ||||
|       "path_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "revolve", | ||||
|       "target": "[uuid]", | ||||
|       "origin": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "axis": { | ||||
|         "x": 0.0, | ||||
|         "y": 1.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "axis_is_2d": true, | ||||
|       "angle": { | ||||
|         "unit": "degrees", | ||||
|         "value": 360.0 | ||||
|       }, | ||||
|       "tolerance": 0.0000001 | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_bring_to_front", | ||||
|       "object_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_extrusion_face_info", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_opposite_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "solid3d_get_next_adjacent_edge", | ||||
|       "object_id": "[uuid]", | ||||
|       "edge_id": "[uuid]", | ||||
|       "face_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -1,6 +1,5 @@ | ||||
| --- | ||||
| source: kcl/src/simulation_tests.rs | ||||
| assertion_line: 189 | ||||
| source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact graph flowchart import_function_not_sketch.kcl | ||||
| extension: md | ||||
| snapshot_kind: binary | ||||
|  | ||||
| @ -1,3 +1,82 @@ | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   subgraph path2 [Path] | ||||
|     2["Path<br>[75, 101, 5]"] | ||||
|     3["Segment<br>[107, 125, 5]"] | ||||
|     4["Segment<br>[131, 150, 5]"] | ||||
|     5["Segment<br>[156, 175, 5]"] | ||||
|     6["Segment<br>[181, 200, 5]"] | ||||
|     7["Segment<br>[206, 231, 5]"] | ||||
|     8["Segment<br>[237, 258, 5]"] | ||||
|     9["Segment<br>[264, 283, 5]"] | ||||
|     10["Segment<br>[289, 296, 5]"] | ||||
|     11[Solid2d] | ||||
|   end | ||||
|   1["Plane<br>[52, 69, 5]"] | ||||
|   12["Sweep Revolve<br>[302, 319, 5]"] | ||||
|   13[Wall] | ||||
|   14[Wall] | ||||
|   15[Wall] | ||||
|   16[Wall] | ||||
|   17[Wall] | ||||
|   18[Wall] | ||||
|   19[Wall] | ||||
|   20[Wall] | ||||
|   21["SweepEdge Adjacent"] | ||||
|   22["SweepEdge Adjacent"] | ||||
|   23["SweepEdge Adjacent"] | ||||
|   24["SweepEdge Adjacent"] | ||||
|   25["SweepEdge Adjacent"] | ||||
|   26["SweepEdge Adjacent"] | ||||
|   27["SweepEdge Adjacent"] | ||||
|   1 --- 2 | ||||
|   2 --- 3 | ||||
|   2 --- 4 | ||||
|   2 --- 5 | ||||
|   2 --- 6 | ||||
|   2 --- 7 | ||||
|   2 --- 8 | ||||
|   2 --- 9 | ||||
|   2 --- 10 | ||||
|   2 ---- 12 | ||||
|   2 --- 11 | ||||
|   3 --- 13 | ||||
|   3 x--> 21 | ||||
|   4 --- 14 | ||||
|   4 --- 21 | ||||
|   5 --- 15 | ||||
|   5 --- 22 | ||||
|   6 --- 16 | ||||
|   6 --- 23 | ||||
|   7 --- 17 | ||||
|   7 --- 24 | ||||
|   8 --- 18 | ||||
|   8 --- 25 | ||||
|   9 --- 19 | ||||
|   9 --- 26 | ||||
|   10 --- 20 | ||||
|   10 --- 27 | ||||
|   12 --- 13 | ||||
|   12 --- 14 | ||||
|   12 --- 15 | ||||
|   12 --- 16 | ||||
|   12 --- 17 | ||||
|   12 --- 18 | ||||
|   12 --- 19 | ||||
|   12 --- 20 | ||||
|   12 <--x 3 | ||||
|   12 --- 21 | ||||
|   12 <--x 4 | ||||
|   12 <--x 5 | ||||
|   12 --- 22 | ||||
|   12 <--x 6 | ||||
|   12 --- 23 | ||||
|   12 <--x 7 | ||||
|   12 --- 24 | ||||
|   12 <--x 8 | ||||
|   12 --- 25 | ||||
|   12 <--x 9 | ||||
|   12 --- 26 | ||||
|   12 <--x 10 | ||||
|   12 --- 27 | ||||
| ``` | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 99 KiB | 
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_glob.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,123 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_side_effect.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "make_plane", | ||||
|       "origin": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "x_axis": { | ||||
|         "x": 1.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "y_axis": { | ||||
|         "x": 0.0, | ||||
|         "y": 1.0, | ||||
|         "z": 0.0 | ||||
|       }, | ||||
|       "size": 60.0, | ||||
|       "clobber": false, | ||||
|       "hide": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "enable_sketch_mode", | ||||
|       "entity_id": "[uuid]", | ||||
|       "ortho": false, | ||||
|       "animated": false, | ||||
|       "adjust_camera": false, | ||||
|       "planar_normal": { | ||||
|         "x": 0.0, | ||||
|         "y": 0.0, | ||||
|         "z": 1.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "start_path" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "move_path_pen", | ||||
|       "path": "[uuid]", | ||||
|       "to": { | ||||
|         "x": 10.0, | ||||
|         "y": 0.0, | ||||
|         "z": 0.0 | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "sketch_mode_disable" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "extend_path", | ||||
|       "path": "[uuid]", | ||||
|       "segment": { | ||||
|         "type": "arc", | ||||
|         "center": { | ||||
|           "x": 0.0, | ||||
|           "y": 0.0 | ||||
|         }, | ||||
|         "radius": 10.0, | ||||
|         "start": { | ||||
|           "unit": "degrees", | ||||
|           "value": 0.0 | ||||
|         }, | ||||
|         "end": { | ||||
|           "unit": "degrees", | ||||
|           "value": 360.0 | ||||
|         }, | ||||
|         "relative": false | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "close_path", | ||||
|       "path_id": "[uuid]" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -1,6 +1,5 @@ | ||||
| --- | ||||
| source: kcl/src/simulation_tests.rs | ||||
| assertion_line: 189 | ||||
| source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact graph flowchart import_side_effect.kcl | ||||
| extension: md | ||||
| snapshot_kind: binary | ||||
|  | ||||
| @ -1,3 +1,12 @@ | ||||
| ```mermaid | ||||
| flowchart LR | ||||
|   subgraph path2 [Path] | ||||
|     2["Path<br>[102, 138, 5]"] | ||||
|     3["Segment<br>[102, 138, 5]"] | ||||
|     4[Solid2d] | ||||
|   end | ||||
|   1["Plane<br>[77, 96, 5]"] | ||||
|   1 --- 2 | ||||
|   2 --- 3 | ||||
|   2 --- 4 | ||||
| ``` | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands import_transform.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -7,26 +7,8 @@ description: Artifact commands import_whole.kcl | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "edge_lines_visible", | ||||
|       "hidden": false | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
| @ -224,6 +206,40 @@ description: Artifact commands import_whole.kcl | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "edge_lines_visible", | ||||
|       "hidden": false | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "object_visible", | ||||
|       "object_id": "[uuid]", | ||||
|       "hidden": true | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -12,53 +12,6 @@ description: Operations executed import_whole.kcl | ||||
|     }, | ||||
|     "sourceRange": [] | ||||
|   }, | ||||
|   { | ||||
|     "labeledArgs": { | ||||
|       "data": { | ||||
|         "value": { | ||||
|           "type": "Plane", | ||||
|           "artifact_id": "[uuid]" | ||||
|         }, | ||||
|         "sourceRange": [] | ||||
|       } | ||||
|     }, | ||||
|     "name": "startSketchOn", | ||||
|     "sourceRange": [], | ||||
|     "type": "StdLibCall", | ||||
|     "unlabeledArg": null | ||||
|   }, | ||||
|   { | ||||
|     "labeledArgs": { | ||||
|       "length": { | ||||
|         "value": { | ||||
|           "type": "Number", | ||||
|           "value": 10.0, | ||||
|           "ty": { | ||||
|             "type": "Default", | ||||
|             "len": { | ||||
|               "type": "Inches" | ||||
|             }, | ||||
|             "angle": { | ||||
|               "type": "Degrees" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "sourceRange": [] | ||||
|       } | ||||
|     }, | ||||
|     "name": "extrude", | ||||
|     "sourceRange": [], | ||||
|     "type": "StdLibCall", | ||||
|     "unlabeledArg": { | ||||
|       "value": { | ||||
|         "type": "Sketch", | ||||
|         "value": { | ||||
|           "artifactId": "[uuid]" | ||||
|         } | ||||
|       }, | ||||
|       "sourceRange": [] | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "type": "GroupEnd" | ||||
|   }, | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands index_of_array.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands intersect_cubes.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands invalid_index_fractional.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands invalid_index_negative.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands invalid_index_str.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands invalid_member_object.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands invalid_member_object_prop.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands 80-20-rail.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands ball-bearing.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,30 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands bench.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
| @ -3,6 +3,22 @@ source: kcl-lib/src/simulation_tests.rs | ||||
| description: Artifact commands bracket.kcl | ||||
| --- | ||||
| [ | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|     "command": { | ||||
|       "type": "set_scene_units", | ||||
|       "unit": "mm" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "cmdId": "[uuid]", | ||||
|     "range": [], | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												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": 7 | ||||
|     "value": 8 | ||||
|   }, | ||||
|   "c1": { | ||||
|     "type": "TagIdentifier", | ||||
| @ -105,11 +105,11 @@ description: Variables in memory after executing car-wheel-assembly.kcl | ||||
|   }, | ||||
|   "carRotor": { | ||||
|     "type": "Module", | ||||
|     "value": 6 | ||||
|     "value": 7 | ||||
|   }, | ||||
|   "carTire": { | ||||
|     "type": "Module", | ||||
|     "value": 9 | ||||
|     "value": 10 | ||||
|   }, | ||||
|   "carWheel": { | ||||
|     "type": "Module", | ||||
| @ -177,7 +177,7 @@ description: Variables in memory after executing car-wheel-assembly.kcl | ||||
|   }, | ||||
|   "lugNut": { | ||||
|     "type": "Module", | ||||
|     "value": 8 | ||||
|     "value": 9 | ||||
|   }, | ||||
|   "lugSpacing": { | ||||
|     "type": "Number", | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 157 KiB | 
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	