diff --git a/rust/kcl-lib/src/engine/mod.rs b/rust/kcl-lib/src/engine/mod.rs index 564d5bd16..ede181397 100644 --- a/rust/kcl-lib/src/engine/mod.rs +++ b/rust/kcl-lib/src/engine/mod.rs @@ -369,13 +369,15 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { settings: &crate::ExecutorSettings, source_range: SourceRange, id_generator: &mut IdGenerator, + grid_scale_unit: Option, ) -> Result<(), crate::errors::KclError> { // Set the edge visibility. self.set_edge_visibility(settings.highlight_edges, source_range, id_generator) .await?; // Send the command to show the grid. - self.modify_grid(!settings.show_grid, source_range, id_generator) + + self.modify_grid(!settings.show_grid, grid_scale_unit, source_range, id_generator) .await?; // We do not have commands for changing ssao on the fly. @@ -829,6 +831,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { async fn modify_grid( &self, hidden: bool, + base_unit: Option, source_range: SourceRange, id_generator: &mut IdGenerator, ) -> Result<(), KclError> { @@ -843,6 +846,17 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { ) .await?; + let grid_scale = if let Some(units) = base_unit { + // The grid is 10x10, so setting the value to 10 means that + // users whose unit is cm will see each cell as 1cm by 1cm, + // which is useful for sketching. + ModelingCmd::from(mcmd::SetGridScale { value: 10.0, units }) + } else { + ModelingCmd::from(mcmd::SetGridAutoScale {}) + }; + self.batch_modeling_cmd(id_generator.next_uuid(), source_range, &grid_scale) + .await?; + // Hide/show the grid scale text. self.batch_modeling_cmd( id_generator.next_uuid(), diff --git a/rust/kcl-lib/src/execution/mod.rs b/rust/kcl-lib/src/execution/mod.rs index 66623e234..6fed152fa 100644 --- a/rust/kcl-lib/src/execution/mod.rs +++ b/rust/kcl-lib/src/execution/mod.rs @@ -586,6 +586,12 @@ impl ExecutorContext { pub async fn run_with_caching(&self, program: crate::Program) -> Result { assert!(!self.is_mock()); + let grid_scale = program + .meta_settings() + .ok() + .flatten() + .map(|s| s.default_length_units) + .map(kcmc::units::UnitLength::from); let (program, exec_state, result) = match cache::read_old_ast().await { Some(mut cached_state) => { @@ -612,6 +618,7 @@ impl ExecutorContext { &self.settings, Default::default(), &mut cached_state.main.exec_state.id_generator, + grid_scale, ) .await .is_err() @@ -639,6 +646,7 @@ impl ExecutorContext { &self.settings, Default::default(), &mut cached_state.main.exec_state.id_generator, + grid_scale, ) .await .is_err() @@ -683,6 +691,7 @@ impl ExecutorContext { &self.settings, Default::default(), &mut cached_state.main.exec_state.id_generator, + grid_scale, ) .await .is_ok() @@ -1072,8 +1081,19 @@ impl ExecutorContext { let _stats = crate::log::LogPerfStats::new("Interpretation"); // Re-apply the settings, in case the cache was busted. + let grid_scale = program + .meta_settings() + .ok() + .flatten() + .map(|s| s.default_length_units) + .map(kcmc::units::UnitLength::from); self.engine - .reapply_settings(&self.settings, Default::default(), exec_state.id_generator()) + .reapply_settings( + &self.settings, + Default::default(), + exec_state.id_generator(), + grid_scale, + ) .await .map_err(KclErrorWithOutputs::no_outputs)?;