X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Validators.cpp;h=fe88ebf595e516bc949a0b732905bf6c59cd8031;hb=f303e0ac953271787efce9c96845b41db3d4dcb9;hp=32a0b30b57cc3028c1311c8b1c5935d5c46841c8;hpb=9bea53a5d0fc5c6aec52f4732ec45a9dcbe7354d;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Validators.cpp b/src/SketchPlugin/SketchPlugin_Validators.cpp index 32a0b30b5..fe88ebf59 100644 --- a/src/SketchPlugin/SketchPlugin_Validators.cpp +++ b/src/SketchPlugin/SketchPlugin_Validators.cpp @@ -6,6 +6,14 @@ #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 @@ -16,6 +24,7 @@ #include + bool SketchPlugin_DistanceAttrValidator::isValid( const AttributePtr& theAttribute, const std::list& theArguments ) const { @@ -54,9 +63,150 @@ bool SketchPlugin_DistanceAttrValidator::isValid( 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); + std::shared_ptr aPoint = SketcherPrs_Tools::getFeaturePoint(aFeature->data(), aParamA); if (aPoint) return true; } return false; } +bool SketchPlugin_TangentAttrValidator::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(); + + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + if (!aRefAttr) + return false; + + 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 false; +} + +bool SketchPlugin_NotFixedValidator::isValid( + const AttributePtr& theAttribute, const std::list& theArguments) const +{ + 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_EqualAttrValidator::isValid( + const AttributePtr& theAttribute, const std::list& theArguments ) const +{ + 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; +} +