QCAD
Open Source 2D CAD
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
REntity.h
Go to the documentation of this file.
1 
20 #ifndef RENTITY_H
21 #define RENTITY_H
22 
23 #include "core_global.h"
24 
25 #include <QList>
26 #include <QStack>
27 
28 #include "RBox.h"
29 #include "RColor.h"
30 #include "RDebug.h"
31 #include "REntityData.h"
32 #include "RLayer.h"
33 #include "RLineweight.h"
34 #include "RMatrix.h"
35 #include "RObject.h"
36 #include "RPropertyAttributes.h"
37 #include "RPropertyTypeId.h"
38 #include "RVector.h"
39 #include "RExplodable.h"
40 
41 class RDocument;
42 class REntity;
44 class RExporter;
45 
46 #ifndef RDEFAULT_QSET_INT
47 #define RDEFAULT_QSET_INT QSet<int>()
48 #endif
49 
61 
62  Q_DECLARE_TR_FUNCTIONS(REntity)
63 
64 public:
75 
80 
81 public:
82  REntity(RDocument* document, Id objectId=-1) : RObject(document, objectId) {}
83  virtual ~REntity();
84 
85  static void init();
86 
87  static QSet<RPropertyTypeId> getStaticPropertyTypeIds() {
89  }
90 
91  void setDocument(RDocument* document) {
92  RObject::setDocument(document);
93  getData().setDocument(document);
94  }
95 
96  virtual REntity* clone() const = 0;
97 
98  virtual RS::EntityType getType() const {
99  return RS::EntityUnknown;
100  }
101 
102  static bool isComplex(const RS::EntityType type);
103  static bool isDimension(const RS::EntityType type);
104 
108  virtual REntityData& getData() = 0;
109 
113  virtual const REntityData& getData() const = 0;
114 
120 // virtual bool isPartOfBlockReference(REntity::Id blockRefId) const {
121 // Q_UNUSED(blockRefId)
122 
123 // return false;
124 // }
125 
129 // virtual bool getAutoVisualize() const {
130 // return true;
131 // }
132 
136  bool isSelected() const {
137  return getData().isSelected();
138  }
139 
140  virtual void setSelected(bool on);
141 
145  void setDrawOrder(int drawOrder) {
146  getData().setDrawOrder(drawOrder);
147  }
148 
152  int getDrawOrder() const {
153  return getData().getDrawOrder();
154  }
155 
159  void setLayerId(RLayer::Id layerId) {
160  getData().setLayerId(layerId);
161  }
162 
167  return getData().getLayerId();
168  }
169 
173  QString getLayerName() const {
174  return getData().getLayerName();
175  }
176 
180  void setBlockId(RBlock::Id blockId) {
181  getData().setBlockId(blockId);
182  }
183 
188  return getData().getBlockId();
189  }
190 
194  QString getBlockName() const {
195  return getData().getBlockName();
196  }
197 
201  void setParentId(REntity::Id parentId) {
202  getData().setParentId(parentId);
203  }
204 
209  return getData().getParentId();
210  }
211 
215  void setLinetypeId(RLinetype::Id linetypeId) {
216  getData().setLinetypeId(linetypeId);
217  }
218 
222  void setLinetypePattern(const RLinetypePattern& linetypePattern) {
223  getData().setLinetypePattern(linetypePattern);
224  }
225 
230  return getData().getLinetypeId();
231  }
232 
233  RLinetype::Id getLinetypeId(bool resolve,
234  const QStack<REntity*>& blockRefStack) const;
235 
240  return getData().getLinetypePattern();
241  }
242 
246  void setLinetypeScale(double linetypeScale) {
247  if (linetypeScale<0.0) {
248  qDebug() << "setLinetypeScale to -1";
249  }
250  getData().setLinetypeScale(linetypeScale);
251  }
252 
256  double getLinetypeScale() const {
257  return getData().getLinetypeScale();
258  }
259 
264  getData().setLineweight(lineweight);
265  }
266 
271  return getData().getLineweight();
272  }
273 
274  RLineweight::Lineweight getLineweight(bool resolve,
275  const QStack<REntity*>& blockRefStack) const;
276 
277  double getLineweightInUnits(const QStack<REntity*>& blockRefStack) const;
278 
282  void setColor(const RColor& color) {
283  getData().setColor(color);
284  }
285 
289  RColor getColor() const {
290  return getData().getColor();
291  }
292 
293  RColor getColor(bool resolve, const QStack<REntity*>& blockRefStack);
294 
295  void copyAttributesFrom(REntity* entity, bool copyBlockId=true);
296 
300  virtual RBox getBoundingBox(bool ignoreEmpty=false) const {
301  return getData().getBoundingBox(ignoreEmpty);
302  }
303 
307  virtual QList<RBox> getBoundingBoxes(bool ignoreEmpty=false) const {
308  return getData().getBoundingBoxes(ignoreEmpty);
309  }
310 
314 // virtual QList<QPair<REntity::Id, RBox> > getIdBoundingBoxes() const {
315 // return getData().getIdBoundingBoxes();
316 // }
317 
321  virtual QList<QSharedPointer<RShape> > getShapes(const RBox& queryBox = RDEFAULT_RBOX, bool ignoreComplex = false) const {
322  return getData().getShapes(queryBox, ignoreComplex);
323  }
324 
328  virtual QSharedPointer<RShape> getClosestShape(const RVector& pos, double range = RNANDOUBLE, bool ignoreComplex = false) const {
329  return getData().getClosestShape(pos, range, ignoreComplex);
330  }
331 
335  virtual bool isInside(const RBox& box) const {
336  return getData().isInside(box);
337  }
338 
342  virtual bool isOnEntity(const RVector& point, bool limited=true) const {
343  return getData().isOnEntity(point, limited);
344  }
345 
349  virtual bool intersectsWith(const RShape& shape) const {
350  return getData().intersectsWith(shape);
351  }
352 
356  virtual double getDistanceTo(const RVector& point, bool limited = true, double range = 0.0, bool draft = false, double strictRange = RMAXDOUBLE) const {
357  return getData().getDistanceTo(point, limited, range, draft, strictRange);
358  }
359 
363  virtual RVector getVectorTo(const RVector& point, bool limited = true, double strictRange = RMAXDOUBLE) const {
364  return getData().getVectorTo(point, limited, strictRange);
365  }
366 
371  return getData().getInternalReferencePoints(hint);
372  }
373 
377  virtual QList<RVector> getReferencePoints(RS::ProjectionRenderingHint hint=RS::RenderTop) const {
378  return getData().getReferencePoints(hint);
379  }
380 
384  virtual RVector getPointOnEntity() const {
385  return getData().getPointOnEntity();
386  }
387 
391  virtual QList<RVector> getEndPoints(const RBox& queryBox = RDEFAULT_RBOX) const {
392  return getData().getEndPoints(queryBox);
393  }
394 
398  virtual QList<RVector> getMiddlePoints(const RBox& queryBox = RDEFAULT_RBOX) const {
399  return getData().getMiddlePoints(queryBox);
400  }
401 
405  virtual QList<RVector> getCenterPoints(const RBox& queryBox = RDEFAULT_RBOX) const {
406  return getData().getCenterPoints(queryBox);
407  }
408 
412  virtual RVector getClosestPointOnEntity(const RVector& point,
413  double range=RNANDOUBLE, bool limited=true) const {
414 
415  return getData().getClosestPointOnEntity(point, range, limited);
416  }
417 
421  virtual QList<RVector> getPointsWithDistanceToEnd(
422  double distance,
423  RS::From from = RS::FromAny,
424  const RBox& queryBox = RDEFAULT_RBOX) const {
425  return getData().getPointsWithDistanceToEnd(distance, from, queryBox);
426  }
427 
431  virtual QList<RVector> getIntersectionPoints(
432  const REntity& other, bool limited = true, const RBox& queryBox = RDEFAULT_RBOX) const;
433 
437  virtual QList<RVector> getIntersectionPoints(const RShape& shape, bool limited = true, const RBox& queryBox = RDEFAULT_RBOX) const;
438 
442  virtual bool moveReferencePoint(
443  const RVector& referencePoint, const RVector& targetPoint) {
444  return getData().moveReferencePoint(referencePoint, targetPoint);
445  }
446 
450  virtual bool move(const RVector& offset) {
451  return getData().move(offset);
452  }
453 
457  virtual bool rotate(double rotation, const RVector& center = RDEFAULT_RVECTOR) {
458  return getData().rotate(rotation, center);
459  }
460 
464  virtual bool scale(const RVector& scaleFactors,
465  const RVector& center = RDEFAULT_RVECTOR) {
466 
467  return getData().scale(scaleFactors, center);
468  }
469 
473  virtual bool scale(double scaleFactor,
474  const RVector& center = RDEFAULT_RVECTOR) {
475 
476  return getData().scale(scaleFactor, center);
477  }
478 
482  virtual bool mirror(const RLine& axis) {
483  return getData().mirror(axis);
484  }
485 
489  virtual bool mirror(const RVector& axis1, const RVector& axis2) {
490  return getData().mirror(axis1, axis2);
491  }
492 
496  virtual bool flipHorizontal() {
497  return getData().flipHorizontal();
498  }
499 
503  virtual bool flipVertical() {
504  return getData().flipVertical();
505  }
506 
510  virtual bool stretch(const RPolyline& area, const RVector& offset) {
511  return getData().stretch(area, offset);
512  }
513 
517  void update() const {
518  getData().update();
519  }
520 
524  virtual RShape* castToShape() {
525  return getData().castToShape();
526  }
527 
531  virtual const RShape* castToConstShape() const {
532  return getData().castToConstShape();
533  }
534 
540  virtual void exportEntity(RExporter& e, bool preview = false, bool forceSelected=false) const = 0;
541 
542  // from RObject:
544  return isSelected();
545  }
546 
547  virtual QPair<QVariant, RPropertyAttributes> getProperty(
548  RPropertyTypeId& propertyTypeId,
549  bool humanReadable = false, bool noAttributes = false);
550 
551  virtual bool setProperty(RPropertyTypeId propertyTypeId,
552  const QVariant& value, RTransaction* transaction=NULL);
553 
554  bool isVisible() const;
555  bool isEditable(bool allowInvisible = false) const;
556 
557  virtual int getComplexity() const {
558  return 1;
559  }
560 
561  void dump();
562 
563 protected:
564  virtual void print(QDebug dbg) const;
565 };
566 
568 Q_DECLARE_METATYPE(QSharedPointer<REntity>)
569 Q_DECLARE_METATYPE(QSharedPointer<REntity>*)
570 Q_DECLARE_METATYPE(QStack<REntity*>)
571 Q_DECLARE_METATYPE(QStack<REntity*>*)
572 
573 #endif