From a5bf67d402291c9adb90723a5359e8ac40762ad1 Mon Sep 17 00:00:00 2001 From: azv Date: Tue, 8 Sep 2015 15:21:32 +0300 Subject: [PATCH] Update coordinates of a point coincided with line, arc or circle (issue #883) --- .../SketchPlugin_ConstraintCoincidence.cpp | 85 ++++++++++++++++++- .../SketchPlugin_ConstraintCoincidence.h | 4 + 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp index 85a255bfb..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() { @@ -39,3 +51,74 @@ AISObjectPtr SketchPlugin_ConstraintCoincidence::getAISObject(AISObjectPtr thePr } 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); + } +} diff --git a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.h b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.h index ffc4ce1b9..c9deb1e35 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.h +++ b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.h @@ -44,6 +44,10 @@ class SketchPlugin_ConstraintCoincidence : public SketchPlugin_ConstraintBase /// \brief Request for initialization of data model of the feature: adding all attributes SKETCHPLUGIN_EXPORT virtual void initAttributes(); + /// Called on change of any argument-attribute of this object + /// \param theID identifier of changed attribute + SKETCHPLUGIN_EXPORT virtual void attributeChanged(const std::string& theID); + /// \brief Use plugin manager for features creation SketchPlugin_ConstraintCoincidence(); }; -- 2.39.2