X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintDistance.cpp;h=3891a2c6cc5eed9a0a013533322e3f5280036d11;hb=61cd0845b41710ad4e7eae07cc6106904be67b9f;hp=b7f708a9c59578efdec9e6d06e6b9690e1c46058;hpb=a1a507560dbc3226167cc11fc27b5caba672edba;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index b7f708a9c..3891a2c6c 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp @@ -12,8 +12,10 @@ #include #include +#include #include #include +#include #include #include @@ -21,11 +23,14 @@ #include +#include + const double tolerance = 1e-7; SketchPlugin_ConstraintDistance::SketchPlugin_ConstraintDistance() { + myFlyoutUpdate = false; } //************************************************************************************* @@ -69,6 +74,11 @@ bool SketchPlugin_ConstraintDistance::compute(const std::string& theAttributeId) if (!sketch()) return false; + std::shared_ptr aFlyOutAttr = std::dynamic_pointer_cast< + GeomDataAPI_Point2D>(attribute(theAttributeId)); + if (fabs(aFlyOutAttr->x()) >= tolerance || fabs(aFlyOutAttr->y()) >= tolerance) + return false; + DataPtr aData = data(); std::shared_ptr aPoint_A = SketcherPrs_Tools::getFeaturePoint( aData, SketchPlugin_Constraint::ENTITY_A()); @@ -82,30 +92,27 @@ bool SketchPlugin_ConstraintDistance::compute(const std::string& theAttributeId) aPnt_A = aPoint_A->pnt(); aPnt_B = aPoint_B->pnt(); } else if (!aPoint_A && aPoint_B) { - //std::shared_ptr aLine = SketcherPrs_Tools::getFeatureLine( - // aData, SketchPlugin_Constraint::ENTITY_A()); - //if (aLine) { - // aPnt_B = aPoint_B->pnt(); - // aPnt_A = SketcherPrs_Tools::getProjectionPoint(aLine, aPnt_B); - //} + FeaturePtr aLine = SketcherPrs_Tools::getFeatureLine( + aData, SketchPlugin_Constraint::ENTITY_A()); + if (aLine) { + aPnt_B = aPoint_B->pnt(); + aPnt_A = SketcherPrs_Tools::getProjectionPoint(aLine, aPnt_B); + } } else if (aPoint_A && !aPoint_B) { - //std::shared_ptr aLine = SketcherPrs_Tools::getFeatureLine( - // aData, SketchPlugin_Constraint::ENTITY_B()); - //if (aLine) { - // aPnt_A = aPoint_A->pnt(); - // aPnt_B = SketcherPrs_Tools::getProjectionPoint(aLine, aPnt_A); - //} + FeaturePtr aLine = SketcherPrs_Tools::getFeatureLine( + aData, SketchPlugin_Constraint::ENTITY_B()); + if (aLine) { + aPnt_A = aPoint_A->pnt(); + aPnt_B = SketcherPrs_Tools::getProjectionPoint(aLine, aPnt_A); + } } if (!aPnt_A || !aPnt_B) return false; - std::shared_ptr aFlyOutAttr = std::dynamic_pointer_cast< - GeomDataAPI_Point2D>(aData->attribute(theAttributeId)); - std::shared_ptr aPoint1 = sketch()->to3D(aPnt_A->x(), aPnt_A->y()); std::shared_ptr aPoint2 = sketch()->to3D(aPnt_B->x(), aPnt_B->y()); // it is not possible to create lin2d on the points with equal position - if (aPoint1->distance(aPoint1) < tolerance) + if (aPoint1->distance(aPoint2) < tolerance) return false; std::shared_ptr aLine = std::shared_ptr(new GeomAPI_Lin2d(aPnt_A, aPnt_B)); @@ -141,9 +148,46 @@ void SketchPlugin_ConstraintDistance::move(double theDeltaX, double theDeltaY) 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 aPointA = SketcherPrs_Tools::getFeaturePoint( + data(), SketchPlugin_Constraint::ENTITY_A()); + std::shared_ptr aPointB = SketcherPrs_Tools::getFeaturePoint( + data(), SketchPlugin_Constraint::ENTITY_B()); + + 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())); - aPoint->move(theDeltaX, theDeltaY); + myFlyoutUpdate = true; + aPoint->setValue(aPoint->x() + dX, aPoint->y() + dY); + myFlyoutUpdate = false; } double SketchPlugin_ConstraintDistance::calculateCurrentDistance() const @@ -156,27 +200,30 @@ double SketchPlugin_ConstraintDistance::calculateCurrentDistance() const std::shared_ptr aPointB = SketcherPrs_Tools::getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_B()); - if (aPointA && aPointB) { // both points + if (aPointA.get() && aPointB.get()) { // both points aDistance = aPointA->pnt()->distance(aPointB->pnt()); } else { -// if (!aPointA && aPointB) { //Line and point -// std::shared_ptr aLine = -// SketcherPrs_Tools::getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_A()); -// if (aLine) { -// aDistance = aLine->distanceToPoint(aPointB->pnt()); -// } -// } else if (aPointA && !aPointB) { // Point and line -// std::shared_ptr aLine = -// SketcherPrs_Tools::getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_B()); -// if (aLine) { -// aDistance = aLine->distanceToPoint(aPointA->pnt()); -// } -// } + 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()); + } + } 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()); + } + } } return aDistance; } -void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) { +void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) +{ if (theID == SketchPlugin_Constraint::ENTITY_A() || theID == SketchPlugin_Constraint::ENTITY_B()) { @@ -188,6 +235,53 @@ void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) 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 + // or a line of projection of the distanced point onto the distanced segment + // the Y coordinate is a distance from the flyout point to the line + std::shared_ptr aFlyoutAttr = + std::dynamic_pointer_cast( + attribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT())); + std::shared_ptr aFlyoutPnt = aFlyoutAttr->pnt(); + + std::shared_ptr aPointA = SketcherPrs_Tools::getFeaturePoint( + data(), SketchPlugin_Constraint::ENTITY_A()); + std::shared_ptr aPointB = SketcherPrs_Tools::getFeaturePoint( + data(), SketchPlugin_Constraint::ENTITY_B()); + + 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))); + std::shared_ptr aFlyoutDir = aFlyoutPnt->xy()->decreased(aStartPnt); + + double X = aFlyoutDir->dot(aLineDir->xy()); + double Y = -aFlyoutDir->cross(aLineDir->xy()); + aFlyoutAttr->setValue(X, Y); + myFlyoutUpdate = false; } }