// Part of the Architektonas Project
// Originally part of QCad Community Edition by Andrew Mustun
// Extensively rewritten and refactored by James L. Hammons
-// (C) 2010 Underground Software
+// Portions copyright (C) 2001-2003 RibbonSoft
+// Copyright (C) 2010 Underground Software
+// See the README and GPLv2 files for licensing and warranty information
//
// JLH = James L. Hammons <jlhamm@acm.org>
//
Vector RS_Dimension::getNearestRef(const Vector & coord, double * dist)
{
- return RS_Entity::getNearestRef(coord, dist);
+ return RS_Entity::getNearestRef(coord, dist);
}
Vector RS_Dimension::getNearestSelectedRef(const Vector & coord, double * dist)
{
- return RS_Entity::getNearestSelectedRef(coord, dist);
+ return RS_Entity::getNearestSelectedRef(coord, dist);
}
/**
*/
QString RS_Dimension::getLabel(bool resolve)
{
- if (!resolve) {
+ if (!resolve)
return data.text;
- }
-
- QString ret="";
- // One space suppresses the text:
- if (data.text==" ") {
- ret = "";
- }
+ QString ret = "";
- // No text prints actual measurement:
- else if (data.text=="") {
- ret = getMeasuredLabel();
- }
-
- // Others print the text (<> is replaced by the measurement)
- else {
- ret = data.text;
- ret = ret.replace(QString("<>"), getMeasuredLabel());
- }
+ // One space suppresses the text:
+ if (data.text == " ")
+ ret = "";
+ // No text prints actual measurement:
+ else if (data.text == "")
+ ret = getMeasuredLabel();
+ // Others print the text (<> is replaced by the measurement)
+ else
+ {
+ ret = data.text;
+ ret = ret.replace(QString("<>"), getMeasuredLabel());
+ }
- return ret;
+ return ret;
}
/**
*
* @param forceAutoText Automatically reposition the text label.
*/
-void RS_Dimension::updateCreateDimensionLine(const Vector& p1,
- const Vector& p2, bool arrow1, bool arrow2, bool forceAutoText)
+void RS_Dimension::updateCreateDimensionLine(const Vector & p1,
+ const Vector & p2, bool arrow1, bool arrow2, bool forceAutoText)
{
- // text height (DIMTXT)
- double dimtxt = getTextHeight();
- // text distance to line (DIMGAP)
- double dimgap = getDimensionLineGap();
-
- // length of dimension line:
- double distance = p1.distanceTo(p2);
-
- // do we have to put the arrows outside of the line?
- bool outsideArrows = (distance<getArrowSize()*2.5);
-
- // arrow angles:
- double arrowAngle1, arrowAngle2;
-
- // Create dimension line:
- RS_Line* dimensionLine = new RS_Line(this, RS_LineData(p1, p2));
- dimensionLine->setPen(RS_Pen(RS2::FlagInvalid));
- dimensionLine->setLayer(NULL);
- addEntity(dimensionLine);
-
- if (outsideArrows==false) {
- arrowAngle1 = dimensionLine->getAngle2();
- arrowAngle2 = dimensionLine->getAngle1();
- } else {
- arrowAngle1 = dimensionLine->getAngle1();
- arrowAngle2 = dimensionLine->getAngle2();
-
- // extend dimension line outside arrows
- Vector dir;
- dir.setPolar(getArrowSize()*2, arrowAngle2);
- dimensionLine->setStartpoint(p1 + dir);
- dimensionLine->setEndpoint(p2 - dir);
- }
-
- // Arrows:
- RS_SolidData sd;
- RS_Solid* arrow;
-
- if (arrow1) {
- // arrow 1
- arrow = new RS_Solid(this, sd);
- arrow->shapeArrow(p1,
- arrowAngle1,
- getArrowSize());
- arrow->setPen(RS_Pen(RS2::FlagInvalid));
- arrow->setLayer(NULL);
- addEntity(arrow);
- }
-
- if (arrow2) {
- // arrow 2:
- arrow = new RS_Solid(this, sd);
- arrow->shapeArrow(p2,
- arrowAngle2,
- getArrowSize());
- arrow->setPen(RS_Pen(RS2::FlagInvalid));
- arrow->setLayer(NULL);
- addEntity(arrow);
- }
-
- // Text label:
- RS_TextData textData;
- Vector textPos;
+#if 0
+printf("RS_Dimension::updateCreateDimensionLine()...\n");
+#endif
+ // text height (DIMTXT)
+ double dimtxt = getTextHeight();
+ // text distance to line (DIMGAP)
+ double dimgap = getDimensionLineGap();
+ // length of dimension line:
+ double distance = p1.distanceTo(p2);
+ // do we have to put the arrows outside of the line?
+ bool outsideArrows = (distance < getArrowSize() * 2.5);
+ // arrow angles:
+ double arrowAngle1, arrowAngle2;
+
+ // Create dimension line:
+ RS_Line * dimensionLine = new RS_Line(this, RS_LineData(p1, p2));
+ dimensionLine->setPen(RS_Pen(RS2::FlagInvalid));
+ dimensionLine->setLayer(NULL);
+ addEntity(dimensionLine);
+
+ if (!outsideArrows)
+ {
+ arrowAngle1 = dimensionLine->getAngle2();
+ arrowAngle2 = dimensionLine->getAngle1();
+ }
+ else
+ {
+ arrowAngle1 = dimensionLine->getAngle1();
+ arrowAngle2 = dimensionLine->getAngle2();
+
+ // extend dimension line outside arrows
+ Vector dir;
+ dir.setPolar(getArrowSize() * 2, arrowAngle2);
+ dimensionLine->setStartpoint(p1 + dir);
+ dimensionLine->setEndpoint(p2 - dir);
+ }
+
+ // Arrows:
+ RS_SolidData sd;
+ RS_Solid * arrow;
+
+ if (arrow1)
+ {
+ // arrow 1
+ arrow = new RS_Solid(this, sd);
+ arrow->shapeArrow(p1, arrowAngle1, getArrowSize());
+ arrow->setPen(RS_Pen(RS2::FlagInvalid));
+ arrow->setLayer(NULL);
+ addEntity(arrow);
+ }
+
+ if (arrow2)
+ {
+ // arrow 2:
+ arrow = new RS_Solid(this, sd);
+ arrow->shapeArrow(p2, arrowAngle2, getArrowSize());
+ arrow->setPen(RS_Pen(RS2::FlagInvalid));
+ arrow->setLayer(NULL);
+ addEntity(arrow);
+ }
+
+ // Text label:
+ RS_TextData textData;
+ Vector textPos;
double dimAngle1 = dimensionLine->getAngle1();
double textAngle;
- bool corrected=false;
+ bool corrected = false;
textAngle = RS_Math::makeAngleReadable(dimAngle1, true, &corrected);
- if (data.middleOfText.valid && !forceAutoText) {
- textPos = data.middleOfText;
- } else {
- textPos = dimensionLine->getMiddlepoint();
-
- Vector distV;
-
- // rotate text so it's readable from the bottom or right (ISO)
- // quadrant 1 & 4
- if (corrected) {
- distV.setPolar(dimgap + dimtxt/2.0, dimAngle1-M_PI/2.0);
- } else {
- distV.setPolar(dimgap + dimtxt/2.0, dimAngle1+M_PI/2.0);
- }
-
- // move text away from dimension line:
- textPos+=distV;
- //// the next update should still be able to adjust this
- //// auto text position. leave it invalid
+ if (data.middleOfText.valid && !forceAutoText)
+ {
+ textPos = data.middleOfText;
+ }
+ else
+ {
+ textPos = dimensionLine->getMiddlepoint();
+ Vector distV;
+
+ // rotate text so it's readable from the bottom or right (ISO)
+ // quadrant 1 & 4
+ if (corrected)
+ distV.setPolar(dimgap + dimtxt / 2.0, dimAngle1 - M_PI / 2.0);
+ else
+ distV.setPolar(dimgap + dimtxt / 2.0, dimAngle1 + M_PI / 2.0);
+
+ // move text away from dimension line:
+ textPos += distV;
+ //// the next update should still be able to adjust this
+ //// auto text position. leave it invalid
data.middleOfText = textPos;
- }
-
- textData = RS_TextData(textPos,
- dimtxt, 30.0,
- RS2::VAlignMiddle,
- RS2::HAlignCenter,
- RS2::LeftToRight,
- RS2::Exact,
- 1.0,
- getLabel(),
- "standard",
- textAngle);
-
- RS_Text* text = new RS_Text(this, textData);
-
- // move text to the side:
- Vector distH;
- if (text->getUsedTextWidth()>distance) {
- distH.setPolar(text->getUsedTextWidth()/2.0
- +distance/2.0+dimgap, textAngle);
- text->move(distH);
- }
- text->setPen(RS_Pen(RS2::FlagInvalid));
- text->setLayer(NULL);
- addEntity(text);
+ }
+
+ textData = RS_TextData(textPos, dimtxt, 30.0, RS2::VAlignMiddle, RS2::HAlignCenter,
+ RS2::LeftToRight, RS2::Exact, 1.0, getLabel(), "standard", textAngle);
+#if 0
+printf("--> %s\n", getLabel().toAscii().data());
+#endif
+
+ RS_Text * text = new RS_Text(this, textData);
+
+ // move text to the side:
+ Vector distH;
+
+ if (text->getUsedTextWidth() > distance)
+ {
+ distH.setPolar(text->getUsedTextWidth() / 2.0 + distance / 2.0 + dimgap, textAngle);
+ text->move(distH);
+ }
+
+ text->setPen(RS_Pen(RS2::FlagInvalid));
+ text->setLayer(NULL);
+ addEntity(text);
}
Vector RS_Dimension::getDefinitionPoint()