X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintCoincidence.cpp;h=b1fb8be9733879d14069da7b70a04eef4054b8f7;hb=1105bfe31c0304ffacd85363d070322049d564f1;hp=a78e1b4efc2d0b7b0aeddfc959586679345ecb63;hpb=7fcf163a8a369889707c5b73eeeb2bc68a4b906e;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp index a78e1b4ef..b1fb8be97 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp @@ -6,13 +6,25 @@ #include "SketchPlugin_ConstraintCoincidence.h" +#include +#include +#include +#include + #include #include #include -#include #include #include +#include + +#include +#include +#include + +/// \brief Update coordinates of the point to be correctly placed on the feature +static void adjustPointOnEntity(std::shared_ptr thePoint, FeaturePtr theFeature); SketchPlugin_ConstraintCoincidence::SketchPlugin_ConstraintCoincidence() { @@ -36,7 +48,77 @@ AISObjectPtr SketchPlugin_ConstraintCoincidence::getAISObject(AISObjectPtr thePr AISObjectPtr anAIS = thePrevious; if (!anAIS) { anAIS = SketcherPrs_Factory::coincidentConstraint(this, sketch()->coordinatePlane()); - anAIS->setColor(0, 0, 255); } return anAIS; } + +void SketchPlugin_ConstraintCoincidence::attributeChanged(const std::string& theID) +{ + if (theID == ENTITY_A() || theID == ENTITY_B()) { + AttributeRefAttrPtr anAttrA = + std::dynamic_pointer_cast(attribute(ENTITY_A())); + AttributeRefAttrPtr anAttrB = + std::dynamic_pointer_cast(attribute(ENTITY_B())); + + if (!anAttrA || !anAttrB || (!anAttrA->isObject() && !anAttrB->isObject())) + return; + + if (anAttrA->isObject()) { + AttributeRefAttrPtr aTransient = anAttrA; + anAttrA = anAttrB; + anAttrB = aTransient; + } + + std::shared_ptr aPoint = + std::dynamic_pointer_cast(anAttrA->attr()); + FeaturePtr aFeature; + if (anAttrB->object()) + aFeature = ModelAPI_Feature::feature(anAttrB->object()); + + // Adjust position of a point lying on a line or arc + if (aPoint && aFeature) + adjustPointOnEntity(aPoint, aFeature); + } +} + + + + +// ======= Auxiliary functions ================================================ +void adjustPointOnEntity(std::shared_ptr thePoint, FeaturePtr theFeature) +{ + if (theFeature->getKind() == SketchPlugin_Line::ID()) { + // project point on line + std::shared_ptr aStart = std::dynamic_pointer_cast( + theFeature->attribute(SketchPlugin_Line::START_ID())); + std::shared_ptr aEnd = std::dynamic_pointer_cast( + theFeature->attribute(SketchPlugin_Line::END_ID())); + + std::shared_ptr aLine(new GeomAPI_Lin2d(aStart->pnt(), aEnd->pnt())); + std::shared_ptr aProjected = aLine->project(thePoint->pnt()); + thePoint->setValue(aProjected); + } + else if (theFeature->getKind() == SketchPlugin_Circle::ID()) { + // project point on circle + std::shared_ptr aCenter = std::dynamic_pointer_cast( + theFeature->attribute(SketchPlugin_Circle::CENTER_ID())); + double aRadius = theFeature->real(SketchPlugin_Circle::RADIUS_ID())->value(); + + std::shared_ptr aDir(new GeomAPI_Dir2d(1.0, 0.0)); + std::shared_ptr aCircle(new GeomAPI_Circ2d(aCenter->pnt(), aDir, aRadius)); + + std::shared_ptr aProjected = aCircle->project(thePoint->pnt()); + thePoint->setValue(aProjected); + } + else if (theFeature->getKind() == SketchPlugin_Arc::ID()) { + // project point on arc + std::shared_ptr aCenter = std::dynamic_pointer_cast( + theFeature->attribute(SketchPlugin_Arc::CENTER_ID())); + std::shared_ptr aStart = std::dynamic_pointer_cast( + theFeature->attribute(SketchPlugin_Arc::START_ID())); + + std::shared_ptr aCircle(new GeomAPI_Circ2d(aCenter->pnt(), aStart->pnt())); + std::shared_ptr aProjected = aCircle->project(thePoint->pnt()); + thePoint->setValue(aProjected); + } +}