Salome HOME
Roll back the modification, not yet approved
[modules/shaper.git] / src / PartSet / PartSet_Validators.cpp
index 4bb729366c33b57bdbe75754f77dca7d5b3ccd79..02683b3554db08b7e313b0fcc5aefe045960ac4d 100755 (executable)
@@ -24,6 +24,7 @@
 #include <ModelAPI_AttributeRefList.h>
 #include <ModelAPI_Object.h>
 #include <ModelAPI_Session.h>
+#include <ModelAPI_Tools.h>
 
 #include <SketchPlugin_Sketch.h>
 #include <SketchPlugin_ConstraintCoincidence.h>
@@ -191,6 +192,35 @@ bool PartSet_AngleSelection::isValid(const ModuleBase_ISelection* theSelection)
   return (aCount > 0) && (aCount < 3);
 }
 
+std::string PartSet_DifferentObjectsValidator::errorMessage(
+                         const PartSet_DifferentObjectsValidator::ErrorType& theType,
+                         const std::string& thEqualObject, const std::string& theFirstAttribute,
+                         const std::string& theSecondAttribute) const
+{
+  std::string anError;
+  switch (theType) {
+    case EqualObjects:
+      anError = "The feature uses one " + thEqualObject + " object in " +
+                theFirstAttribute + " and " + theSecondAttribute + " attributes.";
+      break;
+    case EqualAttributes:
+      anError = "The feature uses reference to one " + thEqualObject + " attribute in " +
+                theFirstAttribute + " and " + theSecondAttribute + " attributes.";
+      break;
+    case EqualShapes:
+      anError = "The feature uses one shape in " +
+                theFirstAttribute + " and " + theSecondAttribute + " attributes.";
+      break;
+    case EmptyShapes:
+      anError = "The feature uses empty shapes in " +
+                theFirstAttribute + " and " + theSecondAttribute + " attributes.";
+      break;
+      break;
+    default:
+      break;
+  }
+  return anError;
+}
 
 bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute, 
                                                 const std::list<std::string>& theArguments,
@@ -219,12 +249,19 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
           if (aRef->isObject() != isObject)
             continue;
           if (isObject) {
-            if (aRef->object() == anObject)
+            if (aRef->object() == anObject) {
+              theError = errorMessage(EqualObjects, anObject.get() ? anObject->data()->name() : "",
+                                      theAttribute->id(), aRef->id());
               return false;
+            }
           }
           else { // the attribute reference
-            if (aRef->attr() == theAttribute)
+            if (aRef->attr() == anAttributeAttr) {
+              theError = errorMessage(EqualAttributes,
+                                      anAttributeAttr.get() ? anAttributeAttr->id() : "",
+                                      theAttribute->id(), aRef->id());
               return false;
+            }
           }
         }
       }
@@ -246,8 +283,10 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
           // check the object is already presented
           if (aRef->context() == aContext) {
             bool aHasShape = aShape.get() != NULL;
-            if (!aHasShape || aRef->value()->isEqual(aShape))
+            if (!aHasShape || aRef->value()->isEqual(aShape)) {
+              theError = errorMessage(EqualShapes, "", theAttribute->id(), aRef->id());
               return false;
+            }
           }
         }
       }
@@ -265,8 +304,11 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
           std::shared_ptr<ModelAPI_AttributeReference> aRef =
             std::dynamic_pointer_cast<ModelAPI_AttributeReference>(*anAttr);
           // check the object is already presented
-          if (aRef->value() == anObject)
+          if (aRef->value() == anObject) {
+            theError = errorMessage(EqualObjects, anObject.get() ? anObject->data()->name() : "",
+                                    theAttribute->id(), aRef->id());
             return false;
+          }
         }
         return true;
       }
