QList<QSharedPointer<RShape> > RDimAlignedData::getShapes(const RBox& queryBox, bool ignoreComplex) const { Q_UNUSED(queryBox) Q_UNUSED(ignoreComplex) QSharedPointer<RBlockReferenceEntity> dimBlockReference = getDimensionBlockReference(); if (!dimBlockReference.isNull()) { return dimBlockReference->getShapes(queryBox, ignoreComplex); } QList<QSharedPointer<RShape> > ret; double dimexo = getDimexo(); double dimexe = getDimexe(); RLine extensionLine(extensionPoint1, extensionPoint2); // angle from extension endpoints towards dimension line double extAngle = extensionPoint1.getAngleTo(extensionPoint2); RS::Side side = extensionLine.getSideOfPoint(definitionPoint); if (side==RS::RightHand) { extAngle -= M_PI/2.0; } else { extAngle += M_PI/2.0; } // extension lines length double extLength = extensionLine.getDistanceTo(definitionPoint, false); RVector v1, v2, e1; RLine line; // from entity to inner point of extension line: v1.setPolar(dimexo, extAngle); // from entity to outer point of extension line: v2.setPolar(dimexe, extAngle); e1.setPolar(1.0, extAngle); refDefinitionPoint1 = extensionPoint1 + e1*extLength; refDefinitionPoint2 = extensionPoint2 + e1*extLength; definitionPoint = refDefinitionPoint1; // extension line 1: line = RLine(extensionPoint1 + v1, extensionPoint1 + e1*extLength + v2); ret.append(QSharedPointer<RLine>(new RLine(line))); // extension line 2: line = RLine(extensionPoint2 + v1, extensionPoint2 + e1*extLength + v2); ret.append(QSharedPointer<RLine>(new RLine(line))); // dimension line: ret.append(getDimensionLineShapes( extensionPoint1 + e1*extLength, extensionPoint2 + e1*extLength, true, true)); return ret; }
QList<QSharedPointer<RShape> > RDimRotatedData::getShapes(const RBox& queryBox, bool ignoreComplex) const { Q_UNUSED(queryBox) Q_UNUSED(ignoreComplex) QList<QSharedPointer<RShape> > ret; double dimexo = getDimexo(); double dimexe = getDimexe(); QList<RVector> l = getDimPoints(); RVector dimP1 = l.at(0); RVector dimP2 = l.at(1); // definitive dimension line: ret += getDimensionLineShapes(dimP1, dimP2, true, true); // extension lines: RVector vDimexo1, vDimexe1, vDimexo2, vDimexe2; if (!extensionPoint1.equalsFuzzy(dimP1)) { double a1 = extensionPoint1.getAngleTo(dimP1); vDimexe1.setPolar(dimexe, a1); vDimexo1.setPolar(dimexo, a1); RLine line(extensionPoint1+vDimexo1, dimP1+vDimexe1); ret.append(QSharedPointer<RLine>(new RLine(line))); } if (!extensionPoint2.equalsFuzzy(dimP2)) { double a2 = extensionPoint2.getAngleTo(dimP2); vDimexe2.setPolar(dimexe, a2); vDimexo2.setPolar(dimexo, a2); RLine line(extensionPoint2+vDimexo2, dimP2+vDimexe2); ret.append(QSharedPointer<RLine>(new RLine(line))); } return ret; }
QList<QSharedPointer<RShape> > RDimAngularData::getShapes(const RBox& queryBox, bool ignoreComplex, bool segment) const { Q_UNUSED(queryBox) Q_UNUSED(ignoreComplex) Q_UNUSED(segment) QSharedPointer<RBlockReferenceEntity> dimBlockReference = getDimensionBlockReference(); if (!dimBlockReference.isNull()) { return dimBlockReference->getShapes(queryBox, ignoreComplex); } QList<QSharedPointer<RShape> > ret; double dimexo = getDimexo(); double dimexe = getDimexe(); double dimtxt = getDimtxt(); double dimgap = getDimgap(); double dimasz = getDimasz(); // find out center: RVector center = getCenter(); if (!center.isValid()) { return ret; } double ang1 = 0.0; double ang2 = 0.0; bool reversed = false; RVector p1; RVector p2; getAngles(ang1, ang2, reversed, p1, p2); double rad = dimArcPosition.getDistanceTo(center); RLine line; RVector dir; double len; double dist; // 1st extension line: dist = center.getDistanceTo2D(p1); len = rad - dist + dimexe; dir.setPolar(1.0, ang1); line = RLine(center + dir*dist + dir*dimexo, center + dir*dist + dir*len); ret.append(QSharedPointer<RShape>(new RLine(line))); // 2nd extension line: dist = center.getDistanceTo2D(p2); len = rad - dist + dimexe; dir.setPolar(1.0, ang2); line = RLine(center + dir*dist + dir*dimexo, center + dir*dist + dir*len); ret.append(QSharedPointer<RShape>(new RLine(line))); // Create dimension line (arc): RArc arc(center, rad, ang1, ang2, reversed); ret.append(QSharedPointer<RShape>(new RArc(arc))); // length of dimension arc: double distance = arc.getLength(); // do we have to put the arrows outside of the arc? bool outsideArrows = (distance<dimasz*2); // arrow angles: double arrowAngle1, arrowAngle2; double arrowAng; if (rad>1.0e-6) { arrowAng = getDimasz() / rad; } else { arrowAng = 0.0; } if (outsideArrows) { arrowAngle1 = arc.getDirection1(); arrowAngle2 = arc.getDirection2(); } else { RVector v1, v2; if (!arc.isReversed()) { v1.setPolar(rad, arc.getStartAngle()+arrowAng); } else { v1.setPolar(rad, arc.getStartAngle()-arrowAng); } v1+=arc.getCenter(); arrowAngle1 = arc.getStartPoint().getAngleTo(v1); if (!arc.isReversed()) { v2.setPolar(rad, arc.getEndAngle()-arrowAng); } else { v2.setPolar(rad, arc.getEndAngle()+arrowAng); } v2+=arc.getCenter(); arrowAngle2 = arc.getEndPoint().getAngleTo(v2); arrowAngle1 = arrowAngle1+M_PI; arrowAngle2 = arrowAngle2+M_PI; } // Arrows: //RTriangle arrow = RTriangle::createArrow(arc.getStartPoint(), arrowAngle1, dimasz); QList<QSharedPointer<RShape> > arrow = getArrow(arc.getStartPoint(), arrowAngle1); ret.append(arrow); //arrow = RTriangle::createArrow(arc.getEndPoint(), arrowAngle2, dimasz); arrow = getArrow(arc.getEndPoint(), arrowAngle2); ret.append(arrow); //ret.append(QSharedPointer<RShape>(new RTriangle(arrow))); //RVector oldMot = textPosition; //textPosition = RVector(0,0); //defaultAngle = 0.0; //dimLineLength = RNANDOUBLE; //getTextData(); //textPosition = oldMot; RVector textPos = arc.getMiddlePoint(); double dimAngle1 = textPos.getAngleTo(arc.getCenter())-M_PI/2.0; if (!autoTextPos) { dimAngle1 = textPositionCenter.getAngleTo(arc.getCenter())-M_PI/2.0; } RVector distV; double textAngle; // 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 + dimtxt/2, dimAngle1+M_PI/2.0); textAngle = dimAngle1; } // quadrant 2 & 3 else { distV.setPolar(dimgap + dimtxt/2, dimAngle1-M_PI/2.0); textAngle = dimAngle1+M_PI; } if (!autoTextPos) { textPos = textPositionCenter; } else { // move text away from dimension line: textPos+=distV; textPositionCenter = textPos; } defaultAngle = textAngle; //getTextData(); //textData.rotate(textAngle, RVector(0,0)); //textData.move(textPos); return ret; }