Salome HOME
Using test for testing number of sub-shapes.
[modules/shaper.git] / src / SketchSolver / SketchSolver_Storage.cpp
index 5af9d5043d6acf6971ab469805409145a3b9a22e..d1f6c4f17bbe88a2619731e5bb59c8c854be1183 100644 (file)
@@ -18,6 +18,7 @@
 #include <SketchPlugin_ConstraintCoincidence.h>
 #include <SketchPlugin_ConstraintMirror.h>
 #include <SketchPlugin_ConstraintRigid.h>
+#include <SketchPlugin_Projection.h>
 
 
 /// \brief Verify two vectors of constraints are equal.
@@ -138,7 +139,7 @@ void SketchSolver_Storage::addEntity(FeaturePtr       theFeature,
 void SketchSolver_Storage::addEntity(AttributePtr     theAttribute,
                                      EntityWrapperPtr theSolverEntity)
 {
-  std::map<AttributePtr, EntityWrapperPtr>::const_iterator aFound = 
+  std::map<AttributePtr, EntityWrapperPtr>::const_iterator aFound =
     myAttributeMap.find(theAttribute);
   if (aFound == myAttributeMap.end() || !aFound->second ||
      (theSolverEntity && !aFound->second->isEqual(theSolverEntity)))
@@ -160,20 +161,14 @@ static bool isCopyInMulti(std::shared_ptr<SketchPlugin_Feature> theFeature,
     return false;
   bool aResult = theFeature->isCopy();
   if (aResult) {
-    std::map<ConstraintPtr, std::list<ConstraintWrapperPtr> >::const_iterator
-        anIt = theConstraints.begin();
-    for (; anIt != theConstraints.end() && aResult; ++anIt) {
-      if (anIt->first->getKind() != SketchPlugin_ConstraintMirror::ID())
-        continue;
-      AttributeRefListPtr aRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
-          anIt->first->attribute(SketchPlugin_Constraint::ENTITY_C()));
-      std::list<ObjectPtr> aMirroredList =  aRefList->list();
-      std::list<ObjectPtr>::const_iterator aMIt = aMirroredList.begin();
-      for (; aMIt != aMirroredList.end() && aResult; ++aMIt) {
-        FeaturePtr aFeat = ModelAPI_Feature::feature(*aMIt);
-        if (aFeat == theFeature)
-          aResult = false;
-      }
+    const std::set<AttributePtr>& aRefs = theFeature->data()->refsToMe();
+    for (std::set<AttributePtr>::const_iterator aRefIt = aRefs.begin();
+         aRefIt != aRefs.end() && aResult; ++aRefIt) {
+      FeaturePtr anOwner = ModelAPI_Feature::feature((*aRefIt)->owner());
+      if ((anOwner->getKind() == SketchPlugin_ConstraintMirror::ID() &&
+          (*aRefIt)->id() == SketchPlugin_Constraint::ENTITY_C()) ||
+         (anOwner->getKind() == SketchPlugin_Projection::ID()))
+        aResult = false;
     }
   }
   return aResult;
@@ -184,7 +179,7 @@ bool SketchSolver_Storage::update(FeaturePtr theFeature, const GroupID& theGroup
   bool isUpdated = false;
   EntityWrapperPtr aRelated = entity(theFeature);
   if (!aRelated) { // Feature is not exist, create it
-    std::shared_ptr<SketchPlugin_Feature> aSketchFeature = 
+    std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
         std::dynamic_pointer_cast<SketchPlugin_Feature>(theFeature);
     bool isCopy = isCopyInMulti(aSketchFeature, myConstraintMap);
     // the feature is a copy in "Multi" constraint and does not used in other constraints
@@ -258,8 +253,8 @@ bool SketchSolver_Storage::update(AttributePtr theAttribute, const GroupID& theG
       if (aFeature->getKind() == SketchPlugin_Arc::ID() &&
           myFeatureMap.find(aFeature) == myFeatureMap.end()) {
         // Additional checking that all attributes are initialized
-        if (aFeature->attribute(SketchPlugin_Arc::CENTER_ID())->isInitialized() && 
-            aFeature->attribute(SketchPlugin_Arc::START_ID())->isInitialized() && 
+        if (aFeature->attribute(SketchPlugin_Arc::CENTER_ID())->isInitialized() &&
+            aFeature->attribute(SketchPlugin_Arc::START_ID())->isInitialized() &&
             aFeature->attribute(SketchPlugin_Arc::END_ID())->isInitialized()) {
           return SketchSolver_Storage::update(aFeature, theGroup, theForce);
         } else {
@@ -271,9 +266,9 @@ bool SketchSolver_Storage::update(AttributePtr theAttribute, const GroupID& theG
     BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
     GroupID aGroup = theGroup != GID_UNKNOWN ? theGroup : myGroupID;
     // Check attribute of external features
-    std::shared_ptr<SketchPlugin_Feature> aSketchFeature = 
+    std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
         std::dynamic_pointer_cast<SketchPlugin_Feature>(anAttribute->owner());
-    if (aSketchFeature && (aSketchFeature->isExternal() || 
+    if (aSketchFeature && (aSketchFeature->isExternal() ||
         isCopyInMulti(aSketchFeature, myConstraintMap)))
       aGroup = GID_OUTOFGROUP;
     aRelated = aBuilder->createAttribute(anAttribute, aGroup);
@@ -658,7 +653,7 @@ bool SketchSolver_Storage::removeCoincidence(ConstraintWrapperPtr theConstraint)
   return true;
 }
 
-void SketchSolver_Storage::replaceEntities(const std::map<EntityWrapperPtr, 
+void SketchSolver_Storage::replaceEntities(const std::map<EntityWrapperPtr,
                                            EntityWrapperPtr>& theChange)
 {
   std::set<EntityWrapperPtr> anUpdFeatures;
@@ -700,7 +695,7 @@ bool SketchSolver_Storage::remove(ConstraintWrapperPtr theConstraint)
     if (aBaseFeature)
       isFullyRemoved = SketchSolver_Storage::removeEntity(aBaseFeature) && isFullyRemoved;
     else
-      isFullyRemoved = 
+      isFullyRemoved =
         SketchSolver_Storage::removeEntity((*anIt)->baseAttribute()) && isFullyRemoved;
   }
   return isFullyRemoved;
@@ -758,7 +753,7 @@ bool SketchSolver_Storage::isInteract(const AttributePtr& theAttribute) const
   if (!theAttribute)
     return false;
 
-  AttributeRefListPtr aRefList = 
+  AttributeRefListPtr aRefList =
       std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(theAttribute);
   if (aRefList) {
     std::list<ObjectPtr> anObjects = aRefList->list();
@@ -817,7 +812,7 @@ bool SketchSolver_Storage::isFixed(EntityWrapperPtr theEntity) const
           return true;
     }
 
-  std::map<ConstraintPtr, std::list<ConstraintWrapperPtr> >::const_iterator aCIt = 
+  std::map<ConstraintPtr, std::list<ConstraintWrapperPtr> >::const_iterator aCIt =
     myConstraintMap.begin();
   std::list<ConstraintWrapperPtr>::const_iterator aCWIt;
   for (; aCIt != myConstraintMap.end(); ++aCIt) {
@@ -900,8 +895,8 @@ void SketchSolver_Storage::processArcs()
   for (; aFIt != myFeatureMap.end(); ++aFIt)
     if (!aFIt->second && aFIt->first->getKind() == SketchPlugin_Arc::ID()) {
       // Additional checking the attributes are initialized
-      if (aFIt->first->attribute(SketchPlugin_Arc::CENTER_ID())->isInitialized() && 
-          aFIt->first->attribute(SketchPlugin_Arc::START_ID())->isInitialized() && 
+      if (aFIt->first->attribute(SketchPlugin_Arc::CENTER_ID())->isInitialized() &&
+          aFIt->first->attribute(SketchPlugin_Arc::START_ID())->isInitialized() &&
           aFIt->first->attribute(SketchPlugin_Arc::END_ID())->isInitialized())
         update(aFIt->first);
       else
@@ -988,7 +983,7 @@ void resultToFeatureOrAttribute(const ObjectPtr& theResult,
   // if the feature has several results, we choose which one is referred
   const std::list<ResultPtr>& aResults = aFeature->results();
   if (aResults.size() > 1 && theResult != aFeature->lastResult()) {
-    // actually, the attribute refers to center of arc or circle, 
+    // actually, the attribute refers to center of arc or circle,
     // but not the edge, get correct attributes
     std::string anAttrName;
     if (aFeature->getKind() == SketchPlugin_Arc::ID())