X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintDistance.cpp;h=719e4fcd282e48eb3a4e8b34d011cefe561e93f1;hb=745c72679f6346375d5e886b25cc3865f3c4daae;hp=e75dcde94be98107862445248b2f20f5319ab821;hpb=ded5bcb481e90e9df0738c0850d8398586160fc0;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index e75dcde94..719e4fcd2 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2021 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,16 +12,16 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "SketchPlugin_ConstraintDistance.h" #include #include #include +#include #include #include @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -62,6 +63,11 @@ void SketchPlugin_ConstraintDistance::initAttributes() data()->addAttribute(SketchPlugin_ConstraintDistance::LOCATION_TYPE_ID(), ModelAPI_AttributeInteger::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID()); + + AttributePtr anAttr = data()->addAttribute(SketchPlugin_ConstraintDistance::DIRECTION_ID(), + GeomDataAPI_Dir::typeId()); + anAttr->setIsArgument(false); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), DIRECTION_ID()); } void SketchPlugin_ConstraintDistance::colorConfigInfo(std::string& theSection, std::string& theName, @@ -94,11 +100,27 @@ AISObjectPtr SketchPlugin_ConstraintDistance::getAISObject(AISObjectPtr thePrevi return thePrevious; AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this, - sketch()->coordinatePlane(), + sketch(), thePrevious); + if (anAIS.get() && !thePrevious.get()) + SketchPlugin_Tools::setDimensionColor(anAIS); return anAIS; } +static std::shared_ptr getLine(DataPtr theData, const std::string& theAttrName) +{ + FeaturePtr aLineFeature = SketcherPrs_Tools::getFeatureLine(theData, theAttrName); + if (!aLineFeature) + return GeomLine2dPtr(); + + std::shared_ptr aStart = std::dynamic_pointer_cast( + aLineFeature->attribute(SketchPlugin_Line::START_ID())); + std::shared_ptr aEnd = std::dynamic_pointer_cast( + aLineFeature->attribute(SketchPlugin_Line::END_ID())); + + return GeomLine2dPtr(new GeomAPI_Lin2d(aStart->x(), aStart->y(), aEnd->x(), aEnd->y())); +} + double SketchPlugin_ConstraintDistance::calculateCurrentDistance() { double aDistance = -1.; @@ -110,25 +132,39 @@ double SketchPlugin_ConstraintDistance::calculateCurrentDistance() std::shared_ptr aPointB = SketcherPrs_Tools::getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_B(), aPlane); + GeomPnt2dPtr aGeomPntA, aGeomPntB; + GeomLine2dPtr aLine; if (aPointA.get() && aPointB.get()) { // both points - aDistance = aPointA->pnt()->distance(aPointB->pnt()); + aGeomPntA = aPointA->pnt(); + aGeomPntB = aPointB->pnt(); } else { - FeaturePtr aLineFeature; - std::shared_ptr aLine; if (!aPointA.get() && aPointB.get()) { //Line and point - aLineFeature = SketcherPrs_Tools::getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_A()); - aLine = std::dynamic_pointer_cast(aLineFeature); - if (aLine.get()) { - aDistance = aLine->distanceToPoint(aPointB->pnt()); - } + aLine = getLine(aData, SketchPlugin_Constraint::ENTITY_A()); + aGeomPntB = aPointB->pnt(); + aGeomPntA = aLine ? aLine->project(aGeomPntB) : GeomPnt2dPtr(); } else if (aPointA.get() && !aPointB.get()) { // Point and line - aLineFeature = SketcherPrs_Tools::getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_B()); - aLine = std::dynamic_pointer_cast(aLineFeature); - if (aLine.get()) { - aDistance = aLine->distanceToPoint(aPointA->pnt()); - } + aLine = getLine(aData, SketchPlugin_Constraint::ENTITY_B()); + aGeomPntA = aPointA->pnt(); + aGeomPntB = aLine ? aLine->project(aGeomPntA) : GeomPnt2dPtr(); } } + + if (aGeomPntA.get() && aGeomPntB.get()) { + aDistance = aGeomPntA->distance(aGeomPntB); + if (aDistance < tolerance) + aDistance = 0.0; + } + + // keep the direction between arguments for processing of the zero distance + std::shared_ptr aPointPointDir = + std::dynamic_pointer_cast(attribute(DIRECTION_ID())); + if (aDistance > tolerance) + aPointPointDir->setValue(aGeomPntB->x() - aGeomPntA->x(), aGeomPntB->y() - aGeomPntA->y(), 0.0); + else if (aLine) { + GeomDir2dPtr aLineDir = aLine->direction(); + aPointPointDir->setValue(-aLineDir->y(), aLineDir->x(), 0.0); + } + return aDistance; } @@ -168,7 +204,7 @@ void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) if (!aValueAttr->isInitialized()) { // only if it is not initialized, try to compute the current value double aDistance = calculateCurrentDistance(); - if (aDistance > 0) { // set as value the length of updated references + if (aDistance >= 0) { // set as value the length of updated references aValueAttr->setValue(aDistance); } } @@ -213,16 +249,16 @@ void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) } else return; - if (aEndPnt->distance(aStartPnt) < tolerance) - return; - myFlyoutUpdate = true; - std::shared_ptr aLineDir(new GeomAPI_Dir2d(aEndPnt->decreased(aStartPnt))); std::shared_ptr aFlyoutDir = aFlyoutPnt->xy()->decreased(aStartPnt); - - double X = aFlyoutDir->dot(aLineDir->xy()); - double Y = -aFlyoutDir->cross(aLineDir->xy()); - aFlyoutAttr->setValue(X, Y); + if (aEndPnt->distance(aStartPnt) >= tolerance) { + std::shared_ptr aLineDir(new GeomAPI_Dir2d(aEndPnt->decreased(aStartPnt))); + double X = aFlyoutDir->dot(aLineDir->xy()); + double Y = -aFlyoutDir->cross(aLineDir->xy()); + aFlyoutAttr->setValue(X, Y); + } + else + aFlyoutAttr->setValue(aFlyoutDir->x(), aFlyoutDir->y()); myFlyoutUpdate = false; } }