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 
105  virtual REntityData& getData() = 0;
106 
110  virtual const REntityData& getData() const = 0;
111 
117 // virtual bool isPartOfBlockReference(REntity::Id blockRefId) const {
118 // Q_UNUSED(blockRefId)
119 
120 // return false;
121 // }
122 
126 // virtual bool getAutoVisualize() const {
127 // return true;
128 // }
129 
133  bool isSelected() const {
134  return getData().isSelected();
135  }
136 
137  virtual void setSelected(bool on);
138 
142  void setDrawOrder(int drawOrder) {
143  getData().setDrawOrder(drawOrder);
144  }
145 
149  int getDrawOrder() const {
150  return getData().getDrawOrder();
151  }
152 
156  void setLayerId(RLayer::Id layerId) {
157  getData().setLayerId(layerId);
158  }
159 
164  return getData().getLayerId();
165  }
166 
170  QString getLayerName() const {
171  return getData().getLayerName();
172  }
173 
177  void setBlockId(RBlock::Id blockId) {
178  getData().setBlockId(blockId);
179  }
180 
185  return getData().getBlockId();
186  }
187 
191  QString getBlockName() const {
192  return getData().getBlockName();
193  }
194 
198  void setParentId(REntity::Id parentId) {
199  getData().setParentId(parentId);
200  }
201 
206  return getData().getParentId();
207  }
208 
212  void setLinetypeId(RLinetype::Id linetypeId) {
213  getData().setLinetypeId(linetypeId);
214  }
215 
219  void setLinetypePattern(const RLinetypePattern& linetypePattern) {
220  getData().setLinetypePattern(linetypePattern);
221  }
222 
227  return getData().getLinetypeId();
228  }
229 
230  RLinetype::Id getLinetypeId(bool resolve,
231  const QStack<REntity*>& blockRefStack) const;
232 
237  return getData().getLinetypePattern();
238  }
239 
243  void setLinetypeScale(double linetypeScale) {
244  if (linetypeScale<0.0) {
245  qDebug() << "setLinetypeScale to -1";
246  }
247  getData().setLinetypeScale(linetypeScale);
248  }
249 
253  double getLinetypeScale() const {
254  return getData().getLinetypeScale();
255  }
256 
261  getData().setLineweight(lineweight);
262  }
263 
268  return getData().getLineweight();
269  }
270 
271  RLineweight::Lineweight getLineweight(bool resolve,
272  const QStack<REntity*>& blockRefStack) const;
273 
274  double getLineweightInUnits(const QStack<REntity*>& blockRefStack) const;
275 
279  void setColor(const RColor& color) {
280  getData().setColor(color);
281  }
282 
286  RColor getColor() const {
287  return getData().getColor();
288  }
289 
290  RColor getColor(bool resolve, const QStack<REntity*>& blockRefStack);
291 
292  void copyAttributesFrom(REntity* entity, bool copyBlockId=true);
293 
297  virtual RBox getBoundingBox(bool ignoreEmpty=false) const {
298  return getData().getBoundingBox(ignoreEmpty);
299  }
300 
304  virtual QList<RBox> getBoundingBoxes(bool ignoreEmpty=false) const {
305  return getData().getBoundingBoxes(ignoreEmpty);
306  }
307 
311 // virtual QList<QPair<REntity::Id, RBox> > getIdBoundingBoxes() const {
312 // return getData().getIdBoundingBoxes();
313 // }
314 
318  virtual QList<QSharedPointer<RShape> > getShapes(const RBox& queryBox = RDEFAULT_RBOX) const {
319  return getData().getShapes(queryBox);
320  }
321 
325  virtual QSharedPointer<RShape> getClosestShape(const RVector& pos, double range = RNANDOUBLE) const {
326  return getData().getClosestShape(pos, range);
327  }
328 
332  virtual bool isInside(const RBox& box) const {
333  return getData().isInside(box);
334  }
335 
339  virtual bool isOnEntity(const RVector& point, bool limited=true) const {
340  return getData().isOnEntity(point, limited);
341  }
342 
346  virtual bool intersectsWith(const RShape& shape) const {
347  return getData().intersectsWith(shape);
348  }
349 
353  virtual double getDistanceTo(const RVector& point, bool limited = true, double range = 0.0, bool draft = false, double strictRange = RMAXDOUBLE) const {
354  return getData().getDistanceTo(point, limited, range, draft, strictRange);
355  }
356 
360  virtual RVector getVectorTo(const RVector& point, bool limited = true, double strictRange = RMAXDOUBLE) const {
361  return getData().getVectorTo(point, limited, strictRange);
362  }
363 
368  return getData().getInternalReferencePoints(hint);
369  }
370 
374  virtual QList<RVector> getReferencePoints(RS::ProjectionRenderingHint hint=RS::RenderTop) const {
375  return getData().getReferencePoints(hint);
376  }
377 
381  virtual RVector getPointOnEntity() const {
382  return getData().getPointOnEntity();
383  }
384 
388  virtual QList<RVector> getEndPoints(const RBox& queryBox = RDEFAULT_RBOX) const {
389  return getData().getEndPoints(queryBox);
390  }
391 
395  virtual QList<RVector> getMiddlePoints(const RBox& queryBox = RDEFAULT_RBOX) const {
396  return getData().getMiddlePoints(queryBox);
397  }
398 
402  virtual QList<RVector> getCenterPoints(const RBox& queryBox = RDEFAULT_RBOX) const {
403  return getData().getCenterPoints(queryBox);
404  }
405 
409  virtual RVector getClosestPointOnEntity(const RVector& point,
410  double range=RNANDOUBLE, bool limited=true) const {
411 
412  return getData().getClosestPointOnEntity(point, range, limited);
413  }
414 
418  virtual QList<RVector> getPointsWithDistanceToEnd(
419  double distance,
420  RS::From from = RS::FromAny,
421  const RBox& queryBox = RDEFAULT_RBOX) const {
422  return getData().getPointsWithDistanceToEnd(distance, from, queryBox);
423  }
424 
428  virtual QList<RVector> getIntersectionPoints(
429  const REntity& other, bool limited = true, const RBox& queryBox = RDEFAULT_RBOX) const;
430 
434  virtual QList<RVector> getIntersectionPoints(const RShape& shape, bool limited = true, const RBox& queryBox = RDEFAULT_RBOX) const;
435 
439  virtual bool moveReferencePoint(
440  const RVector& referencePoint, const RVector& targetPoint) {
441  return getData().moveReferencePoint(referencePoint, targetPoint);
442  }
443 
447  virtual bool move(const RVector& offset) {
448  return getData().move(offset);
449  }
450 
454  virtual bool rotate(double rotation, const RVector& center = RDEFAULT_RVECTOR) {
455  return getData().rotate(rotation, center);
456  }
457 
461  virtual bool scale(const RVector& scaleFactors,
462  const RVector& center = RDEFAULT_RVECTOR) {
463 
464  return getData().scale(scaleFactors, center);
465  }
466 
470  virtual bool scale(double scaleFactor,
471  const RVector& center = RDEFAULT_RVECTOR) {
472 
473  return getData().scale(scaleFactor, center);
474  }
475 
479  virtual bool mirror(const RLine& axis) {
480  return getData().mirror(axis);
481  }
482 
486  virtual bool mirror(const RVector& axis1, const RVector& axis2) {
487  return getData().mirror(axis1, axis2);
488  }
489 
493  virtual bool flipHorizontal() {
494  return getData().flipHorizontal();
495  }
496 
500  virtual bool flipVertical() {
501  return getData().flipVertical();
502  }
503 
507  virtual bool stretch(const RPolyline& area, const RVector& offset) {
508  return getData().stretch(area, offset);
509  }
510 
514  void update() const {
515  getData().update();
516  }
517 
521  virtual RShape* castToShape() {
522  return getData().castToShape();
523  }
524 
528  virtual const RShape* castToConstShape() const {
529  return getData().castToConstShape();
530  }
531 
537  virtual void exportEntity(RExporter& e, bool preview = false, bool forceSelected=false) const = 0;
538 
539  // from RObject:
541  return isSelected();
542  }
543 
544  virtual QPair<QVariant, RPropertyAttributes> getProperty(
545  RPropertyTypeId& propertyTypeId,
546  bool humanReadable = false, bool noAttributes = false);
547 
548  virtual bool setProperty(RPropertyTypeId propertyTypeId,
549  const QVariant& value, RTransaction* transaction=NULL);
550 
551  bool isVisible() const;
552  bool isEditable(bool allowInvisible = false) const;
553 
554  virtual int getComplexity() const {
555  return 1;
556  }
557 
558  void dump();
559 
560 protected:
561  virtual void print(QDebug dbg) const;
562 };
563 
565 Q_DECLARE_METATYPE(QSharedPointer<REntity>)
566 Q_DECLARE_METATYPE(QSharedPointer<REntity>*)
567 Q_DECLARE_METATYPE(QStack<REntity*>)
568 Q_DECLARE_METATYPE(QStack<REntity*>*)
569 
570 #endif