X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Arc.cpp;h=7d285d079dd1cfa00f5c3494330be7ef428054cf;hb=c7a5ff20294ae8270bfb9120b8887f0c9959d658;hp=9de0fc49b97dc5851cf50f116c523120b22ac3af;hpb=caf028355772b8ed5cd35a400a879d009df7968b;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Arc.cpp b/src/SketchPlugin/SketchPlugin_Arc.cpp index 9de0fc49b..7d285d079 100644 --- a/src/SketchPlugin/SketchPlugin_Arc.cpp +++ b/src/SketchPlugin/SketchPlugin_Arc.cpp @@ -28,6 +28,7 @@ const double tolerance = 1e-7; const double paramTolerance = 1.e-4; const double PI =3.141592653589793238463; + SketchPlugin_Arc::SketchPlugin_Arc() : SketchPlugin_SketchEntity() { @@ -37,7 +38,6 @@ SketchPlugin_Arc::SketchPlugin_Arc() myXEndBefore = 0; myYEndBefore = 0; - myForwardDirection = true; myParamBefore = 0; } @@ -52,6 +52,12 @@ void SketchPlugin_Arc::initAttributes() data()->addAttribute(EXTERNAL_ID(), ModelAPI_AttributeSelection::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), EXTERNAL_ID()); + data()->addAttribute(INVERSED_ID(), ModelAPI_AttributeBoolean::typeId()); + AttributeBooleanPtr isInversed = + std::dynamic_pointer_cast(attribute(INVERSED_ID())); + if (!isInversed->isInitialized()) + isInversed->setValue(false); + // get the initial values if (anEndAttr->isInitialized()) { myXEndBefore = anEndAttr->x(); @@ -98,24 +104,26 @@ void SketchPlugin_Arc::execute() anEndAttr->setValue(aProjection); */ std::shared_ptr aEndPoint(aSketch->to3D(anEndAttr->x(), anEndAttr->y())); + AttributeBooleanPtr isInversed = + std::dynamic_pointer_cast(attribute(INVERSED_ID())); std::shared_ptr anXDir(new GeomAPI_Dir(aStartPoint->xyz()->decreased(aCenter->xyz()))); std::shared_ptr anAx2(new GeomAPI_Ax2(aCenter, aNormal, anXDir)); std::shared_ptr aCirc(new GeomAPI_Circ(anAx2, aCenter->distance(aStartPoint))); double aParameterNew = 0.0; if(aCirc->parameter(aEndPoint, paramTolerance, aParameterNew)) { - if(0 < myParamBefore && myParamBefore <= PI / 2.0 - && PI * 1.5 < aParameterNew && aParameterNew <= PI * 2.0) { - myForwardDirection = false; - } else if(PI * 1.5 < myParamBefore && myParamBefore <= PI * 2.0 - && 0 < aParameterNew && aParameterNew <= PI / 2.0) { - myForwardDirection = true; + if(0 <= myParamBefore && myParamBefore <= PI / 2.0 + && PI * 1.5 <= aParameterNew && aParameterNew <= PI * 2.0) { + isInversed->setValue(true); + } else if(PI * 1.5 <= myParamBefore && myParamBefore <= PI * 2.0 + && 0 <= aParameterNew && aParameterNew <= PI / 2.0) { + isInversed->setValue(false); } } myParamBefore = aParameterNew; std::shared_ptr aCircleShape; - if(myForwardDirection) { + if(!isInversed->value()) { aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc(aCenter, aStartPoint, aEndPoint, aNormal); } else { aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc(aCenter, aEndPoint, aStartPoint, aNormal); @@ -258,30 +266,31 @@ void SketchPlugin_Arc::attributeChanged(const std::string& theID) new GeomAPI_Circ2d(aCenterAttr->pnt(), aStartAttr->pnt())); std::shared_ptr aProjection = aCircleForArc->project(anEndAttr->pnt()); if (aProjection && anEndAttr->pnt()->distance(aProjection) > tolerance) { - // issue #855: trying to update only not-updated coordinate if it is possible - if (abs(myXEndBefore - anEndAttr->x()) < 1.e-10) { // keep Y unchanged - double aVy = aCenterAttr->y() - anEndAttr->y(); - double aVy2 = aVy * aVy; - double aR2 = aCircleForArc->radius() * aCircleForArc->radius(); - if (aVy2 <= aR2) { - double aDX = sqrt(aR2 - aVy * aVy); - if (anEndAttr->x() > aCenterAttr->x()) - aProjection->setX(aCenterAttr->x() + aDX); - else - aProjection->setX(aCenterAttr->x() - aDX); - aProjection->setY(anEndAttr->y()); - } - } else if (abs(myYEndBefore - anEndAttr->y()) < 1.e-10) { // keep X unchanged - double aVx = aCenterAttr->x() - anEndAttr->x(); - double aVx2 = aVx * aVx; - double aR2 = aCircleForArc->radius() * aCircleForArc->radius(); - if (aVx2 <= aR2) { - double aDY = sqrt(aR2 - aVx * aVx); - if (anEndAttr->y() > aCenterAttr->y()) - aProjection->setY(aCenterAttr->y() + aDY); - else - aProjection->setY(aCenterAttr->y() - aDY); - aProjection->setX(anEndAttr->x()); + if (!isStable()) { // issue #855: trying to update only not-updated coordinate if it is possible + if (fabs(myXEndBefore - anEndAttr->x()) < 1.e-10) { // keep Y unchanged + double aVy = aCenterAttr->y() - anEndAttr->y(); + double aVy2 = aVy * aVy; + double aR2 = aCircleForArc->radius() * aCircleForArc->radius(); + if (aVy2 <= aR2) { + double aDX = sqrt(aR2 - aVy * aVy); + if (anEndAttr->x() > aCenterAttr->x()) + aProjection->setX(aCenterAttr->x() + aDX); + else + aProjection->setX(aCenterAttr->x() - aDX); + aProjection->setY(anEndAttr->y()); + } + } else if (fabs(myYEndBefore - anEndAttr->y()) < 1.e-10) { // keep X unchanged + double aVx = aCenterAttr->x() - anEndAttr->x(); + double aVx2 = aVx * aVx; + double aR2 = aCircleForArc->radius() * aCircleForArc->radius(); + if (aVx2 <= aR2) { + double aDY = sqrt(aR2 - aVx * aVx); + if (anEndAttr->y() > aCenterAttr->y()) + aProjection->setY(aCenterAttr->y() + aDY); + else + aProjection->setY(aCenterAttr->y() - aDY); + aProjection->setX(anEndAttr->x()); + } } } @@ -310,3 +319,14 @@ void SketchPlugin_Arc::attributeChanged(const std::string& theID) myEndUpdate = false; } } + +void SketchPlugin_Arc::setReversed(bool isReversed) +{ + std::dynamic_pointer_cast(attribute(INVERSED_ID()))->setValue(isReversed); + myParamBefore = 0.0; +} + +bool SketchPlugin_Arc::isReversed() +{ + return std::dynamic_pointer_cast(attribute(INVERSED_ID()))->value(); +}