X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FGeomValidators%2FGeomValidators_ConstructionComposite.cpp;h=8ae2b2dbf769cc9af7a7b132bd8f2f11feb752e9;hb=3a5afc79fc52a9ab688f830ab0d173e492b0ec7e;hp=fea2319925f92521a50aac085a7f37678041971b;hpb=ad777acf40828575ffa8a9ba6db103a7cc17dd71;p=modules%2Fshaper.git diff --git a/src/GeomValidators/GeomValidators_ConstructionComposite.cpp b/src/GeomValidators/GeomValidators_ConstructionComposite.cpp index fea231992..8ae2b2dbf 100644 --- a/src/GeomValidators/GeomValidators_ConstructionComposite.cpp +++ b/src/GeomValidators/GeomValidators_ConstructionComposite.cpp @@ -2,46 +2,68 @@ #include "GeomValidators_ConstructionComposite.h" +#include + #include "ModelAPI_AttributeSelection.h" #include "ModelAPI_ResultConstruction.h" #include "ModelAPI_CompositeFeature.h" bool GeomValidators_ConstructionComposite::isValid(const AttributePtr& theAttribute, - const std::list& theArguments) const + const std::list& theArguments, + Events_InfoMessage& theError) const { - bool aValid = false; - AttributeSelectionPtr aSelectionAttr = std::dynamic_pointer_cast - (theAttribute); - if (aSelectionAttr.get() == NULL) + bool aValid = true; + if (theAttribute->attributeType() != ModelAPI_AttributeSelection::typeId()) { + aValid = false; + theError = "The attribute with the %1 type is not processed"; + theError.arg(theAttribute->attributeType()); return aValid; + } + AttributeSelectionPtr aSelectionAttr = std::dynamic_pointer_cast + (theAttribute); ResultPtr aResult = aSelectionAttr->context(); - GeomShapePtr aShape = aSelectionAttr->value(); // global selection should be ignored, the filter processes only selected sub-shapes // that means, that the shape of the context result is equal to the shape value ///*ResultPtr aResult = std::dynamic_pointer_cast(theSelectedObject); - if (aResult.get() != NULL) { + if (!aResult.get()) { + aValid = false; + theError = "The result is empty"; + } + else { + GeomShapePtr aShape = aSelectionAttr->value(); GeomShapePtr aShapePtr = aResult->shape(); // it is important to call isEqual of the shape of result. // It is a GeomAPI_Vertex shape for the point. The shape of the parameter is // GeomAPI_Shape. It is important to use the realization of the isEqual method from // GeomAPI_Vertex class - aValid = aShapePtr.get() != NULL && aShapePtr->isEqual(aShape); - } - if (!aValid) { - ResultConstructionPtr aConstr = - std::dynamic_pointer_cast(aResult); - if (aConstr != NULL) { - // it provides selection only on compositie features, construction without composite - // feature is not selectable - FeaturePtr aFeature = ModelAPI_Feature::feature(aConstr); - CompositeFeaturePtr aComposite = - std::dynamic_pointer_cast(aFeature); - aValid = aComposite && aComposite->numberOfSubs() > 0; + if (!aShape.get()) { + // an empty shape is used in attribute selection if the shape of the result is equal to + // the selected shape, so according to the upper condition, the result is true + aValid = true; } else { - // non-construction results should be accepted by this filter, e.g. body results - aValid = true; + if (aShapePtr->isEqual(aShape)) { + aValid = true; + } + else { + ResultConstructionPtr aConstr = + std::dynamic_pointer_cast(aResult); + if (!aConstr.get()) { + // non-construction results should be accepted by this filter, e.g. body results + aValid = true; + } + else { + // it provides selection only on composite features, construction without composite + // feature is not selectable. + FeaturePtr aFeature = ModelAPI_Feature::feature(aConstr); + CompositeFeaturePtr aComposite = + std::dynamic_pointer_cast(aFeature); + aValid = aComposite && aComposite->numberOfSubs() > 0; + if (!aValid) + theError = "Uses composite construction feature without sub-features."; + } + } } } return aValid;