OpenLexocad  28.0
NurbsOptions.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <Topo/Types.h>
4 #include <Geom/Dir.h>
5 
6 namespace Topo
7 {
8 // SB - Acis options about skinning are a little bit "unclear". There are different methods to skin wires, but not all methods accept all parameters,
9 // that's why I'm trying to make different classes, each one that fits only a particular method, with only the parameters that are taken into account.
10 class LX_TOPO_EXPORT NurbsOptions
11 {
12 protected:
13  NurbsOptions() = default;
14  virtual ~NurbsOptions() = default;
15 };
16 
17 /*
18  * Topo::SkinningOptions
19  */
20 class LX_TOPO_EXPORT SkinningOptions : public NurbsOptions
21 {
22 public:
24  ~SkinningOptions() override = default;
25 
26  void setWiresU(const std::vector<pConstShape>& in);
27  void setWiresU(const std::vector<pConstWire>& in);
28  std::vector<pConstWire> getWiresU() const;
29 
30  enum class ClosedMode
31  {
32  Open = 0,
33  Closed = 1,
34  Loop = 2,
35  Solid = 3
36  };
37 
38  void setClosedMode(const ClosedMode& mode);
40 
41  void setFlatShapes(bool force);
42 
43  void setSolid(bool solid);
44  bool getSolid() const;
45 
46  void setUniformUV(bool uniform);
47  bool getArcLen() const;
48  bool getArcLenU() const;
49  bool getMerge() const;
50 
51  // These values are intentionally "readonly", since it is not clear when it would be useful to alter them.
52  bool getAllowUV() const;
53  bool getSelfIntersect() const;
54  bool getSimplify() const;
55 
56 protected:
57 
58  bool _allowSameUv = true; // SB 2011.12.16 - Very special case! http://doc.spatial.com/index.php/Skinning_and_Lofting_Options/Surface_Checks#allow_same_uv_.28false.29
59  bool _arcLength = true; // SB 2013.05.07 - http://doc.spatial.com/index.php/Skinning_and_Lofting_Options/Surface_Parameterization
60  bool _arcLengthU = true;
61  ClosedMode _closedMode = ClosedMode::Open;
62  bool _forceFlatShapes = false;
63  bool _mergeWireCoEdges = true;
64  bool _selfIntTest = false; // SB 2012.06.05 - When FALSE allow creation of self-intersecting surfaces: http://doc.spatial.com/index.php/Skinning_and_Lofting_Options/Surface_Checks#self_int_test_.281.29
65  // No exception is thrown, NURBS is created (probably rubbish) and "selfIntersect" property can be detected later.
66  bool _simplify = false; // SB 2012.06.14 - Leave to FALSE or ACIS will try to build a simpler surface (if possible). For example, if set to TRUE and the
67  // surface is exactly a cylinder, ACIS will not make a NURBS but a cylinder and the "api_accurate_bs3_approximation" won't work! See
68  // http://doc.spatial.com/index.php/Skinning_and_Lofting_Options/Simplification
69 
70  std::vector<pConstWire> _uWires = {};
71 
72  void setWires(std::vector<pConstWire>& u_or_vWires, const std::vector<pConstShape>& in);
73 };
74 
75 /*
76  * Topo::BasicSkinningOptions
77  */
78 class LX_TOPO_EXPORT BasicSkinningOptions final : public SkinningOptions
79 {
80 public:
82  ~BasicSkinningOptions() override = default;
83 };
84 
85 /*
86  * Topo::DraftSkinningOptions
87  */
88 class LX_TOPO_EXPORT DraftSkinningOptions final : public SkinningOptions
89 {
90 public:
92  ~DraftSkinningOptions() override = default;
93 
94  enum class GapMode
95  {
96  Extended = 0,
97  Rounded = 1,
98  Chamfered = 2
99  }; // SB - Pls match values in "skin_opts.hxx" => skin_gap_type
100 
101  void setGapMode(GapMode mode);
103 
104  double endAngle = 0.;
105  double endMagnitude = 0.;
106  double startAngle = 0.;
107  double startMagnitude = 0.;
108 
109 protected:
110  GapMode _gapMode = GapMode::Extended;
111 };
112 
113 /*
114  * Topo::GuideSkinningOptions
115  */
116 class LX_TOPO_EXPORT GuideSkinningOptions final : public SkinningOptions
117 {
118 public:
120  ~GuideSkinningOptions() override = default;
121 
122  void setWiresV(const std::vector<pConstShape>& in);
123  void setWiresV(std::vector<pConstWire> in);
124  std::vector<pConstWire> getWiresV() const;
125 
126  void setVirtualGuides(const bool& virtualGuides);
127  bool getVirtualGuides() const;
128 
129 protected:
130  bool _virtualGuides = false; // SB 2012.05.07 - http://doc.spatial.com/index.php/Skinning_and_Lofting_Options/Guide-related
131 
132  std::vector<pConstWire> _vWires = {};
133 };
134 
135 /*
136  * Topo::LinearSkinningOptions
137  */
138 class LX_TOPO_EXPORT LinearSkinningOptions final : public SkinningOptions
139 {
140 public:
142  ~LinearSkinningOptions() override = default;
143 };
144 
145 /*
146  * Topo::PathSkinningOptions
147  */
148 class LX_TOPO_EXPORT PathSkinningOptions final : public SkinningOptions
149 {
150 public:
152  ~PathSkinningOptions() override = default;
153 
154  void setPath(pConstWire in);
156 
157 protected:
158  pConstWire _path = nullptr;
159 };
160 
161 /*
162  * Topo::PlanarSkinningOptions
163  */
164 class LX_TOPO_EXPORT PlanarSkinningOptions final : public SkinningOptions
165 {
166 public:
168  ~PlanarSkinningOptions() override = default;
169 
170  enum class NormalsMode
171  {
172  First = 0,
173  Last = 1,
174  Ends = 2,
175  All = 3
176  }; // SB - Pls match values in "skin_opts.hxx" => skinning_normals
177 
180 
181 protected:
182  NormalsMode _normalsMode = NormalsMode::All;
183 };
184 
185 /*
186  * Topo::SweepingOptions
187  */
188 class LX_TOPO_EXPORT SweepingOptions : public NurbsOptions
189 {
190 public:
192  ~SweepingOptions() override = default;
193 
198 
199  void setToShape(pConstShape shape);
201 
202  void setSolid(const bool& solid);
203  bool getSolid() const;
204 
205  void setSelfIntersect(const bool& allowSelfIntersect);
206  bool getSelfIntersect() const;
207 
208  // This value is intentionally "readonly", since it is not clear when it would be useful to alter them.
209  bool getSimplify() const;
210 
211 protected:
212  bool _selfIntTest = false; // SB 2012.06.05 - When FALSE allow creation of self-intersecting surfaces:
213  // http://doc.spatial.com/index.php/Skinning_and_Lofting_Options/Surface_Checks#self_int_test_.281.29. No exception is
214  // thrown, NURBS is created (probably rubbish) and "selfIntersect" property can be detected later.
215  bool _simplify =
216  false; // SB 2012.06.14 - Leave to FALSE or ACIS will try to build a simpler surface (if possible). For example, if set to TRUE and the
217  // surface is exactly a cylinder, ACIS will not make a NURBS but a cylinder and the "api_accurate_bs3_approximation" won't work! See
218  // http://doc.spatial.com/index.php/Skinning_and_Lofting_Options/Simplification
219  bool _solid = false;
220 
221  pConstShape _uShape = nullptr;
222  pConstShape _toShape = nullptr;
223 };
224 
225 /*
226  * Topo::PathSweepingOptions
227  */
228 class LX_TOPO_EXPORT PathSweepingOptions final : public SweepingOptions
229 {
230 public:
232  ~PathSweepingOptions() override = default;
233 
237 
238  void setFinalTwistAngle(double angleInDeg);
239  double getFinalTwistAngle() const;
240 
241  void setRigid(bool rigid);
242  bool getRigid() const;
243 
244  void setUseRail(bool rail, const Geom::Dir& railDir = Geom::Dir::ZDir());
245  bool getUseRail(Geom::Dir& railDir) const;
246 
247 protected:
248  bool _approximatePath = true;
249  double _finalTwistAngle = 0.;
250  bool _rail = false;
252  bool _rigid = false;
253 
254  pConstShape _vShape = nullptr;
255 };
256 }
Topo::SweepingOptions::getSolid
bool getSolid() const
Topo::PathSkinningOptions
Definition: NurbsOptions.h:149
Topo::DraftSkinningOptions::GapMode
GapMode
Definition: NurbsOptions.h:95
Topo::PathSweepingOptions::getRigid
bool getRigid() const
Topo::DraftSkinningOptions::setGapMode
void setGapMode(GapMode mode)
Topo::BasicSkinningOptions::~BasicSkinningOptions
~BasicSkinningOptions() override=default
Topo::SkinningOptions::getSelfIntersect
bool getSelfIntersect() const
Topo::SweepingOptions::setShapeU
void setShapeU(pConstWire in)
Topo::GuideSkinningOptions::~GuideSkinningOptions
~GuideSkinningOptions() override=default
Topo::SkinningOptions::setSolid
void setSolid(bool solid)
Topo::GuideSkinningOptions::setWiresV
void setWiresV(std::vector< pConstWire > in)
Topo::PlanarSkinningOptions
Definition: NurbsOptions.h:165
Topo::SweepingOptions::setSolid
void setSolid(const bool &solid)
Topo::LinearSkinningOptions::LinearSkinningOptions
LinearSkinningOptions()
Topo::SweepingOptions::setSelfIntersect
void setSelfIntersect(const bool &allowSelfIntersect)
Topo::PathSweepingOptions::getShapeV
pConstShape getShapeV() const
Topo::Solid
Definition: Shape.h:284
Topo::SkinningOptions::getSimplify
bool getSimplify() const
Topo::PathSweepingOptions::getFinalTwistAngle
double getFinalTwistAngle() const
Topo::GuideSkinningOptions::setVirtualGuides
void setVirtualGuides(const bool &virtualGuides)
pConstWire
std::shared_ptr< Topo::Wire const > pConstWire
Definition: Types.h:71
Topo::SkinningOptions::getAllowUV
bool getAllowUV() const
Topo::BasicSkinningOptions
Definition: NurbsOptions.h:79
Topo::SkinningOptions
Definition: NurbsOptions.h:21
pConstShape
std::shared_ptr< Topo::Shape const > pConstShape
Definition: Variant.h:65
Topo::NurbsOptions::NurbsOptions
NurbsOptions()=default
Geom::Dir
Definition: Dir.h:45
Topo::SkinningOptions::setUniformUV
void setUniformUV(bool uniform)
Topo::PathSweepingOptions::setRigid
void setRigid(bool rigid)
Topo::LinearSkinningOptions::~LinearSkinningOptions
~LinearSkinningOptions() override=default
Topo::SweepingOptions::~SweepingOptions
~SweepingOptions() override=default
Topo::SkinningOptions::setClosedMode
void setClosedMode(const ClosedMode &mode)
Topo::SkinningOptions::setWires
void setWires(std::vector< pConstWire > &u_or_vWires, const std::vector< pConstShape > &in)
Topo::PathSweepingOptions::~PathSweepingOptions
~PathSweepingOptions() override=default
Topo::GuideSkinningOptions
Definition: NurbsOptions.h:117
Topo::NurbsOptions
Definition: NurbsOptions.h:11
Topo::SkinningOptions::setFlatShapes
void setFlatShapes(bool force)
pConstFace
std::shared_ptr< Topo::Face const > pConstFace
Definition: Types.h:70
Topo::PlanarSkinningOptions::PlanarSkinningOptions
PlanarSkinningOptions()
Topo::SkinningOptions::setWiresU
void setWiresU(const std::vector< pConstShape > &in)
Topo::SkinningOptions::ClosedMode
ClosedMode
Definition: NurbsOptions.h:31
Topo::GuideSkinningOptions::getVirtualGuides
bool getVirtualGuides() const
Topo::SweepingOptions::SweepingOptions
SweepingOptions()
Topo::NurbsOptions::~NurbsOptions
virtual ~NurbsOptions()=default
Topo::SweepingOptions
Definition: NurbsOptions.h:189
Topo::PlanarSkinningOptions::~PlanarSkinningOptions
~PlanarSkinningOptions() override=default
Topo::PlanarSkinningOptions::NormalsMode
NormalsMode
Definition: NurbsOptions.h:171
Topo::LinearSkinningOptions
Definition: NurbsOptions.h:139
Topo::PathSweepingOptions::setShapeV
void setShapeV(pConstShape in)
Geom::Dir::ZDir
static Dir ZDir()
Definition: Dir.h:76
Topo::SkinningOptions::getSolid
bool getSolid() const
Topo::PlanarSkinningOptions::getNormalsMode
NormalsMode getNormalsMode() const
Topo::DraftSkinningOptions
Definition: NurbsOptions.h:89
Topo::SkinningOptions::getMerge
bool getMerge() const
Topo::PathSweepingOptions
Definition: NurbsOptions.h:229
Topo
Definition: DbgInfo.h:17
Types.h
Topo::SkinningOptions::getArcLen
bool getArcLen() const
Topo::SkinningOptions::~SkinningOptions
~SkinningOptions() override=default
Topo::SkinningOptions::SkinningOptions
SkinningOptions()
Topo::PathSkinningOptions::PathSkinningOptions
PathSkinningOptions()
Topo::SkinningOptions::setWiresU
void setWiresU(const std::vector< pConstWire > &in)
Topo::GuideSkinningOptions::getWiresV
std::vector< pConstWire > getWiresV() const
Topo::SkinningOptions::getClosedMode
ClosedMode getClosedMode() const
Topo::PlanarSkinningOptions::setNormalsMode
void setNormalsMode(NormalsMode mode)
Topo::GuideSkinningOptions::setWiresV
void setWiresV(const std::vector< pConstShape > &in)
Topo::SweepingOptions::getSimplify
bool getSimplify() const
Topo::DraftSkinningOptions::DraftSkinningOptions
DraftSkinningOptions()
Topo::PathSkinningOptions::~PathSkinningOptions
~PathSkinningOptions() override=default
Topo::DraftSkinningOptions::getGapMode
GapMode getGapMode() const
Topo::PathSweepingOptions::setFinalTwistAngle
void setFinalTwistAngle(double angleInDeg)
Topo::SweepingOptions::setShapeU
void setShapeU(pConstFace in)
Topo::SweepingOptions::getShapeU
pConstShape getShapeU() const
Topo::SkinningOptions::getArcLenU
bool getArcLenU() const
Topo::PathSkinningOptions::getPath
pConstWire getPath() const
Topo::PathSweepingOptions::setShapeV
void setShapeV(pConstWire in)
Topo::SweepingOptions::getSelfIntersect
bool getSelfIntersect() const
Dir.h
Topo::DraftSkinningOptions::~DraftSkinningOptions
~DraftSkinningOptions() override=default
Topo::PathSweepingOptions::setUseRail
void setUseRail(bool rail, const Geom::Dir &railDir=Geom::Dir::ZDir())
Topo::SweepingOptions::getToShape
pConstShape getToShape() const
Topo::GuideSkinningOptions::GuideSkinningOptions
GuideSkinningOptions()
Topo::BasicSkinningOptions::BasicSkinningOptions
BasicSkinningOptions()
Topo::PathSweepingOptions::PathSweepingOptions
PathSweepingOptions()
Topo::SkinningOptions::getWiresU
std::vector< pConstWire > getWiresU() const
Topo::PathSweepingOptions::getUseRail
bool getUseRail(Geom::Dir &railDir) const
Topo::PathSkinningOptions::setPath
void setPath(pConstWire in)
Topo::SweepingOptions::setShapeU
void setShapeU(pConstShape in)
Topo::SweepingOptions::setToShape
void setToShape(pConstShape shape)