@@ -284,12 +326,36 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
             std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(*anAttrItr);
           for(int i = 0; i < aCurSelList->size(); i++) {
             std::shared_ptr<ModelAPI_AttributeSelection> aCurSel = aCurSelList->value(i);
+            ResultPtr aCurSelContext = aCurSel->context();
+            ResultCompSolidPtr aCurSelCompSolidPtr = ModelAPI_Tools::compSolidOwner(aCurSelContext);
+            std::shared_ptr<GeomAPI_Shape> aCurSelCompSolid;
+            if(aCurSelCompSolidPtr.get()) {
+              aCurSelCompSolid = aCurSelCompSolidPtr->shape();
+            }
             for(int j = 0; j < aRefSelList->size(); j++) {
               std::shared_ptr<ModelAPI_AttributeSelection> aRefSel = aRefSelList->value(j);
-              if(aCurSel->context() == aRefSel->context()) {
-                if(aCurSel->value().get() == NULL || aRefSel->value().get() == NULL
-                  || aCurSel->value()->isEqual(aRefSel->value())) {
-                    return false;
+              ResultPtr aRefSelContext = aRefSel->context();
+              ResultCompSolidPtr aRefSelCompSolidPtr = ModelAPI_Tools::compSolidOwner(aRefSelContext);
+              std::shared_ptr<GeomAPI_Shape> aRefSelCompSolid;
+              if(aRefSelCompSolidPtr.get()) {
+                aRefSelCompSolid = aRefSelCompSolidPtr->shape();
+              }
+              if ((aCurSelCompSolid.get() && aCurSelCompSolid->isEqual(aRefSel->value()))
+                || (aRefSelCompSolid.get() && aRefSelCompSolid->isEqual(aCurSel->value()))) {
+                  theError = errorMessage(EqualShapes, "", theAttribute->id(),
+                                          aRefSel->id());
+                  return false;
+              }
+              if(aCurSelContext == aRefSelContext) {
+                if (aCurSel->value().get() == NULL || aRefSel->value().get() == NULL) {
+                  theError = errorMessage(EmptyShapes, "", theAttribute->id(),
+                                          aRefSel->id());
+                  return false;
+                }
+                if (aCurSel->value()->isEqual(aRefSel->value())) {
+                  theError = errorMessage(EqualShapes, "", theAttribute->id(),
+                                          aRefSel->id());
+                  return false;
                 }
               }
             }
@@ -312,6 +378,9 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
             ObjectPtr aCurSelObject = aCurSelList->object(i);
             for (int j = 0; j < aRefSelList->size(); j++) {
               if (aCurSelObject == aRefSelList->object(j)) {
+                theError = errorMessage(EqualObjects,
+                              aCurSelObject.get() ? aCurSelObject->data()->name() : "",
+                              theAttribute->id(), aCurSelList->id());
                 return false;
               }
             }
@@ -320,37 +389,7 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
       }
     }
   }
