X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Validators.cpp;h=ca7df854dcdf26bcbf700b5da88ef40ad542951e;hb=a731f82dccbfdb67cbf8e8d617222a4d3e32018a;hp=2d135af004a96510b752f87fe7a533187ea759e4;hpb=7340566c73e76dacbb07d702c21ffb0068cb8e5c;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Validators.cpp b/src/SketchPlugin/SketchPlugin_Validators.cpp index 2d135af00..ca7df854d 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 @@ -6,48 +8,141 @@ #include "SketchPlugin_ConstraintDistance.h" #include #include -#include #include +#include +#include + +#include + #include -bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, - const std::list& theArguments, - const ObjectPtr& theObject) const +bool SketchPlugin_DistanceAttrValidator::isValid( + const AttributePtr& theAttribute, const std::list& theArguments ) const +//bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, +// const std::list& theArguments, +// const ObjectPtr& theObject, +// const GeomShapePtr& theShape) const +// ======= end of todo master { + // there is a check whether the feature contains a point and a linear edge or two point values std::string aParamA = theArguments.front(); - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - // 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)) - return true; + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + if (!aRefAttr) + return false; - // 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); - if (aPoint) + bool isObject = aRefAttr->isObject(); + if (!isObject) { + // an attribute is a point. A point value is valid always for the distance return true; - return false; -} + } else { + // 1. check whether the references object is a linear + ObjectPtr anObject = aRefAttr->object(); -bool SketchPlugin_DistanceAttrValidator::isValid( - const AttributePtr& theAttribute, const std::list& theArguments ) const -{ - boost::shared_ptr anAttr = - boost::dynamic_pointer_cast(theAttribute); - if (anAttr) { - const ObjectPtr& anObj = theAttribute->owner(); - const FeaturePtr aFeature = boost::dynamic_pointer_cast(anObj); - return isValid(aFeature, theArguments, anAttr->object()); + const ModelAPI_AttributeValidator* anEdgeValidator = + dynamic_cast(aFactory->validator("GeomValidators_Edge")); + std::list anArguments; + anArguments.push_back("circle"); + bool anEdgeValid = anEdgeValidator->isValid(aRefAttr, anArguments); + // the circle line is not a valid case + if (anEdgeValid) + return false; + + anArguments.clear(); + anArguments.push_back("line"); + anEdgeValid = anEdgeValidator->isValid(aRefAttr, anArguments); + // if the attribute value is not a line, that means it is a vertex. A vertex is always valid + if (!anEdgeValid) + return true; + + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + // If it is a line then we have to check that first attribute id not a line + std::shared_ptr aPoint = getFeaturePoint(aFeature->data(), aParamA); + if (aPoint) + return true; } - return true; // it may be not reference attribute, in this case, it is OK + return false; } +// TODO(nds) v1.0.2, master +// return false; +//} -bool SketchPlugin_RadiusValidator::isValid( - const AttributePtr& theAttribute, const std::list& theArguments) const -{ - boost::shared_ptr aDouble = - boost::dynamic_pointer_cast(theAttribute); - return aDouble->isInitialized() && aDouble->value() > 1.e-5; -} +//bool SketchPlugin_DistanceAttrValidator::isValid( +// const AttributePtr& theAttribute, const std::list& theArguments ) const +//{ +// // 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); +//} + +// commented in v1.0.2, master: +//bool SketchPlugin_DifferentObjectsValidator::isValid(const FeaturePtr& theFeature, +// const std::list& theArguments, +// const ObjectPtr& theObject) const +//{ +// std::list > anAttrs = +// theFeature->data()->attributes(ModelAPI_AttributeRefAttr::typeId()); +// 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 = std::dynamic_pointer_cast(anObj); +// +// std::list > anAttrs = +// aFeature->data()->attributes(ModelAPI_AttributeRefAttr::typeId()); +// 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; +//} + +//bool SketchPlugin_DifferentObjectsValidator::isValid(const FeaturePtr& theFeature, +// const std::list& theArguments, const AttributePtr& theAttribute) const +//{ +// std::list > anAttrs = +// theFeature->data()->attributes(ModelAPI_AttributeRefAttr::typeId()); +// 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; +//} +// =========== end of todo