/** * Recompute definition point if extension point(s) have changed. */ void RDimRotatedData::recomputeDefinitionPoint( const RVector& oldExtPoint1, const RVector& oldExtPoint2, const RVector& newExtPoint1, const RVector& newExtPoint2) { Q_UNUSED(oldExtPoint1) Q_UNUSED(oldExtPoint2) Q_UNUSED(newExtPoint2) RVector dirDim = RVector::createPolar(1.0, rotation); // construction line for dimension line RLine dimLine(definitionPoint, definitionPoint + dirDim); RVector dimP1 = dimLine.getClosestPointOnShape(newExtPoint1, false); RVector dimP2 = dimLine.getClosestPointOnShape(newExtPoint2, false); // make sure the dimension line is movable if dimension point == extension point if (dimP1.equalsFuzzy(newExtPoint1) || dimP1.equalsFuzzy(newExtPoint2)) { dimP1 = RVector::getAverage(dimP1, dimP2); } if (dimP1.isValid()) { definitionPoint = dimP1; } }
/** * @return Automatically created label for the default * measurement of this dimension. */ QString RS_DimLinear::getMeasuredLabel() { // direction of dimension line RS_Vector dirDim; dirDim.setPolar(100.0, edata.angle); // 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: double dist = dimP1.distanceTo(dimP2); RS_Graphic* graphic = getGraphic(); QString ret; if (graphic!=NULL) { ret = RS_Units::formatLinear(dist, graphic->getUnit(), graphic->getLinearFormat(), graphic->getLinearPrecision()); } else { ret = QString("%1").arg(dist); } return ret; }
QList<RVector> RDimRotatedData::getDimPoints() const { QList<RVector> ret; RVector dirDim = RVector::createPolar(1.0, rotation); // construction line for dimension line RLine dimLine(definitionPoint, definitionPoint + dirDim); ret.append(dimLine.getClosestPointOnShape(extensionPoint1, false)); ret.append(dimLine.getClosestPointOnShape(extensionPoint2, false)); return ret; }
double RDimRotatedData::getMeasuredValue() const { // direction of dimension line RVector dirDim; dirDim.setPolar(1.0, rotation); RLine dimLine(definitionPoint, definitionPoint + dirDim); RVector dimP1 = dimLine.getClosestPointOnShape(extensionPoint1, false); RVector dimP2 = dimLine.getClosestPointOnShape(extensionPoint2, false); // Definitive dimension line: return dimP1.getDistanceTo(dimP2); }
/** * @return Automatically created label for the default * measurement of this dimension. */ QString RS_DimLinear::getMeasuredLabel() { // 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: double dist = dimP1.distanceTo(dimP2) * getGeneralFactor(); RS_Graphic* graphic = getGraphic(); QString ret; if (graphic) { int dimlunit = getGraphicVariableInt("$DIMLUNIT", 2); int dimdec = getGraphicVariableInt("$DIMDEC", 4); int dimzin = getGraphicVariableInt("$DIMZIN", 1); RS2::LinearFormat format = graphic->getLinearFormat(dimlunit); ret = RS_Units::formatLinear(dist, RS2::None, format, dimdec); if (format == RS2::Decimal) ret = stripZerosLinear(ret, dimzin); //verify if units are decimal and comma separator if (format == RS2::Decimal || format == RS2::ArchitecturalMetric){ if (getGraphicVariableInt("$DIMDSEP", 0) == 44) ret.replace(QChar('.'), QChar(',')); } } else { ret = QString("%1").arg(dist); } return ret; }
/** * 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(); }