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