LibreCAD
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
lwpolyline.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "cad/const.h"
5 #include "cad/base/cadentity.h"
6 #include "cad/meta/layer.h"
7 
9 #include "cad/geometry/geobase.h"
10 #include "cad/interface/snapable.h"
12 #include <vector>
13 
14 namespace lc {
15  namespace entity {
19  class LWVertex2D {
20  public:
21  LWVertex2D(geo::Coordinate const location, double const bulge = 0., double const startWidth = 0.,
22  double const endWidth = 0.)
24  }
25 
26  LWVertex2D(LWVertex2D const &other)
27  : _location(other._location),
28  _startWidth(other._startWidth),
29  _endWidth(other._endWidth),
30  _bulge(other._bulge) {
31  }
32 
33  geo::Coordinate const location() const {
34  return _location;
35  }
36 
37  LWVertex2D const move(geo::Coordinate const &offset) {
38  return LWVertex2D(_location + offset);
39  }
40 
41  LWVertex2D const rotate(const geo::Coordinate &rotation_center, double rotation_angle) {
42  return LWVertex2D(_location.rotate(rotation_center, rotation_angle));
43  }
44 
48  LWVertex2D const scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) {
49  if (scale_factor.x() == scale_factor.y()) {
50  return LWVertex2D(_location.scale(scale_center, scale_factor), _bulge * scale_factor.x(),
51  _startWidth * scale_factor.x(), _endWidth * scale_factor.x());
52  } else {
53  throw;
54  }
55  }
56 
57  double startWidth() const {
58  return _startWidth;
59  }
60 
61  double endWidth() const {
62  return _endWidth;
63  }
64 
65  double bulge() const {
66  return _bulge;
67  }
68 
69  private:
70  friend std::ostream &operator<<(std::ostream &os, const LWVertex2D &a) {
71  os << "LWVertex2D(location=" << a._location << " startWidth=" << a._startWidth << " startHeight=" <<
72  a._endWidth << " bulge=" << a._bulge << ")";
73  return os;
74  }
75 
76  public:
78  double _startWidth;
79  double _endWidth;
80  double _bulge;
81  };
82 
86  class LWPolyline : public std::enable_shared_from_this<LWPolyline>, public CADEntity, public Snapable, public Draggable {
87  public:
88 
99  LWPolyline(const std::vector<LWVertex2D> &vertex,
100  double width,
101  double elevation,
102  double tickness,
103  bool closed,
105  const Layer_CSPtr layer,
106  const MetaInfo_CSPtr metaInfo = nullptr,
107  const Block_CSPtr block = nullptr
108  );
109 
110  LWPolyline(const LWPolyline_CSPtr other, bool sameID = false);
111 
112 
113  double width() const {
114  return _width;
115  }
116 
117  double elevation() const {
118  return _elevation;
119  }
120 
121  double tickness() const {
122  return _tickness;
123  }
124 
126  return _extrusionDirection;
127  }
128 
129  std::vector<LWVertex2D> const &vertex() const {
130  return _vertex;
131  }
132 
133  bool closed() const {
134  return _closed;
135  }
136 
137  public:
138  virtual std::vector<EntityCoordinate> snapPoints(const geo::Coordinate &coord,
139  const SimpleSnapConstrain &constrain,
140  double minDistanceToSnap,
141  int maxNumberOfSnapPoints) const override;
142 
143  virtual geo::Coordinate nearestPointOnPath(const geo::Coordinate &coord) const override;
144  std::tuple<geo::Coordinate, std::shared_ptr<const geo::Vector>, std::shared_ptr<const geo::Arc>> nearestPointOnPath2(const geo::Coordinate &coord) const;
145 
146  private:
150  void generateEntities();
151 
152  const std::vector<LWVertex2D> _vertex;
153  const double _width;
154  const double _elevation;
155  const double _tickness;
156  const bool _closed; // If we had more 'flag' options we should consider using an enum instead of separate variables to make constructors easier
158  std::vector<CADEntity_CSPtr> _entities;
159 
160  public:
166  virtual CADEntity_CSPtr move(const geo::Coordinate &offset) const override;
167 
173  virtual CADEntity_CSPtr copy(const geo::Coordinate &offset) const override;
174 
181  virtual CADEntity_CSPtr rotate(const geo::Coordinate &rotation_center, const double rotation_angle) const override;
182 
189  virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center,
190  const geo::Coordinate &scale_factor) const override;
191 
192 
193  virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1,
194  const geo::Coordinate& axis2) const override {
195  return NULL; // TODO: no return statement, not implemented in lwpolyline.cpp
196  }
201  virtual const geo::Area boundingBox() const override;
202 
203  virtual CADEntity_CSPtr modify(Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo, Block_CSPtr block) const override;
204 
209  std::vector<CADEntity_CSPtr> const asEntities() const;
210 
211 
212  public:
213  virtual void accept(GeoEntityVisitor &v) const override { v.visit(*this); }
214 
215  virtual void dispatch(EntityDispatch &ed) const override {
216  ed.visit(shared_from_this());
217  }
218 
219  public:
220  virtual std::map<unsigned int, lc::geo::Coordinate> dragPoints() const override;
221  virtual CADEntity_CSPtr setDragPoints(std::map<unsigned int, lc::geo::Coordinate> dragPoints) const override;
222  };
223 
224  DECLARE_SHORT_SHARED_PTR(LWPolyline)
225  }
226 }
virtual CADEntity_CSPtr modify(Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo, Block_CSPtr block) const override
modify Return a new entity with the same ID bit with possible modified metainfo and/pr layer informat...
Definition: lwpolyline.cpp:109
geo::Coordinate const & extrusionDirection() const
Definition: lwpolyline.h:125
virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override
scale, scales the entity
Definition: lwpolyline.cpp:78
virtual CADEntity_CSPtr move(const geo::Coordinate &offset) const override
move, moves by an offset
Definition: lwpolyline.cpp:46
double x() const
Returns x of Coordinate.
Definition: geocoordinate.h:26
double elevation() const
Definition: lwpolyline.h:117
geo::Coordinate const location() const
Definition: lwpolyline.h:33
std::vector< LWVertex2D > const & vertex() const
Definition: lwpolyline.h:129
virtual void visit(entity::Line_CSPtr)=0
Layer_CSPtr layer() const
layer return the layer this entity is placed on
Definition: cadentity.cpp:29
double y() const
Returns y of Coordinate.
Definition: geocoordinate.h:34
double width() const
Definition: lwpolyline.h:113
Coordinate scale(const double &scale_factor) const
double startWidth() const
Definition: lwpolyline.h:57
virtual geo::Coordinate nearestPointOnPath(const geo::Coordinate &coord) const override
Find the nearest point on the path for this entity for the coordinate coord The path of a entity that...
Definition: lwpolyline.cpp:229
virtual void dispatch(EntityDispatch &ed) const override
Definition: lwpolyline.h:215
virtual void accept(GeoEntityVisitor &v) const override
Definition: lwpolyline.h:213
virtual std::map< unsigned int, lc::geo::Coordinate > dragPoints() const override
Get all points of the entity that can be dragged.
Definition: lwpolyline.cpp:267
MetaInfo_CSPtr metaInfo() const
Definition: cadentity.h:123
DECLARE_SHORT_SHARED_PTR(Document)
LWVertex2D(LWVertex2D const &other)
Definition: lwpolyline.h:26
Definition: cadentity.h:12
virtual CADEntity_CSPtr mirror(const geo::Coordinate &axis1, const geo::Coordinate &axis2) const override
Definition: lwpolyline.h:193
LWPolyline(const std::vector< LWVertex2D > &vertex, double width, double elevation, double tickness, bool closed, geo::Coordinate const &extrusionDirection, const Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo=nullptr, const Block_CSPtr block=nullptr)
Definition: lwpolyline.cpp:15
const double _width
Definition: lwpolyline.h:153
virtual CADEntity_CSPtr rotate(const geo::Coordinate &rotation_center, const double rotation_angle) const override
rotate, rotate operation
Definition: lwpolyline.cpp:67
Coordinate rotate(const Coordinate &angleVector) const
rotate around (0.,0.) with a given angle vector
std::tuple< geo::Coordinate, std::shared_ptr< const geo::Vector >, std::shared_ptr< const geo::Arc > > nearestPointOnPath2(const geo::Coordinate &coord) const
Definition: lwpolyline.cpp:234
const double _tickness
Definition: lwpolyline.h:155
LWVertex2D(geo::Coordinate const location, double const bulge=0., double const startWidth=0., double const endWidth=0.)
Definition: lwpolyline.h:21
friend std::ostream & operator<<(std::ostream &os, const LWVertex2D &a)
Definition: lwpolyline.h:70
const geo::Coordinate _extrusionDirection
Definition: lwpolyline.h:157
bool closed() const
Definition: lwpolyline.h:133
double tickness() const
Definition: lwpolyline.h:121
const double _elevation
Definition: lwpolyline.h:154
LWVertex2D const move(geo::Coordinate const &offset)
Definition: lwpolyline.h:37
virtual CADEntity_CSPtr setDragPoints(std::map< unsigned int, lc::geo::Coordinate > dragPoints) const override
Return modified entity.
Definition: lwpolyline.cpp:280
std::vector< CADEntity_CSPtr > _entities
Definition: lwpolyline.h:158
Block_CSPtr block() const
Return the current entity block.
Definition: cadentity.cpp:33
virtual const geo::Area boundingBox() const override
boundingBox of the entity
Definition: lwpolyline.cpp:92
LWVertex2D const rotate(const geo::Coordinate &rotation_center, double rotation_angle)
Definition: lwpolyline.h:41
double bulge() const
Definition: lwpolyline.h:65
double endWidth() const
Definition: lwpolyline.h:61
virtual CADEntity_CSPtr copy(const geo::Coordinate &offset) const override
copy, copies by an offset
Definition: lwpolyline.cpp:57
const std::vector< LWVertex2D > _vertex
Definition: lwpolyline.h:152
geo::Coordinate _location
Definition: lwpolyline.h:77
virtual std::vector< EntityCoordinate > snapPoints(const geo::Coordinate &coord, const SimpleSnapConstrain &constrain, double minDistanceToSnap, int maxNumberOfSnapPoints) const override
Find a number of snap points the line has available This function returns a ordered list...
Definition: lwpolyline.cpp:162
LWVertex2D const scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor)
Definition: lwpolyline.h:48
void generateEntities()
Generate entities of the polyline.
Definition: lwpolyline.cpp:126
std::vector< CADEntity_CSPtr > const asEntities() const
Definition: lwpolyline.cpp:299