X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Validators.cpp;h=29bdf3c27310df0ba7abadc7ca882ea353ef4f85;hb=7e0da9d6edbfd2e934df3ff119b45cec3cff6936;hp=14f5aaa9bf69b4d5295157ef9ccd868ef4571d9b;hpb=d77708ba98445935aae7a0d93b5506e1f16018de;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Validators.cpp b/src/SketchPlugin/SketchPlugin_Validators.cpp index 14f5aaa9b..29bdf3c27 100644 --- a/src/SketchPlugin/SketchPlugin_Validators.cpp +++ b/src/SketchPlugin/SketchPlugin_Validators.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: SketchPlugin_Validators.cpp // Created: 01 Aug 2014 // Author: Vitaly SMETANNIKOV @@ -8,6 +10,8 @@ #include #include #include +#include +#include #include bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, @@ -18,14 +22,22 @@ bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); + const ModelAPI_ResultValidator* anArcValidator = + dynamic_cast(aFactory->validator("SketchPlugin_ResultArc")); + bool anArcValid = anArcValidator->isValid(theObject); + if (anArcValid) + return false; + + // If the object is not a line then it is accepted const ModelAPI_ResultValidator* aLineValidator = - dynamic_cast(aFactory->validator("SketchPlugin_ResultLineValidator")); - if (!aLineValidator->isValid(theObject)) + dynamic_cast(aFactory->validator("SketchPlugin_ResultLine")); + bool aLineValid = aLineValidator->isValid(theObject); + if (!aLineValid) return true; // If it is a line then we have to check that first attribute id not a line - boost::shared_ptr aPoint = getFeaturePoint(theFeature->data(), aParamA); + std::shared_ptr aPoint = getFeaturePoint(theFeature->data(), aParamA); if (aPoint) return true; return false; @@ -34,20 +46,75 @@ bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, bool SketchPlugin_DistanceAttrValidator::isValid( const AttributePtr& theAttribute, const std::list& theArguments ) const { - boost::shared_ptr anAttr = - boost::dynamic_pointer_cast(theAttribute); - if (anAttr) { + // any point attribute is acceptable for the distance operation + return true; +} + +bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, + const std::list& theArguments, + const AttributePtr& theAttribute) const +{ + return isValid(theAttribute, theArguments); +} + +bool SketchPlugin_DifferentObjectsValidator::isValid(const FeaturePtr& theFeature, + const std::list& theArguments, + const ObjectPtr& theObject) const +{ + std::list > anAttrs = + theFeature->data()->attributes(ModelAPI_AttributeRefAttr::type()); + std::list >::iterator anAttr = anAttrs.begin(); + for(; anAttr != anAttrs.end(); anAttr++) { + if (*anAttr) { + std::shared_ptr aRef = + std::dynamic_pointer_cast(*anAttr); + // check the object is already presented + if (aRef->isObject() && aRef->object() == theObject) + return false; + } + } + return true; +} + +bool SketchPlugin_DifferentObjectsValidator::isValid( + const AttributePtr& theAttribute, const std::list& theArguments ) const +{ + std::shared_ptr anOrigAttr = + std::dynamic_pointer_cast(theAttribute); + if (anOrigAttr && anOrigAttr->isObject()) { const ObjectPtr& anObj = theAttribute->owner(); - const FeaturePtr aFeature = boost::dynamic_pointer_cast(anObj); - return isValid(aFeature, theArguments, anAttr->object()); + const FeaturePtr aFeature = std::dynamic_pointer_cast(anObj); + + std::list > anAttrs = + aFeature->data()->attributes(ModelAPI_AttributeRefAttr::type()); + std::list >::iterator anAttr = anAttrs.begin(); + for(; anAttr != anAttrs.end(); anAttr++) { + if (*anAttr && *anAttr != theAttribute) { + std::shared_ptr aRef = + std::dynamic_pointer_cast(*anAttr); + // check the object is already presented + if (aRef->isObject() && aRef->object() == anOrigAttr->object()) + return false; + } + } } - return true; // it may be not reference attribute, in this case, it is OK + return true; } -bool SketchPlugin_RadiusValidator::isValid( - const AttributePtr& theAttribute, const std::list& theArguments) const +bool SketchPlugin_DifferentObjectsValidator::isValid(const FeaturePtr& theFeature, + const std::list& theArguments, const AttributePtr& theAttribute) const { - boost::shared_ptr aDouble = - boost::dynamic_pointer_cast(theAttribute); - return aDouble->isInitialized() && aDouble->value() > 1.e-5; + std::list > anAttrs = + theFeature->data()->attributes(ModelAPI_AttributeRefAttr::type()); + std::list >::iterator anAttr = anAttrs.begin(); + for(; anAttr != anAttrs.end(); anAttr++) { + if (*anAttr) { + std::shared_ptr aRef = + std::dynamic_pointer_cast(*anAttr); + // check the object is already presented + if (!aRef->isObject() && aRef->attr() == theAttribute) + return false; + } + } + return true; }