X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Validators.cpp;h=29bdf3c27310df0ba7abadc7ca882ea353ef4f85;hb=7e0da9d6edbfd2e934df3ff119b45cec3cff6936;hp=161a1442c37dcf3930a90631b421c55549d2347e;hpb=a99d088ab2827a48a72148c17fd366c39efde8f3;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Validators.cpp b/src/SketchPlugin/SketchPlugin_Validators.cpp index 161a1442c..29bdf3c27 100644 --- a/src/SketchPlugin/SketchPlugin_Validators.cpp +++ b/src/SketchPlugin/SketchPlugin_Validators.cpp @@ -1,57 +1,120 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: SketchPlugin_Validators.cpp // Created: 01 Aug 2014 // Author: Vitaly SMETANNIKOV #include "SketchPlugin_Validators.h" -#include "SketchPlugin_Constraint.h" -#include "SketchPlugin_Sketch.h" -#include "SketchPlugin_Point.h" -#include "SketchPlugin_Line.h" -#include "SketchPlugin_Circle.h" -#include "SketchPlugin_Arc.h" +#include "SketchPlugin_ConstraintDistance.h" #include +#include +#include +#include +#include +#include +#include - -bool isValidType(const std::string& theType) +bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, + const std::list& theArguments, + const ObjectPtr& theObject) const { - return (theType == SketchPlugin_Point::ID()) || - (theType == SketchPlugin_Circle::ID()) || - (theType == SketchPlugin_Arc::ID()); -} + std::string aParamA = theArguments.front(); + SessionPtr aMgr = ModelAPI_Session::get(); + ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); -bool SketchPlugin_DistanceFeatureValidator::isValid(const FeaturePtr theFeature) const -{ - if (!theFeature) - return false; - if (!theFeature->data() || !theFeature->data()->isValid()) + const ModelAPI_ResultValidator* anArcValidator = + dynamic_cast(aFactory->validator("SketchPlugin_ResultArc")); + bool anArcValid = anArcValidator->isValid(theObject); + if (anArcValid) return false; - boost::shared_ptr aData = theFeature->data(); - boost::shared_ptr aRefA = - boost::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::ENTITY_A())); - boost::shared_ptr aRefB = - boost::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::ENTITY_B())); + // If the object is not a line then it is accepted + const ModelAPI_ResultValidator* aLineValidator = + dynamic_cast(aFactory->validator("SketchPlugin_ResultLine")); + bool aLineValid = aLineValidator->isValid(theObject); + if (!aLineValid) + return true; - if (!aRefA || !aRefB) - return false; + // If it is a line then we have to check that first attribute id not a line + std::shared_ptr aPoint = getFeaturePoint(theFeature->data(), aParamA); + if (aPoint) + return true; + return false; +} +bool SketchPlugin_DistanceAttrValidator::isValid( + const AttributePtr& theAttribute, const std::list& theArguments ) const +{ + // any point attribute is acceptable for the distance operation return true; -/* FeaturePtr aFetureA = SketchPlugin_Sketch::getFeature(aRefA->object()); - FeaturePtr aFetureB = SketchPlugin_Sketch::getFeature(aRefB->object()); - if (!aFetureA || !aFetureB) - return false; +} - std::string aTypeA = aFetureA->getKind(); - std::string aTypeB = aFetureB->getKind(); +bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, + const std::list& theArguments, + const AttributePtr& theAttribute) const +{ + return isValid(theAttribute, theArguments); +} - if (aTypeA == SketchPlugin_Line::ID()) { - return isValidType(aTypeB); - } else if (aTypeB == SketchPlugin_Line::ID()) { - return isValidType(aTypeA); - } else - return isValidType(aTypeA) && isValidType(aTypeB); - return false;*/ +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 = 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; +} + +bool SketchPlugin_DifferentObjectsValidator::isValid(const FeaturePtr& theFeature, + const std::list& theArguments, const AttributePtr& theAttribute) 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->attr() == theAttribute) + return false; + } + } + return true; }