X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Validators.cpp;h=be53bdcf704862eda784f95a7dc7c9538713fbf0;hb=64fc7e4fdd63997ec7a502b233ef5f88186d5bbb;hp=ec5e929abb7d0b6101fe2e35f0e583d71f05f1ba;hpb=3eb5a9ba3696a7d8eb516943dfdabd8b188a76c5;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Validators.cpp b/src/SketchPlugin/SketchPlugin_Validators.cpp old mode 100644 new mode 100755 index ec5e929ab..be53bdcf7 --- a/src/SketchPlugin/SketchPlugin_Validators.cpp +++ b/src/SketchPlugin/SketchPlugin_Validators.cpp @@ -5,29 +5,47 @@ // Author: Vitaly SMETANNIKOV #include "SketchPlugin_Validators.h" + +#include "SketchPlugin_Arc.h" +#include "SketchPlugin_Circle.h" +#include "SketchPlugin_ConstraintCoincidence.h" #include "SketchPlugin_ConstraintDistance.h" +#include "SketchPlugin_ConstraintRigid.h" +#include "SketchPlugin_Line.h" +#include "SketchPlugin_Point.h" +#include "SketchPlugin_Sketch.h" + +#include "SketcherPrs_Tools.h" + #include #include #include #include +#include +#include +#include #include -//#include +#include #include -bool SketchPlugin_DistanceAttrValidator::isValid( - const AttributePtr& theAttribute, const std::list& theArguments ) const + +bool SketchPlugin_DistanceAttrValidator::isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + std::string& theError) const { + if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) { + theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed"; + return false; + } + // 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(); AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); - if (!aRefAttr) - return false; - bool isObject = aRefAttr->isObject(); if (!isObject) { // an attribute is a point. A point value is valid always for the distance @@ -35,101 +53,348 @@ bool SketchPlugin_DistanceAttrValidator::isValid( } else { // 1. check whether the references object is a linear ObjectPtr anObject = aRefAttr->object(); - /* - const ModelAPI_AttributeValidator* aCircleValidator = - dynamic_cast(aFactory->validator("ModuleBase_ValidatorLinearEdge")); + + const ModelAPI_AttributeValidator* aShapeValidator = + dynamic_cast(aFactory->validator("GeomValidators_ShapeType")); std::list anArguments; anArguments.push_back("circle"); - bool anEdgeValid = aCircleValidator->isValid(aRefAttr, anArguments); - if (anEdgeValid) + std::string aCircleError; + bool aShapeValid = aShapeValidator->isValid(aRefAttr, anArguments, aCircleError); + // the circle line is not a valid case + if (aShapeValid) { + theError = "Circle can not be used in distance constraint"; return false; + } anArguments.clear(); anArguments.push_back("line"); - bool anEdgeValid = aCircleValidator->isValid(aRefAttr, anArguments); - if (!anEdgeValid) - return true;*/ - - /*const ModelAPI_ResultValidator* anArcValidator = aFactory->validator("ModuleBase_ValidatorLinearEdge"); - //dynamic_cast(aFactory->validator("SketchPlugin_ResultArc")); - bool anArcValid = anArcValidator->isValid(anObject); - if (anArcValid) + std::string aLineError; + aShapeValid = aShapeValidator->isValid(aRefAttr, anArguments, aLineError); + // if the attribute value is not a line, that means it is a vertex. A vertex is always valid + if (aShapeValid) { + 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 aSFeature = + std::dynamic_pointer_cast(theAttribute->owner()); + SketchPlugin_Sketch* aSketch = aSFeature->sketch(); + std::shared_ptr aPlane = SketchPlugin_Sketch::plane(aSketch); + std::shared_ptr aPoint = SketcherPrs_Tools::getFeaturePoint( + aFeature->data(), aParamA, aPlane); + if (!aPoint.get()) { + theError = "One of parameters of distance constraint should be a point"; + return false; + } + } + } + return true; +} + +bool SketchPlugin_TangentAttrValidator::isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + std::string& theError) const +{ + if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) { + theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed"; + return false; + } + + // 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(); + + FeaturePtr anAttributeFeature = std::dynamic_pointer_cast(theAttribute->owner()); + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + + bool isObject = aRefAttr->isObject(); + ObjectPtr anObject = aRefAttr->object(); + if (isObject && anObject.get()) { + FeaturePtr aRefFea = ModelAPI_Feature::feature(anObject); + + AttributeRefAttrPtr aOtherAttr = anAttributeFeature->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()) { + theError = "It refers to a " + SketchPlugin_Line::ID() + ", but " + aParamA + " is not an " + + SketchPlugin_Arc::ID(); + return false; + } + } + else if (aRefFea->getKind() == SketchPlugin_Arc::ID()) { + if (aOtherFea->getKind() != SketchPlugin_Line::ID() && + aOtherFea->getKind() != SketchPlugin_Arc::ID()) { + theError = "It refers to an " + SketchPlugin_Arc::ID() + ", but " + aParamA + " is not a " + + SketchPlugin_Line::ID() + " or an " + SketchPlugin_Arc::ID(); + return false; + } + } + else { + theError = "It refers to " + aRefFea->getKind() + "but should refer to " + SketchPlugin_Line::ID() + + " or " + SketchPlugin_Arc::ID(); return false; + } + return true; + } + else { + theError = "It uses an empty object"; + return false; + } + + return true; +} + +bool SketchPlugin_NotFixedValidator::isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + std::string& theError) const +{ + if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) { + theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed"; + return false; + } + + std::shared_ptr aFeature = + std::dynamic_pointer_cast(theAttribute->owner()); + if (!aFeature) + return true; + + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + + 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()) { + ObjectPtr anObject = aRefAttr->object(); + std::string aName = anObject.get() ? anObject->data()->name() : ""; + theError = "The object " + aName + " has been already fixed."; + return false; + } + } + else if (aRefAttr->attr() == aRAttr->attr()) { + AttributePtr anAttribute = aRefAttr->attr(); + std::string aName = anAttribute.get() ? anAttribute->id() : ""; + theError = "The attribute " + aName + " has been already fixed."; + return false; + } + } + return true; +} - // If the object is not a line then it is accepted. It can be a point feature selected - const ModelAPI_ResultValidator* aLineValidator = - dynamic_cast(aFactory->validator("SketchPlugin_ResultLine")); - bool aLineValid = aLineValidator->isValid(anObject); - if (!aLineValid) - 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) +bool SketchPlugin_EqualAttrValidator::isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + std::string& theError) const +{ + if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) { + theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed"; + 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); + aRefAttr[1] = aFeature->data()->refattr(aParamA); + + if (!aRefAttr[0]->isObject() || !aRefAttr[1]->isObject()) { + theError = "Attributes can not be used in equal constraint"; + 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(); + if (!anObject.get()) { + theError = "An empty object is used."; + return false; + } + + aFeature = ModelAPI_Feature::feature(anObject); + if (!aFeature.get()) { + theError = "An empty feature is used."; + 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; + } + theError = "The " + aFeature->getKind() + " feature kind of attribute is wrong. It should be " + + SketchPlugin_Line::ID() + " or " + SketchPlugin_Circle::ID() + " or " + + SketchPlugin_Arc::ID(); + // wrong type of attribute + return false; + } + + if ((aType[0] == 1 && aType[1] == 2) || + (aType[0] == 2 && aType[1] == 1)) { + theError = "Feature with kinds " + SketchPlugin_Line::ID() + " and " + + SketchPlugin_Circle::ID() + "can not be equal."; + return false; + } + return true; +} + +bool SketchPlugin_MirrorAttrValidator::isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + std::string& theError) const +{ + if (theAttribute->attributeType() != ModelAPI_AttributeRefList::typeId()) { + theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed"; + return false; + } + + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + AttributeRefListPtr aSelAttr = std::dynamic_pointer_cast(theAttribute); + + AttributeRefListPtr aRefListOfMirrored = std::dynamic_pointer_cast( + aFeature->attribute(SketchPlugin_Constraint::ENTITY_C())); + std::list aMirroredObjects = aRefListOfMirrored->list(); + + for(int anInd = 0; anInd < aSelAttr->size(); anInd++) { + ObjectPtr aSelObject = aSelAttr->object(anInd); + std::string aName = aSelObject.get() ? aSelObject->data()->name() : ""; + std::list::iterator aMirIter = aMirroredObjects.begin(); + for (; aMirIter != aMirroredObjects.end(); aMirIter++) + if (aSelObject == *aMirIter) { + theError = "The object " + aName + " is a result of mirror"; + return false; + } + } + return true; +} + + +bool SketchPlugin_CoincidenceAttrValidator::isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + std::string& theError) const +{ + if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) { + theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed"; + return false; + } + + // 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(); + + FeaturePtr aConstraint = std::dynamic_pointer_cast(theAttribute->owner()); + AttributeRefAttrPtr aRefAttrA = aConstraint->data()->refattr(aParamA); + if (!aRefAttrA) { + theError = "The " + aParamA + " attribute " + " should be " + ModelAPI_AttributeRefAttr::typeId(); + return false; + } + + AttributeRefAttrPtr aRefAttrB = std::dynamic_pointer_cast(theAttribute); + + // first attribute is a point, it may coincide with any object + if (!aRefAttrA->isObject()) + return true; + else { + ObjectPtr anObject = aRefAttrA->object(); + if (!anObject.get()) { + theError = aParamA + " attribute has an empty object"; + return false; + } + FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttrA->object()); + if (!aFeature.get()) { + theError = aParamA + " attribute has an empty feature"; + return false; + } + + if (aFeature->getKind() == SketchPlugin_Point::ID()) return true; } + + // second attribute is a point, it may coincide with any object + if (!aRefAttrB->isObject()) + return true; + else { + FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttrB->object()); + if (!aFeature) { + theError = theAttribute->id() + " attribute has an empty object"; + return false; + } + if (aFeature->getKind() == SketchPlugin_Point::ID()) + return true; + } + theError = "There is no an attribute filled by a point"; 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; -//} + +bool SketchPlugin_CopyValidator::isValid(const AttributePtr& theAttribute, + const std::list& theArguments, + std::string& theError) const +{ + if (theAttribute->attributeType() != ModelAPI_AttributeRefList::typeId()) { + theError = "The attribute with the " + theAttribute->attributeType() + " type is not processed"; + return false; + } + + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + AttributeRefListPtr aSelAttr = + std::dynamic_pointer_cast(theAttribute); + + AttributeRefListPtr aRefListOfInitial = std::dynamic_pointer_cast( + aFeature->attribute(SketchPlugin_Constraint::ENTITY_A())); + AttributeRefListPtr aRefListOfCopied = std::dynamic_pointer_cast( + aFeature->attribute(SketchPlugin_Constraint::ENTITY_B())); + std::list anInitialObjects = aRefListOfInitial->list(); + std::list aCopiedObjects = aRefListOfCopied->list(); + + std::list::iterator anObjIter; + for(int anInd = 0; anInd < aSelAttr->size(); anInd++) { + ObjectPtr aSelObject = aSelAttr->object(anInd); + anObjIter = anInitialObjects.begin(); + for (; anObjIter != anInitialObjects.end(); anObjIter++) + if (aSelObject == *anObjIter) + break; + if (anObjIter != anInitialObjects.end()) + continue; + anObjIter = aCopiedObjects.begin(); + for (; anObjIter != aCopiedObjects.end(); anObjIter++) + if (aSelObject == *anObjIter) { + std::string aName = aSelObject.get() ? aSelObject->data()->name() : ""; + theError = "The object " + aName + " is a result of copy"; + return false; + } + } + return true; +} + +bool SketchPlugin_SolverErrorValidator::isValid(const std::shared_ptr& theFeature, + const std::list& theArguments, + std::string& theError) const +{ + AttributeStringPtr aAttributeString = theFeature->string(SketchPlugin_Sketch::SOLVER_ERROR()); + + if (!aAttributeString->value().empty()) { + theError = aAttributeString->value(); + return false; + } + + return true; +} + +bool SketchPlugin_SolverErrorValidator::isNotObligatory(std::string theFeature, std::string theAttribute) +{ + return true; +} +