X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomValidators%2FGeomValidators_ZeroOffset.cpp;h=3d08e9fd95817006dd9de5983b8865e88ab65539;hb=4fc2dc9fdc0c14fab5f2780598eccdc1368d81b9;hp=4bfe414a19f16627ee8e428ef33b5a6362ecc764;hpb=1a0d48211014d96db9125fe973eacbae895c4490;p=modules%2Fshaper.git diff --git a/src/GeomValidators/GeomValidators_ZeroOffset.cpp b/src/GeomValidators/GeomValidators_ZeroOffset.cpp index 4bfe414a1..3d08e9fd9 100644 --- a/src/GeomValidators/GeomValidators_ZeroOffset.cpp +++ b/src/GeomValidators/GeomValidators_ZeroOffset.cpp @@ -6,16 +6,25 @@ #include -#include #include #include +#include #include +#include + +#include +#include +#include +#include +#include //================================================================================================= bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr& theFeature, - const std::list& theArguments) const + const std::list& theArguments, + std::string& theError) const { - if(theArguments.size() != 8) { + if(theArguments.size() != 9) { + theError = "Wrong number of validator arguments in xml(expected 9)."; return false; } @@ -28,7 +37,45 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr& anIt++; std::string aCreationMethod = *anIt; anIt++; - + + ListOfShape aFacesList; + if(theFeature->selection(*anIt)) { + AttributeSelectionPtr aFaceSelection = theFeature->selection(*anIt); + ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aFaceSelection->context()); + if(aConstruction.get()) { + int aSketchFacesNum = aConstruction->facesNum(); + for(int aFaceIndex = 0; aFaceIndex < aSketchFacesNum; aFaceIndex++) { + std::shared_ptr aFace = std::dynamic_pointer_cast(aConstruction->face(aFaceIndex)); + aFacesList.push_back(aFace); + } + } + } else if(theFeature->selectionList(*anIt)) { + AttributeSelectionListPtr aFacesSelectionList = theFeature->selectionList(*anIt); + for(int anIndex = 0; anIndex < aFacesSelectionList->size(); anIndex++) { + AttributeSelectionPtr aFaceSel = aFacesSelectionList->value(anIndex); + std::shared_ptr aFaceShape = aFaceSel->value(); + if(aFaceShape.get() && !aFaceShape->isNull()) { // Getting face. + aFacesList.push_back(aFaceShape); + } else { // This may be the whole sketch result selected, check and get faces. + ResultPtr aContext = aFaceSel->context(); + std::shared_ptr aContextShape = aContext->shape(); + if(!aContextShape.get()) { + break; + } + ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aContext); + if(!aConstruction.get()) { + break; + } + int aFacesNum = aConstruction->facesNum(); + for(int aFaceIndex = 0; aFaceIndex < aFacesNum || aFacesNum == -1; aFaceIndex++) { + aFaceShape = std::dynamic_pointer_cast(aConstruction->face(aFaceIndex)); + aFacesList.push_back(aFaceShape); + } + } + } + } + anIt++; + double aToSize = 0.0; double aFromSize = 0.0; @@ -42,7 +89,8 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr& anIt++; if(aSelectedMethod == aCreationMethod) { - if(aToSize == 0.0 && aFromSize == 0.0) { + if(aToSize == -aFromSize) { + theError = "ToSize = -FromSize."; return false; } else { return true; @@ -81,8 +129,42 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr& aFromSize = anAttrDouble->value(); } - if(((!aFromShape && !aToShape) || ((aFromShape && aToShape) && aFromShape->isEqual(aToShape))) - && (aFromSize == 0.0 && aToSize == 0.0)) { + bool isPlanesCoincident = false; + if(!aFromShape.get() && !aToShape.get()) { + isPlanesCoincident = true; + } else if(aFromShape.get() && aToShape.get()) { + std::shared_ptr aFromFace(new GeomAPI_Face(aFromShape)); + std::shared_ptr aFromPln = aFromFace->getPlane(); + + std::shared_ptr aToFace(new GeomAPI_Face(aToShape)); + std::shared_ptr aToPln = aToFace->getPlane(); + + if(aFromPln.get()) { + isPlanesCoincident = aFromPln->isCoincident(aToPln); + } + } else { + std::shared_ptr aFace; + if(aFromShape.get()) { + aFace.reset(new GeomAPI_Face(aFromShape)); + } else { + aFace.reset(new GeomAPI_Face(aToShape)); + } + std::shared_ptr aPln = aFace->getPlane(); + if(aPln.get()) { + for(ListOfShape::const_iterator anIter = aFacesList.cbegin(); anIter != aFacesList.cend(); anIter++) { + std::shared_ptr aSketchShape = *anIter; + std::shared_ptr aSketchFace(new GeomAPI_Face(aSketchShape)); + std::shared_ptr aSketchPln = aSketchFace->getPlane(); + if(aPln->isCoincident(aSketchPln)) { + isPlanesCoincident = true; + break; + } + } + } + } + + if(isPlanesCoincident && aFromSize == -aToSize) { + theError = "FromSize = -ToSize and bounding planes are coincident."; return false; }