Skip to content

Commit e4ed7bb

Browse files
committed
Send multiple fillets in a single request
1 parent 4e2deca commit e4ed7bb

File tree

1 file changed

+57
-33
lines changed

1 file changed

+57
-33
lines changed

rust/kcl-lib/src/std/fillet.rs

Lines changed: 57 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -82,43 +82,67 @@ async fn inner_fillet(
8282
exec_state: &mut ExecState,
8383
args: Args,
8484
) -> Result<Box<Solid>, KclError> {
85+
// If you try and tag multiple edges with a tagged fillet, we want to return an
86+
// error to the user that they can only tag one edge at a time.
87+
if tag.is_some() && tags.len() > 1 {
88+
return Err(KclError::Type(KclErrorDetails {
89+
message: "You can only tag one edge at a time with a tagged fillet. Either delete the tag for the fillet fn if you don't need it OR separate into individual fillet functions for each tag.".to_string(),
90+
source_ranges: vec![args.source_range],
91+
backtrace: Default::default(),
92+
}));
93+
}
94+
if tags.is_empty() {
95+
return Err(KclError::Semantic(KclErrorDetails {
96+
source_ranges: vec![args.source_range],
97+
message: "You must fillet at least one tag".to_owned(),
98+
backtrace: Default::default(),
99+
}));
100+
}
101+
85102
let mut solid = solid.clone();
86-
for edge_tag in tags {
87-
let edge_id = edge_tag.get_engine_id(exec_state, &args)?;
103+
let edge_ids = tags
104+
.into_iter()
105+
.map(|edge_tag| edge_tag.get_engine_id(exec_state, &args))
106+
.collect::<Result<Vec<_>, _>>()?;
88107

89-
let id = exec_state.next_uuid();
90-
args.batch_end_cmd(
91-
id,
92-
ModelingCmd::from(mcmd::Solid3dFilletEdge {
93-
edge_id: None,
94-
edge_ids: vec![edge_id],
95-
extra_face_ids: vec![],
96-
strategy: Default::default(),
97-
object_id: solid.id,
98-
radius: LengthUnit(radius.to_mm()),
99-
tolerance: LengthUnit(tolerance.as_ref().map(|t| t.to_mm()).unwrap_or(DEFAULT_TOLERANCE)),
100-
cut_type: CutType::Fillet,
101-
}),
102-
)
103-
.await?;
108+
let id = exec_state.next_uuid();
109+
let mut extra_face_ids = Vec::new();
110+
let num_extra_ids = edge_ids.len() - 1;
111+
for _ in 0..num_extra_ids {
112+
extra_face_ids.push(exec_state.next_uuid());
113+
}
114+
args.batch_end_cmd(
115+
id,
116+
ModelingCmd::from(mcmd::Solid3dFilletEdge {
117+
edge_id: None,
118+
edge_ids: edge_ids.clone(),
119+
extra_face_ids,
120+
strategy: Default::default(),
121+
object_id: solid.id,
122+
radius: LengthUnit(radius.to_mm()),
123+
tolerance: LengthUnit(tolerance.as_ref().map(|t| t.to_mm()).unwrap_or(DEFAULT_TOLERANCE)),
124+
cut_type: CutType::Fillet,
125+
}),
126+
)
127+
.await?;
104128

105-
solid.edge_cuts.push(EdgeCut::Fillet {
106-
id,
107-
edge_id,
108-
radius: radius.clone(),
109-
tag: Box::new(tag.clone()),
110-
});
129+
let new_edge_cuts = edge_ids.into_iter().map(|edge_id| EdgeCut::Fillet {
130+
id,
131+
edge_id,
132+
radius: radius.clone(),
133+
tag: Box::new(tag.clone()),
134+
});
135+
solid.edge_cuts.extend(new_edge_cuts);
111136

112-
if let Some(ref tag) = tag {
113-
solid.value.push(ExtrudeSurface::Fillet(FilletSurface {
114-
face_id: id,
115-
tag: Some(tag.clone()),
116-
geo_meta: GeoMeta {
117-
id,
118-
metadata: args.source_range.into(),
119-
},
120-
}));
121-
}
137+
if let Some(ref tag) = tag {
138+
solid.value.push(ExtrudeSurface::Fillet(FilletSurface {
139+
face_id: id,
140+
tag: Some(tag.clone()),
141+
geo_meta: GeoMeta {
142+
id,
143+
metadata: args.source_range.into(),
144+
},
145+
}));
122146
}
123147

124148
Ok(solid)

0 commit comments

Comments
 (0)