-  return !featureHasReferences(theAttribute);
-}
-
-bool PartSet_DifferentObjectsValidator::featureHasReferences(const AttributePtr& theAttribute) const
-{
-  std::list<std::pair<std::string, std::list<ObjectPtr> > > allRefs;
-  if (theAttribute->owner().get() && theAttribute->owner()->data()->isValid())
-    theAttribute->owner()->data()->referencesToObjects(allRefs);
-  // collect object referenced by theAttribute
-  std::list<ObjectPtr>* anAttrObjs = 0;
-  std::list<std::pair<std::string, std::list<ObjectPtr> > >::iterator aRefIter = allRefs.begin();
-  for(; aRefIter != allRefs.end(); aRefIter++) {
-    if (theAttribute->id() == aRefIter->first)
-      anAttrObjs = &(aRefIter->second);
-  }
-  if (!anAttrObjs || anAttrObjs->empty())
-    return false; // theAttribute does not references to anything
-  // check with all others
-  for(aRefIter = allRefs.begin(); aRefIter != allRefs.end(); aRefIter++) {
-    if (theAttribute->id() == aRefIter->first)
-      continue; // do not check with myself
-    std::list<ObjectPtr>::iterator aReferenced = aRefIter->second.begin();
-    for(; aReferenced != aRefIter->second.end(); aReferenced++) {
-      std::list<ObjectPtr>::iterator aReferencedByMe = anAttrObjs->begin();
-      for(; aReferencedByMe != anAttrObjs->end(); aReferencedByMe++) {
-        if (*aReferenced == *aReferencedByMe) // found same objects!
-          return true;
-      }
-    }
-  }
-  return false;
+  return true;
 }
 
 bool PartSet_SketchEntityValidator::isValid(const AttributePtr& theAttribute,
@@ -359,9 +398,13 @@ bool PartSet_SketchEntityValidator::isValid(const AttributePtr& theAttribute,
 {
   bool isSketchEntities = true;
   std::set<std::string> anEntityKinds;
+  std::string anEntityKindsStr;
   std::list<std::string>::const_iterator anIt = theArguments.begin(), aLast = theArguments.end();
   for (; anIt != aLast; anIt++) {
     anEntityKinds.insert(*anIt);
+    if (!anEntityKindsStr.empty())
+      anEntityKindsStr += ", ";
+    anEntityKindsStr += *anIt;
   }
 
   std::string anAttributeType = theAttribute->attributeType();
@@ -415,43 +458,22 @@ bool PartSet_SketchEntityValidator::isValid(const AttributePtr& theAttribute,
       }
     }
   }
+  if (!isSketchEntities) {
+    theError = "It refers to feature, which kind is not in the list: " + anEntityKindsStr;
+  }
 
   return isSketchEntities;
 }
 
-
-
-bool PartSet_SameTypeAttrValidator::isValid(const AttributePtr& theAttribute, 
-                                            const std::list<std::string>& theArguments,
-                                            std::string& theError ) const
-{
-  // there is a check whether the feature contains a point and a linear edge or two point values
-  std::string aParamA = theArguments.front();
-  SessionPtr aMgr = ModelAPI_Session::get();
-  ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
-
-  FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
-  AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
-  if (!aRefAttr)
-    return false;
-
-  bool isObject = aRefAttr->isObject();
-  ObjectPtr anObject = aRefAttr->object();
-  if (isObject && anObject) {
-    FeaturePtr aRefFea = ModelAPI_Feature::feature(anObject);
-
-    AttributeRefAttrPtr aOtherAttr = aFeature->data()->refattr(aParamA);
-    ObjectPtr aOtherObject = aOtherAttr->object();
-    FeaturePtr aOtherFea = ModelAPI_Feature::feature(aOtherObject);
-    return aRefFea->getKind() == aOtherFea->getKind();
-  }
-  return false;
-}
-
 bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute, 
                                      const std::list<std::string>& theArguments,
                                      std::string& theError) const
 {
+  if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) {
+    theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed";
+    return false;
+  }
+
   // there is a check whether the feature contains a point and a linear edge or two point values
   std::string aParamA = theArguments.front();
   SessionPtr aMgr = ModelAPI_Session::get();
@@ -459,9 +481,6 @@ bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute,
 
   FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
   AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
-  if (!aRefAttr)
-    return false;
-
   QList<FeaturePtr> aCoinsideLines;
 
   bool isObject = aRefAttr->isObject();
@@ -495,17 +514,17 @@ bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute,
       }
     }
     // if there is no coincidence then it is not valid
-    if (aCoinList.size() == 0)
-      return false;
-
-    QList<FeaturePtr>::const_iterator anIt = aCoinsideLines.begin(), aLast = aCoinsideLines.end();
-    bool aValid = false;
-    for (; anIt != aLast && !aValid; anIt++) {
-      aValid = *anIt == aOtherFea;
+    if (aCoinList.size() > 0) {
+      QList<FeaturePtr>::const_iterator anIt = aCoinsideLines.begin(), aLast = aCoinsideLines.end();
+      bool aValid = false;
+      for (; anIt != aLast && !aValid; anIt++) {
+        aValid = *anIt == aOtherFea;
+      }
+      if (aValid)
+        return true;
     }
-    if (aValid)
-      return true;
   }
+  theError = "There is no a common coincident point.";
   return false;
 }