X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Validators.cpp;h=cef1e60380eba49b515d2a980762cc19cb40c510;hb=ae42afe3e35f7d69b26ef66323c54eb9e2fe45fe;hp=32fea83989156974e215e1ba842a8fc613b67ce2;hpb=5a82acff74697623112b76b67c0200945a3e9976;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Validators.cpp b/src/PartSet/PartSet_Validators.cpp old mode 100755 new mode 100644 index 32fea8398..cef1e6038 --- a/src/PartSet/PartSet_Validators.cpp +++ b/src/PartSet/PartSet_Validators.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2021 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 "PartSet_Validators.h" @@ -54,7 +53,10 @@ #include #include +#include + #include +#include #ifdef _DEBUG #include #endif @@ -75,7 +77,9 @@ int shapesNbPoints(const ModuleBase_ISelection* theSelection) return aCount; } -int shapesNbLines(const ModuleBase_ISelection* theSelection) +typedef std::unordered_map ShapeQuantity; + +int shapesNbEdges(const ModuleBase_ISelection* theSelection, ShapeQuantity& theEdges) { QList aList = theSelection->getSelected(ModuleBase_ISelection::Viewer); int aCount = 0; @@ -88,8 +92,8 @@ int shapesNbLines(const ModuleBase_ISelection* theSelection) Standard_Real aStart, aEnd; Handle(Geom_Curve) aCurve = BRep_Tool::Curve(aEdge, aStart, aEnd); GeomAdaptor_Curve aAdaptor(aCurve); - if (aAdaptor.GetType() == GeomAbs_Line) - aCount++; + theEdges[(int)aAdaptor.GetType()] += 1; + aCount++; } } } @@ -142,8 +146,11 @@ bool PartSet_DistanceSelection::isValid(const ModuleBase_ISelection* theSelectio if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbPoints(theSelection) + shapesNbLines(theSelection); - return (aCount > 0) && (aCount < 3); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return (aNbPoints >= 0 && aNbPoints < 3) && + (aShapes[GeomAbs_Line] == aNbEdges && aNbEdges >= 0 && aNbEdges < 2); } } @@ -153,8 +160,10 @@ bool PartSet_LengthSelection::isValid(const ModuleBase_ISelection* theSelection, if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbLines(theSelection); - return (aCount == 1); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && (aShapes[GeomAbs_Line] == aNbEdges && aNbEdges == 1); } } @@ -164,8 +173,10 @@ bool PartSet_PerpendicularSelection::isValid(const ModuleBase_ISelection* theSel if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbLines(theSelection); - return (aCount > 0) && (aCount < 3); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && aShapes[GeomAbs_Line] == aNbEdges && aNbEdges > 0 && aNbEdges < 3; } } @@ -175,8 +186,10 @@ bool PartSet_ParallelSelection::isValid(const ModuleBase_ISelection* theSelectio if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbLines(theSelection); - return (aCount > 0) && (aCount < 3); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && aShapes[GeomAbs_Line] == aNbEdges && aNbEdges > 0 && aNbEdges < 3; } } @@ -186,24 +199,10 @@ bool PartSet_RadiusSelection::isValid(const ModuleBase_ISelection* theSelection, if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - QList aList = - theSelection->getSelected(ModuleBase_ISelection::Viewer); - int aCount = 0; - foreach (ModuleBase_ViewerPrsPtr aPrs, aList) { - const GeomShapePtr& aShape = aPrs->shape(); - if (aShape.get() && !aShape->isNull()) { - if (aShape->shapeType() == GeomAPI_Shape::EDGE) { - const TopoDS_Shape& aTDShape = aShape->impl(); - TopoDS_Edge aEdge = TopoDS::Edge(aTDShape); - Standard_Real aStart, aEnd; - Handle(Geom_Curve) aCurve = BRep_Tool::Curve(aEdge, aStart, aEnd); - GeomAdaptor_Curve aAdaptor(aCurve); - if (aAdaptor.GetType() == GeomAbs_Circle) - aCount++; - } - } - } - return (aCount == 1); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && (aShapes[GeomAbs_Circle] == aNbEdges && aNbEdges == 1); } } @@ -239,9 +238,10 @@ bool PartSet_CoincidentSelection::isValid(const ModuleBase_ISelection* theSelect return isEmptySelectionValid(theOperation); } else { // Coincident can be applied to points and to lines - int aCount = shapesNbPoints(theSelection); - aCount += shapesNbLines(theSelection); - return (aCount > 0) && (aCount < 3); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return (aNbPoints >= 0 && aNbPoints < 3) && (aNbEdges >= 0 && aNbEdges < 2); } } @@ -251,8 +251,10 @@ bool PartSet_HVDirSelection::isValid(const ModuleBase_ISelection* theSelection, if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbLines(theSelection); - return (aCount == 1); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && (aShapes[GeomAbs_Line] == aNbEdges && aNbEdges == 1); } } @@ -263,7 +265,9 @@ bool PartSet_FilletSelection::isValid(const ModuleBase_ISelection* theSelection, return isEmptySelectionValid(theOperation); } else { int aCount = shapesNbPoints(theSelection); - return aCount > 1; + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aCount > 1 && aNbEdges == 0; } } @@ -273,35 +277,10 @@ bool PartSet_TangentSelection::isValid(const ModuleBase_ISelection* theSelection if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - QList aList = theSelection->getSelected(ModuleBase_ISelection::Viewer); - if ((aList.size() == 0) || (aList.size() > 2)) - return false; - - ModuleBase_ViewerPrsPtr aPrs = aList.first(); - const GeomShapePtr& aShape = aPrs->shape(); - if (!aShape.get() || aShape->isNull() || aShape->shapeType() != GeomAPI_Shape::EDGE) - return false; - GeomAPI_Edge aEdge1(aShape); - - if (aEdge1.isLine() || aEdge1.isArc()) { - if (aList.size() == 2) { - // Check second selection - aPrs = aList.last(); - const GeomShapePtr& aShape2 = aPrs->shape(); - if (!aShape2.get() || aShape2->isNull() || aShape2->shapeType() != GeomAPI_Shape::EDGE) - return false; - GeomAPI_Edge aEdge2(aShape2); - - if (aEdge1.isLine() && aEdge2.isArc()) - return true; - else if (aEdge1.isArc() && aEdge2.isLine()) - return true; - else - return false; - } else - return true; - } - return false; + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && (aNbEdges == 1 || (aNbEdges == 2 && aShapes[GeomAbs_Line] == 1)); } } @@ -311,8 +290,10 @@ bool PartSet_AngleSelection::isValid(const ModuleBase_ISelection* theSelection, if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbLines(theSelection); - return (aCount > 0) && (aCount < 3); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && aShapes[GeomAbs_Line] == aNbEdges && aNbEdges > 0 && aNbEdges < 3; } } @@ -322,35 +303,13 @@ bool PartSet_EqualSelection::isValid(const ModuleBase_ISelection* theSelection, if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - QList aList = - theSelection->getSelected(ModuleBase_ISelection::Viewer); - int aCount = 0; - int aType = 0; - foreach (ModuleBase_ViewerPrsPtr aPrs, aList) { - GeomShapePtr aShape = aPrs->shape(); - if (aShape.get() && aShape->isEdge()) { - aCount++; - GeomAPI_Edge aEdge(aShape); - if (aEdge.isLine()) { - if (aCount == 1) - aType = 1; - else if (aType != 1) - return false; - } else if (aEdge.isCircle()) { - if (aCount == 1) - aType = 2; - else if (aType != 2) - return false; - } else if (aEdge.isArc()) { - if (aCount == 1) - aType = 3; - else if (aType != 3) - return false; - } - } else - return false; - } - return (aCount > 0) && (aCount < 3); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && (aNbEdges > 0 && aNbEdges < 3) && + (aShapes[GeomAbs_Line] == aNbEdges || + aShapes[GeomAbs_Circle] == aNbEdges || + aShapes[GeomAbs_Ellipse] == aNbEdges); } } @@ -360,8 +319,10 @@ bool PartSet_CollinearSelection::isValid(const ModuleBase_ISelection* theSelecti if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbLines(theSelection); - return (aCount > 0) && (aCount < 3); + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbPoints == 0 && aShapes[GeomAbs_Line] == aNbEdges && aNbEdges > 0 && aNbEdges < 3; } } @@ -370,8 +331,12 @@ bool PartSet_MiddlePointSelection::isValid(const ModuleBase_ISelection* theSelec { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) return isEmptySelectionValid(theOperation); - else - return shapesNbLines(theSelection) == 1 || shapesNbPoints(theSelection) == 1; + else { + int aNbPoints = shapesNbPoints(theSelection); + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return (aNbPoints >= 0 && aNbPoints < 3) && (aNbEdges >= 0 && aNbEdges < 2); + } } bool PartSet_MultyTranslationSelection::isValid(const ModuleBase_ISelection* theSelection, @@ -380,8 +345,9 @@ bool PartSet_MultyTranslationSelection::isValid(const ModuleBase_ISelection* the if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbLines(theSelection); - return aCount > 0; + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbEdges > 0; } } @@ -391,31 +357,24 @@ bool PartSet_SplitSelection::isValid(const ModuleBase_ISelection* theSelection, if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - int aCount = shapesNbLines(theSelection); - return aCount > 0; + ShapeQuantity aShapes; + int aNbEdges = shapesNbEdges(theSelection, aShapes); + return aNbEdges > 0; } } bool PartSet_ProjectionSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const { - if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { - return isEmptySelectionValid(theOperation); - } else { - int aCount = shapesNbLines(theSelection); - return aCount > 0; - } + return theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0 && + isEmptySelectionValid(theOperation); } bool PartSet_IntersectionSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const { - if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { - return isEmptySelectionValid(theOperation); - } else { - int aCount = shapesNbLines(theSelection); - return aCount == 0; - } + return theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0 && + isEmptySelectionValid(theOperation); } @@ -478,8 +437,9 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute continue; if (isObject) { if (aRef->object() == anObject) { - theError = errorMessage(EqualObjects, anObject.get() ? anObject->data()->name() : "", - theAttribute->id(), aRef->id()); + theError = errorMessage(EqualObjects, + anObject.get() ? Locale::Convert::toString(anObject->data()->name()) : "", + theAttribute->id(), aRef->id()); return false; } } @@ -497,10 +457,11 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute } } else if (anAttrType == ModelAPI_AttributeSelection::typeId()) { - AttributeSelectionPtr anAttr = + AttributeSelectionPtr anAttrSel = std::dynamic_pointer_cast(theAttribute); - ResultPtr aContext = anAttr->context(); - GeomShapePtr aShape = anAttr->value(); + ResultPtr aContext = anAttrSel->context(); + FeaturePtr aContextFeature = anAttrSel->contextFeature(); + GeomShapePtr aShape = anAttrSel->value(); // Check selection attributes anAttrs = aFeature->data()->attributes(ModelAPI_AttributeSelection::typeId()); @@ -518,14 +479,32 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute return false; } } + // check the whole selected feature contains the result + if (aContextFeature.get()) { + if (aRef->contextFeature().get()) { + if (aContextFeature == aRef->contextFeature()) { + theError = errorMessage(EqualShapes, "", theAttribute->id(), aRef->id()); + return false; + } + } else if (aRef->context().get() && + aRef->context()->document()->feature(aRef->context()) == aContextFeature) { + theError = errorMessage(EqualShapes, "", theAttribute->id(), aRef->id()); + return false; + } + } else if (aRef->contextFeature().get() && aContext.get()) { + if (aContext->document()->feature(aContext) == aRef->contextFeature()) { + theError = errorMessage(EqualShapes, "", theAttribute->id(), aRef->id()); + return false; + } + } } } } } else if (anAttrType == ModelAPI_AttributeReference::typeId()) { - AttributeReferencePtr anAttr = + AttributeReferencePtr anAttrRef = std::dynamic_pointer_cast(theAttribute); - ObjectPtr anObject = anAttr->value(); + ObjectPtr anObject = anAttrRef->value(); // Check selection attributes anAttrs = aFeature->data()->attributes(ModelAPI_AttributeReference::typeId()); if (anAttrs.size() > 0) { @@ -536,13 +515,14 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute std::dynamic_pointer_cast(*anAttr); // check the object is already presented if (aRef->value() == anObject) { - theError = errorMessage(EqualObjects, anObject.get() ? anObject->data()->name() : "", - theAttribute->id(), aRef->id()); + theError = errorMessage(EqualObjects, + anObject.get() ? Locale::Convert::toString(anObject->data()->name()) : "", + theAttribute->id(), aRef->id()); return false; } } - return true; } + return true; } } else if(anAttrType == ModelAPI_AttributeSelectionList::typeId()) { @@ -558,6 +538,7 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute for(int i = 0; i < aCurSelList->size(); i++) { std::shared_ptr aCurSel = aCurSelList->value(i); ResultPtr aCurSelContext = aCurSel->context(); + FeaturePtr aCurSelFeature = aCurSel->contextFeature(); ResultBodyPtr aCurSelCompSolidPtr = ModelAPI_Tools::bodyOwner(aCurSelContext); std::shared_ptr aCurSelCompSolid; if(aCurSelCompSolidPtr.get()) { @@ -566,27 +547,47 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute for(int j = 0; j < aRefSelList->size(); j++) { std::shared_ptr aRefSel = aRefSelList->value(j); ResultPtr aRefSelContext = aRefSel->context(); + FeaturePtr aRefSelFeature = aRefSel->contextFeature(); ResultBodyPtr aRefSelCompSolidPtr = ModelAPI_Tools::bodyOwner(aRefSelContext); std::shared_ptr aRefSelCompSolid; - if(aRefSelCompSolidPtr.get()) { + if (aRefSelCompSolidPtr.get()) { aRefSelCompSolid = aRefSelCompSolidPtr->shape(); } if ((aCurSelCompSolid.get() && aCurSelCompSolid->isEqual(aRefSel->value())) || (aRefSelCompSolid.get() && aRefSelCompSolid->isEqual(aCurSel->value()))) { - theError = errorMessage(EqualShapes, "", theAttribute->id(), - aRefSel->id()); - return false; + theError = errorMessage(EqualShapes, "", theAttribute->id(), + aRefSel->id()); + return false; } - if(aCurSelContext == aRefSelContext) { + if (aCurSelContext == aRefSelContext) { if (aCurSel->value().get() == NULL || aRefSel->value().get() == NULL) { - theError = errorMessage(EmptyShapes, "", theAttribute->id(), - aRefSel->id()); + theError = errorMessage(EmptyShapes, "", theAttribute->id(), aRefSel->id()); return false; } if (aCurSel->value()->isEqual(aRefSel->value())) { - theError = errorMessage(EqualShapes, "", theAttribute->id(), - aRefSel->id()); + theError = errorMessage(EqualShapes, "", theAttribute->id(), aRefSel->id()); + return false; + } + } + + // check the whole selected feature contains the result + if (aCurSelFeature.get()) { + if (aRefSelFeature.get()) { + if (aCurSelFeature == aRefSelFeature) { + theError = errorMessage(EqualShapes, "", theAttribute->id(), aRefSel->id()); + return false; + } + } + else if (aRefSelContext.get() && + aRefSelContext->document()->feature(aRefSelContext) == aCurSelFeature) { + theError = errorMessage(EqualShapes, "", theAttribute->id(), aRefSel->id()); + return false; + } + } + else if (aRefSelFeature.get() && aCurSelContext.get()) { + if (aCurSelContext->document()->feature(aCurSelContext) == aRefSelFeature) { + theError = errorMessage(EqualShapes, "", theAttribute->id(), aRefSel->id()); return false; } } @@ -611,8 +612,9 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute for (int j = 0; j < aRefSelList->size(); j++) { if (aCurSelObject == aRefSelList->object(j)) { theError = errorMessage(EqualObjects, - aCurSelObject.get() ? aCurSelObject->data()->name() : "", - theAttribute->id(), aCurSelList->id()); + aCurSelObject.get()? + Locale::Convert::toString(aCurSelObject->data()->name()) : "", + theAttribute->id(), aCurSelList->id()); return false; } } @@ -686,8 +688,6 @@ bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute, // there is a check whether the feature contains a point and a linear edge or two point values std::string aParamA = theArguments.front(); - SessionPtr aMgr = ModelAPI_Session::get(); - ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); @@ -718,13 +718,13 @@ bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute, AttributePtr aAR = aRAttr->attr(); if (aAR->id() != SketchPlugin_Arc::CENTER_ID()) // ignore constraint to center of arc aCoinList.insert(aConstrFeature); - QList anIsAttributes; - PartSet_Tools::findCoincidences(aConstrFeature, aCoinsideLines, aCoins, - SketchPlugin_ConstraintCoincidence::ENTITY_A(), - anIsAttributes); - PartSet_Tools::findCoincidences(aConstrFeature, aCoinsideLines, aCoins, - SketchPlugin_ConstraintCoincidence::ENTITY_B(), - anIsAttributes); + QList anIsAttributes; + PartSet_Tools::findCoincidences(aConstrFeature, aCoinsideLines, aCoins, + SketchPlugin_ConstraintCoincidence::ENTITY_A(), + anIsAttributes); + PartSet_Tools::findCoincidences(aConstrFeature, aCoinsideLines, aCoins, + SketchPlugin_ConstraintCoincidence::ENTITY_B(), + anIsAttributes); } } // if there is no coincidence then it is not valid