X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintDistance.cpp;h=16a0451d4044c1987e970bf4b56adea306ed4e8a;hb=15b221c8138e24bf0ecdf0e65b11755cfa8fa9e3;hp=4d299b6b01d848532fdda463e70a51b18271ccd6;hpb=5a67842979db286af5bb5015fe413d8b06c6587e;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index 4d299b6b0..16a0451d4 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-2019 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,10 +12,9 @@ // // 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" @@ -33,7 +32,10 @@ #include #include +#include #include +#include +#include #include @@ -54,6 +56,11 @@ 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()); } void SketchPlugin_ConstraintDistance::colorConfigInfo(std::string& theSection, std::string& theName, @@ -86,65 +93,11 @@ AISObjectPtr SketchPlugin_ConstraintDistance::getAISObject(AISObjectPtr thePrevi return thePrevious; AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this, - sketch()->coordinatePlane(), + sketch(), thePrevious); return anAIS; } -//************************************************************************************* -void SketchPlugin_ConstraintDistance::move(double theDeltaX, double theDeltaY) -{ - std::shared_ptr aData = data(); - if (!aData->isValid()) - return; - - // 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 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; -} - double SketchPlugin_ConstraintDistance::calculateCurrentDistance() { double aDistance = -1.; @@ -178,6 +131,32 @@ double SketchPlugin_ConstraintDistance::calculateCurrentDistance() 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() || @@ -193,7 +172,6 @@ void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) } } } 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 @@ -237,6 +215,7 @@ void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) 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);