X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintDistance.cpp;h=fc0c36630d36f0e779175ad8d2632663572d2b0e;hb=ce72dd01645885d720b731795d676e2feeabc8d6;hp=eef61d0a900e7802f6842308c7c96b7b2df725da;hpb=423c10234142d14d0d5de89383f2f96a4ec5930f;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index eef61d0a9..fc0c36630 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp @@ -1,13 +1,27 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: SketchPlugin_ConstraintDistance.cpp -// Created: 23 May 2014 -// Author: Artem ZHIDKOV +// 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "SketchPlugin_ConstraintDistance.h" #include #include #include +#include #include #include @@ -17,9 +31,13 @@ #include #include #include +#include #include +#include #include +#include +#include #include @@ -40,6 +58,16 @@ void SketchPlugin_ConstraintDistance::initAttributes() data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(SIGNED(), ModelAPI_AttributeBoolean::typeId()); + + 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, @@ -72,63 +100,25 @@ 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; } -//************************************************************************************* -void SketchPlugin_ConstraintDistance::move(double theDeltaX, double theDeltaY) +static std::shared_ptr getLine(DataPtr theData, const std::string& theAttrName) { - std::shared_ptr aData = data(); - if (!aData->isValid()) - return; + FeaturePtr aLineFeature = SketcherPrs_Tools::getFeatureLine(theData, theAttrName); + if (!aLineFeature) + return GeomLine2dPtr(); - // Recalculate a shift of flyout point in terms of local coordinates - std::shared_ptr aDir(new GeomAPI_XY(theDeltaX, theDeltaY)); - std::shared_ptr aPlane = SketchPlugin_Sketch::plane(sketch()); - std::shared_ptr aPointA = SketcherPrs_Tools::getFeaturePoint( - data(), SketchPlugin_Constraint::ENTITY_A(), aPlane); - std::shared_ptr aPointB = SketcherPrs_Tools::getFeaturePoint( - data(), SketchPlugin_Constraint::ENTITY_B(), aPlane); - - std::shared_ptr aStartPnt; - std::shared_ptr aEndPnt; - if (aPointA && aPointB) { - aStartPnt = aPointA->pnt()->xy(); - aEndPnt = aPointB->pnt()->xy(); - } else if (aPointA) { - FeaturePtr aLine = SketcherPrs_Tools::getFeatureLine(data(), - SketchPlugin_Constraint::ENTITY_B()); - if (!aLine) - return; - std::shared_ptr aPoint = aPointA->pnt(); - aStartPnt = aPoint->xy(); - aEndPnt = SketcherPrs_Tools::getProjectionPoint(aLine, aPoint)->xy(); - } else if (aPointB) { - FeaturePtr aLine = SketcherPrs_Tools::getFeatureLine(data(), - SketchPlugin_Constraint::ENTITY_A()); - if (!aLine) - return; - std::shared_ptr aPoint = aPointB->pnt(); - aStartPnt = SketcherPrs_Tools::getProjectionPoint(aLine, aPoint)->xy(); - aEndPnt = aPoint->xy(); - } else - return; + 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())); - std::shared_ptr aLineDir(new GeomAPI_Dir2d(aEndPnt->decreased(aStartPnt))); - double dX = aDir->dot(aLineDir->xy()); - double dY = -aDir->cross(aLineDir->xy()); - - std::shared_ptr aPoint = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT())); - myFlyoutUpdate = true; - if (aPoint->isInitialized()) { - aPoint->setValue(aPoint->x() + dX, aPoint->y() + dY); - } else { - aPoint->setValue(dX, dY); - } - myFlyoutUpdate = false; + return GeomLine2dPtr(new GeomAPI_Lin2d(aStart->x(), aStart->y(), aEnd->x(), aEnd->y())); } double SketchPlugin_ConstraintDistance::calculateCurrentDistance() @@ -142,28 +132,68 @@ 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; } +bool SketchPlugin_ConstraintDistance::areAttributesInitialized() +{ + std::shared_ptr aData = data(); + std::shared_ptr aPlane = SketchPlugin_Sketch::plane(sketch()); + std::shared_ptr aPointA = + SketcherPrs_Tools::getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_A(), aPlane); + std::shared_ptr aPointB = + SketcherPrs_Tools::getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_B(), aPlane); + + if (!aPointA && !aPointB) + return false; + else if (aPointA || aPointB) { + FeaturePtr aLine; + if (!aPointA) + aLine = SketcherPrs_Tools::getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_A()); + else if (!aPointB) + aLine = SketcherPrs_Tools::getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_B()); + else // both points are initialized + return true; + + if (!aLine || aLine->getKind() != SketchPlugin_Line::ID()) + return false; + } + return true; +} + void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) { if (theID == SketchPlugin_Constraint::ENTITY_A() || @@ -174,12 +204,11 @@ 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); } } } else if (theID == SketchPlugin_Constraint::FLYOUT_VALUE_PNT() && !myFlyoutUpdate) { - myFlyoutUpdate = true; // Recalculate flyout point in local coordinates of the distance constraint: // the X coordinate is a length of projection of the flyout point on the // line binding two distanced points @@ -220,15 +249,16 @@ void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) } else return; - if (aEndPnt->distance(aStartPnt) < tolerance) - return; - - std::shared_ptr aLineDir(new GeomAPI_Dir2d(aEndPnt->decreased(aStartPnt))); + myFlyoutUpdate = true; 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; } }