+
+
+bool SketchPlugin_CoincidenceAttrValidator::isValid(const AttributePtr& theAttribute,
+ const std::list<std::string>& theArguments,
+ std::string& theError) 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 aConstraint = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+ AttributeRefAttrPtr aRefAttrA = aConstraint->data()->refattr(aParamA);
+ if (!aRefAttrA)
+ return false;
+
+ AttributeRefAttrPtr aRefAttrB = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+ if (!aRefAttrB)
+ return false;
+
+ // first attribute is a point, it may coincide with any object
+ if (!aRefAttrA->isObject())
+ return true;
+ else {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttrA->object());
+ if (!aFeature)
+ 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)
+ return false;
+ if (aFeature->getKind() == SketchPlugin_Point::ID())
+ return true;
+ }
+
+ return false;
+}
+
+
+bool SketchPlugin_CopyValidator::isValid(const AttributePtr& theAttribute,
+ const std::list<std::string>& theArguments,
+ std::string& theError) const
+{
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+ AttributeSelectionListPtr aSelAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(theAttribute);
+ if (!aSelAttr)
+ return false;
+
+ AttributeRefListPtr aRefListOfInitial = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
+ aFeature->attribute(SketchPlugin_Constraint::ENTITY_A()));
+ AttributeRefListPtr aRefListOfCopied = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
+ aFeature->attribute(SketchPlugin_Constraint::ENTITY_B()));
+ std::list<ObjectPtr> anInitialObjects = aRefListOfInitial->list();
+ std::list<ObjectPtr> aCopiedObjects = aRefListOfCopied->list();
+
+ std::list<ObjectPtr>::iterator anObjIter;
+ for(int anInd = 0; anInd < aSelAttr->size(); anInd++) {
+ std::shared_ptr<ModelAPI_AttributeSelection> aSelect = aSelAttr->value(anInd);
+ anObjIter = anInitialObjects.begin();
+ for (; anObjIter != anInitialObjects.end(); anObjIter++)
+ if (aSelect->context() == *anObjIter)
+ break;
+ if (anObjIter != anInitialObjects.end())
+ continue;
+ anObjIter = aCopiedObjects.begin();
+ for (; anObjIter != aCopiedObjects.end(); anObjIter++)
+ if (aSelect->context() == *anObjIter)
+ return false;
+ }
+ return true;
+}
+