+void PartSet_Tools::setConstraints(CompositeFeaturePtr theSketch, FeaturePtr theFeature,
+ const std::string& theAttribute, double theClickedX,
+ double theClickedY)
+{
+ // find a feature point by the selection mode
+ //std::shared_ptr<GeomDataAPI_Point2D> aPoint = featurePoint(theMode);
+ std::shared_ptr<GeomDataAPI_Point2D> aFeaturePoint = std::dynamic_pointer_cast<
+ GeomDataAPI_Point2D>(theFeature->data()->attribute(theAttribute));
+ if (!aFeaturePoint)
+ return;
+
+ // get all sketch features. If the point with the given coordinates belong to any sketch feature,
+ // the constraint is created between the feature point and the found sketch point
+ std::shared_ptr<ModelAPI_Data> aData = theSketch->data();
+ std::shared_ptr<ModelAPI_AttributeRefList> aRefList = std::dynamic_pointer_cast<
+ ModelAPI_AttributeRefList>(aData->attribute(SketchPlugin_Sketch::FEATURES_ID()));
+
+ std::list<ObjectPtr> aFeatures = aRefList->list();
+ std::list<ObjectPtr>::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end();
+ std::list<std::shared_ptr<ModelAPI_Attribute> > anAttiributes;
+ std::shared_ptr<GeomAPI_Pnt2d> aClickedPoint = std::shared_ptr<GeomAPI_Pnt2d>(
+ new GeomAPI_Pnt2d(theClickedX, theClickedY));
+ for (; anIt != aLast; anIt++) {
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*anIt);
+ // find the given point in the feature attributes
+ anAttiributes = aFeature->data()->attributes(GeomDataAPI_Point2D::type());
+ std::list<std::shared_ptr<ModelAPI_Attribute> >::const_iterator anIt = anAttiributes.begin(),
+ aLast = anAttiributes.end();
+ std::shared_ptr<GeomDataAPI_Point2D> aFPoint;
+ for (; anIt != aLast && !aFPoint; anIt++) {
+ std::shared_ptr<GeomDataAPI_Point2D> aCurPoint = std::dynamic_pointer_cast<
+ GeomDataAPI_Point2D>(*anIt);
+ if (aCurPoint && aCurPoint->pnt()->distance(aClickedPoint) < Precision::Confusion())
+ aFPoint = aCurPoint;
+ }
+ if (aFPoint)
+ PartSet_Tools::createConstraint(theSketch, aFPoint, aFeaturePoint);
+ }