3 // Part of the Architektonas Project
4 // Originally part of QCad Community Edition by Andrew Mustun
5 // Extensively rewritten and refactored by James L. Hammons
6 // (C) 2010 Underground Software
8 // JLH = James L. Hammons <jlhamm@acm.org>
11 // --- ---------- -----------------------------------------------------------
12 // JLH 06/02/2010 Added this text. :-)
17 #include "graphicview.h"
18 #include "paintinterface.h"
21 * Default constructor.
23 RS_Solid::RS_Solid(RS_EntityContainer * parent, const RS_SolidData & d):
24 RS_AtomicEntity(parent), data(d)
29 /*virtual*/ RS_Entity * RS_Solid::clone()
31 RS_Solid * s = new RS_Solid(*this);
36 /** @return RS_ENTITY_POINT */
37 /*virtual*/ RS2::EntityType RS_Solid::rtti() const
39 return RS2::EntitySolid;
43 * @return Start point of the entity.
45 /*virtual*/ Vector RS_Solid::getStartpoint() const
51 * @return End point of the entity.
53 /*virtual*/ Vector RS_Solid::getEndpoint() const
58 /** @return Copy of data that defines the point. */
59 RS_SolidData RS_Solid::getData() const
64 /** @return true if this is a triangle. */
65 bool RS_Solid::isTriangle()
67 return !data.corner[3].valid;
71 * @return Corner number 'num'.
73 Vector RS_Solid::getCorner(int num)
75 if (num >= 0 && num < 4)
76 return data.corner[num];
79 RS_DEBUG->print("Illegal corner requested from Solid", RS_Debug::D_WARNING);
85 * Shapes this Solid into a standard arrow (used in dimensions).
87 * @param point The point the arrow points to.
88 * @param angle Direction of the arrow.
89 * @param arrowSize Size of arrow (length).
91 void RS_Solid::shapeArrow(const Vector & point, double angle, double arrowSize)
93 double cosv1, sinv1, cosv2, sinv2;
94 double arrowSide = arrowSize / cos(0.165);
96 cosv1 = cos(angle + 0.165) * arrowSide;
97 sinv1 = sin(angle + 0.165) * arrowSide;
98 cosv2 = cos(angle - 0.165) * arrowSide;
99 sinv2 = sin(angle - 0.165) * arrowSide;
101 data.corner[0] = point;
102 data.corner[1] = Vector(point.x - cosv1, point.y - sinv1);
103 data.corner[2] = Vector(point.x - cosv2, point.y - sinv2);
104 data.corner[3] = Vector(false);
109 void RS_Solid::calculateBorders()
113 for(int i=0; i<4; ++i)
115 if (data.corner[i].valid)
117 minV = Vector::minimum(minV, data.corner[i]);
118 maxV = Vector::maximum(maxV, data.corner[i]);
123 Vector RS_Solid::getNearestEndpoint(const Vector & coord, double * dist)
125 double minDist = RS_MAXDOUBLE;
129 for(int i=0; i<4; ++i)
131 if (data.corner[i].valid)
133 curDist = data.corner[i].distanceTo(coord);
135 if (curDist < minDist)
137 ret = data.corner[i];
150 * @todo Implement this.
152 Vector RS_Solid::getNearestPointOnEntity(const Vector & /*coord*/, bool /*onEntity*/,
153 double * /*dist*/, RS_Entity ** /*entity*/)
159 Vector RS_Solid::getNearestCenter(const Vector & /*coord*/, double * dist)
162 *dist = RS_MAXDOUBLE;
164 return Vector(false);
167 Vector RS_Solid::getNearestMiddle(const Vector & /*coord*/, double * dist)
170 *dist = RS_MAXDOUBLE;
172 return Vector(false);
175 Vector RS_Solid::getNearestDist(double /*distance*/, const Vector & /*coord*/, double * dist)
178 *dist = RS_MAXDOUBLE;
180 return Vector(false);
184 * @return Distance from one of the boundry lines of this solid to given point.
188 double RS_Solid::getDistanceToPoint(const Vector & /*coord*/, RS_Entity ** /*entity*/,
189 RS2::ResolveLevel /*level*/, double /*solidDist*/)
194 void RS_Solid::move(Vector offset)
196 for(int i=0; i<4; ++i)
197 data.corner[i].move(offset);
202 void RS_Solid::rotate(Vector center, double angle)
204 for(int i=0; i<4; ++i)
205 data.corner[i].rotate(center, angle);
210 void RS_Solid::scale(Vector center, Vector factor)
212 for(int i=0; i<4; ++i)
213 data.corner[i].scale(center, factor);
218 void RS_Solid::mirror(Vector axisPoint1, Vector axisPoint2)
220 for(int i=0; i<4; ++i)
221 data.corner[i].mirror(axisPoint1, axisPoint2);
226 void RS_Solid::draw(PaintInterface * painter, GraphicView * view, double /*patternOffset*/)
228 if (!painter || !view)
231 RS_SolidData d = getData();
234 painter->fillTriangle(view->toGui(getCorner(0)), view->toGui(getCorner(1)),
235 view->toGui(getCorner(2)));
239 * Dumps the point's data to stdout.
241 std::ostream & operator<<(std::ostream & os, const RS_Solid & p)
243 os << " Solid: " << p.getData() << "\n";