X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Validators.cpp;h=f8d05fe0a6c011c731d314ee19bc06739368b871;hb=d6d93bc8be11df99d82dc34232e924502333f0d6;hp=9766c0a9ee319424ef0817137272855b5e09d99a;hpb=b234852f214beada2b07507e1ed35827ce8988c4;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 9766c0a9e..f8d05fe0a --- a/src/PartSet/PartSet_Validators.cpp +++ b/src/PartSet/PartSet_Validators.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: PartSet_Validators.cpp -// Created: 09 July 2014 -// Author: Vitaly SMETANNIKOV +// 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "PartSet_Validators.h" @@ -19,18 +32,25 @@ #include #include +#include +#include + +#include + #include #include #include #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -80,21 +100,23 @@ std::shared_ptr sketcherPlane(ModuleBase_Operation* theOperation) { std::shared_ptr aEmptyPln; if (theOperation) { - ModuleBase_OperationFeature* aFeatureOp = dynamic_cast(theOperation); + ModuleBase_OperationFeature* aFeatureOp = + dynamic_cast(theOperation); if (aFeatureOp) { - CompositeFeaturePtr aFeature = + CompositeFeaturePtr aFeature = std::dynamic_pointer_cast(aFeatureOp->feature()); if (aFeature && (aFeature->getKind() == SketchPlugin_Sketch::ID())) return PartSet_Tools::sketchPlane(aFeature); } } - return aEmptyPln; + return aEmptyPln; } bool isEmptySelectionValid(ModuleBase_Operation* theOperation) { - ModuleBase_OperationFeature* aFeatureOp = dynamic_cast(theOperation); + ModuleBase_OperationFeature* aFeatureOp = + dynamic_cast(theOperation); // during the create operation empty selection is always valid if (!aFeatureOp->isEditOperation()) { return true; @@ -104,15 +126,17 @@ bool isEmptySelectionValid(ModuleBase_Operation* theOperation) std::shared_ptr aPlane = sketcherPlane(theOperation); if (aPlane.get()) return true; - else + else return false; } - else// in edit operation an empty selection is always valid, performed for re-entrant operrations + else + // in edit operation an empty selection is always valid, performed for re-entrant operrations return true; } } -bool PartSet_DistanceSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_DistanceSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -122,7 +146,8 @@ bool PartSet_DistanceSelection::isValid(const ModuleBase_ISelection* theSelectio } } -bool PartSet_LengthSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_LengthSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -132,7 +157,8 @@ bool PartSet_LengthSelection::isValid(const ModuleBase_ISelection* theSelection, } } -bool PartSet_PerpendicularSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_PerpendicularSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -142,7 +168,8 @@ bool PartSet_PerpendicularSelection::isValid(const ModuleBase_ISelection* theSel } } -bool PartSet_ParallelSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_ParallelSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -152,12 +179,14 @@ bool PartSet_ParallelSelection::isValid(const ModuleBase_ISelection* theSelectio } } -bool PartSet_RadiusSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_RadiusSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - QList aList = theSelection->getSelected(ModuleBase_ISelection::Viewer); + QList aList = + theSelection->getSelected(ModuleBase_ISelection::Viewer); int aCount = 0; foreach (ModuleBase_ViewerPrsPtr aPrs, aList) { const GeomShapePtr& aShape = aPrs->shape(); @@ -177,18 +206,33 @@ bool PartSet_RadiusSelection::isValid(const ModuleBase_ISelection* theSelection, } } -bool PartSet_RigidSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_RigidSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - QList aList = theSelection->getSelected(ModuleBase_ISelection::Viewer); - return (aList.count() == 1); + QList aList = + theSelection->getSelected(ModuleBase_ISelection::Viewer); + int aCount = 0; + foreach (ModuleBase_ViewerPrsPtr aPrs, aList) { + ObjectPtr aObj = aPrs->object(); + if (aObj.get()) { + FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); + if (aFeature.get()) { + CompositeFeaturePtr aComp = ModelAPI_Tools::compositeOwner(aFeature); + if (aComp.get() && (aComp->getKind() == SketchPlugin_Sketch::ID())) + aCount++; + } + } + } + return (aCount == 1); } } -bool PartSet_CoincidentSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_CoincidentSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -200,7 +244,8 @@ bool PartSet_CoincidentSelection::isValid(const ModuleBase_ISelection* theSelect } } -bool PartSet_HVDirSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_HVDirSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -210,7 +255,8 @@ bool PartSet_HVDirSelection::isValid(const ModuleBase_ISelection* theSelection, } } -bool PartSet_FilletSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_FilletSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -220,7 +266,8 @@ bool PartSet_FilletSelection::isValid(const ModuleBase_ISelection* theSelection, } } -bool PartSet_TangentSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_TangentSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -235,29 +282,23 @@ bool PartSet_TangentSelection::isValid(const ModuleBase_ISelection* theSelection 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; + 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.isLine()) + return false; } - return false; } + return true; } -bool PartSet_AngleSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_AngleSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -267,12 +308,14 @@ bool PartSet_AngleSelection::isValid(const ModuleBase_ISelection* theSelection, } } -bool PartSet_EqualSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_EqualSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); } else { - QList aList = theSelection->getSelected(ModuleBase_ISelection::Viewer); + QList aList = + theSelection->getSelected(ModuleBase_ISelection::Viewer); int aCount = 0; int aType = 0; foreach (ModuleBase_ViewerPrsPtr aPrs, aList) { @@ -285,12 +328,12 @@ bool PartSet_EqualSelection::isValid(const ModuleBase_ISelection* theSelection, aType = 1; else if (aType != 1) return false; - } else if (aEdge.isCircle()) { + } else if (aEdge.isCircle() || aEdge.isArc()) { if (aCount == 1) aType = 2; else if (aType != 2) return false; - } else if (aEdge.isArc()) { + } else if (aEdge.isEllipse()) { if (aCount == 1) aType = 3; else if (aType != 3) @@ -303,7 +346,8 @@ bool PartSet_EqualSelection::isValid(const ModuleBase_ISelection* theSelection, } } -bool PartSet_CollinearSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_CollinearSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) { return isEmptySelectionValid(theOperation); @@ -313,12 +357,57 @@ bool PartSet_CollinearSelection::isValid(const ModuleBase_ISelection* theSelecti } } -bool PartSet_MiddlePointSelection::isValid(const ModuleBase_ISelection* theSelection, ModuleBase_Operation* theOperation) const +bool PartSet_MiddlePointSelection::isValid(const ModuleBase_ISelection* theSelection, + ModuleBase_Operation* theOperation) const { if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) return isEmptySelectionValid(theOperation); else - return shapesNbLines(theSelection) == 1 && shapesNbPoints(theSelection) == 1; + return shapesNbLines(theSelection) == 1 || shapesNbPoints(theSelection) == 1; +} + +bool PartSet_MultyTranslationSelection::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; + } +} + +bool PartSet_SplitSelection::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; + } +} + +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; + } +} + +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; + } } @@ -352,19 +441,21 @@ std::string PartSet_DifferentObjectsValidator::errorMessage( return anError; } -bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute, +bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute, const std::list& theArguments, - std::string& theError) const + Events_InfoMessage& theError) const { FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); - // the type of validated attributes should be equal, attributes with different types are not validated + // the type of validated attributes should be equal, attributes with + // different types are not validated // Check RefAttr attributes std::string anAttrType = theAttribute->attributeType(); std::list > anAttrs; if (anAttrType == ModelAPI_AttributeRefAttr::typeId()) { - AttributeRefAttrPtr anAttr = std::dynamic_pointer_cast(theAttribute); + AttributeRefAttrPtr anAttr = + std::dynamic_pointer_cast(theAttribute); bool isObject = anAttr->isObject(); ObjectPtr anObject = anAttr->object(); @@ -374,7 +465,7 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute for(; anAttrIter != anAttrs.end(); anAttrIter++) { if ((*anAttrIter).get() && (*anAttrIter)->id() != theAttribute->id()) { std::shared_ptr aRef = - std::dynamic_pointer_cast(*anAttrIter); + std::dynamic_pointer_cast(*anAttrIter); if (aRef->isObject() != isObject) continue; if (isObject) { @@ -398,8 +489,10 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute } } else if (anAttrType == ModelAPI_AttributeSelection::typeId()) { - AttributeSelectionPtr anAttr = std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr anAttr = + std::dynamic_pointer_cast(theAttribute); ResultPtr aContext = anAttr->context(); + FeaturePtr aContextFeature = anAttr->contextFeature(); GeomShapePtr aShape = anAttr->value(); // Check selection attributes @@ -409,7 +502,7 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute for(; anAttr != anAttrs.end(); anAttr++) { if ((*anAttr).get() && (*anAttr)->id() != theAttribute->id()) { std::shared_ptr aRef = - std::dynamic_pointer_cast(*anAttr); + std::dynamic_pointer_cast(*anAttr); // check the object is already presented if (aRef->context() == aContext) { bool aHasShape = aShape.get() != NULL; @@ -418,12 +511,31 @@ 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 = std::dynamic_pointer_cast(theAttribute); + AttributeReferencePtr anAttr = + std::dynamic_pointer_cast(theAttribute); ObjectPtr anObject = anAttr->value(); // Check selection attributes anAttrs = aFeature->data()->attributes(ModelAPI_AttributeReference::typeId()); @@ -445,19 +557,20 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute } } else if(anAttrType == ModelAPI_AttributeSelectionList::typeId()) { - std::shared_ptr aCurSelList = + std::shared_ptr aCurSelList = std::dynamic_pointer_cast(theAttribute); anAttrs = aFeature->data()->attributes(ModelAPI_AttributeSelectionList::typeId()); if(anAttrs.size() > 0) { std::list>::iterator anAttrItr = anAttrs.begin(); for(; anAttrItr != anAttrs.end(); anAttrItr++){ if ((*anAttrItr).get() && (*anAttrItr)->id() != theAttribute->id()){ - std::shared_ptr aRefSelList = + std::shared_ptr aRefSelList = std::dynamic_pointer_cast(*anAttrItr); for(int i = 0; i < aCurSelList->size(); i++) { std::shared_ptr aCurSel = aCurSelList->value(i); ResultPtr aCurSelContext = aCurSel->context(); - ResultCompSolidPtr aCurSelCompSolidPtr = ModelAPI_Tools::compSolidOwner(aCurSelContext); + FeaturePtr aCurSelFeature = aCurSel->contextFeature(); + ResultBodyPtr aCurSelCompSolidPtr = ModelAPI_Tools::bodyOwner(aCurSelContext); std::shared_ptr aCurSelCompSolid; if(aCurSelCompSolidPtr.get()) { aCurSelCompSolid = aCurSelCompSolidPtr->shape(); @@ -465,26 +578,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(); - ResultCompSolidPtr aRefSelCompSolidPtr = ModelAPI_Tools::compSolidOwner(aRefSelContext); + 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; } } @@ -522,12 +656,63 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute return true; } -bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute, +bool PartSet_DifferentPointsValidator::isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + Events_InfoMessage& theError) const +{ + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + + // the type of validated attributes should be equal, attributes with + // different types are not validated + // Check RefAttr attributes + std::string anAttrType = theAttribute->attributeType(); + std::list > anAttrs; + if (anAttrType != ModelAPI_AttributeRefAttr::typeId()) + return true; + + // obtain point of the given attribute + AttributePoint2DPtr anAttributePoint = getRefPointAttribute(theAttribute); + if (!anAttributePoint.get() || !anAttributePoint->isInitialized()) + return true; + + // obtain point of the parameter attribute + AttributePoint2DPtr anArgumentPoint = getRefPointAttribute + (aFeature->attribute(theArguments.front())); + + if (!anArgumentPoint.get() || !anArgumentPoint->isInitialized()) + return true; + + return !anAttributePoint->pnt()->isEqual(anArgumentPoint->pnt()); +} + +AttributePoint2DPtr PartSet_DifferentPointsValidator::getRefPointAttribute + (const AttributePtr& theAttribute) const +{ + AttributeRefAttrPtr anAttr = std::dynamic_pointer_cast(theAttribute); + + AttributePoint2DPtr aPointAttribute; + if (anAttr->isObject()) { + ObjectPtr anObject = anAttr->object(); + if (anObject.get()) { + FeaturePtr aFeature = ModelAPI_Feature::feature(anObject); + if (aFeature->getKind() == SketchPlugin_Point::ID()) + aPointAttribute = std::dynamic_pointer_cast + (aFeature->attribute(SketchPlugin_Point::COORD_ID())); + } + } + else { + aPointAttribute = std::dynamic_pointer_cast(anAttr->attr()); + } + return aPointAttribute; +} + +bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute, const std::list& theArguments, - std::string& theError) const + Events_InfoMessage& theError) const { if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) { - theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed"; + theError = "The attribute with the %1 type is not processed"; + theError.arg(theAttribute->attributeType()); return false; } @@ -565,10 +750,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()); + SketchPlugin_ConstraintCoincidence::ENTITY_A(), + anIsAttributes); PartSet_Tools::findCoincidences(aConstrFeature, aCoinsideLines, aCoins, - SketchPlugin_ConstraintCoincidence::ENTITY_B()); + SketchPlugin_ConstraintCoincidence::ENTITY_B(), + anIsAttributes); } } // if there is no coincidence then it is not valid @@ -585,4 +773,3 @@ bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute, theError = "There is no a common coincident point."; return false; } -