/** * Updates the sub entities of this dimension. Called when the * dimension or the position, alignment, .. changes. * * @param autoText Automatically reposition the text label */ void RS_DimAngular::update(bool /*autoText*/) { RS_DEBUG->print("RS_DimAngular::update"); clear(); if (isUndone()) { return; } // distance from entities (DIMEXO) double dimexo = getExtensionLineOffset(); // extension line extension (DIMEXE) double dimexe = getExtensionLineExtension(); // text height (DIMTXT) double dimtxt = getTextHeight(); // text distance to line (DIMGAP) double dimgap = getDimensionLineGap(); // find out center: RS_Vector center = getCenter(); if (!center.valid) { return; } double ang1 = 0.0; double ang2 = 0.0; bool reversed = false; RS_Vector p1; RS_Vector p2; getAngles(ang1, ang2, reversed, p1, p2); double rad = edata.definitionPoint4.distanceTo(center); RS_Line* line; RS_Vector dir; double len; double dist; // 1st extension line: dist = center.distanceTo(p1); len = rad - dist + dimexe; dir.setPolar(1.0, ang1); line = new RS_Line(this, RS_LineData(center + dir*dist + dir*dimexo, center + dir*dist + dir*len)); line->setPen(RS_Pen(RS2::FlagInvalid)); line->setLayer(NULL); addEntity(line); // 2nd extension line: dist = center.distanceTo(p2); len = rad - dist + dimexe; dir.setPolar(1.0, ang2); line = new RS_Line(this, RS_LineData(center + dir*dist + dir*dimexo, center + dir*dist + dir*len)); line->setPen(RS_Pen(RS2::FlagInvalid)); line->setLayer(NULL); addEntity(line); // Create dimension line (arc): RS_Arc* arc = new RS_Arc(this, RS_ArcData(center, rad, ang1, ang2, reversed)); arc->setPen(RS_Pen(RS2::FlagInvalid)); arc->setLayer(NULL); addEntity(arc); // length of dimension arc: double distance = arc->getLength(); // do we have to put the arrows outside of the arc? bool outsideArrows = (distance<getArrowSize()*2); // arrow angles: double arrowAngle1, arrowAngle2; double arrowAng; if (rad>1.0e-6) { arrowAng = getArrowSize() / rad; } else { arrowAng = 0.0; } RS_Vector v1, v2; if (!arc->isReversed()) { v1.setPolar(rad, arc->getAngle1()+arrowAng); } else { v1.setPolar(rad, arc->getAngle1()-arrowAng); } v1+=arc->getCenter(); arrowAngle1 = arc->getStartpoint().angleTo(v1); if (!arc->isReversed()) { v2.setPolar(rad, arc->getAngle2()-arrowAng); } else { v2.setPolar(rad, arc->getAngle2()+arrowAng); } v2+=arc->getCenter(); arrowAngle2 = arc->getEndpoint().angleTo(v2); if (!outsideArrows) { arrowAngle1 = arrowAngle1+M_PI; arrowAngle2 = arrowAngle2+M_PI; } // Arrows: RS_SolidData sd; RS_Solid* arrow; // arrow 1 arrow = new RS_Solid(this, sd); arrow->shapeArrow(arc->getStartpoint(), arrowAngle1, getArrowSize()); arrow->setPen(RS_Pen(RS2::FlagInvalid)); arrow->setLayer(NULL); addEntity(arrow); // arrow 2: arrow = new RS_Solid(this, sd); arrow->shapeArrow(arc->getEndpoint(), arrowAngle2, getArrowSize()); arrow->setPen(RS_Pen(RS2::FlagInvalid)); arrow->setLayer(NULL); addEntity(arrow); // text label: RS_TextData textData; RS_Vector textPos = arc->getMiddlePoint(); RS_Vector distV; double textAngle; double dimAngle1 = textPos.angleTo(arc->getCenter())-M_PI/2.0; // rotate text so it's readable from the bottom or right (ISO) // quadrant 1 & 4 if (dimAngle1>M_PI/2.0*3.0+0.001 || dimAngle1<M_PI/2.0+0.001) { distV.setPolar(dimgap, dimAngle1+M_PI/2.0); textAngle = dimAngle1; } // quadrant 2 & 3 else { distV.setPolar(dimgap, dimAngle1-M_PI/2.0); textAngle = dimAngle1+M_PI; } // move text away from dimension line: textPos+=distV; textData = RS_TextData(textPos, dimtxt, 30.0, RS2::VAlignBottom, RS2::HAlignCenter, RS2::LeftToRight, RS2::Exact, 1.0, getLabel(), "standard", textAngle); RS_Text* text = new RS_Text(this, textData); // move text to the side: text->setPen(RS_Pen(RS2::FlagInvalid)); text->setLayer(NULL); addEntity(text); calculateBorders(); }
/** * Updates the sub entities of this dimension. Called when the * text or the position, alignment, .. changes. * * @param autoText Automatically reposition the text label */ void RS_DimLinear::update(bool autoText) { RS_DEBUG->print("RS_DimLinear::update"); clear(); if (isUndone()) { return; } // general scale (DIMSCALE) double dimscale = getGeneralScale(); // distance from entities (DIMEXO) double dimexo = getExtensionLineOffset()*dimscale; // extension line extension (DIMEXE) double dimexe = getExtensionLineExtension()*dimscale; RS_LineData ld; double extAngle = edata.angle + (M_PI/2.0); // direction of dimension line RS_Vector dirDim; dirDim.setPolar(100.0, edata.angle); // direction of extension lines RS_Vector dirExt; dirExt.setPolar(100.0, extAngle); // construction line for dimension line RS_ConstructionLine dimLine( NULL, RS_ConstructionLineData(data.definitionPoint, data.definitionPoint + dirDim)); RS_Vector dimP1 = dimLine.getNearestPointOnEntity(edata.extensionPoint1); RS_Vector dimP2 = dimLine.getNearestPointOnEntity(edata.extensionPoint2); // Definitive dimension line: updateCreateDimensionLine(dimP1, dimP2, true, true, autoText); /* ld = RS_LineData(data.definitionPoint, dimP1); RS_Line* dimensionLine = new RS_Line(this, ld); addEntity(dimensionLine); */ RS_Vector vDimexo1, vDimexe1, vDimexo2, vDimexe2; vDimexe1.setPolar(dimexe, edata.extensionPoint1.angleTo(dimP1)); vDimexo1.setPolar(dimexo, edata.extensionPoint1.angleTo(dimP1)); vDimexe2.setPolar(dimexe, edata.extensionPoint2.angleTo(dimP2)); vDimexo2.setPolar(dimexo, edata.extensionPoint2.angleTo(dimP2)); if ((edata.extensionPoint1-dimP1).magnitude()<1e-6) { vDimexe1.setPolar(dimexe, data.definitionPoint.angleTo(dimP1)-M_PI/2.0); vDimexo1.setPolar(dimexo, data.definitionPoint.angleTo(dimP1)-M_PI/2.0); } if ((edata.extensionPoint2-dimP2).magnitude()<1e-6) { vDimexe2.setPolar(dimexe, data.definitionPoint.angleTo(dimP2)-M_PI/2.0); vDimexo2.setPolar(dimexo, data.definitionPoint.angleTo(dimP2)-M_PI/2.0); } // extension lines: ld = RS_LineData(edata.extensionPoint1+vDimexo1, dimP1+vDimexe1); RS_Line* line = new RS_Line(this, ld); line->setPen(RS_Pen(RS2::FlagInvalid)); line->setLayer(NULL); addEntity(line); ld = RS_LineData(edata.extensionPoint2+vDimexo2, dimP2+vDimexe2); //data.definitionPoint+vDimexe2); line = new RS_Line(this, ld); line->setPen(RS_Pen(RS2::FlagInvalid)); line->setLayer(NULL); addEntity(line); calculateBorders(); }
/** * Updates the sub entities of this dimension. Called when the * text or the position, alignment, .. changes. * * @param autoText Automatically reposition the text label */ void RS_DimLinear::updateDim(bool autoText) { RS_DEBUG->print("RS_DimLinear::update"); clear(); if (isUndone()) { return; } // general scale (DIMSCALE) double dimscale = getGeneralScale(); // distance from entities (DIMEXO) double dimexo = getExtensionLineOffset()*dimscale; // extension line extension (DIMEXE) double dimexe = getExtensionLineExtension()*dimscale; // direction of dimension line RS_Vector dirDim = RS_Vector::polar(100.0, edata.angle); // construction line for dimension line RS_ConstructionLine dimLine( nullptr, RS_ConstructionLineData(data.definitionPoint, data.definitionPoint + dirDim)); RS_Vector dimP1 = dimLine.getNearestPointOnEntity(edata.extensionPoint1); RS_Vector dimP2 = dimLine.getNearestPointOnEntity(edata.extensionPoint2); // Definitive dimension line: updateCreateDimensionLine(dimP1, dimP2, true, true, autoText); /* ld = RS_LineData(data.definitionPoint, dimP1); RS_Line* dimensionLine = new RS_Line(this, ld); addEntity(dimensionLine); */ double extAngle1, extAngle2; if ((edata.extensionPoint1-dimP1).magnitude()<1e-6) { if ((edata.extensionPoint2-dimP2).magnitude()<1e-6) { //boot extension points are in dimension line only rotate 90 extAngle2 = edata.angle + (M_PI_2); } else { //first extension point are in dimension line use second extAngle2 = edata.extensionPoint2.angleTo(dimP2); } extAngle1 = extAngle2; } else { //first extension point not are in dimension line use it extAngle1 = edata.extensionPoint1.angleTo(dimP1); if ((edata.extensionPoint2-dimP2).magnitude()<1e-6) extAngle2 = extAngle1; else extAngle2 = edata.extensionPoint2.angleTo(dimP2); } RS_Vector vDimexe1 = RS_Vector::polar(dimexe, extAngle1); RS_Vector vDimexe2 = RS_Vector::polar(dimexe, extAngle2); RS_Vector vDimexo1, vDimexo2; if (getFixedLengthOn()){ double dimfxl = getFixedLength(); double extLength = (edata.extensionPoint1-dimP1).magnitude(); if (extLength-dimexo > dimfxl) vDimexo1.setPolar(extLength - dimfxl, extAngle1); extLength = (edata.extensionPoint2-dimP2).magnitude(); if (extLength-dimexo > dimfxl) vDimexo2.setPolar(extLength - dimfxl, extAngle2); } else { vDimexo1.setPolar(dimexo, extAngle1); vDimexo2.setPolar(dimexo, extAngle2); } RS_Pen pen(getExtensionLineColor(), getExtensionLineWidth(), RS2::LineByBlock); // extension lines: RS_Line* line = new RS_Line{this, edata.extensionPoint1+vDimexo1, dimP1+vDimexe1}; line->setPen(pen); // line->setPen(RS_Pen(RS2::FlagInvalid)); line->setLayer(nullptr); addEntity(line); //data.definitionPoint+vDimexe2); line = new RS_Line{this, edata.extensionPoint2+vDimexo2, dimP2+vDimexe2}; line->setPen(pen); // line->setPen(RS_Pen(RS2::FlagInvalid)); line->setLayer(nullptr); addEntity(line); calculateBorders(); }
/** * Updates the sub entities of this dimension. Called when the * text or the position, alignment, .. changes. * * @param autoText Automatically reposition the text label */ void RS_DimAligned::updateDim(bool autoText) { RS_DEBUG->print("RS_DimAligned::update"); clear(); if (isUndone()) { return; } // general scale (DIMSCALE) double dimscale = getGeneralScale(); // distance from entities (DIMEXO) double dimexo = getExtensionLineOffset()*dimscale; // definition line definition (DIMEXE) double dimexe = getExtensionLineExtension()*dimscale; // text height (DIMTXT) //double dimtxt = getTextHeight(); // text distance to line (DIMGAP) //double dimgap = getDimensionLineGap(); // Angle from extension endpoints towards dimension line double extAngle = edata.extensionPoint2.angleTo(data.definitionPoint); // extension lines length double extLength = edata.extensionPoint2.distanceTo(data.definitionPoint); if (getFixedLengthOn()){ double dimfxl = getFixedLength(); if (extLength-dimexo > dimfxl) dimexo = extLength - dimfxl; } RS_Vector v1 = RS_Vector::polar(dimexo, extAngle); RS_Vector v2 = RS_Vector::polar(dimexe, extAngle); RS_Vector e1 = RS_Vector::polar(1.0, extAngle); RS_Pen pen(getExtensionLineColor(), getExtensionLineWidth(), RS2::LineByBlock); // Extension line 1: RS_Line* line = new RS_Line{this, edata.extensionPoint1 + v1, edata.extensionPoint1 + e1*extLength + v2}; //line->setLayerToActive(); //line->setPenToActive(); // line->setPen(RS_Pen(RS2::FlagInvalid)); line->setPen(pen); line->setLayer(nullptr); addEntity(line); // Extension line 2: line = new RS_Line{this, edata.extensionPoint2 + v1, edata.extensionPoint2 + e1*extLength + v2}; //line->setLayerToActive(); //line->setPenToActive(); // line->setPen(RS_Pen(RS2::FlagInvalid)); line->setPen(pen); line->setLayer(nullptr); addEntity(line); // Dimension line: updateCreateDimensionLine(edata.extensionPoint1 + e1*extLength, edata.extensionPoint2 + e1*extLength, true, true, autoText); calculateBorders(); }
/** * Updates the sub entities of this dimension. Called when the * text or the position, alignment, .. changes. * * @param autoText Automatically reposition the text label */ void RS_DimAligned::update(bool autoText) { RS_DEBUG->print("RS_DimAligned::update"); clear(); if (isUndone()) { return; } // general scale (DIMSCALE) double dimscale = getGeneralScale(); // distance from entities (DIMEXO) double dimexo = getExtensionLineOffset()*dimscale; // definition line definition (DIMEXE) double dimexe = getExtensionLineExtension()*dimscale; // text height (DIMTXT) //double dimtxt = getTextHeight(); // text distance to line (DIMGAP) //double dimgap = getDimensionLineGap(); // Angle from extension endpoints towards dimension line double extAngle = edata.extensionPoint2.angleTo(data.definitionPoint); // extension lines length double extLength = edata.extensionPoint2.distanceTo(data.definitionPoint); RS_Vector v1, v2, e1; RS_LineData ld; RS_Line* line; v1.setPolar(dimexo, extAngle); v2.setPolar(dimexe, extAngle); e1.setPolar(1.0, extAngle); // Extension line 1: ld = RS_LineData(edata.extensionPoint1 + v1, edata.extensionPoint1 + e1*extLength + v2); line = new RS_Line(this, ld); //line->setLayerToActive(); //line->setPenToActive(); line->setPen(RS_Pen(RS2::FlagInvalid)); line->setLayer(NULL); addEntity(line); // Extension line 2: ld = RS_LineData(edata.extensionPoint2 + v1, edata.extensionPoint2 + e1*extLength + v2); line = new RS_Line(this, ld); //line->setLayerToActive(); //line->setPenToActive(); line->setPen(RS_Pen(RS2::FlagInvalid)); line->setLayer(NULL); addEntity(line); // Dimension line: updateCreateDimensionLine(edata.extensionPoint1 + e1*extLength, edata.extensionPoint2 + e1*extLength, true, true, autoText); calculateBorders(); }