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_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}