Skip to main content

brep_kernel/abi/
geometry.rs

1use super::*;
2
3#[derive(Deserialize)]
4pub(crate) struct CurveEvaluationRequest {
5    pub(crate) curve: NurbsCurve,
6    pub(crate) parameters: Vec<f64>,
7}
8
9#[derive(Deserialize)]
10pub(crate) struct CurveDerivativeRequest {
11    pub(crate) curve: NurbsCurve,
12    pub(crate) parameter: f64,
13    pub(crate) derivative_count: usize,
14}
15
16#[derive(Deserialize)]
17pub(crate) struct CurveProjectionRequest {
18    pub(crate) curve: NurbsCurve,
19    pub(crate) point: Vec3,
20}
21
22#[derive(Deserialize)]
23pub(crate) struct SurfaceProjectionRequest {
24    pub(crate) surface: NurbsSurface,
25    pub(crate) point: Vec3,
26}
27
28#[derive(Deserialize)]
29pub(crate) struct CurveSurfaceIntersectionRequest {
30    pub(crate) curve: NurbsCurve,
31    pub(crate) surface: NurbsSurface,
32    #[serde(default = "default_intersection_tolerance")]
33    pub(crate) tolerance: f64,
34}
35
36#[derive(Deserialize)]
37pub(crate) struct CurveCurveIntersectionRequest {
38    pub(crate) first: NurbsCurve,
39    pub(crate) second: NurbsCurve,
40    #[serde(default = "default_intersection_tolerance")]
41    pub(crate) tolerance: f64,
42}
43
44#[derive(Deserialize)]
45pub(crate) struct SurfaceSurfaceIntersectionRequest {
46    pub(crate) first: NurbsSurface,
47    pub(crate) second: NurbsSurface,
48    #[serde(default)]
49    pub(crate) options: SurfaceIntersectionOptions,
50}
51
52pub(crate) fn default_intersection_tolerance() -> f64 {
53    1e-7
54}
55
56#[derive(Deserialize)]
57pub(crate) struct LineRequest {
58    pub(crate) start: Vec3,
59    pub(crate) end: Vec3,
60}
61
62#[derive(Deserialize)]
63pub(crate) struct ArcRequest {
64    pub(crate) center: Vec3,
65    pub(crate) x_axis: Vec3,
66    pub(crate) y_axis: Vec3,
67    pub(crate) radius: f64,
68    pub(crate) start_angle: f64,
69    pub(crate) end_angle: f64,
70}
71
72#[derive(Deserialize)]
73pub(crate) struct CircleRequest {
74    pub(crate) center: Vec3,
75    pub(crate) normal: Vec3,
76    pub(crate) radius: f64,
77}
78
79#[derive(Deserialize)]
80pub(crate) struct ParabolaRequest {
81    pub(crate) vertex: Vec3,
82    pub(crate) axis: Vec3,
83    pub(crate) latus_direction: Vec3,
84    pub(crate) focal: f64,
85    pub(crate) t0: f64,
86    pub(crate) t1: f64,
87}
88
89#[derive(Deserialize)]
90pub(crate) struct HyperbolaRequest {
91    pub(crate) center: Vec3,
92    pub(crate) major_axis: Vec3,
93    pub(crate) minor_axis: Vec3,
94    pub(crate) a: f64,
95    pub(crate) b: f64,
96    pub(crate) t0: f64,
97    pub(crate) t1: f64,
98}
99
100#[derive(Deserialize)]
101pub(crate) struct BandedSolveRequest {
102    pub(crate) matrix: Vec<Vec<f64>>,
103    pub(crate) rhs: Vec<f64>,
104    pub(crate) bandwidth: usize,
105}
106
107#[derive(Deserialize)]
108pub(crate) struct DenseSolveRequest {
109    pub(crate) matrix: Vec<Vec<f64>>,
110    pub(crate) rhs: Vec<f64>,
111}
112
113#[derive(Deserialize)]
114pub(crate) struct SegmentIntersectionRequest {
115    pub(crate) a1: Vec2,
116    pub(crate) b1: Vec2,
117    pub(crate) a2: Vec2,
118    pub(crate) b2: Vec2,
119    pub(crate) tolerance: f64,
120}
121
122#[derive(Deserialize)]
123pub(crate) struct PointInPolygonRequest {
124    pub(crate) point: Vec2,
125    pub(crate) polygon: Vec<Vec2>,
126    pub(crate) tolerance: f64,
127}
128
129#[derive(Deserialize)]
130pub(crate) struct ParameterPointInFaceRequest {
131    pub(crate) face: FaceRecord,
132    pub(crate) point: Vec2,
133    pub(crate) tolerance: f64,
134}
135
136#[derive(Deserialize)]
137pub(crate) struct ThinnedCurveRequest {
138    pub(crate) points: Vec<Vec3>,
139    #[serde(default = "default_curve_fit_degree")]
140    pub(crate) degree: usize,
141    #[serde(default = "default_curve_fit_maximum_points")]
142    pub(crate) maximum_points: usize,
143}
144
145pub(crate) fn default_curve_fit_degree() -> usize {
146    3
147}
148
149pub(crate) fn default_curve_fit_maximum_points() -> usize {
150    200
151}
152
153/// A typed refusal crossing the wasm ABI: the flattened refusal object
154/// (`{"class":…,…,"stage":…,"message":…}`) as the error's text, so a JS
155/// consumer can dispatch on the class and still show the message.
156pub(crate) fn javascript_refusal(refusal: crate::KernelRefusal) -> JsValue {
157    let text = serde_json::to_string(&refusal).unwrap_or_else(|_| refusal.message.clone());
158    javascript_error(text)
159}
160
161pub(crate) fn javascript_error(error: String) -> JsValue {
162    JsValue::from_str(&error)
163}
164
165#[wasm_bindgen]
166pub fn curve_evaluate_json(request_json: &str) -> Result<String, JsValue> {
167    let request: CurveEvaluationRequest =
168        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
169    let curve = NurbsCurve::new(
170        request.curve.degree,
171        request.curve.knots,
172        request.curve.control_points,
173    )
174    .map_err(javascript_error)?;
175    let points: Result<Vec<Vec3>, String> = request
176        .parameters
177        .into_iter()
178        .map(|parameter| curve.evaluate(parameter))
179        .collect();
180    serde_json::to_string(&points.map_err(javascript_error)?)
181        .map_err(|error| javascript_error(error.to_string()))
182}
183
184#[wasm_bindgen]
185pub fn project_curve_json(request_json: &str) -> Result<String, JsValue> {
186    let request: CurveProjectionRequest =
187        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
188    let projection =
189        project_point_to_curve(&request.curve, request.point).map_err(javascript_error)?;
190    serde_json::to_string(&projection).map_err(|error| javascript_error(error.to_string()))
191}
192
193#[wasm_bindgen]
194pub fn project_surface_json(request_json: &str) -> Result<String, JsValue> {
195    let request: SurfaceProjectionRequest =
196        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
197    let projection =
198        project_point_to_surface(&request.surface, request.point).map_err(javascript_error)?;
199    serde_json::to_string(&projection).map_err(|error| javascript_error(error.to_string()))
200}
201
202#[wasm_bindgen]
203pub fn intersect_curve_surface_json(request_json: &str) -> Result<String, JsValue> {
204    let request: CurveSurfaceIntersectionRequest =
205        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
206    let intersections =
207        intersect_curve_surface(&request.curve, &request.surface, request.tolerance)
208            .map_err(javascript_error)?;
209    serde_json::to_string(&intersections).map_err(|error| javascript_error(error.to_string()))
210}
211
212#[wasm_bindgen]
213pub fn intersect_curves_json(request_json: &str) -> Result<String, JsValue> {
214    let request: CurveCurveIntersectionRequest =
215        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
216    let intersections = intersect_curves(&request.first, &request.second, request.tolerance)
217        .map_err(javascript_error)?;
218    serde_json::to_string(&intersections).map_err(|error| javascript_error(error.to_string()))
219}
220
221#[wasm_bindgen]
222pub fn intersect_surfaces_json(request_json: &str) -> Result<String, JsValue> {
223    let request: SurfaceSurfaceIntersectionRequest =
224        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
225    let intersections = intersect_surfaces(&request.first, &request.second, &request.options)
226        .map_err(javascript_error)?;
227    serde_json::to_string(&intersections).map_err(|error| javascript_error(error.to_string()))
228}
229
230#[wasm_bindgen]
231pub fn curve_derivatives_json(request_json: &str) -> Result<String, JsValue> {
232    let request: CurveDerivativeRequest =
233        serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
234    let curve = NurbsCurve::new(
235        request.curve.degree,
236        request.curve.knots,
237        request.curve.control_points,
238    )
239    .map_err(javascript_error)?;
240    serde_json::to_string(
241        &curve
242            .derivatives(request.parameter, request.derivative_count)
243            .map_err(javascript_error)?,
244    )
245    .map_err(|error| javascript_error(error.to_string()))
246}