+bool FeaturesPlugin_ValidatorPipeLocations::isNotObligatory(std::string theFeature, std::string theAttribute)
+{
+ return false;
+}
+
+//=================================================================================================
+bool FeaturesPlugin_ValidatorBaseForGeneration::isValid(const AttributePtr& theAttribute,
+ const std::list<std::string>& theArguments,
+ std::string& theError) const
+{
+ if(theArguments.empty()) {
+ theError = "Validator parameters is empty.";
+ return false;
+ }
+
+ // Checking attribute.
+ if(!isValidAttribute(theAttribute, theArguments, theError)) {
+ if(theError.empty()) {
+ theError = "Attribute contains unacceptable shape.";
+ }
+ return false;
+ }
+
+ return true;
+}
+
+//=================================================================================================
+bool FeaturesPlugin_ValidatorBaseForGeneration::isValidAttribute(const AttributePtr& theAttribute,
+ const std::list<std::string>& theArguments,
+ std::string& theError) const
+{
+ if(!theAttribute.get()) {
+ theError = "Empty attribute.";
+ return false;
+ }
+
+ std::string anAttributeType = theAttribute->attributeType();
+ if(anAttributeType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aListAttr = std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(theAttribute);
+ for(int anIndex = 0; anIndex < aListAttr->size(); ++anIndex) {
+ // If at least one attribute is invalid, the result is false.
+ if(!isValidAttribute(aListAttr->value(anIndex), theArguments, theError)) {
+ return false;
+ }
+ }
+ } else if(anAttributeType == ModelAPI_AttributeSelection::typeId()) {
+ // Getting context.
+ AttributeSelectionPtr anAttr = std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(theAttribute);
+ ResultPtr aContext = anAttr->context();
+ if(!aContext.get()) {
+ theError = "Attribute have empty context.";
+ return false;
+ }
+
+ GeomShapePtr aShape = anAttr->value();
+ GeomShapePtr aContextShape = aContext->shape();
+ if(!aShape.get()) {
+ aShape = aContextShape;
+ }
+ if(!aShape.get()) {
+ theError = "Empty shape selected";
+ return false;
+ }
+
+ ResultConstructionPtr aConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
+ if(aConstruction.get()) {
+ // Construciotn selected. Check that is is not infinite.
+ if(aConstruction->isInfinite()) {
+ theError = "Infinite constructions is not allowed as base.";
+ return false;
+ }
+
+ if(aShape->isEqual(aContextShape)) {
+ // Whole construction selected. Check that it have faces.
+ if(aConstruction->facesNum() > 0) {
+ return true;
+ }
+ } else {
+ // Shape on construction selected. Check that it is a face or wire.
+ if(aShape->shapeType() == GeomAPI_Shape::WIRE || aShape->shapeType() == GeomAPI_Shape::FACE) {
+ return true;
+ }
+ }
+ }
+
+ if(!aShape->isEqual(aContextShape)) {
+ // Local selection on body does not allowed.
+ theError = "Selected shape is in the local selection. Only global selection is allowed.";
+ return false;
+ }
+
+ // Check that object is a shape with allowed type.
+ 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: ";
+ std::list<std::string>::const_iterator anIt = theArguments.cbegin();
+ theError += *anIt;
+ for(++anIt; anIt != theArguments.cend(); ++anIt) {
+ theError += ", " + *anIt;
+ }
+ return false;
+ }
+
+ } else {
+ theError = "Following attribute does not supported: " + anAttributeType + ".";
+ return false;
+ }
+
+ return true;
+}
+
+//=================================================================================================
+bool FeaturesPlugin_ValidatorCompositeLauncher::isValid(const AttributePtr& theAttribute,
+ const std::list<std::string>& theArguments,
+ std::string& theError) const