X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomValidators%2FGeomValidators_ConstructionComposite.cpp;h=b19719831ce1846d1ba90a5c928e46f00769f1ee;hb=a82ea9780de8241676648ca46e467a74e082f328;hp=16fd4a2e954f83225f1c62adaf7f91774cc41a8b;hpb=2f86be51c890074b44f82d3ee46e98e9a565f246;p=modules%2Fshaper.git diff --git a/src/GeomValidators/GeomValidators_ConstructionComposite.cpp b/src/GeomValidators/GeomValidators_ConstructionComposite.cpp index 16fd4a2e9..b19719831 100644 --- a/src/GeomValidators/GeomValidators_ConstructionComposite.cpp +++ b/src/GeomValidators/GeomValidators_ConstructionComposite.cpp @@ -7,48 +7,60 @@ #include "ModelAPI_CompositeFeature.h" bool GeomValidators_ConstructionComposite::isValid(const AttributePtr& theAttribute, - const std::list& theArguments) const + const std::list& theArguments, + std::string& 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 " + theAttribute->attributeType() + " type is not processed"; 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 - if (aShape.get()) { - aValid = aShapePtr.get() != NULL && aShapePtr->isEqual(aShape); - } - else { + 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 condifition, the result is true + // the selected shape, so according to the upper condition, the result is true aValid = true; } - } - 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; - } 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;