X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Validators.cpp;h=fe88ebf595e516bc949a0b732905bf6c59cd8031;hb=f303e0ac953271787efce9c96845b41db3d4dcb9;hp=abef5066c21a8809d83327f5d92be9627796bb73;hpb=8babac25037f2666dcb422dd68a66dd2ed1383d8;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Validators.cpp b/src/SketchPlugin/SketchPlugin_Validators.cpp index abef5066c..fe88ebf59 100644 --- a/src/SketchPlugin/SketchPlugin_Validators.cpp +++ b/src/SketchPlugin/SketchPlugin_Validators.cpp @@ -6,115 +6,207 @@ #include "SketchPlugin_Validators.h" #include "SketchPlugin_ConstraintDistance.h" +#include "SketchPlugin_ConstraintCoincidence.h" +#include "SketchPlugin_ConstraintRigid.h" +#include "SketchPlugin_Line.h" +#include "SketchPlugin_Arc.h" +#include "SketchPlugin_Circle.h" + +#include "SketcherPrs_Tools.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 { + // there is a check whether the feature contains a point and a linear edge or two point values std::string aParamA = theArguments.front(); 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) + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + if (!aRefAttr) return false; - - // 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) + bool isObject = aRefAttr->isObject(); + if (!isObject) { + // an attribute is a point. A point value is valid always for the distance return true; + } else { + // 1. check whether the references object is a linear + ObjectPtr anObject = aRefAttr->object(); - // 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; + 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 = SketcherPrs_Tools::getFeaturePoint(aFeature->data(), aParamA); + if (aPoint) + return true; + } return false; } - -bool SketchPlugin_DistanceAttrValidator::isValid( +bool SketchPlugin_TangentAttrValidator::isValid( const AttributePtr& theAttribute, const std::list& theArguments ) const { - // any point attribute is acceptable for the distance operation - return true; -} + // there is a check whether the feature contains a point and a linear edge or two point values + std::string aParamA = theArguments.front(); + SessionPtr aMgr = ModelAPI_Session::get(); + ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); -bool SketchPlugin_DistanceAttrValidator::isValid(const FeaturePtr& theFeature, - const std::list& theArguments, - const AttributePtr& theAttribute) const -{ - return isValid(theAttribute, theArguments); -} + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + if (!aRefAttr) + 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::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) + bool isObject = aRefAttr->isObject(); + ObjectPtr anObject = aRefAttr->object(); + if (isObject && anObject) { + FeaturePtr aRefFea = ModelAPI_Feature::feature(anObject); + + AttributeRefAttrPtr aOtherAttr = aFeature->data()->refattr(aParamA); + ObjectPtr aOtherObject = aOtherAttr->object(); + FeaturePtr aOtherFea = ModelAPI_Feature::feature(aOtherObject); + + if (aRefFea->getKind() == SketchPlugin_Line::ID()) { + if (aOtherFea->getKind() != SketchPlugin_Arc::ID()) return false; + } else if (aRefFea->getKind() == SketchPlugin_Arc::ID()) { + if (aOtherFea->getKind() != SketchPlugin_Line::ID()) + return false; + } else + return false; + + // check that both have coincidence + FeaturePtr aConstrFeature; + std::set aCoinList; + const std::set>& aRefsList = aRefFea->data()->refsToMe(); + std::set>::const_iterator aIt; + for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) { + std::shared_ptr aAttr = (*aIt); + aConstrFeature = std::dynamic_pointer_cast(aAttr->owner()); + if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { + AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast(aAttr); + AttributePtr aAR = aRAttr->attr(); + if (aAR->id() != SketchPlugin_Arc::CENTER_ID()) // ignore constraint to center of arc + aCoinList.insert(aConstrFeature); + } + } + // if there is no coincidence then it is not valid + if (aCoinList.size() == 0) + return false; + + // find that coincedence is the same + const std::set>& aOtherList = aOtherFea->data()->refsToMe(); + std::set::const_iterator aCoinsIt; + for (aIt = aOtherList.cbegin(); aIt != aOtherList.cend(); ++aIt) { + std::shared_ptr aAttr = (*aIt); + aConstrFeature = std::dynamic_pointer_cast(aAttr->owner()); + aCoinsIt = aCoinList.find(aConstrFeature); + if (aCoinsIt != aCoinList.end()) { + AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast(aAttr); + AttributePtr aAR = aRAttr->attr(); + if (aAR->id() != SketchPlugin_Arc::CENTER_ID()) + return true; + } } } - return true; + return false; } -bool SketchPlugin_DifferentObjectsValidator::isValid( - const AttributePtr& theAttribute, const std::list& theArguments ) const +bool SketchPlugin_NotFixedValidator::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; - } - } + std::shared_ptr aFeature = + std::dynamic_pointer_cast(theAttribute->owner()); + if (!aFeature) + return true; + + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + if (!aRefAttr) + return false; + + SketchPlugin_Sketch* aSketch = aFeature->sketch(); + int aNbFeatures = aSketch->numberOfSubs(); + for (int anInd = 0; anInd < aNbFeatures; anInd++) { + FeaturePtr aSubFeature = aSketch->subFeature(anInd); + if (aSubFeature->getKind() != SketchPlugin_ConstraintRigid::ID() || aSubFeature == aFeature) + continue; + AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast( + aSubFeature->attribute(SketchPlugin_ConstraintRigid::ENTITY_A())); + if (aRefAttr->isObject()) { + if (aRefAttr->object() == aRAttr->object()) + return false; + } else if (aRefAttr->attr() == aRAttr->attr()) + return false; } return true; } -bool SketchPlugin_DifferentObjectsValidator::isValid(const FeaturePtr& theFeature, - const std::list& theArguments, const AttributePtr& theAttribute) const +bool SketchPlugin_EqualAttrValidator::isValid( + const AttributePtr& theAttribute, const std::list& theArguments ) 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; + std::string aParamA = theArguments.front(); + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + AttributeRefAttrPtr aRefAttr[2]; + aRefAttr[0] = std::dynamic_pointer_cast(theAttribute); + if (!aRefAttr) + return false; + aRefAttr[1] = aFeature->data()->refattr(aParamA); + + if (!aRefAttr[0]->isObject() || !aRefAttr[1]->isObject()) + return false; + + int aType[2] = {0, 0}; // types of attributes: 0 - incorrect, 1 - line, 2 - circle, 3 - arc + std::list anArguments; + for (int i = 0; i < 2; i++) { + ObjectPtr anObject = aRefAttr[i]->object(); + aFeature = ModelAPI_Feature::feature(anObject); + if (!aFeature) + return false; + + if (aFeature->getKind() == SketchPlugin_Line::ID()) { + aType[i] = 1; + continue; } + if (aFeature->getKind() == SketchPlugin_Circle::ID()) { + aType[i] = 2; + continue; + } + if (aFeature->getKind() == SketchPlugin_Arc::ID()) { + aType[i] = 3; + continue; + } + // wrong type of attribute + return false; } + + if ((aType[0] == 1 && aType[1] == 2) || + (aType[0] == 2 && aType[1] == 1)) + return false; return true; } +