brep_kernel/abi/
geometry.rs1use 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
153pub(crate) fn javascript_error(error: String) -> JsValue {
154 JsValue::from_str(&error)
155}
156
157#[wasm_bindgen]
158pub fn curve_evaluate_json(request_json: &str) -> Result<String, JsValue> {
159 let request: CurveEvaluationRequest =
160 serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
161 let curve = NurbsCurve::new(
162 request.curve.degree,
163 request.curve.knots,
164 request.curve.control_points,
165 )
166 .map_err(javascript_error)?;
167 let points: Result<Vec<Vec3>, String> = request
168 .parameters
169 .into_iter()
170 .map(|parameter| curve.evaluate(parameter))
171 .collect();
172 serde_json::to_string(&points.map_err(javascript_error)?)
173 .map_err(|error| javascript_error(error.to_string()))
174}
175
176#[wasm_bindgen]
177pub fn project_curve_json(request_json: &str) -> Result<String, JsValue> {
178 let request: CurveProjectionRequest =
179 serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
180 let projection =
181 project_point_to_curve(&request.curve, request.point).map_err(javascript_error)?;
182 serde_json::to_string(&projection).map_err(|error| javascript_error(error.to_string()))
183}
184
185#[wasm_bindgen]
186pub fn project_surface_json(request_json: &str) -> Result<String, JsValue> {
187 let request: SurfaceProjectionRequest =
188 serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
189 let projection =
190 project_point_to_surface(&request.surface, request.point).map_err(javascript_error)?;
191 serde_json::to_string(&projection).map_err(|error| javascript_error(error.to_string()))
192}
193
194#[wasm_bindgen]
195pub fn intersect_curve_surface_json(request_json: &str) -> Result<String, JsValue> {
196 let request: CurveSurfaceIntersectionRequest =
197 serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
198 let intersections =
199 intersect_curve_surface(&request.curve, &request.surface, request.tolerance)
200 .map_err(javascript_error)?;
201 serde_json::to_string(&intersections).map_err(|error| javascript_error(error.to_string()))
202}
203
204#[wasm_bindgen]
205pub fn intersect_curves_json(request_json: &str) -> Result<String, JsValue> {
206 let request: CurveCurveIntersectionRequest =
207 serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
208 let intersections = intersect_curves(&request.first, &request.second, request.tolerance)
209 .map_err(javascript_error)?;
210 serde_json::to_string(&intersections).map_err(|error| javascript_error(error.to_string()))
211}
212
213#[wasm_bindgen]
214pub fn intersect_surfaces_json(request_json: &str) -> Result<String, JsValue> {
215 let request: SurfaceSurfaceIntersectionRequest =
216 serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
217 let intersections = intersect_surfaces(&request.first, &request.second, &request.options)
218 .map_err(javascript_error)?;
219 serde_json::to_string(&intersections).map_err(|error| javascript_error(error.to_string()))
220}
221
222#[wasm_bindgen]
223pub fn curve_derivatives_json(request_json: &str) -> Result<String, JsValue> {
224 let request: CurveDerivativeRequest =
225 serde_json::from_str(request_json).map_err(|error| javascript_error(error.to_string()))?;
226 let curve = NurbsCurve::new(
227 request.curve.degree,
228 request.curve.knots,
229 request.curve.control_points,
230 )
231 .map_err(javascript_error)?;
232 serde_json::to_string(
233 &curve
234 .derivatives(request.parameter, request.derivative_count)
235 .map_err(javascript_error)?,
236 )
237 .map_err(|error| javascript_error(error.to_string()))
238}