From: mpv Date: Mon, 29 Aug 2016 09:11:27 +0000 (+0300) Subject: Fix for the issue #1695 : don't display circle on start point creation in arc by... X-Git-Tag: V_2.5.0~121 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=0e066909b98f8e3bad224956bfae0af3c077feb8;p=modules%2Fshaper.git Fix for the issue #1695 : don't display circle on start point creation in arc by passing point mode. --- diff --git a/src/SketchPlugin/SketchPlugin_Arc.cpp b/src/SketchPlugin/SketchPlugin_Arc.cpp index b4666ebca..ea436960b 100644 --- a/src/SketchPlugin/SketchPlugin_Arc.cpp +++ b/src/SketchPlugin/SketchPlugin_Arc.cpp @@ -208,26 +208,30 @@ AISObjectPtr SketchPlugin_Arc::getAISObject(AISObjectPtr thePrevious) std::shared_ptr aStartPoint(aSketch->to3D(aStartAttr->x(), aStartAttr->y())); std::shared_ptr aEndPoint = aStartPoint; if (aTypeAttr && aTypeAttr->isInitialized() && - aTypeAttr->value() == ARC_TYPE_THREE_POINTS() && aEndAttr->isInitialized() && - aEndAttr->pnt()->distance(aStartAttr->pnt()) > tolerance) { - aEndPoint = aSketch->to3D(aEndAttr->x(), aEndAttr->y()); - std::shared_ptr aPassedAttr = - std::dynamic_pointer_cast(data()->attribute(PASSED_POINT_ID())); - if (!aPassedAttr->isInitialized()) { // calculate the appropriate center for the presentation - // check that center is bad for the current start and end and must be recomputed - std::shared_ptr aCircleForArc(new GeomAPI_Circ2d( - aCenterAttr->pnt(), aStartAttr->pnt())); - std::shared_ptr aProjection = aCircleForArc->project(aEndAttr->pnt()); - if (!aProjection.get() || aEndAttr->pnt()->distance(aProjection) > tolerance) { - std::shared_ptr aDir = - aEndAttr->pnt()->xy()->decreased(aStartAttr->pnt()->xy())->multiplied(0.5); - double x = aDir->x(); - double y = aDir->y(); - aDir->setX(x - y); - aDir->setY(y + x); - std::shared_ptr aCenterXY = aStartAttr->pnt()->xy()->added(aDir); - aCenter = aSketch->to3D(aCenterXY->x(), aCenterXY->y()); + aTypeAttr->value() == ARC_TYPE_THREE_POINTS()) { + if (aEndAttr->isInitialized() && // + aEndAttr->pnt()->distance(aStartAttr->pnt()) > tolerance) { + aEndPoint = aSketch->to3D(aEndAttr->x(), aEndAttr->y()); + std::shared_ptr aPassedAttr = + std::dynamic_pointer_cast(data()->attribute(PASSED_POINT_ID())); + if (!aPassedAttr->isInitialized()) { // calculate the appropriate center for the presentation + // check that center is bad for the current start and end and must be recomputed + std::shared_ptr aCircleForArc(new GeomAPI_Circ2d( + aCenterAttr->pnt(), aStartAttr->pnt())); + std::shared_ptr aProjection = aCircleForArc->project(aEndAttr->pnt()); + if (!aProjection.get() || aEndAttr->pnt()->distance(aProjection) > tolerance) { + std::shared_ptr aDir = + aEndAttr->pnt()->xy()->decreased(aStartAttr->pnt()->xy())->multiplied(0.5); + double x = aDir->x(); + double y = aDir->y(); + aDir->setX(x - y); + aDir->setY(y + x); + std::shared_ptr aCenterXY = aStartAttr->pnt()->xy()->added(aDir); + aCenter = aSketch->to3D(aCenterXY->x(), aCenterXY->y()); + } } + } else { // issue #1695: don't display circle if initialized only start point + return AISObjectPtr(); } } AttributeBooleanPtr isInversed =