]> Shamusworld >> Repos - architektonas/blob - src/base/rs_solid.h
Changed RS_Graphic to Drawing; this is less confusing as a drawing is
[architektonas] / src / base / rs_solid.h
1 #ifndef RS_SOLID_H
2 #define RS_SOLID_H
3
4 #include "rs_atomicentity.h"
5 #include "vector.h"
6
7 /**
8  * Holds the data that defines a solid.
9  */
10 class RS_SolidData
11 {
12 public:
13     /**
14      * Default constructor. Leaves the data object uninitialized.
15      */
16     RS_SolidData() {
17         for (int i=0; i<4; ++i) {
18             corner[i] = Vector(false);
19         }
20     }
21
22     /**
23      * Constructor for a solid with 3 corners.
24      */
25     RS_SolidData(const Vector& corner1,
26                  const Vector& corner2,
27                  const Vector& corner3) {
28
29         corner[0] = corner1;
30         corner[1] = corner2;
31         corner[2] = corner3;
32         corner[3] = Vector(false);
33     }
34
35     /**
36      * Constructor for a solid with 4 corners.
37      */
38     RS_SolidData(const Vector& corner1,
39                  const Vector& corner2,
40                  const Vector& corner3,
41                  const Vector& corner4) {
42
43         corner[0] = corner1;
44         corner[1] = corner2;
45         corner[2] = corner3;
46         corner[3] = corner4;
47     }
48
49     friend class RS_Solid;
50
51     friend std::ostream& operator << (std::ostream& os,
52                                       const RS_SolidData& pd) {
53         os << "(";
54         for (int i=0; i<4; i++) {
55             os << pd.corner[i];
56         }
57         os << ")";
58         return os;
59     }
60
61 private:
62     Vector corner[4];
63 };
64
65 /**
66  * Class for a solid entity (e.g. dimension arrows).
67  *
68  * @author Andrew Mustun
69  */
70 class RS_Solid: public RS_AtomicEntity
71 {
72 public:
73     RS_Solid(RS_EntityContainer* parent,
74              const RS_SolidData& d);
75
76     virtual RS_Entity* clone() {
77         RS_Solid* s = new RS_Solid(*this);
78         s->initId();
79         return s;
80     }
81
82     /** @return RS_ENTITY_POINT */
83     virtual RS2::EntityType rtti() const {
84         return RS2::EntitySolid;
85     }
86
87     /**
88          * @return Start point of the entity.
89          */
90     virtual Vector getStartpoint() const {
91         return Vector(false);
92     }
93     /**
94          * @return End point of the entity.
95          */
96     virtual Vector getEndpoint() const {
97         return Vector(false);
98     }
99
100
101     /** @return Copy of data that defines the point. */
102     RS_SolidData getData() const {
103         return data;
104     }
105
106     /** @return true if this is a triangle. */
107     bool isTriangle() {
108         return !data.corner[3].valid;
109     }
110
111     Vector getCorner(int num);
112
113     void shapeArrow(const Vector & point, double angle, double arrowSize);
114
115     virtual Vector getNearestEndpoint(const Vector & coord, double * dist = NULL);
116     virtual Vector getNearestPointOnEntity(const Vector & coord,
117             bool onEntity = true, double * dist = NULL, RS_Entity ** entity = NULL);
118     virtual Vector getNearestCenter(const Vector & coord, double * dist = NULL);
119     virtual Vector getNearestMiddle(const Vector & coord, double * dist = NULL);
120     virtual Vector getNearestDist(double distance, const Vector & coord, double * dist = NULL);
121
122     virtual double getDistanceToPoint(const Vector & coord, RS_Entity ** entity = NULL,
123                 RS2::ResolveLevel level = RS2::ResolveNone, double solidDist = RS_MAXDOUBLE);
124
125     virtual void move(Vector offset);
126     virtual void rotate(Vector center, double angle);
127     virtual void scale(Vector center, Vector factor);
128     virtual void mirror(Vector axisPoint1, Vector axisPoint2);
129
130 //    virtual void draw(RS_Painter* painter, RS_GraphicView* view, double patternOffset=0.0);
131     virtual void draw(PaintInterface * painter, RS_GraphicView * view, double patternOffset = 0.0);
132
133     friend std::ostream & operator<<(std::ostream & os, const RS_Solid & p);
134
135     /** Recalculates the borders of this entity. */
136     virtual void calculateBorders ();
137
138 protected:
139     RS_SolidData data;
140     //Vector point;
141 };
142
143 #endif