OpenLexocad  27.1
Geometry2d.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (c) 2016 Werner Mayer <wmayer[at]users.sourceforge.net> *
3  * *
4  * This file is part of the FreeCAD CAx development system. *
5  * *
6  * This library is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU Library General Public *
8  * License as published by the Free Software Foundation; either *
9  * version 2 of the License, or (at your option) any later version. *
10  * *
11  * This library is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU Library General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU Library General Public *
17  * License along with this library; see the file COPYING.LIB. If not, *
18  * write to the Free Software Foundation, Inc., 59 Temple Place, *
19  * Suite 330, Boston, MA 02111-1307, USA *
20  * *
21  ***************************************************************************/
22 
23 
24 #ifndef PART_GEOMETRY2D_H
25 #define PART_GEOMETRY2D_H
26 
27 #include <Geom2d_CartesianPoint.hxx>
28 #include <Geom2d_BezierCurve.hxx>
29 #include <Geom2d_BSplineCurve.hxx>
30 #include <Geom2d_Circle.hxx>
31 #include <Geom2d_Ellipse.hxx>
32 #include <Geom2d_Hyperbola.hxx>
33 #include <Geom2d_Parabola.hxx>
34 #include <Geom2d_Line.hxx>
35 #include <Geom2d_OffsetCurve.hxx>
36 #include <Geom2d_TrimmedCurve.hxx>
37 #include <TopoDS_Shape.hxx>
38 #include <list>
39 #include <vector>
40 #include <memory>
41 #include <Base/Persistence.h>
42 #include <Base/Tools2D.h>
43 
44 class Adaptor2d_Curve2d;
45 
46 namespace Geom {
47 
48 class LX_GEOM_EXPORT Geometry2d : public Base::Persistence
49 {
51 public:
52  virtual ~Geometry2d();
53 
54  virtual TopoDS_Shape toShape() const = 0;
55  virtual const Handle(Geom2d_Geometry)& handle() const = 0;
56  // Persistence implementer ---------------------
57 
58  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
59  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
61  virtual Geometry2d *clone(void) const = 0;
62 
63 protected:
64  Geometry2d();
65 
66 private:
67  Geometry2d(const Geometry2d&);
68  Geometry2d& operator = (const Geometry2d&);
69 };
70 
71 class LX_GEOM_EXPORT Geom2dPoint : public Geometry2d
72 {
74 public:
75  Geom2dPoint();
76  Geom2dPoint(const Handle(Geom2d_CartesianPoint)&);
78  virtual ~Geom2dPoint();
79  virtual Geometry2d *clone(void) const;
80  virtual TopoDS_Shape toShape() const;
81 
82  // Persistence implementer ---------------------
83 
84  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
85  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
86  // Base implementer ----------------------------
87 
88 
89  const Handle(Geom2d_Geometry)& handle() const;
90 
91  Base::Vector2d getPoint(void)const;
92  void setPoint(const Base::Vector2d&);
93 
94 private:
95  Handle(Geom2d_CartesianPoint) myPoint;
96 };
97 
98 class LX_GEOM_EXPORT Geom2dCurve : public Geometry2d
99 {
101 public:
102  Geom2dCurve();
103  virtual ~Geom2dCurve();
104 
105  virtual TopoDS_Shape toShape() const;
106  bool tangent(double u, gp_Dir2d&) const;
107  Base::Vector2d pointAtParameter(double u) const;
108  Base::Vector2d firstDerivativeAtParameter(double u) const;
109  Base::Vector2d secondDerivativeAtParameter(double u) const;
110  bool normal(double u, gp_Dir2d& dir) const;
111  bool closestParameter(const Base::Vector2d& point, double &u) const;
112  bool closestParameterToBasicCurve(const Base::Vector2d& point, double &u) const;
113 };
114 
115 class LX_GEOM_EXPORT Geom2dBezierCurve : public Geom2dCurve
116 {
118 public:
120  Geom2dBezierCurve(const Handle(Geom2d_BezierCurve)&);
121  virtual ~Geom2dBezierCurve();
122  virtual Geometry2d *clone(void) const;
123 
124  // Persistence implementer ---------------------
125 
126  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
127  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
128  // Base implementer ----------------------------
129 
130 
131  void setHandle(const Handle(Geom2d_BezierCurve)&);
132  const Handle(Geom2d_Geometry)& handle() const;
133 
134 private:
135  Handle(Geom2d_BezierCurve) myCurve;
136 };
137 
138 class LX_GEOM_EXPORT Geom2dBSplineCurve : public Geom2dCurve
139 {
141 public:
143  Geom2dBSplineCurve(const Handle(Geom2d_BSplineCurve)&);
144  virtual ~Geom2dBSplineCurve();
145  virtual Geometry2d *clone(void) const;
146 
150  void interpolate(const std::vector<gp_Pnt2d>&, const std::vector<gp_Vec2d>&);
155  void getCardinalSplineTangents(const std::vector<gp_Pnt2d>&,
156  const std::vector<double>&,
157  std::vector<gp_Vec2d>&) const;
163  void getCardinalSplineTangents(const std::vector<gp_Pnt2d>&, double,
164  std::vector<gp_Vec2d>&) const;
165 
166  int countPoles() const;
167  void setPole(int index, const Base::Vector2d&, double weight=-1);
168  std::vector<Base::Vector2d> getPoles() const;
169  bool join(const Handle(Geom2d_BSplineCurve)&);
170  void makeC1Continuous(double);
171  std::list<Geometry2d*> toBiArcs(double tolerance) const;
172 
173  // Persistence implementer ---------------------
174 
175  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
176  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
177  // Base implementer ----------------------------
178 
179 
180  void setHandle(const Handle(Geom2d_BSplineCurve)&);
181  const Handle(Geom2d_Geometry)& handle() const;
182 
183 private:
184  void createArcs(double tolerance, std::list<Geometry2d*>& new_spans,
185  const gp_Pnt2d &p_start, const gp_Vec2d &v_start,
186  double t_start, double t_end, gp_Pnt2d &p_end, gp_Vec2d &v_end) const;
187  bool calculateBiArcPoints(const gp_Pnt2d& p0, gp_Vec2d v_start,
188  const gp_Pnt2d& p4, gp_Vec2d v_end,
189  gp_Pnt2d& p1, gp_Pnt2d& p2, gp_Pnt2d& p3) const;
190 private:
191  Handle(Geom2d_BSplineCurve) myCurve;
192 };
193 
194 class LX_GEOM_EXPORT Geom2dConic : public Geom2dCurve
195 {
197 protected:
198  Geom2dConic();
199 
200 public:
201  virtual ~Geom2dConic();
202  virtual Geometry2d *clone(void) const = 0;
203 
204  Base::Vector2d getLocation(void) const;
205  void setLocation(const Base::Vector2d& Center);
206  bool isReversed() const;
207  const Handle(Geom2d_Geometry)& handle() const = 0;
208 
209 protected:
210  void SaveAxis(Base::AbstractWriter& writer, const gp_Ax22d&) const;
211  void RestoreAxis(Base::AbstractXMLReader& reader, gp_Ax22d&);
212 };
213 
214 class LX_GEOM_EXPORT Geom2dArcOfConic : public Geom2dCurve
215 {
217 protected:
219 
220 public:
221  virtual ~Geom2dArcOfConic();
222  virtual Geometry2d *clone(void) const = 0;
223 
224  Base::Vector2d getLocation(void) const;
225  void setLocation(const Base::Vector2d& Center);
226  bool isReversed() const;
227 
228  Base::Vector2d getStartPoint() const;
229  Base::Vector2d getEndPoint() const;
230 
231  void getRange(double& u, double& v) const;
232  void setRange(double u, double v);
233  const Handle(Geom2d_Geometry)& handle() const = 0;
234 
235 protected:
236  void SaveAxis(Base::AbstractWriter& writer, const gp_Ax22d&, double u, double v) const;
237  void RestoreAxis(Base::AbstractXMLReader& reader, gp_Ax22d&, double& u, double& v);
238 };
239 
240 class LX_GEOM_EXPORT Geom2dCircle : public Geom2dConic
241 {
243 public:
244  Geom2dCircle();
245  Geom2dCircle(const Handle(Geom2d_Circle)&);
246  virtual ~Geom2dCircle();
247  virtual Geometry2d *clone(void) const;
248 
249  double getRadius(void) const;
250  void setRadius(double Radius);
251 
252  // Persistence implementer ---------------------
253 
254  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
255  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
256  // Base implementer ----------------------------
257 
258 
259  const Handle(Geom2d_Geometry)& handle() const;
260 
261 private:
262  Handle(Geom2d_Circle) myCurve;
263 };
264 
265 class LX_GEOM_EXPORT Geom2dArcOfCircle : public Geom2dArcOfConic
266 {
268 public:
270  Geom2dArcOfCircle(const Handle(Geom2d_Circle)&);
271  virtual ~Geom2dArcOfCircle();
272  virtual Geometry2d *clone(void) const;
273 
274  double getRadius(void) const;
275  void setRadius(double Radius);
276 
277  // Persistence implementer ---------------------
278 
279  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
280  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
281  // Base implementer ----------------------------
282 
283 
284  void setHandle(const Handle(Geom2d_TrimmedCurve)&);
285  const Handle(Geom2d_Geometry)& handle() const;
286 
287 private:
288  Handle(Geom2d_TrimmedCurve) myCurve;
289 };
290 
291 class LX_GEOM_EXPORT Geom2dEllipse : public Geom2dConic
292 {
294 public:
295  Geom2dEllipse();
296  Geom2dEllipse(const Handle(Geom2d_Ellipse)&);
297  virtual ~Geom2dEllipse();
298  virtual Geometry2d *clone(void) const;
299 
300  double getMajorRadius(void) const;
301  void setMajorRadius(double Radius);
302  double getMinorRadius(void) const;
303  void setMinorRadius(double Radius);
304  Base::Vector2d getMajorAxisDir() const;
305  void setMajorAxisDir(Base::Vector2d newdir);
306 
307  // Persistence implementer ---------------------
308 
309  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
310  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
311  // Base implementer ----------------------------
312 
313 
314  void setHandle(const Handle(Geom2d_Ellipse) &e);
315  const Handle(Geom2d_Geometry)& handle() const;
316 
317 private:
318  Handle(Geom2d_Ellipse) myCurve;
319 };
320 
321 class LX_GEOM_EXPORT Geom2dArcOfEllipse : public Geom2dArcOfConic
322 {
324 public:
326  Geom2dArcOfEllipse(const Handle(Geom2d_Ellipse)&);
327  virtual ~Geom2dArcOfEllipse();
328  virtual Geometry2d *clone(void) const;
329 
330  double getMajorRadius(void) const;
331  void setMajorRadius(double Radius);
332  double getMinorRadius(void) const;
333  void setMinorRadius(double Radius);
334  Base::Vector2d getMajorAxisDir() const;
335  void setMajorAxisDir(Base::Vector2d newdir);
336 
337  // Persistence implementer ---------------------
338 
339  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
340  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
341  // Base implementer ----------------------------
342 
343 
344  void setHandle(const Handle(Geom2d_TrimmedCurve)&);
345  const Handle(Geom2d_Geometry)& handle() const;
346 
347 private:
348  Handle(Geom2d_TrimmedCurve) myCurve;
349 };
350 
351 class LX_GEOM_EXPORT Geom2dHyperbola : public Geom2dConic
352 {
354 public:
355  Geom2dHyperbola();
356  Geom2dHyperbola(const Handle(Geom2d_Hyperbola)&);
357  virtual ~Geom2dHyperbola();
358  virtual Geometry2d *clone(void) const;
359 
360  double getMajorRadius(void) const;
361  void setMajorRadius(double Radius);
362  double getMinorRadius(void) const;
363  void setMinorRadius(double Radius);
364 
365  // Persistence implementer ---------------------
366 
367  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
368  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
369  // Base implementer ----------------------------
370 
371 
372  const Handle(Geom2d_Geometry)& handle() const;
373 
374 private:
375  Handle(Geom2d_Hyperbola) myCurve;
376 };
377 
378 class LX_GEOM_EXPORT Geom2dArcOfHyperbola : public Geom2dArcOfConic
379 {
381 public:
383  Geom2dArcOfHyperbola(const Handle(Geom2d_Hyperbola)&);
384  virtual ~Geom2dArcOfHyperbola();
385  virtual Geometry2d *clone(void) const;
386 
387  double getMajorRadius(void) const;
388  void setMajorRadius(double Radius);
389  double getMinorRadius(void) const;
390  void setMinorRadius(double Radius);
391 
392  // Persistence implementer ---------------------
393 
394  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
395  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
396  // Base implementer ----------------------------
397 
398 
399  void setHandle(const Handle(Geom2d_TrimmedCurve)&);
400  const Handle(Geom2d_Geometry)& handle() const;
401 
402 private:
403  Handle(Geom2d_TrimmedCurve) myCurve;
404 };
405 
406 class LX_GEOM_EXPORT Geom2dParabola : public Geom2dConic
407 {
409 public:
410  Geom2dParabola();
411  Geom2dParabola(const Handle(Geom2d_Parabola)&);
412  virtual ~Geom2dParabola();
413  virtual Geometry2d *clone(void) const;
414 
415  double getFocal(void) const;
416  void setFocal(double length);
417 
418  // Persistence implementer ---------------------
419 
420  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
421  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
422  // Base implementer ----------------------------
423 
424 
425  const Handle(Geom2d_Geometry)& handle() const;
426 
427 private:
428  Handle(Geom2d_Parabola) myCurve;
429 };
430 
431 class LX_GEOM_EXPORT Geom2dArcOfParabola : public Geom2dArcOfConic
432 {
434 public:
436  Geom2dArcOfParabola(const Handle(Geom2d_Parabola)&);
437  virtual ~Geom2dArcOfParabola();
438  virtual Geometry2d *clone(void) const;
439 
440  double getFocal(void) const;
441  void setFocal(double length);
442 
443  // Persistence implementer ---------------------
444 
445  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
446  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
447  // Base implementer ----------------------------
448 
449 
450  void setHandle(const Handle(Geom2d_TrimmedCurve)&);
451  const Handle(Geom2d_Geometry)& handle() const;
452 
453 private:
454  Handle(Geom2d_TrimmedCurve) myCurve;
455 };
456 
457 class LX_GEOM_EXPORT Geom2dLine : public Geom2dCurve
458 {
460 public:
461  Geom2dLine();
462  Geom2dLine(const Handle(Geom2d_Line)&);
463  Geom2dLine(const Base::Vector2d& Pos, const Base::Vector2d& Dir);
464  virtual ~Geom2dLine();
465  virtual Geometry2d *clone(void) const;
466 
467  void setLine(const Base::Vector2d& Pos, const Base::Vector2d& Dir);
468  Base::Vector2d getPos(void) const;
469  Base::Vector2d getDir(void) const;
470 
471  // Persistence implementer ---------------------
472 
473  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
474  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
475  // Base implementer ----------------------------
476 
477 
478  const Handle(Geom2d_Geometry)& handle() const;
479 
480 private:
481  Handle(Geom2d_Line) myCurve;
482 };
483 
484 class LX_GEOM_EXPORT Geom2dLineSegment : public Geom2dCurve
485 {
487 public:
489  virtual ~Geom2dLineSegment();
490  virtual Geometry2d *clone(void) const;
491 
492  Base::Vector2d getStartPoint() const;
493  Base::Vector2d getEndPoint() const;
494 
495  void setPoints(const Base::Vector2d& p1,
496  const Base::Vector2d& p2);
497 
498  // Persistence implementer ---------------------
499 
500  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
501  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
502  // Base implementer ----------------------------
503 
504 
505  void setHandle(const Handle(Geom2d_TrimmedCurve)&);
506  const Handle(Geom2d_Geometry)& handle() const;
507 
508 private:
509  Handle(Geom2d_TrimmedCurve) myCurve;
510 };
511 
512 class LX_GEOM_EXPORT Geom2dOffsetCurve : public Geom2dCurve
513 {
515 public:
517  Geom2dOffsetCurve(const Handle(Geom2d_Curve)&, double);
518  Geom2dOffsetCurve(const Handle(Geom2d_OffsetCurve)&);
519  virtual ~Geom2dOffsetCurve();
520  virtual Geometry2d *clone(void) const;
521 
522  // Persistence implementer ---------------------
523 
524  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
525  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
526  // Base implementer ----------------------------
527 
528 
529  void setHandle(const Handle(Geom2d_OffsetCurve)& c);
530  const Handle(Geom2d_Geometry)& handle() const;
531 
532 private:
533  Handle(Geom2d_OffsetCurve) myCurve;
534 };
535 
536 class LX_GEOM_EXPORT Geom2dTrimmedCurve : public Geom2dCurve
537 {
539 public:
541  Geom2dTrimmedCurve(const Handle(Geom2d_TrimmedCurve)&);
542  virtual ~Geom2dTrimmedCurve();
543  virtual Geometry2d *clone(void) const;
544 
545  // Persistence implementer ---------------------
546 
547  virtual void save(Base::AbstractWriter& /*writer*/, Base::PersistenceVersion& /*save_version*/) override;
548  virtual void restore(Base::AbstractXMLReader& /*reader*/, Base::PersistenceVersion& /*version*/) override;
549  // Base implementer ----------------------------
550 
551 
552  void setHandle(const Handle(Geom2d_TrimmedCurve)&);
553  const Handle(Geom2d_Geometry)& handle() const;
554 
555 private:
556  Handle(Geom2d_TrimmedCurve) myCurve;
557 };
558 
559 std::unique_ptr<Geom2dCurve> makeFromCurve2d(Handle(Geom2d_Curve));
560 std::unique_ptr<Geom2dCurve> makeFromTrimmedCurve2d(const Handle(Geom2d_Curve)&, double f, double l);
561 std::unique_ptr<Geom2dCurve> makeFromCurveAdaptor2d(const Adaptor2d_Curve2d&);
562 
563 }
564 
565 #endif // PART_GEOMETRY2D_H
LX_GEOM_EXPORT Point getPoint(const Geom::Pnt &p)
Definition: Variant.h:60
std::unique_ptr< Geom2dCurve > makeFromTrimmedCurve2d(const Handle(Geom2d_Curve)&, double f, double l)
Definition: Geometry2d.h:512
Definition: Persistence.h:14
Definition: Geometry2d.h:484
Definition: Tools2D.h:45
Definition: Geometry2d.h:138
Definition: Geometry2d.h:351
Definition: Geometry2d.h:406
Definition: Geometry2d.h:240
std::unique_ptr< Geom2dCurve > makeFromCurveAdaptor2d(const Adaptor2d_Curve2d &)
Definition: Geometry2d.h:291
Definition: Geometry2d.h:321
Persistence class and root of the type system.
Definition: Persistence.h:23
Definition: AbstractXMLReader.h:7
Definition: Dir.h:45
Definition: Geometry2d.h:265
Definition: AbstractConstraint.h:6
Definition: Geometry2d.h:115
Definition: Writer.h:16
Definition: Geometry2d.h:71
Definition: Geometry2d.h:48
Definition: Geometry2d.h:378
Definition: Geometry2d.h:98
std::unique_ptr< Geom2dCurve > makeFromCurve2d(Handle(Geom2d_Curve))
Definition: Geometry2d.h:194
Definition: Geometry2d.h:214
Definition: Geometry2d.h:431
Definition: Geometry2d.h:536
TYPESYSTEM_HEADER()
Definition: Geometry2d.h:457