+ 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<ModelAPI_AttributeRefAttr>(theAttribute);
+ bool isObject = aRefAttr->isObject();
+ if (!isObject) {
+ // an attribute is a point. A point value is valid always for the distance
+ return true;
+ } else {
+ // 1. check whether the references object is a linear
+ ObjectPtr anObject = aRefAttr->object();
+
+ const ModelAPI_AttributeValidator* aShapeValidator =
+ dynamic_cast<const GeomValidators_ShapeType*>(aFactory->validator("GeomValidators_ShapeType"));
+ std::list<std::string> anArguments;
+ anArguments.push_back("circle");
+ 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");
+ 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<ModelAPI_Feature>(theAttribute->owner());
+ // If it is a line then we have to check that first attribute id not a line
+ std::shared_ptr<SketchPlugin_Feature> aSFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(theAttribute->owner());
+ SketchPlugin_Sketch* aSketch = aSFeature->sketch();
+ std::shared_ptr<GeomAPI_Ax3> aPlane = SketchPlugin_Sketch::plane(aSketch);
+ std::shared_ptr<GeomDataAPI_Point2D> 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<std::string>& theArguments,
+ std::string& theError) const