X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintCoincidence.cpp;h=b1fb8be9733879d14069da7b70a04eef4054b8f7;hb=a8d47776cf43a5535c262115d529e2f9f445cef3;hp=358158325fc9b4da8f49f9a60ca6efae1e14a66c;hpb=694482299ca580d780c221cc6a3e7574e59fd2c3;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp index 358158325..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() { @@ -20,8 +32,8 @@ SketchPlugin_ConstraintCoincidence::SketchPlugin_ConstraintCoincidence() void SketchPlugin_ConstraintCoincidence::initAttributes() { - data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::type()); - data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::type()); + data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); } void SketchPlugin_ConstraintCoincidence::execute() @@ -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; -} \ No newline at end of file +} + +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); + } +}