X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Validators.cpp;h=3b79ad68cae45a90022ea0093a0bb4cddb89c0af;hb=868158fe6d39b25e60ac528295b1c908821e4af5;hp=ee7121371bf94d53d0ac811250dfd9527adcd6a1;hpb=a4e96a62c87a4b63969cb6a2c7438ba23fa61f1b;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Validators.cpp b/src/SketchPlugin/SketchPlugin_Validators.cpp index ee7121371..3b79ad68c 100755 --- a/src/SketchPlugin/SketchPlugin_Validators.cpp +++ b/src/SketchPlugin/SketchPlugin_Validators.cpp @@ -27,10 +27,9 @@ #include #include -#include - #include +const double tolerance = 1.e-7; bool SketchPlugin_DistanceAttrValidator::isValid(const AttributePtr& theAttribute, const std::list& theArguments, @@ -56,7 +55,7 @@ bool SketchPlugin_DistanceAttrValidator::isValid(const AttributePtr& theAttribut ObjectPtr anObject = aRefAttr->object(); const ModelAPI_AttributeValidator* aShapeValidator = - dynamic_cast(aFactory->validator("GeomValidators_ShapeType")); + dynamic_cast(aFactory->validator("GeomValidators_ShapeType")); std::list anArguments; anArguments.push_back("circle"); std::string aCircleError; @@ -408,19 +407,73 @@ bool SketchPlugin_FilletVertexValidator::isValid(const AttributePtr& theAttribut } AttributeRefAttrPtr aBase = std::dynamic_pointer_cast(theAttribute); + AttributePtr anAttrBase = aBase->attr(); if(aBase->isObject()) { return false; } - // If we alredy have some result then all ok + // If we alredy have some result then: + // - if it is the same point all ok + // - if it is point on the fillet arc then it is not valid FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); AttributePtr aBaseLinesAttribute = aFeature->attribute(SketchPlugin_Constraint::ENTITY_C()); AttributeRefListPtr aRefListOfBaseLines = std::dynamic_pointer_cast(aBaseLinesAttribute); - if(aRefListOfBaseLines->list().size() == 2) { - return true; + std::list anOldFeatList = aRefListOfBaseLines->list(); + if(!aRefListOfBaseLines->list().empty()) { + FeaturePtr anOldFeatureA, anOldFeatureB; + std::list::iterator aFeatIt = anOldFeatList.begin(); + anOldFeatureA = ModelAPI_Feature::feature(*aFeatIt++); + anOldFeatureB = ModelAPI_Feature::feature(*aFeatIt); + + AttributePtr anAttrStartA = + anOldFeatureA->attribute(anOldFeatureA->getKind() == SketchPlugin_Line::ID() ? SketchPlugin_Line::START_ID() : SketchPlugin_Arc::START_ID()); + AttributePtr anAttrEndA = + anOldFeatureA->attribute(anOldFeatureA->getKind() == SketchPlugin_Line::ID() ? SketchPlugin_Line::END_ID() : SketchPlugin_Arc::END_ID()); + AttributePtr anAttrStartB = + anOldFeatureB->attribute(anOldFeatureB->getKind() == SketchPlugin_Line::ID() ? SketchPlugin_Line::START_ID() : SketchPlugin_Arc::START_ID()); + AttributePtr anAttrEndB = + anOldFeatureB->attribute(anOldFeatureB->getKind() == SketchPlugin_Line::ID() ? SketchPlugin_Line::END_ID() : SketchPlugin_Arc::END_ID()); + + std::shared_ptr aBasePnt = std::dynamic_pointer_cast(anAttrBase)->pnt(); + std::shared_ptr aStartPntA = std::dynamic_pointer_cast(anAttrStartA)->pnt(); + std::shared_ptr anEndPntA = std::dynamic_pointer_cast(anAttrEndA)->pnt(); + std::shared_ptr aStartPntB = std::dynamic_pointer_cast(anAttrStartB)->pnt(); + std::shared_ptr anEndPntB = std::dynamic_pointer_cast(anAttrEndB)->pnt(); + double aDistBaseStartA = aBasePnt->distance(aStartPntA); + double aDistBaseEndA = aBasePnt->distance(anEndPntA); + double aDistStartAStartB = aStartPntA->distance(aStartPntB); + double aDistStartAEndB = aStartPntA->distance(anEndPntB); + double aDistEndAStartB = anEndPntA->distance(aStartPntB); + double aDistEndAEndB = anEndPntA->distance(anEndPntB); + + if((aDistBaseStartA < tolerance && (aDistStartAStartB < tolerance || aDistStartAEndB < tolerance)) || + (aDistBaseEndA < tolerance && (aDistEndAStartB < tolerance || aDistEndAStartB < tolerance))) { + return true; + } + + // Check that point not on fillet arc + AttributeRefListPtr aRefListOfFillet = std::dynamic_pointer_cast( + aFeature->attribute(SketchPlugin_Constraint::ENTITY_B())); + std::list aNewFeatList = aRefListOfFillet->list(); + if(!aNewFeatList.empty()) { + aFeatIt = aNewFeatList.begin(); + FeaturePtr aNewArc; + //aNewFeatureA = ModelAPI_Feature::feature(*aFeatIt++); + //aNewFeatureB = ModelAPI_Feature::feature(*aFeatIt++); + aFeatIt++; aFeatIt++; + aNewArc = ModelAPI_Feature::feature(*aFeatIt); + AttributePtr anArcStart = aNewArc->attribute(SketchPlugin_Arc::START_ID()); + AttributePtr anArcEnd = aNewArc->attribute(SketchPlugin_Arc::END_ID()); + std::shared_ptr anArcStartPnt = std::dynamic_pointer_cast(anArcStart)->pnt(); + std::shared_ptr anArcEndPnt = std::dynamic_pointer_cast(anArcEnd)->pnt(); + double aDistBaseArcStart = aBasePnt->distance(anArcStartPnt); + double aDistBaseArcEnd = aBasePnt->distance(anArcEndPnt); + if(aDistBaseArcStart < tolerance || aDistBaseArcEnd < tolerance) { + return false; + } + } } - AttributePtr anAttrBase = aBase->attr(); const std::set& aRefsList = anAttrBase->owner()->data()->refsToMe(); std::set::const_iterator aIt; FeaturePtr aCoincident; @@ -453,34 +506,39 @@ bool SketchPlugin_FilletVertexValidator::isValid(const AttributePtr& theAttribut return false; } - std::set aCoinsideLines; + std::set aCoinsides; SketchPlugin_Tools::findCoincidences(aCoincident, SketchPlugin_ConstraintCoincidence::ENTITY_A(), - aCoinsideLines); + aCoinsides); SketchPlugin_Tools::findCoincidences(aCoincident, SketchPlugin_ConstraintCoincidence::ENTITY_B(), - aCoinsideLines); - if(aCoinsideLines.size() < 2) { - return false; + aCoinsides); + // Remove points + std::set aNewLines; + for(std::set::iterator anIt = aCoinsides.begin(); anIt != aCoinsides.end(); ++anIt) { + if((*anIt)->getKind() != SketchPlugin_Point::ID()) { + aNewLines.insert(*anIt); + } } + aCoinsides = aNewLines; // Remove auxilary lines - if(aCoinsideLines.size() > 2) { - std::set aNewLines; - for(std::set::iterator anIt = aCoinsideLines.begin(); anIt != aCoinsideLines.end(); ++anIt) { + if(aCoinsides.size() > 2) { + aNewLines.clear(); + for(std::set::iterator anIt = aCoinsides.begin(); anIt != aCoinsides.end(); ++anIt) { if(!(*anIt)->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID())->value()) { aNewLines.insert(*anIt); } } - aCoinsideLines = aNewLines; + aCoinsides = aNewLines; } - if(aCoinsideLines.size() != 2) { + if(aCoinsides.size() != 2) { return false; } // Check that lines not collinear - std::set::iterator anIt = aCoinsideLines.begin(); + std::set::iterator anIt = aCoinsides.begin(); FeaturePtr aFirstFeature = *anIt++; FeaturePtr aSecondFeature = *anIt; if(aFirstFeature->getKind() == SketchPlugin_Line::ID() && aSecondFeature->getKind() == SketchPlugin_Line::ID()) {