X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintDistance.cpp;h=962ddfbc85f2cfb20de8b3ab9b3c9edea833bfc8;hb=3aa818c0a5abf4c46afa2d91cad46340efc4bd5f;hp=b7f708a9c59578efdec9e6d06e6b9690e1c46058;hpb=a1f792970074d097f2f8a408dfcae5f6c263a6ca;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index b7f708a9c..962ddfbc8 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; } //************************************************************************************* @@ -37,6 +42,14 @@ void SketchPlugin_ConstraintDistance::initAttributes() data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); } +void SketchPlugin_ConstraintDistance::colorConfigInfo(std::string& theSection, std::string& theName, + std::string& theDefault) +{ + theSection = "Visualization"; + theName = "sketch_dimension_color"; + theDefault = SKETCH_DIMENSION_COLOR; +} + //************************************************************************************* void SketchPlugin_ConstraintDistance::execute() { @@ -48,72 +61,8 @@ void SketchPlugin_ConstraintDistance::execute() return; double aDistance = calculateCurrentDistance(); - if(aDistance >= 0) { + if(aDistance >= 0) anAttrValue->setValue(aDistance); - } - - // the value should to be computed here, not in the getAISObject in order to change the model value - // inside the object transaction. This is important for creating a constraint by preselection. - // The display of the presentation in this case happens after the transaction commit - std::shared_ptr aFlyOutAttr = std::dynamic_pointer_cast< - GeomDataAPI_Point2D>(aData->attribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT())); - if(!aFlyOutAttr->isInitialized()) - compute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT()); -} - -bool SketchPlugin_ConstraintDistance::compute(const std::string& theAttributeId) -{ - if (theAttributeId != SketchPlugin_Constraint::FLYOUT_VALUE_PNT()) - return false; - - if (!sketch()) - return false; - - DataPtr aData = data(); - std::shared_ptr aPoint_A = SketcherPrs_Tools::getFeaturePoint( - aData, SketchPlugin_Constraint::ENTITY_A()); - std::shared_ptr aPoint_B = SketcherPrs_Tools::getFeaturePoint( - aData, SketchPlugin_Constraint::ENTITY_B()); - - std::shared_ptr aPnt_A; - std::shared_ptr aPnt_B; - - if (aPoint_A && aPoint_B) { - 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); - //} - } 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); - //} - } - 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) - return false; - - std::shared_ptr aLine = std::shared_ptr(new GeomAPI_Lin2d(aPnt_A, aPnt_B)); - double aDist = aPoint1->distance(aPoint2)/5.; - std::shared_ptr aFPnt = aLine->shiftedLocation(aDist); - aFlyOutAttr->setValue(aFPnt); - - return true; } //************************************************************************************* @@ -122,15 +71,8 @@ AISObjectPtr SketchPlugin_ConstraintDistance::getAISObject(AISObjectPtr thePrevi if (!sketch()) return thePrevious; - AISObjectPtr anAIS = thePrevious; - if (!anAIS) { - anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this, sketch()->coordinatePlane()); - } - - // Set color from preferences - std::vector aRGB = Config_PropManager::color("Visualization", "sketch_dimension_color", - SKETCH_DIMENSION_COLOR); - anAIS->setColor(aRGB[0], aRGB[1], aRGB[2]); + AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this, sketch()->coordinatePlane(), + thePrevious); return anAIS; } @@ -141,42 +83,84 @@ 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 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())); - aPoint->move(theDeltaX, theDeltaY); + myFlyoutUpdate = true; + aPoint->setValue(aPoint->x() + dX, aPoint->y() + dY); + myFlyoutUpdate = false; } -double SketchPlugin_ConstraintDistance::calculateCurrentDistance() const +double SketchPlugin_ConstraintDistance::calculateCurrentDistance() { double aDistance = -1.; 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()); + SketcherPrs_Tools::getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_A(), aPlane); std::shared_ptr aPointB = - SketcherPrs_Tools::getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_B()); + SketcherPrs_Tools::getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_B(), aPlane); - 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 +172,57 @@ 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 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; + + if (aEndPnt->distance(aStartPnt) < tolerance) + 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; } }