Skip to main content

brep_kernel/abi/
modeling_a.rs

1use super::*;
2
3#[wasm_bindgen]
4pub fn extrude_brep_json(request_json: &str) -> Result<String, JsValue> {
5    let request: ExtrudeBrepRequest =
6        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
7    let solid = extrude_profile_brep(&request.profile, request.direction, request.distance)
8        .map_err(javascript_error)?;
9    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
10}
11
12#[wasm_bindgen]
13pub fn revolve_brep_json(request_json: &str) -> Result<String, JsValue> {
14    let request: RevolveBrepRequest =
15        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
16    let solid = revolve_profile_brep_named(
17        &request.profile,
18        request.axis_point,
19        request.axis_direction,
20        request.angle,
21        &request.side_names,
22        &request.cap_names,
23    )
24    .map_err(javascript_error)?;
25    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
26}
27
28#[wasm_bindgen]
29pub fn fillet_edge_json(request_json: &str) -> Result<String, JsValue> {
30    let request: EdgeBlendRequest =
31        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
32    let edge_id = resolve_blend_edge(&request).map_err(javascript_error)?;
33    let solid = fillet_edge(
34        &request.solid,
35        edge_id,
36        request.radius,
37        request.name.as_deref(),
38    )
39    .map_err(javascript_error)?;
40    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
41}
42
43#[wasm_bindgen]
44pub fn fillet_edge_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
45    let request: EdgeBlendRequest =
46        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
47    let edge_id = resolve_blend_edge(&request).map_err(javascript_error)?;
48    let solid = fillet_edge(
49        &request.solid,
50        edge_id,
51        request.radius,
52        request.name.as_deref(),
53    )
54    .map_err(javascript_error)?;
55    solid_buffer(&solid, "{}".into())
56}
57
58#[wasm_bindgen]
59pub fn chamfer_edge_json(request_json: &str) -> Result<String, JsValue> {
60    let request: EdgeBlendRequest =
61        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
62    let edge_id = resolve_blend_edge(&request).map_err(javascript_error)?;
63    let solid = chamfer_edge(
64        &request.solid,
65        edge_id,
66        request.radius,
67        request.name.as_deref(),
68    )
69    .map_err(javascript_error)?;
70    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
71}
72
73#[wasm_bindgen]
74pub fn chamfer_edge_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
75    let request: EdgeBlendRequest =
76        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
77    let edge_id = resolve_blend_edge(&request).map_err(javascript_error)?;
78    let solid = chamfer_edge(
79        &request.solid,
80        edge_id,
81        request.radius,
82        request.name.as_deref(),
83    )
84    .map_err(javascript_error)?;
85    solid_buffer(&solid, "{}".into())
86}
87
88/// Convex-corner (vertex/"star") blend request โ€” Golovanov ยง6.9.7. The three
89/// incident edges must ALREADY be filleted; `corner_point` is the original
90/// sharp-corner coordinate (trimmed away by the edge fillets, so it names the
91/// corner geometrically โ€” the vertex itself no longer exists).
92#[derive(Deserialize)]
93pub(crate) struct CornerBlendRequest {
94    pub(crate) solid: BrepSolid,
95    pub(crate) corner_point: Vec3,
96    pub(crate) radius: f64,
97    #[serde(default)]
98    pub(crate) name: Option<String>,
99}
100
101/// Multi-edge fillet/chamfer request: the object plus one 3D point on each
102/// selected edge. The kernel fillets them all and (for fillets) rounds the
103/// convex vertices where >=3 of them meet โ€” the whole operation in one call.
104#[derive(Deserialize)]
105pub(crate) struct FilletEdgesRequest {
106    pub(crate) solid: BrepSolid,
107    pub(crate) edge_points: Vec<Vec3>,
108    pub(crate) radius: f64,
109    #[serde(default)]
110    pub(crate) chamfer: bool,
111    #[serde(default)]
112    pub(crate) name: Option<String>,
113}
114
115#[wasm_bindgen]
116pub fn fillet_edges_json(request_json: &str) -> Result<String, JsValue> {
117    let request: FilletEdgesRequest =
118        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
119    let solid = fillet_edges(
120        &request.solid,
121        &request.edge_points,
122        None,
123        request.radius,
124        request.chamfer,
125        request.name.as_deref(),
126    )
127    .map_err(javascript_error)?;
128    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
129}
130
131#[wasm_bindgen]
132pub fn fillet_edges_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
133    let request: FilletEdgesRequest =
134        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
135    let solid = fillet_edges(
136        &request.solid,
137        &request.edge_points,
138        None,
139        request.radius,
140        request.chamfer,
141        request.name.as_deref(),
142    )
143    .map_err(javascript_error)?;
144    solid_buffer(&solid, "{}".into())
145}
146
147#[derive(serde::Deserialize)]
148pub(crate) struct FilletEdgesVariableRequest {
149    pub(crate) solid: BrepSolid,
150    pub(crate) edge_points: Vec<Vec3>,
151    /// (edge-fraction in [0,1], radius) stops applied along each edge.
152    pub(crate) radii: Vec<(f64, f64)>,
153    #[serde(default)]
154    pub(crate) chamfer: bool,
155    #[serde(default)]
156    pub(crate) name: Option<String>,
157}
158
159#[wasm_bindgen]
160pub fn fillet_edges_variable_json(request_json: &str) -> Result<String, JsValue> {
161    let request: FilletEdgesVariableRequest =
162        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
163    let solid = fillet_edges_variable(
164        &request.solid,
165        &request.edge_points,
166        None,
167        &request.radii,
168        request.chamfer,
169        request.name.as_deref(),
170    )
171    .map_err(javascript_error)?;
172    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
173}
174
175#[wasm_bindgen]
176pub fn fillet_edges_variable_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
177    let request: FilletEdgesVariableRequest =
178        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
179    let solid = fillet_edges_variable(
180        &request.solid,
181        &request.edge_points,
182        None,
183        &request.radii,
184        request.chamfer,
185        request.name.as_deref(),
186    )
187    .map_err(javascript_error)?;
188    solid_buffer(&solid, "{}".into())
189}
190
191#[derive(serde::Deserialize)]
192pub(crate) struct ChamferEdgesAsymmetricRequest {
193    pub(crate) solid: BrepSolid,
194    pub(crate) edge_points: Vec<Vec3>,
195    /// Setback along face 1 (into_first).
196    pub(crate) d1: f64,
197    /// Setback along face 2 (into_second).
198    pub(crate) d2: f64,
199    #[serde(default)]
200    pub(crate) name: Option<String>,
201}
202
203#[wasm_bindgen]
204pub fn chamfer_edges_asymmetric_json(request_json: &str) -> Result<String, JsValue> {
205    let request: ChamferEdgesAsymmetricRequest =
206        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
207    let solid = chamfer_edges_asymmetric(
208        &request.solid,
209        &request.edge_points,
210        None,
211        request.d1,
212        request.d2,
213        request.name.as_deref(),
214    )
215    .map_err(javascript_error)?;
216    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
217}
218
219#[wasm_bindgen]
220pub fn chamfer_edges_asymmetric_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
221    let request: ChamferEdgesAsymmetricRequest =
222        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
223    let solid = chamfer_edges_asymmetric(
224        &request.solid,
225        &request.edge_points,
226        None,
227        request.d1,
228        request.d2,
229        request.name.as_deref(),
230    )
231    .map_err(javascript_error)?;
232    solid_buffer(&solid, "{}".into())
233}
234
235#[derive(serde::Deserialize)]
236pub(crate) struct ChamferEdgesAngleRequest {
237    pub(crate) solid: BrepSolid,
238    pub(crate) edge_points: Vec<Vec3>,
239    /// Setback along face 1 (into_first).
240    pub(crate) d1: f64,
241    /// Angle (radians) between the chamfer face and face 1.
242    pub(crate) angle: f64,
243    #[serde(default)]
244    pub(crate) name: Option<String>,
245}
246
247#[wasm_bindgen]
248pub fn chamfer_edges_angle_json(request_json: &str) -> Result<String, JsValue> {
249    let request: ChamferEdgesAngleRequest =
250        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
251    let solid = chamfer_edges_angle(
252        &request.solid,
253        &request.edge_points,
254        None,
255        request.d1,
256        request.angle,
257        request.name.as_deref(),
258    )
259    .map_err(javascript_error)?;
260    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
261}
262
263#[wasm_bindgen]
264pub fn chamfer_edges_angle_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
265    let request: ChamferEdgesAngleRequest =
266        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
267    let solid = chamfer_edges_angle(
268        &request.solid,
269        &request.edge_points,
270        None,
271        request.d1,
272        request.angle,
273        request.name.as_deref(),
274    )
275    .map_err(javascript_error)?;
276    solid_buffer(&solid, "{}".into())
277}
278
279#[wasm_bindgen]
280pub fn round_convex_corner_json(request_json: &str) -> Result<String, JsValue> {
281    let request: CornerBlendRequest =
282        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
283    let solid = round_convex_corner(
284        &request.solid,
285        request.corner_point,
286        request.radius,
287        request.name.as_deref(),
288    )
289    .map_err(javascript_error)?;
290    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
291}
292
293#[wasm_bindgen]
294pub fn round_convex_corner_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
295    let request: CornerBlendRequest =
296        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
297    let solid = round_convex_corner(
298        &request.solid,
299        request.corner_point,
300        request.radius,
301        request.name.as_deref(),
302    )
303    .map_err(javascript_error)?;
304    solid_buffer(&solid, "{}".into())
305}
306
307#[wasm_bindgen]
308pub fn loft_brep_json(request_json: &str) -> Result<String, JsValue> {
309    let request: LoftBrepRequest =
310        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
311    let solid = loft_profile_brep(&request.sections).map_err(javascript_error)?;
312    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
313}
314
315#[wasm_bindgen]
316pub fn extrude_brep_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
317    let request: ExtrudeBrepRequest =
318        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
319    let solid = extrude_profile_brep(&request.profile, request.direction, request.distance)
320        .map_err(javascript_error)?;
321    solid_buffer(&solid, "{}".into())
322}
323
324#[wasm_bindgen]
325pub fn extrude_profile_brep_draft_json(request_json: &str) -> Result<String, JsValue> {
326    let request: ExtrudeDraftRequest =
327        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
328    let solid = extrude_profile_brep_draft(
329        &request.profile,
330        request.direction,
331        request.distance,
332        request.draft_angle,
333        request.name.as_deref(),
334    )
335    .map_err(javascript_error)?;
336    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
337}
338
339#[wasm_bindgen]
340pub fn extrude_profile_brep_draft_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
341    let request: ExtrudeDraftRequest =
342        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
343    let solid = extrude_profile_brep_draft(
344        &request.profile,
345        request.direction,
346        request.distance,
347        request.draft_angle,
348        request.name.as_deref(),
349    )
350    .map_err(javascript_error)?;
351    solid_buffer(&solid, "{}".into())
352}
353
354#[wasm_bindgen]
355pub fn rib_from_profile_json(request_json: &str) -> Result<String, JsValue> {
356    let request: RibRequest =
357        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
358    let solid = rib_from_profile(
359        &request.solid,
360        &request.profile,
361        request.thickness,
362        request.extrude_dir,
363        request.depth,
364        request.name.as_deref(),
365    )
366    .map_err(javascript_error)?;
367    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
368}
369
370#[wasm_bindgen]
371pub fn rib_from_profile_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
372    let request: RibRequest =
373        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
374    let solid = rib_from_profile(
375        &request.solid,
376        &request.profile,
377        request.thickness,
378        request.extrude_dir,
379        request.depth,
380        request.name.as_deref(),
381    )
382    .map_err(javascript_error)?;
383    solid_buffer(&solid, "{}".into())
384}
385
386#[wasm_bindgen]
387pub fn revolve_brep_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
388    let request: RevolveBrepRequest =
389        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
390    let solid = revolve_profile_brep_named(
391        &request.profile,
392        request.axis_point,
393        request.axis_direction,
394        request.angle,
395        &request.side_names,
396        &request.cap_names,
397    )
398    .map_err(javascript_error)?;
399    solid_buffer(&solid, "{}".into())
400}
401
402#[wasm_bindgen]
403pub fn loft_brep_buffer(request_json: &str) -> Result<WasmSolidBuffer, JsValue> {
404    let request: LoftBrepRequest =
405        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
406    let solid = loft_profile_brep(&request.sections).map_err(javascript_error)?;
407    solid_buffer(&solid, "{}".into())
408}
409
410#[wasm_bindgen]
411pub fn loft_profile_brep_guided_json(request_json: &str) -> Result<String, JsValue> {
412    let request: GuidedLoftRequest =
413        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
414    let solid = guided_loft_dispatch(&request).map_err(javascript_error)?;
415    serde_json::to_string(&solid).map_err(|error| javascript_error(error.to_string()))
416}