X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Arc.cpp;h=9de0fc49b97dc5851cf50f116c523120b22ac3af;hb=64fc7e4fdd63997ec7a502b233ef5f88186d5bbb;hp=312297733b333c670c75677006ee0d191e121d0e;hpb=59c066f4e0b62942f48f173c9e052658ca94eaf5;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Arc.cpp b/src/SketchPlugin/SketchPlugin_Arc.cpp index 312297733..9de0fc49b 100644 --- a/src/SketchPlugin/SketchPlugin_Arc.cpp +++ b/src/SketchPlugin/SketchPlugin_Arc.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -24,6 +25,8 @@ #include const double tolerance = 1e-7; +const double paramTolerance = 1.e-4; +const double PI =3.141592653589793238463; SketchPlugin_Arc::SketchPlugin_Arc() : SketchPlugin_SketchEntity() @@ -33,6 +36,9 @@ SketchPlugin_Arc::SketchPlugin_Arc() // default values myXEndBefore = 0; myYEndBefore = 0; + + myForwardDirection = true; + myParamBefore = 0; } void SketchPlugin_Arc::initAttributes() @@ -93,8 +99,28 @@ void SketchPlugin_Arc::execute() */ std::shared_ptr aEndPoint(aSketch->to3D(anEndAttr->x(), anEndAttr->y())); - std::shared_ptr aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc( - aCenter, aStartPoint, aEndPoint, aNormal); + 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; + } + } + myParamBefore = aParameterNew; + + std::shared_ptr aCircleShape; + if(myForwardDirection) { + aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc(aCenter, aStartPoint, aEndPoint, aNormal); + } else { + aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc(aCenter, aEndPoint, aStartPoint, aNormal); + } + if (aCircleShape) { std::shared_ptr aConstr2 = document()->createConstruction( data(), 1); @@ -178,30 +204,6 @@ void SketchPlugin_Arc::move(double theDeltaX, double theDeltaY) aPoint1->move(theDeltaX, theDeltaY); } -double SketchPlugin_Arc::distanceToPoint(const std::shared_ptr& thePoint) -{ - double aDelta = 0; - std::shared_ptr aData = data(); - - std::shared_ptr aPoint1 = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Arc::CENTER_ID())); - aDelta = aPoint1->pnt()->distance(thePoint); - - std::shared_ptr aPoint2 = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Arc::START_ID())); - double aDistance = aPoint2->pnt()->distance(thePoint); - if (aDelta < aDistance) - aDelta = aDistance; - - std::shared_ptr aPoint3 = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Arc::END_ID())); - aDistance = aPoint3->pnt()->distance(thePoint); - if (aDelta < aDistance) - aDelta = aDistance; - - return aDelta; -} - bool SketchPlugin_Arc::isFixed() { return data()->selection(EXTERNAL_ID())->context().get() != NULL; }