X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Validators.cpp;h=83ab5ed7515e82e4bd397422b2d8465bb47812ab;hb=658fccce59f75b0cfa7c3f3d45f1ffb295ed24be;hp=9afdafd181a9ea9b4a9c4efd88716722d0d5009a;hpb=dae58840b66bf4262ee617d7cff793cc048c2b93;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp b/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp index 9afdafd18..83ab5ed75 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp @@ -17,7 +17,9 @@ #include #include +#include #include +#include #include //================================================================================================= @@ -88,6 +90,56 @@ bool FeaturesPlugin_ValidatorBaseForGeneration::isValid(const AttributePtr& theA return false; } + std::set aSelectedSketches; + std::set aSelectedSketchesFromObjects; + GeomAPI_DataMapOfShapeShape aSelectedWiresFromObjects; + std::string anAttributeType = theAttribute->attributeType(); + if(anAttributeType == ModelAPI_AttributeSelectionList::typeId()) { + AttributeSelectionListPtr aListAttr = std::dynamic_pointer_cast(theAttribute); + for(int anIndex = 0; anIndex < aListAttr->size(); ++anIndex) { + AttributeSelectionPtr aSelectionAttr = aListAttr->value(anIndex); + ResultConstructionPtr aContext = std::dynamic_pointer_cast(aSelectionAttr->context()); + if(!aContext.get()) { + // It is not a result construction, continue. + continue; + } + + GeomShapePtr aShape = aSelectionAttr->value(); + GeomShapePtr aContextShape = aContext->shape(); + if(!aShape.get()) { + // Whole sketch selected. + if(aSelectedSketchesFromObjects.find(aContext) != aSelectedSketchesFromObjects.cend()) { + theError = "Object from this sketch is already selected. Sketch is not allowed for selection."; + return false; + } + + aSelectedSketches.insert(aContext); + } else { + // Object from sketch selected. + if(aSelectedSketches.find(aContext) != aSelectedSketches.cend()) { + theError = "Whole sketch with this object is already selected. Don't allow to select this object."; + return false; + } + + for(GeomAPI_ShapeExplorer anExp(aShape, GeomAPI_Shape::WIRE); anExp.more(); anExp.next()) { + GeomShapePtr aWire = anExp.current(); + if(aWire->orientation() != GeomAPI_Shape::FORWARD) { + theError = "Wire with wrong orientation selected."; + return false; + } + + if(aSelectedWiresFromObjects.isBound(aWire)) { + theError = "Objects with such wire already selected. Don't allow to select this object."; + return false; + } + + aSelectedWiresFromObjects.bind(aWire, aWire); + aSelectedSketchesFromObjects.insert(aContext); + } + } + } + } + return true; } @@ -148,6 +200,8 @@ bool FeaturesPlugin_ValidatorBaseForGeneration::isValidAttribute(const Attribute return true; } } + + return false; } if(!aShape->isEqual(aContextShape)) { @@ -159,8 +213,8 @@ bool FeaturesPlugin_ValidatorBaseForGeneration::isValidAttribute(const Attribute // 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: "; + 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::const_iterator anIt = theArguments.cbegin(); theError += *anIt; for(++anIt; anIt != theArguments.cend(); ++anIt) { @@ -251,7 +305,8 @@ bool FeaturesPlugin_ValidatorCanBeEmpty::isValid(const std::shared_ptrcontext(); if(!aContext.get()) { - theError = "Selection attribute \"" + *anArgsIt + "\" can not be empty."; + theError = "Base objects list contains vertex or edge, so attribute \"" + *anArgsIt + + "\" can not be used with default value. Select direction for extrusion."; return false; } @@ -259,7 +314,8 @@ bool FeaturesPlugin_ValidatorCanBeEmpty::isValid(const std::shared_ptr