1use axiolid_core::{Aabb, Frame2, Frame3, Point2, Point3, Scalar, Transform3, Vec2, Vec3};
4use axiolid_curve::{Curve2, Curve3};
5use axiolid_mesh::{PolygonMesh, TriMesh};
6use axiolid_primitive::{HalfSpace, Primitive};
7use axiolid_profile::Profile;
8use axiolid_surface::Surface;
9use axiolid_topology::BRep;
10
11use crate::{
12 CurveRelation, CurveStation, InstanceAtStation, NodeId, OrientedCurveStation, SolidOperation,
13 SurfaceRelation,
14};
15
16#[derive(Debug, Clone, Copy, PartialEq)]
18#[cfg_attr(
19 feature = "serde",
20 derive(serde::Serialize, serde::Deserialize),
21 serde(deny_unknown_fields)
22)]
23pub struct PointOnCurve {
24 pub curve: NodeId,
26 pub parameter: Scalar,
28}
29
30#[derive(Debug, Clone, Copy, PartialEq)]
32#[cfg_attr(
33 feature = "serde",
34 derive(serde::Serialize, serde::Deserialize),
35 serde(deny_unknown_fields)
36)]
37pub struct PointOnSurface {
38 pub surface: NodeId,
40 pub u: Scalar,
42 pub v: Scalar,
44}
45
46#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
56#[cfg_attr(
57 feature = "serde",
58 derive(serde::Serialize, serde::Deserialize),
59 serde(deny_unknown_fields)
60)]
61pub struct OpenProfile {
62 pub path: NodeId,
64}
65
66impl OpenProfile {
67 pub const fn new(path: NodeId) -> Self {
69 Self { path }
70 }
71}
72
73#[derive(Debug, Clone, Copy, PartialEq)]
75#[cfg_attr(
76 feature = "serde",
77 derive(serde::Serialize, serde::Deserialize),
78 serde(deny_unknown_fields)
79)]
80pub struct Instance {
81 pub source: NodeId,
83 pub transform: Transform3,
85}
86
87#[non_exhaustive]
93#[derive(Debug, Clone, PartialEq)]
94#[cfg_attr(
95 feature = "serde",
96 derive(serde::Serialize, serde::Deserialize),
97 serde(deny_unknown_fields)
98)]
99pub enum GeometryNode {
100 Point2(Point2),
102 Point3(Point3),
104 Vector2(Vec2),
106 Vector3(Vec3),
108 Frame2(Frame2),
110 Frame3(Frame3),
112 Transform(Transform3),
114 PointList2(Vec<Point2>),
116 PointList3(Vec<Point3>),
118 Curve2(Curve2),
120 Curve3(Curve3),
122 CurveRelation(CurveRelation),
124 PointOnCurve(PointOnCurve),
126 Surface(Surface),
128 SurfaceRelation(SurfaceRelation),
130 PointOnSurface(PointOnSurface),
132 Profile(Profile),
134 OpenProfile(OpenProfile),
136 Primitive(Primitive),
138 HalfSpace(HalfSpace),
140 SolidOperation(SolidOperation),
142 BRep(BRep<NodeId>),
144 PolygonMesh(PolygonMesh),
146 TriMesh(TriMesh),
148 BoundingBox(Aabb),
150 Instance(Instance),
152 Collection(Vec<NodeId>),
154 CurveStation(CurveStation),
157 OrientedCurveStation(OrientedCurveStation),
160 InstanceAtStation(InstanceAtStation),
164}
165
166impl GeometryNode {
167 pub fn references(&self) -> Vec<NodeId> {
169 let mut references = Vec::new();
170 match self {
171 Self::CurveRelation(value) => value.references(&mut references),
172 Self::PointOnCurve(value) => references.push(value.curve),
173 Self::SurfaceRelation(value) => value.references(&mut references),
174 Self::PointOnSurface(value) => references.push(value.surface),
175 Self::OpenProfile(value) => references.push(value.path),
176 Self::SolidOperation(value) => value.references(&mut references),
177 Self::BRep(value) => {
178 references.extend(value.edges().iter().filter_map(|edge| edge.curve));
179 references.extend(
182 value
183 .loops()
184 .iter()
185 .flat_map(|wire| wire.edges.iter())
186 .filter_map(|use_| use_.pcurve),
187 );
188 references.extend(value.faces().iter().filter_map(|face| face.surface));
189 }
190 Self::Instance(value) => references.push(value.source),
191 Self::Collection(values) => references.extend(values.iter().copied()),
192 Self::CurveStation(value) => references.push(value.basis),
193 Self::OrientedCurveStation(value) => references.push(value.station.basis),
194 Self::InstanceAtStation(value) => {
195 references.extend([value.source, value.station.station.basis]);
196 }
197 Self::Point2(_)
198 | Self::Point3(_)
199 | Self::Vector2(_)
200 | Self::Vector3(_)
201 | Self::Frame2(_)
202 | Self::Frame3(_)
203 | Self::Transform(_)
204 | Self::PointList2(_)
205 | Self::PointList3(_)
206 | Self::Curve2(_)
207 | Self::Curve3(_)
208 | Self::Surface(_)
209 | Self::Profile(_)
210 | Self::Primitive(_)
211 | Self::HalfSpace(_)
212 | Self::PolygonMesh(_)
213 | Self::TriMesh(_)
214 | Self::BoundingBox(_) => {}
215 }
216 references
217 }
218}