X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintCoincidence.cpp;h=3cc02a863e73f99b635880abcd94b982366ebcc6;hb=21a0c85b52bb93f94680e2342370764e6510e387;hp=358158325fc9b4da8f49f9a60ca6efae1e14a66c;hpb=f15802c13f98af8d10e7b81cbd4506d3b486da59;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp index 358158325..3cc02a863 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp @@ -6,13 +6,18 @@ #include "SketchPlugin_ConstraintCoincidence.h" +#include +#include +#include +#include + +#include +#include +#include + #include -#include -#include -#include -#include -#include +#include SketchPlugin_ConstraintCoincidence::SketchPlugin_ConstraintCoincidence() { @@ -20,8 +25,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() @@ -33,10 +38,90 @@ AISObjectPtr SketchPlugin_ConstraintCoincidence::getAISObject(AISObjectPtr thePr if (!sketch()) return thePrevious; - AISObjectPtr anAIS = thePrevious; - if (!anAIS) { - anAIS = SketcherPrs_Factory::coincidentConstraint(this, sketch()->coordinatePlane()); - anAIS->setColor(0, 0, 255); - } + AISObjectPtr anAIS = SketcherPrs_Factory::coincidentConstraint(this, sketch()->coordinatePlane(), + thePrevious); return anAIS; -} \ No newline at end of file +} + +FeaturePtr SketchPlugin_ConstraintCoincidence::findCoincidenceFeature(const FeaturePtr& theFeature1, + const FeaturePtr& theFeature2) +{ + FeaturePtr aResultFeature; + + std::list anAttrList; + if (theFeature1->getKind() == SketchPlugin_Circle::ID() || + theFeature2->getKind() == SketchPlugin_Circle::ID()) + return aResultFeature; + + if (theFeature2->getKind() == SketchPlugin_Line::ID()) { + anAttrList.push_back(theFeature2->attribute(SketchPlugin_Line::START_ID())); + anAttrList.push_back(theFeature2->attribute(SketchPlugin_Line::END_ID())); + } else if (theFeature2->getKind() == SketchPlugin_Arc::ID()) { + anAttrList.push_back(theFeature2->attribute(SketchPlugin_Arc::START_ID())); + anAttrList.push_back(theFeature2->attribute(SketchPlugin_Arc::END_ID())); + } + + const std::set& aRefsList = theFeature1->data()->refsToMe(); + std::set::const_iterator aRefIt = aRefsList.begin(); + for (; aRefIt != aRefsList.end() && !aResultFeature.get(); ++aRefIt) { + FeaturePtr aConstrFeature = std::dynamic_pointer_cast((*aRefIt)->owner()); + if (aConstrFeature->getKind() != SketchPlugin_ConstraintCoincidence::ID()) + continue; + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(*aRefIt); + AttributePtr anAttr = aRefAttr->attr(); + if (anAttr->id() == SketchPlugin_Arc::CENTER_ID()) + continue; + + anAttr = aConstrFeature->attribute(SketchPlugin_Constraint::ENTITY_A()); + if (anAttr == *aRefIt) + anAttr = aConstrFeature->attribute(SketchPlugin_Constraint::ENTITY_B()); + + aRefAttr = std::dynamic_pointer_cast(anAttr); + if (!aRefAttr) + continue; + anAttr = aRefAttr->attr(); + for (std::list::const_iterator anIt = anAttrList.begin(); + anIt != anAttrList.end() && !aResultFeature.get(); ++anIt) + if (*anIt == anAttr) + aResultFeature = aConstrFeature; + } + return aResultFeature; +} + +AttributePoint2DPtr SketchPlugin_ConstraintCoincidence::getPoint(const FeaturePtr& theFeature) +{ + AttributePoint2DPtr aPoint = ModelGeomAlgo_Point2D::getPointOfRefAttr(theFeature.get(), + SketchPlugin_Constraint::ENTITY_A(), + SketchPlugin_Point::ID(), SketchPlugin_Point::COORD_ID()); + if (!aPoint.get()) + aPoint = ModelGeomAlgo_Point2D::getPointOfRefAttr(theFeature.get(), + SketchPlugin_Constraint::ENTITY_B(), + SketchPlugin_Point::ID(), SketchPlugin_Point::COORD_ID()); + return aPoint; +} + +void SketchPlugin_ConstraintCoincidence::createCoincidenceFeature(SketchPlugin_Sketch* theSketch, + const std::shared_ptr& thePoint1, + const std::shared_ptr& thePoint2) +{ + FeaturePtr aFeature; + if (theSketch) { + aFeature = theSketch->addFeature(SketchPlugin_ConstraintCoincidence::ID()); + } else { + std::shared_ptr aDoc = theSketch->document(); + aFeature = aDoc->addFeature(SketchPlugin_ConstraintCoincidence::ID()); + } + + std::shared_ptr aData = aFeature->data(); + + std::shared_ptr aRef1 = std::dynamic_pointer_cast< + ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_A())); + aRef1->setAttr(thePoint1); + + std::shared_ptr aRef2 = std::dynamic_pointer_cast< + ModelAPI_AttributeRefAttr>(aData->attribute(SketchPlugin_Constraint::ENTITY_B())); + aRef2->setAttr(thePoint2); + + // we need to flush created signal in order to coincidence is processed by solver + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); +}