X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintCoincidence.cpp;h=ed40959083e55defeb23a657f35f16622159f940;hb=c5b71f05b19e8b0e3588b4b1778f0e9f256dcf17;hp=02cf66ca06415735860e72076d76f67c2a3f8f03;hpb=8babac25037f2666dcb422dd68a66dd2ed1383d8;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp index 02cf66ca0..ed4095908 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp @@ -6,9 +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() { @@ -24,3 +40,83 @@ void SketchPlugin_ConstraintCoincidence::execute() { } +AISObjectPtr SketchPlugin_ConstraintCoincidence::getAISObject(AISObjectPtr thePrevious) +{ + if (!sketch()) + return thePrevious; + + AISObjectPtr anAIS = SketcherPrs_Factory::coincidentConstraint(this, sketch()->coordinatePlane(), + thePrevious); + 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); + } +}