KCL refactor: implement patternLinear3D as patternTransform (#4539)
Part of https://github.com/KittyCAD/modeling-app/issues/4543 Changes patternLinear3D's implementation so it just calls into patternTransform instead of needing all its own logic and API calls.
This commit is contained in:
		@ -59,7 +59,6 @@ pub struct LinearPattern3dData {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub enum LinearPattern {
 | 
			
		||||
    ThreeD(LinearPattern3dData),
 | 
			
		||||
    TwoD(LinearPattern2dData),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -67,14 +66,12 @@ impl LinearPattern {
 | 
			
		||||
    pub fn axis(&self) -> [f64; 3] {
 | 
			
		||||
        match self {
 | 
			
		||||
            LinearPattern::TwoD(lp) => [lp.axis[0], lp.axis[1], 0.0],
 | 
			
		||||
            LinearPattern::ThreeD(lp) => lp.axis,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn repetitions(&self) -> RepetitionsNeeded {
 | 
			
		||||
        let n = match self {
 | 
			
		||||
            LinearPattern::TwoD(lp) => lp.instances.u32(),
 | 
			
		||||
            LinearPattern::ThreeD(lp) => lp.instances.u32(),
 | 
			
		||||
        };
 | 
			
		||||
        RepetitionsNeeded::from(n)
 | 
			
		||||
    }
 | 
			
		||||
@ -82,7 +79,6 @@ impl LinearPattern {
 | 
			
		||||
    pub fn distance(&self) -> f64 {
 | 
			
		||||
        match self {
 | 
			
		||||
            LinearPattern::TwoD(lp) => lp.distance,
 | 
			
		||||
            LinearPattern::ThreeD(lp) => lp.distance,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -312,6 +308,16 @@ async fn inner_pattern_transform<'a>(
 | 
			
		||||
        let t = make_transform(i, &transform_function, args.source_range, exec_state).await?;
 | 
			
		||||
        transform.push(t);
 | 
			
		||||
    }
 | 
			
		||||
    let transform = transform; // remove mutability
 | 
			
		||||
    execute_pattern_transform(transform, solid_set, exec_state, args).await
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async fn execute_pattern_transform<'a>(
 | 
			
		||||
    transforms: Vec<Vec<Transform>>,
 | 
			
		||||
    solid_set: SolidSet,
 | 
			
		||||
    exec_state: &mut ExecState,
 | 
			
		||||
    args: &'a Args,
 | 
			
		||||
) -> Result<Vec<Box<Solid>>, KclError> {
 | 
			
		||||
    // Flush the batch for our fillets/chamfers if there are any.
 | 
			
		||||
    // If we do not flush these, then you won't be able to pattern something with fillets.
 | 
			
		||||
    // Flush just the fillets/chamfers that apply to these solids.
 | 
			
		||||
@ -326,7 +332,7 @@ async fn inner_pattern_transform<'a>(
 | 
			
		||||
 | 
			
		||||
    let mut solids = Vec::new();
 | 
			
		||||
    for e in starting_solids {
 | 
			
		||||
        let new_solids = send_pattern_transform(transform.clone(), &e, exec_state, args).await?;
 | 
			
		||||
        let new_solids = send_pattern_transform(transforms.clone(), &e, exec_state, args).await?;
 | 
			
		||||
        solids.extend(new_solids);
 | 
			
		||||
    }
 | 
			
		||||
    Ok(solids)
 | 
			
		||||
@ -664,39 +670,21 @@ async fn inner_pattern_linear_3d(
 | 
			
		||||
    exec_state: &mut ExecState,
 | 
			
		||||
    args: Args,
 | 
			
		||||
) -> Result<Vec<Box<Solid>>, KclError> {
 | 
			
		||||
    // Flush the batch for our fillets/chamfers if there are any.
 | 
			
		||||
    // If we do not flush these, then you won't be able to pattern something with fillets.
 | 
			
		||||
    // Flush just the fillets/chamfers that apply to these solids.
 | 
			
		||||
    args.flush_batch_for_solid_set(exec_state, solid_set.clone().into())
 | 
			
		||||
        .await?;
 | 
			
		||||
 | 
			
		||||
    let starting_solids: Vec<Box<Solid>> = solid_set.into();
 | 
			
		||||
 | 
			
		||||
    if args.ctx.context_type == crate::executor::ContextType::Mock {
 | 
			
		||||
        return Ok(starting_solids);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut solids = Vec::new();
 | 
			
		||||
    for solid in starting_solids.iter() {
 | 
			
		||||
        let geometries = pattern_linear(
 | 
			
		||||
            LinearPattern::ThreeD(data.clone()),
 | 
			
		||||
            Geometry::Solid(solid.clone()),
 | 
			
		||||
            exec_state,
 | 
			
		||||
            args.clone(),
 | 
			
		||||
        )
 | 
			
		||||
        .await?;
 | 
			
		||||
 | 
			
		||||
        let Geometries::Solids(new_solids) = geometries else {
 | 
			
		||||
            return Err(KclError::Semantic(KclErrorDetails {
 | 
			
		||||
                message: "Expected a vec of solids".to_string(),
 | 
			
		||||
                source_ranges: vec![args.source_range],
 | 
			
		||||
            }));
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        solids.extend(new_solids);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ok(solids)
 | 
			
		||||
    let axis = data.axis;
 | 
			
		||||
    let [x, y, z] = axis;
 | 
			
		||||
    let axis_len = f64::sqrt(x * x + y * y + z * z);
 | 
			
		||||
    let normalized_axis = kcmc::shared::Point3d::from([x / axis_len, y / axis_len, z / axis_len]);
 | 
			
		||||
    let transforms: Vec<_> = (1..data.instances.u64())
 | 
			
		||||
        .map(|i| {
 | 
			
		||||
            let d = data.distance * (i as f64);
 | 
			
		||||
            let translate = (normalized_axis * d).map(LengthUnit);
 | 
			
		||||
            vec![Transform {
 | 
			
		||||
                translate,
 | 
			
		||||
                ..Default::default()
 | 
			
		||||
            }]
 | 
			
		||||
        })
 | 
			
		||||
        .collect();
 | 
			
		||||
    execute_pattern_transform(transforms, solid_set, exec_state, &args).await
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async fn pattern_linear(
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user