X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintDistance.cpp;h=3c46ab4a557ac098c9488f49eca7a04b4a989cf3;hb=af7e6fdbea92a91e74a3c7b6ab340c19badb9d6a;hp=611d85a0fba3c238f4605bf9d0ca953736a02906;hpb=4783f146b71a48c651523fcf0e12367bcf3d1fa8;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index 611d85a0f..3c46ab4a5 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: SketchPlugin_ConstraintDistance.cpp // Created: 23 May 2014 // Author: Artem ZHIDKOV @@ -16,6 +18,8 @@ #include +const double tolerance = 1e-7; + SketchPlugin_ConstraintDistance::SketchPlugin_ConstraintDistance() { } @@ -43,6 +47,69 @@ void SketchPlugin_ConstraintDistance::execute() 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 = getFeaturePoint( + aData, SketchPlugin_Constraint::ENTITY_A()); + std::shared_ptr aPoint_B = 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 = getFeatureLine( + aData, SketchPlugin_Constraint::ENTITY_A()); + if (aLine) { + aPnt_B = aPoint_B->pnt(); + aPnt_A = getProjectionPoint(aLine, aPnt_B); + } + } else if (aPoint_A && !aPoint_B) { + std::shared_ptr aLine = getFeatureLine( + aData, SketchPlugin_Constraint::ENTITY_B()); + if (aLine) { + aPnt_A = aPoint_A->pnt(); + aPnt_B = 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; } //************************************************************************************* @@ -88,25 +155,19 @@ AISObjectPtr SketchPlugin_ConstraintDistance::getAISObject(AISObjectPtr thePrevi std::shared_ptr aPoint1 = sketch()->to3D(aPnt_A->x(), aPnt_A->y()); std::shared_ptr aPoint2 = sketch()->to3D(aPnt_B->x(), aPnt_B->y()); - std::shared_ptr aFlyoutPnt = std::shared_ptr(); - if(aFlyOutAttr->isInitialized()) { - aFlyoutPnt = sketch()->to3D(aFlyOutAttr->x(), aFlyOutAttr->y()); - } else { - 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); - aFlyoutPnt = sketch()->to3D(aFPnt->x(), aFPnt->y()); - } + if(!aFlyOutAttr->isInitialized()) + return AISObjectPtr(); + std::shared_ptr aFlyoutPnt = sketch()->to3D(aFlyOutAttr->x(), aFlyOutAttr->y()/*aFPnt->x(), aFPnt->y()*/); + // value calculation std::shared_ptr aValueAttr = std::dynamic_pointer_cast< ModelAPI_AttributeDouble>(aData->attribute(SketchPlugin_Constraint::VALUE())); - double aValue = aValueAttr->value(); + double aValue = 0; // Issue #196: checking the positivity of the distance constraint // there is a validator for a distance constraint, that the value should be positive // in case if an invalid value is set, the current distance value is shown - if (aValue <= 0) - aValue = calculateCurrentDistance(); + if (aValueAttr->isInitialized()) + aValue = aValueAttr->value(); AISObjectPtr anAIS = thePrevious; if (!anAIS) @@ -114,8 +175,8 @@ AISObjectPtr SketchPlugin_ConstraintDistance::getAISObject(AISObjectPtr thePrevi anAIS->createDistance(aPoint1, aPoint2, aFlyoutPnt, aPlane, aValue); // Set color from preferences - std::vector aRGB = Config_PropManager::color("Visualization", "distance_color", - DISTANCE_COLOR); + std::vector aRGB = Config_PropManager::color("Visualization", "sketch_dimension_color", + SKETCH_DIMENSION_COLOR); anAIS->setColor(aRGB[0], aRGB[1], aRGB[2]); return anAIS; } @@ -162,6 +223,20 @@ double SketchPlugin_ConstraintDistance::calculateCurrentDistance() const return aDistance; } +void SketchPlugin_ConstraintDistance::attributeChanged(const std::string& theID) { + if (theID == SketchPlugin_Constraint::ENTITY_A() || + theID == SketchPlugin_Constraint::ENTITY_B()) + { + std::shared_ptr aValueAttr = std::dynamic_pointer_cast< + ModelAPI_AttributeDouble>(data()->attribute(SketchPlugin_Constraint::VALUE())); + 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 + aValueAttr->setValue(aDistance); + } + } + } +} //************************************************************************************* std::shared_ptr getFeaturePoint(DataPtr theData,