KCL: Break face-analyzing map into its own function (#3792)
This commit is contained in:
		@ -1,8 +1,10 @@
 | 
			
		||||
//! Functions related to extruding.
 | 
			
		||||
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
 | 
			
		||||
use anyhow::Result;
 | 
			
		||||
use derive_docs::stdlib;
 | 
			
		||||
use kittycad::types::ExtrusionFaceCapType;
 | 
			
		||||
use kittycad::types::{ExtrusionFaceCapType, ExtrusionFaceInfo};
 | 
			
		||||
use schemars::JsonSchema;
 | 
			
		||||
use uuid::Uuid;
 | 
			
		||||
 | 
			
		||||
@ -217,26 +219,11 @@ pub(crate) async fn do_post_extrude(
 | 
			
		||||
        .await?;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Create a hashmap for quick id lookup
 | 
			
		||||
    let mut face_id_map = std::collections::HashMap::new();
 | 
			
		||||
    // creating fake ids for start and end caps is to make extrudes mock-execute safe
 | 
			
		||||
    let (mut start_cap_id, mut end_cap_id) = if args.ctx.is_mock {
 | 
			
		||||
        (Some(Uuid::new_v4()), Some(Uuid::new_v4()))
 | 
			
		||||
    } else {
 | 
			
		||||
        (None, None)
 | 
			
		||||
    };
 | 
			
		||||
    for face_info in face_infos {
 | 
			
		||||
        match face_info.cap {
 | 
			
		||||
            ExtrusionFaceCapType::Bottom => start_cap_id = face_info.face_id,
 | 
			
		||||
            ExtrusionFaceCapType::Top => end_cap_id = face_info.face_id,
 | 
			
		||||
            ExtrusionFaceCapType::None => {
 | 
			
		||||
                if let Some(curve_id) = face_info.curve_id {
 | 
			
		||||
                    face_id_map.insert(curve_id, face_info.face_id);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let Faces {
 | 
			
		||||
        sides: face_id_map,
 | 
			
		||||
        start_cap_id,
 | 
			
		||||
        end_cap_id,
 | 
			
		||||
    } = analyze_faces(&args, face_infos);
 | 
			
		||||
    // Iterate over the sketch_group.value array and add face_id to GeoMeta
 | 
			
		||||
    let new_value = sketch_group
 | 
			
		||||
        .value
 | 
			
		||||
@ -300,3 +287,37 @@ pub(crate) async fn do_post_extrude(
 | 
			
		||||
        edge_cuts: vec![],
 | 
			
		||||
    }))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Default)]
 | 
			
		||||
struct Faces {
 | 
			
		||||
    /// Maps curve ID to face ID for each side.
 | 
			
		||||
    sides: HashMap<Uuid, Option<Uuid>>,
 | 
			
		||||
    /// Top face ID.
 | 
			
		||||
    end_cap_id: Option<Uuid>,
 | 
			
		||||
    /// Bottom face ID.
 | 
			
		||||
    start_cap_id: Option<Uuid>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn analyze_faces(args: &Args, face_infos: Vec<ExtrusionFaceInfo>) -> Faces {
 | 
			
		||||
    let mut faces = Faces {
 | 
			
		||||
        sides: HashMap::with_capacity(face_infos.len()),
 | 
			
		||||
        ..Default::default()
 | 
			
		||||
    };
 | 
			
		||||
    if args.ctx.is_mock {
 | 
			
		||||
        // Create fake IDs for start and end caps, to make extrudes mock-execute safe
 | 
			
		||||
        faces.start_cap_id = Some(Uuid::new_v4());
 | 
			
		||||
        faces.end_cap_id = Some(Uuid::new_v4());
 | 
			
		||||
    }
 | 
			
		||||
    for face_info in face_infos {
 | 
			
		||||
        match face_info.cap {
 | 
			
		||||
            ExtrusionFaceCapType::Bottom => faces.start_cap_id = face_info.face_id,
 | 
			
		||||
            ExtrusionFaceCapType::Top => faces.end_cap_id = face_info.face_id,
 | 
			
		||||
            ExtrusionFaceCapType::None => {
 | 
			
		||||
                if let Some(curve_id) = face_info.curve_id {
 | 
			
		||||
                    faces.sides.insert(curve_id, face_info.face_id);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    faces
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user