X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintDistance.cpp;h=fc0c36630d36f0e779175ad8d2632663572d2b0e;hb=ce72dd01645885d720b731795d676e2feeabc8d6;hp=391c1016234ecb1702b235963af676b10f31544e;hpb=d588149317acbc2bd8e6ceb00f8e82e806571775;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index 391c10162..fc0c36630 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 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 @@ -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, @@ -101,6 +107,20 @@ AISObjectPtr SketchPlugin_ConstraintDistance::getAISObject(AISObjectPtr thePrevi 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.; @@ -112,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; } @@ -170,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); } } @@ -215,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; } }