#include "SketchPlugin_Validators.h"
#include "SketchPlugin_ConstraintDistance.h"
+#include "SketchPlugin_ConstraintCoincidence.h"
+#include "SketchPlugin_Line.h"
+#include "SketchPlugin_Arc.h"
+
#include <ModelAPI_Data.h>
#include <ModelAPI_Validator.h>
#include <ModelAPI_AttributeDouble.h>
}
return false;
}
+
+
+
+bool SketchPlugin_TangentAttrValidator::isValid(
+ const AttributePtr& theAttribute, const std::list<std::string>& 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<ModelAPI_Feature>(theAttribute->owner());
+ AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(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<FeaturePtr> aCoinList;
+ const std::set<std::shared_ptr<ModelAPI_Attribute>>& aRefsList = aRefFea->data()->refsToMe();
+ std::set<std::shared_ptr<ModelAPI_Attribute>>::const_iterator aIt;
+ for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) {
+ std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
+ aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
+ if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
+ AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(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<std::shared_ptr<ModelAPI_Attribute>>& aOtherList = aOtherFea->data()->refsToMe();
+ std::set<FeaturePtr>::const_iterator aCoinsIt;
+ for (aIt = aOtherList.cbegin(); aIt != aOtherList.cend(); ++aIt) {
+ std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
+ aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
+ aCoinsIt = aCoinList.find(aConstrFeature);
+ if (aCoinsIt != aCoinList.end()) {
+ AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aAttr);
+ AttributePtr aAR = aRAttr->attr();
+ if (aAR->id() != SketchPlugin_Arc::CENTER_ID())
+ return true;
+ }
+ }
+ }
+ return false;
+}
+