X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fbase%2Frs_dimension.cpp;h=01097c6c6f443ce8ca1a77b21e1815ed81604015;hb=d774c2655ba2c3657a565f325411144452392277;hp=e99f2990910f25dbb8b15c839c078d3277e567aa;hpb=16ce54abf01ca3032e42a5bb11a4afcf9014dcca;p=architektonas diff --git a/src/base/rs_dimension.cpp b/src/base/rs_dimension.cpp index e99f299..01097c6 100644 --- a/src/base/rs_dimension.cpp +++ b/src/base/rs_dimension.cpp @@ -38,12 +38,12 @@ RS_DimensionData RS_Dimension::getData() const 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); } /** @@ -56,29 +56,25 @@ Vector RS_Dimension::getNearestSelectedRef(const Vector & coord, double * 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 = ""; - } - // No text prints actual measurement: - else if (data.text=="") { - ret = getMeasuredLabel(); - } + QString ret = ""; - // 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; } /** @@ -94,123 +90,125 @@ void RS_Dimension::setLabel(const QString & l) * * @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 = (distancesetPen(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; + // 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 = (distancesetPen(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; 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); + + 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()