X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomValidators%2FGeomValidators_DifferentShapes.cpp;h=58f6892dfe705d0f5215562c3075abe4f26a2d1f;hb=d5d78920316491975a67f76578982b401cdfe71d;hp=75f3535004cd3e7a0c841a7d84afbf08c7da9421;hpb=a94fc319f2aa64b43c9a73b5ff7063923648faec;p=modules%2Fshaper.git diff --git a/src/GeomValidators/GeomValidators_DifferentShapes.cpp b/src/GeomValidators/GeomValidators_DifferentShapes.cpp index 75f353500..58f6892df 100644 --- a/src/GeomValidators/GeomValidators_DifferentShapes.cpp +++ b/src/GeomValidators/GeomValidators_DifferentShapes.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "GeomValidators_DifferentShapes.h" @@ -23,31 +22,89 @@ #include #include +#include #include "ModelAPI_Object.h" #include +#include +//================================================================================================= bool GeomValidators_DifferentShapes::isValid(const AttributePtr& theAttribute, const std::list& theArguments, Events_InfoMessage& theError) const { - FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + bool isValid = false; + + std::string anAttributeType = theAttribute->attributeType(); + bool isList = anAttributeType == ModelAPI_AttributeSelectionList::typeId(); + + std::list anAttrs; + if (isList) { + AttributeSelectionListPtr aListAttr = + std::dynamic_pointer_cast(theAttribute); + // get all selection attributes from the list + for (int anIndex = 0; anIndex < aListAttr->size(); ++anIndex) { + anAttrs.push_back(aListAttr->value(anIndex)); + } + + isValid = checkEquals(anAttrs); + } + else { + // get all feature selection attributes + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + anAttrs = aFeature->data()->attributes(ModelAPI_AttributeSelection::typeId()); + + isValid = checkEqualToCurrent(anAttrs, theAttribute); + } + + if (!isValid) { + theError = isList ? "The selection list contains equal shapes." : + "The feature uses equal shapes."; + return false; + } + + return true; +} + +//================================================================================================= +bool GeomValidators_DifferentShapes::checkEquals(std::list& theAttributes) +{ + std::list::iterator anIt = theAttributes.begin(); + for (; anIt != theAttributes.end(); anIt++) { + AttributePtr anAttribute = *anIt; + + std::list::iterator anOthersIt = std::next(anIt); + for (; anOthersIt != theAttributes.end(); anOthersIt++) { + AttributePtr anOtherAttribute = *anOthersIt; + if (isAttrShapesEqual(anAttribute, anOtherAttribute)) { + return false; + } + } + } + + return true; +} + +//================================================================================================= +bool GeomValidators_DifferentShapes::checkEqualToCurrent(std::list& theAttributes, + const AttributePtr& theCurrentAttribute) +{ AttributeSelectionPtr aSelectionAttribute = - std::dynamic_pointer_cast(theAttribute); + std::dynamic_pointer_cast(theCurrentAttribute); + GeomShapePtr aShape = aSelectionAttribute->value(); + ResultPtr aResultContext = aSelectionAttribute->context(); if (!aShape.get()) { - ResultPtr aResult = aSelectionAttribute->context(); - if (aResult.get()) - aShape = aResult->shape(); + if (aResultContext.get()) + aShape = aResultContext->shape(); } + // whole feature selection + FeaturePtr aFeature = aSelectionAttribute->contextFeature(); - std::string aCurrentAttributeId = theAttribute->id(); - // get all feature attributes - std::list anAttrs = - aFeature->data()->attributes(ModelAPI_AttributeSelection::typeId()); - if (anAttrs.size() > 0 && aShape.get() != NULL) { - std::list::iterator anAttr = anAttrs.begin(); - for(; anAttr != anAttrs.end(); anAttr++) { + std::string aCurrentAttributeId = theCurrentAttribute->id(); + if (theAttributes.size() > 0 && aShape.get() != NULL) { + std::list::iterator anAttr = theAttributes.begin(); + for (; anAttr != theAttributes.end(); anAttr++) { AttributePtr anAttribute = *anAttr; // take into concideration only other attributes if (anAttribute.get() != NULL && anAttribute->id() != aCurrentAttributeId) { @@ -56,18 +113,64 @@ bool GeomValidators_DifferentShapes::isValid(const AttributePtr& theAttribute, // the shape of the attribute should be not the same if (aSelectionAttribute.get() != NULL) { GeomShapePtr anAttrShape = aSelectionAttribute->value(); + ResultPtr aResult = aSelectionAttribute->context(); if (!anAttrShape.get()) { - ResultPtr aResult = aSelectionAttribute->context(); if (aResult.get()) anAttrShape = aResult->shape(); } if (aShape->isEqual(anAttrShape)) { - theError = "The feature uses equal shapes."; return false; } + if (aFeature.get()) { + if (aResult.get()) { // check result is in feature + if (aResult->document()->feature(aResult) == aFeature) + return false; + } + else { // check selection of the same features + if (aFeature == aSelectionAttribute->contextFeature()) + return false; + } + } + else { + if (!aResult.get() && aResultContext.get()) { + FeaturePtr aSelectedFeature = aSelectionAttribute->contextFeature(); + if (aResultContext->document()->feature(aResultContext) == aSelectedFeature) + return false; + } + } } } } } + return true; } + +bool GeomValidators_DifferentShapes::isAttrShapesEqual(const AttributePtr& theAttribute, + const AttributePtr& theOtherAttribute) +{ + AttributeSelectionPtr aSelectionAttribute = + std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr anOtherSelectionAttribute = + std::dynamic_pointer_cast(theOtherAttribute); + + GeomShapePtr aShape = aSelectionAttribute->value(); + if (!aShape.get()) { + ResultPtr aResult = aSelectionAttribute->context(); + if (aResult.get()) + aShape = aResult->shape(); + } + GeomShapePtr aTypedShape = GeomAPI_Tools::getTypedShape(aShape); + + GeomShapePtr anOtherShape = anOtherSelectionAttribute->value(); + if (!anOtherShape.get()) { + ResultPtr aResult = anOtherSelectionAttribute->context(); + if (aResult.get()) + anOtherShape = aResult->shape(); + } + GeomShapePtr aOtherTypedShape = GeomAPI_Tools::getTypedShape(anOtherShape); + + if (!aTypedShape.get()) + return !aTypedShape.get() && !aOtherTypedShape.get(); + return aTypedShape->isEqual(aOtherTypedShape); +}