Salome HOME
Update TestConstraintEqual.py
[modules/shaper.git] / src / PartSet / PartSet_Tools.cpp
index 893e692c7b4a122471643bb95ed0482182d36219..002f148e58905abdf502cbb92d86d4f53cd3266a 100755 (executable)
@@ -728,8 +728,37 @@ std::shared_ptr<GeomAPI_Pnt2d> PartSet_Tools::getPoint(std::shared_ptr<ModelAPI_
   return std::shared_ptr<GeomAPI_Pnt2d>();
 }
 
+FeaturePtr findFirstCoincidenceByData(const DataPtr& theData, std::shared_ptr<GeomAPI_Pnt2d> thePoint)
+{
+  FeaturePtr aCoincident;
+
+  const std::set<AttributePtr>& aRefsList = theData->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> a2dPnt = 
+        PartSet_Tools::getPoint(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_A());
+      if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { 
+        aCoincident = aConstrFeature;
+        break;
+      } else {
+        a2dPnt = PartSet_Tools::getPoint(aConstrFeature,
+                                          SketchPlugin_ConstraintCoincidence::ENTITY_B());
+        if (a2dPnt.get() && thePoint->isEqual(a2dPnt)) { 
+          aCoincident = aConstrFeature;
+          break;
+        }
+      }
+    }
+  }
+  return aCoincident;
+}
+
 FeaturePtr PartSet_Tools::findFirstCoincidence(const FeaturePtr& theFeature,
-                                               std::shared_ptr<GeomAPI_Pnt2d> thePoint)
+                                               std::shared_ptr<GeomAPI_Pnt2d> thePoint,
+                                               const bool theSearchInResults)
 {
   FeaturePtr aCoincident;
   if (theFeature.get() == NULL)
@@ -756,6 +785,18 @@ FeaturePtr PartSet_Tools::findFirstCoincidence(const FeaturePtr& theFeature,
       }
     }
   }
+  if (theSearchInResults) {
+    if (!aCoincident.get()) {
+      std::list<ResultPtr> aResults = theFeature->results();
+      std::list<ResultPtr>::const_iterator aIt;
+      for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) {
+        ResultPtr aResult = *aIt;
+        aCoincident = findFirstCoincidenceByData(aResult->data(), thePoint);
+        if (aCoincident.get())
+          break;
+      }
+    }
+  }
   return aCoincident;
 }