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 // Portions copyright (C) 2001-2003 RibbonSoft
7 // Copyright (C) 2010 Underground Software
8 // See the README and GPLv2 files for licensing and warranty information
10 // JLH = James L. Hammons <jlhamm@acm.org>
13 // --- ---------- -----------------------------------------------------------
14 // JLH 05/28/2010 Added this text. :-)
17 #include "dimradial.h"
27 * @para parent Parent Entity Container.
28 * @para d Common dimension geometrical data.
29 * @para ed Extended geometrical data for radial dimension.
31 DimRadial::DimRadial(EntityContainer * parent, const DimensionData & d,
32 const DimRadialData & ed): Dimension(parent, d), edata(ed)
36 /*virtual*/ DimRadial::~DimRadial()
40 /*virtual*/ Entity * DimRadial::clone()
42 DimRadial * d = new DimRadial(*this);
43 #warning "!!! Need to deal with setAutoDelete() Qt3->Qt4 !!!"
44 // d->entities.setAutoDelete(entities.autoDelete());
50 /** @return RS2::EntityDimRadial */
51 /*virtual*/ RS2::EntityType DimRadial::rtti() const
53 return RS2::EntityDimRadial;
57 * @return Copy of data that defines the radial dimension.
60 DimRadialData DimRadial::getEData() const
66 * @return Automatically created label for the default
67 * measurement of this dimension.
69 QString DimRadial::getMeasuredLabel()
71 // Definitive dimension line:
72 double dist = data.definitionPoint.distanceTo(edata.definitionPoint);
73 Drawing * drawing = GetDrawing();
76 return Units::formatLinear(dist, drawing->getUnit(),
77 drawing->getLinearFormat(), drawing->getLinearPrecision());
79 return QString("%1").arg(dist);
83 VectorSolutions DimRadial::getRefPoints()
85 return VectorSolutions(edata.definitionPoint,
86 data.definitionPoint, data.middleOfText);
90 * Updates the sub entities of this dimension. Called when the
91 * dimension or the position, alignment, .. changes.
93 * @param autoText Automatically reposition the text label
95 void DimRadial::update(bool autoText)
97 DEBUG->print("DimRadial::update");
106 //updateCreateDimensionLine(data.definitionPoint, edata.definitionPoint,
109 Vector p1 = data.definitionPoint;
110 Vector p2 = edata.definitionPoint;
111 double angle = p1.angleTo(p2);
113 // text height (DIMTXT)
114 double dimtxt = getTextHeight();
115 // text distance to line (DIMGAP)
116 double dimgap = getDimensionLineGap();
118 // length of dimension line:
119 double length = p1.distanceTo(p2);
123 textData = TextData(Vector(0.0,0.0),
134 Text* text = new Text(this, textData);
135 double textWidth = text->getSize().x;
137 // do we have to put the arrow / text outside of the arc?
138 bool outsideArrow = (length<getArrowSize()*2+textWidth);
142 length += getArrowSize()*2 + textWidth;
143 arrowAngle = angle+M_PI;
152 arrow = new Solid(this, sd);
153 arrow->shapeArrow(p2,
156 arrow->setPen(Pen(RS2::FlagInvalid));
157 arrow->setLayer(NULL);
161 p3.setPolar(length, angle);
164 // Create dimension line:
165 Line* dimensionLine = new Line(this, LineData(p1, p3));
166 dimensionLine->setPen(Pen(RS2::FlagInvalid));
167 dimensionLine->setLayer(NULL);
168 addEntity(dimensionLine);
173 // rotate text so it's readable from the bottom or right (ISO)
175 if (angle>M_PI/2.0*3.0+0.001 ||
176 angle<M_PI/2.0+0.001) {
178 distV.setPolar(dimgap + dimtxt/2.0, angle+M_PI/2.0);
183 distV.setPolar(dimgap + dimtxt/2.0, angle-M_PI/2.0);
184 textAngle = angle+M_PI;
190 if (data.middleOfText.valid && !autoText) {
191 textPos = data.middleOfText;
194 textPos.setPolar(length-textWidth/2.0-getArrowSize(), angle);
196 textPos.setPolar(length/2.0, angle);
199 // move text away from dimension line:
201 data.middleOfText = textPos;
204 text->rotate(Vector(0.0,0.0), textAngle);
207 text->setPen(Pen(RS2::FlagInvalid));
208 text->setLayer(NULL);
214 Vector DimRadial::getDefinitionPoint()
216 return edata.definitionPoint;
219 double DimRadial::getLeader()
224 void DimRadial::move(Vector offset)
226 Dimension::move(offset);
228 edata.definitionPoint.move(offset);
232 void DimRadial::rotate(Vector center, double angle)
234 Dimension::rotate(center, angle);
236 edata.definitionPoint.rotate(center, angle);
242 void DimRadial::scale(Vector center, Vector factor) {
243 Dimension::scale(center, factor);
245 edata.definitionPoint.scale(center, factor);
246 edata.leader*=factor.x;
252 void DimRadial::mirror(Vector axisPoint1, Vector axisPoint2) {
253 Dimension::mirror(axisPoint1, axisPoint2);
255 edata.definitionPoint.mirror(axisPoint1, axisPoint2);
260 void DimRadial::moveRef(const Vector& ref, const Vector& offset) {
262 if (ref.distanceTo(edata.definitionPoint)<1.0e-4) {
263 double d = data.definitionPoint.distanceTo(edata.definitionPoint);
264 double a = data.definitionPoint.angleTo(edata.definitionPoint + offset);
268 edata.definitionPoint = data.definitionPoint + v;
271 else if (ref.distanceTo(data.middleOfText)<1.0e-4) {
272 data.middleOfText.move(offset);
278 * Dumps the point's data to stdout.
280 std::ostream& operator << (std::ostream& os, const DimRadial& d) {
281 os << " DimRadial: " << d.getData() << "\n" << d.getEData() << "\n";