/**
 * 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();
}
Esempio n. 2
0
/**
 * 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();
}