Salome HOME
2D point selection in multi-rotation/multi-translation.
[modules/shaper.git] / src / SketchPlugin / SketchPlugin_Tools.cpp
index 134e00ddf131da4fd890714b09ff1284caf121c1..82c5a3f93986c9c07d3857e797771ec59f7cdc52 100644 (file)
@@ -9,6 +9,11 @@
 #include <GeomDataAPI_Point.h>
 #include <GeomDataAPI_Point2D.h>
 #include <ModelAPI_AttributeDouble.h>
+#include <SketcherPrs_Tools.h>
+#include <SketchPlugin_ConstraintCoincidence.h>
+#include <SketchPlugin_SketchEntity.h>
+
+namespace SketchPlugin_Tools {
 
 void clearExpressions(AttributeDoublePtr theAttribute)
 {
@@ -55,3 +60,45 @@ void clearExpressions(FeaturePtr theFeature)
     clearExpressions(*anAttributeIt);
   }
 }
+
+std::shared_ptr<GeomAPI_Pnt2d> getCoincidencePoint(const FeaturePtr theStartCoin)
+{
+  std::shared_ptr<GeomAPI_Pnt2d> aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), 
+                                                                    SketchPlugin_Constraint::ENTITY_A());
+  if (aPnt.get() == NULL)
+    aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), SketchPlugin_Constraint::ENTITY_B());
+  return aPnt;
+}
+
+void findCoincidences(const FeaturePtr theStartCoin,
+                      const std::string& theAttr,
+                      std::set<FeaturePtr>& theList)
+{
+  AttributeRefAttrPtr aPnt = theStartCoin->refattr(theAttr);
+  if(!aPnt) {
+    return;
+  }
+  FeaturePtr aObj = ModelAPI_Feature::feature(aPnt->object());
+  if(theList.find(aObj) == theList.end()) {
+    std::shared_ptr<GeomAPI_Pnt2d> aOrig = getCoincidencePoint(theStartCoin);
+    if(aOrig.get() == NULL) {
+      return;
+    }
+    theList.insert(aObj);
+    const std::set<AttributePtr>& aRefsList = aObj->data()->refsToMe();
+    std::set<AttributePtr>::const_iterator aIt;
+    for(aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) {
+      std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
+      FeaturePtr aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
+      if(aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
+        std::shared_ptr<GeomAPI_Pnt2d> aPnt = getCoincidencePoint(aConstrFeature);
+        if(aPnt.get() && aOrig->isEqual(aPnt)) {
+          findCoincidences(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_A(), theList);
+          findCoincidences(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_B(), theList);
+        }
+      }
+    }
+  }
+}
+
+} // namespace SketchPlugin_Tools