Salome HOME
Pipe validator fix
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_Validators.cpp
index 1470d03538a6c14b6f10cd1ca688f9594e04d3fc..0de4d856a96de2bc262914492e50ad51b971cb81 100644 (file)
@@ -155,7 +155,7 @@ bool FeaturesPlugin_ValidatorBaseForGeneration::isValidAttribute(const Attribute
     GeomValidators_ShapeType aShapeTypeValidator;
     if(!aShapeTypeValidator.isValid(anAttr, theArguments, theError)) {
       theError = "Selected shape has unacceptable type. Acceptable types are: faces or wires on sketch, \
-                  whole sketch(if it has at least one face), and whole objects with shape types: ";
+whole sketch(if it has at least one face), and whole objects with shape types: ";
       std::list<std::string>::const_iterator anIt = theArguments.cbegin();
       theError += *anIt;
       for(++anIt; anIt != theArguments.cend(); ++anIt) {
@@ -181,43 +181,40 @@ bool FeaturesPlugin_ValidatorCompositeLauncher::isValid(const AttributePtr& theA
     theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed";
     return false;
   }
-
-  bool aValid = true;
-  GeomValidators_FeatureKind* aValidator = new GeomValidators_FeatureKind();
-  // check whether the selection is on the sketch
-  bool aFeatureKindValid = aValidator->isValid(theAttribute, theArguments, theError);
-  if (!aFeatureKindValid) {
-    // check if selection has Face selected
-    GeomValidators_ShapeType* aShapeType = new GeomValidators_ShapeType();
-    std::list<std::string> anArguments;
-    anArguments.push_back("face");
-    aValid = aShapeType->isValid(theAttribute, anArguments, theError);
+  if (theArguments.size() != 2) {
+    theError = "Wrong parameters in XML definition for " + theAttribute->attributeType() + " type";
+    return false;
   }
-  return aValid;
-}
-
-//=================================================================================================
-bool FeaturesPlugin_ValidatorCompositeLauncher_::isValid(const AttributePtr& theAttribute,
-                                                        const std::list<std::string>& theArguments,
-                                                        std::string& theError) const
-{
-  FeaturesPlugin_ValidatorBaseForGeneration aBaseValidator;
-
-  if(aBaseValidator.isValid(theAttribute, theArguments, theError)) {
-    return true;
+  // first argument is for the base attribute, second - for skipping feature kind
+  std::list<std::string>::const_iterator anIt = theArguments.begin();
+  std::string aBaseAttributeId = *anIt;
+  FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner());
+  AttributePtr aBaseAttribute = aFeature->attribute(aBaseAttributeId);
+  if (!aBaseAttribute.get()) {
+    theError = "Wrong parameters in XML definition for " + theAttribute->attributeType() + " type";
+    return false;
   }
+  if (aBaseAttribute->isInitialized()) // when base list of composite feature is already filled,
+    // this validator is not necessary anymore
+    return true;
 
-  // Check that face selected.
-  GeomValidators_ShapeType aShapeType;
+  anIt++;
+  std::string aFeatureAttributeKind = *anIt;
+  GeomValidators_FeatureKind* aValidator = new GeomValidators_FeatureKind();
+  // check whether the selection is on the sketch
   std::list<std::string> anArguments;
-  anArguments.push_back("face");
-  if(aShapeType.isValid(theAttribute, anArguments, theError)) {
-    return true;
-  }
+  anArguments.push_back(aFeatureAttributeKind);
 
-  theError = "Selected shape is not suitable for this operation";
+  bool aFeatureKind = aValidator->isValid(theAttribute, theArguments, theError);
+  bool aPlanarFace = false;
+  // check if selection has Face selected
+  GeomValidators_ShapeType* aShapeType = new GeomValidators_ShapeType();
+  anArguments.clear();
+  anArguments.push_back("face");
+  aPlanarFace = aShapeType->isValid(theAttribute, anArguments, theError);
 
-  return false;
+  bool aValid = !aFeatureKind && aPlanarFace;
+  return aValid;
 }
 
 //=================================================================================================
@@ -225,21 +222,13 @@ bool FeaturesPlugin_ValidatorCanBeEmpty::isValid(const std::shared_ptr<ModelAPI_
                                                  const std::list<std::string>& theArguments,
                                                  std::string& theError) const
 {
-  if(theArguments.size() != 5 && theArguments.size() != 6) {
-    theError = "Validator should be used with 6 parameters for extrusion and with 5 for revolution.";
+  if(theArguments.size() != 2) {
+    theError = "Validator should be used with 2 parameters for extrusion.";
     return false;
   }
 
   std::list<std::string>::const_iterator anArgsIt = theArguments.begin(), aLast = theArguments.end();
 
-  std::string aSelectedMethod;
-  if(theFeature->string(*anArgsIt)) {
-    aSelectedMethod = theFeature->string(*anArgsIt)->value();
-  }
-  ++anArgsIt;
-  std::string aCreationMethod = *anArgsIt;
-  ++anArgsIt;
-
   AttributePtr aCheckAttribute = theFeature->attribute(*anArgsIt);
   ++anArgsIt;
 
@@ -247,33 +236,26 @@ bool FeaturesPlugin_ValidatorCanBeEmpty::isValid(const std::shared_ptr<ModelAPI_
     return true;
   }
 
-  if(aSelectedMethod == aCreationMethod) {
-    ++anArgsIt;
-    ++anArgsIt;
+  AttributeSelectionPtr aSelAttr = theFeature->selection(*anArgsIt);
+  if(!aSelAttr.get()) {
+    theError = "Could not get selection attribute \"" + *anArgsIt + "\".";
+    return false;
   }
 
-  for(; anArgsIt != theArguments.cend(); ++anArgsIt) {
-    AttributeSelectionPtr aSelAttr = theFeature->selection(*anArgsIt);
-    if(!aSelAttr.get()) {
-      theError = "Could not get selection attribute \"" + *anArgsIt + "\".";
+  GeomShapePtr aShape = aSelAttr->value();
+  if(!aShape.get()) {
+    ResultPtr aContext = aSelAttr->context();
+    if(!aContext.get()) {
+      theError = "Selection attribute \"" + *anArgsIt + "\" can not be empty.";
       return false;
     }
 
-    GeomShapePtr aShape = aSelAttr->value();
-    if(!aShape.get()) {
-      ResultPtr aContext = aSelAttr->context();
-      if(!aContext.get()) {
-        theError = "Selection attribute \"" + *anArgsIt + "\" can not be empty.";
-        return false;
-      }
-
-      aShape = aContext->shape();
-    }
+    aShape = aContext->shape();
+  }
 
-    if(!aShape.get()) {
-      theError = "Selection attribute \"" + *anArgsIt + "\" can not be empty.";
-      return false;
-    }
+  if(!aShape.get()) {
+    theError = "Selection attribute \"" + *anArgsIt + "\" can not be empty.";
+    return false;
   }
 
   return true;