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