Fix patterning in module to not fail when importing function from the module (#6082)

* Add failing test

* Update output to show execution error

* Fix circular pattern to not error in isolated or mock mode

* Update output after fix

* Add failing test for pattern linear 2D

* Add failing output

* Fix isolated execution in linear patterns

* Update output after linear fix
This commit is contained in:
Jonathan Tran
2025-03-31 19:46:29 -04:00
committed by GitHub
parent 566143757f
commit bb4ed59191
24 changed files with 2492 additions and 9 deletions

View File

@ -381,6 +381,7 @@ async fn send_pattern_transform<T: GeometryTrait>(
args: &Args,
) -> Result<Vec<T>, KclError> {
let id = exec_state.next_uuid();
let extra_instances = transforms.len();
let resp = args
.send_modeling_cmd(
@ -393,10 +394,19 @@ async fn send_pattern_transform<T: GeometryTrait>(
)
.await?;
let OkWebSocketResponseData::Modeling {
let mut mock_ids = Vec::new();
let entity_ids = if let OkWebSocketResponseData::Modeling {
modeling_response: OkModelingCmdResponse::EntityLinearPatternTransform(pattern_info),
} = &resp
else {
{
&pattern_info.entity_ids
} else if args.ctx.no_engine_commands().await {
mock_ids.reserve(extra_instances);
for _ in 0..extra_instances {
mock_ids.push(exec_state.next_uuid());
}
&mock_ids
} else {
return Err(KclError::Engine(KclErrorDetails {
message: format!("EntityLinearPattern response was not as expected: {:?}", resp),
source_ranges: vec![args.source_range],
@ -404,7 +414,7 @@ async fn send_pattern_transform<T: GeometryTrait>(
};
let mut geometries = vec![solid.clone()];
for id in pattern_info.entity_ids.iter().copied() {
for id in entity_ids.iter().copied() {
let mut new_solid = solid.clone();
new_solid.set_id(id);
geometries.push(new_solid);
@ -1280,10 +1290,21 @@ async fn pattern_circular(
)
.await?;
let OkWebSocketResponseData::Modeling {
// The common case is borrowing from the response. Instead of cloning,
// create a Vec to borrow from in mock mode.
let mut mock_ids = Vec::new();
let entity_ids = if let OkWebSocketResponseData::Modeling {
modeling_response: OkModelingCmdResponse::EntityCircularPattern(pattern_info),
} = &resp
else {
{
&pattern_info.entity_ids
} else if args.ctx.no_engine_commands().await {
mock_ids.reserve(num_repetitions as usize);
for _ in 0..num_repetitions {
mock_ids.push(exec_state.next_uuid());
}
&mock_ids
} else {
return Err(KclError::Engine(KclErrorDetails {
message: format!("EntityCircularPattern response was not as expected: {:?}", resp),
source_ranges: vec![args.source_range],
@ -1293,18 +1314,18 @@ async fn pattern_circular(
let geometries = match geometry {
Geometry::Sketch(sketch) => {
let mut geometries = vec![sketch.clone()];
for id in pattern_info.entity_ids.iter() {
for id in entity_ids.iter().copied() {
let mut new_sketch = sketch.clone();
new_sketch.id = *id;
new_sketch.id = id;
geometries.push(new_sketch);
}
Geometries::Sketches(geometries)
}
Geometry::Solid(solid) => {
let mut geometries = vec![solid.clone()];
for id in pattern_info.entity_ids.iter() {
for id in entity_ids.iter().copied() {
let mut new_solid = solid.clone();
new_solid.id = *id;
new_solid.id = id;
geometries.push(new_solid);
}
Geometries::Solids(geometries)