Salome HOME
Merge branch 'master' of newgeom:newgeom
[modules/shaper.git] / src / PartSet / PartSet_Tools.cpp
index 17f5be33b69f38b28bbbe07c0dacc1a483517f83..24a726a90df03bf938282248b2ab5637556dc8c4 100644 (file)
 #include <SketchPlugin_Feature.h>
 #include <SketchPlugin_Sketch.h>
 #include <SketchPlugin_ConstraintCoincidence.h>
+#include <SketchPlugin_ConstraintDistance.h>
+#include <SketchPlugin_ConstraintLength.h>
+#include <SketchPlugin_ConstraintRadius.h>
 #include <SketchPlugin_Constraint.h>
 
-#include <PartSet_FeatureLinePrs.h>
-#include <PartSet_FeaturePointPrs.h>
-#include <PartSet_FeatureCirclePrs.h>
-#include <PartSet_FeatureArcPrs.h>
-
-#include <PartSet_ConstraintLengthPrs.h>
-#include <PartSet_ConstraintRadiusPrs.h>
-#include <PartSet_ConstraintDistancePrs.h>
-
-#include <XGUI_ViewerPrs.h>
+#include <ModuleBase_ViewerPrs.h>
 
 #include <V3d_View.hxx>
 #include <gp_Pln.hxx>
@@ -142,68 +136,33 @@ void PartSet_Tools::convertTo3D(const double theX, const double theY,
   thePoint = gp_Pnt(aPoint->x(), aPoint->y(), aPoint->z());
 }
 
-boost::shared_ptr<PartSet_FeaturePrs> PartSet_Tools::createFeaturePrs(const std::string& theKind,
-                                                                      FeaturePtr theSketch,
-                                                                      FeaturePtr theFeature)
-{
-  boost::shared_ptr<PartSet_FeaturePrs> aFeaturePrs;
-
-  if (theKind == PartSet_FeaturePointPrs::getKind()) {
-    aFeaturePrs = boost::shared_ptr<PartSet_FeaturePrs>(new PartSet_FeaturePointPrs(theSketch));
-  }
-  else if (theKind == PartSet_FeatureLinePrs::getKind()) {
-    aFeaturePrs = boost::shared_ptr<PartSet_FeaturePrs>(new PartSet_FeatureLinePrs(theSketch));
-  }
-  else if (theKind == PartSet_FeatureCirclePrs::getKind()) {
-    aFeaturePrs = boost::shared_ptr<PartSet_FeaturePrs>(new PartSet_FeatureCirclePrs(theSketch));
-  }
-  else if (theKind == PartSet_FeatureArcPrs::getKind()) {
-    aFeaturePrs = boost::shared_ptr<PartSet_FeaturePrs>(new PartSet_FeatureArcPrs(theSketch));
-  }
-  else if (theKind == PartSet_ConstraintLengthPrs::getKind()) {
-    aFeaturePrs = boost::shared_ptr<PartSet_FeaturePrs>(new PartSet_ConstraintLengthPrs(theSketch));
-  }
-  else if (theKind == PartSet_ConstraintRadiusPrs::getKind()) {
-    aFeaturePrs = boost::shared_ptr<PartSet_ConstraintRadiusPrs>(new PartSet_ConstraintRadiusPrs(theSketch));
-  }
-  else if (theKind == PartSet_ConstraintDistancePrs::getKind()) {
-    aFeaturePrs = boost::shared_ptr<PartSet_ConstraintDistancePrs>(new PartSet_ConstraintDistancePrs(theSketch));
-  }
-
-
-  if (theFeature && aFeaturePrs)
-    aFeaturePrs->init(theFeature);
-
-  return aFeaturePrs;
-}
-
 FeaturePtr PartSet_Tools::nearestFeature(QPoint thePoint, Handle_V3d_View theView,
                                          FeaturePtr theSketch,
-                                         const std::list<XGUI_ViewerPrs>& theFeatures)
+                                         const std::list<ModuleBase_ViewerPrs>& theFeatures)
 {
   double aX, anY;
   gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(thePoint, theView);
   PartSet_Tools::convertTo2D(aPoint, theSketch, theView, aX, anY);
 
   FeaturePtr aFeature;
-  std::list<XGUI_ViewerPrs>::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end();
+  std::list<ModuleBase_ViewerPrs>::const_iterator anIt = theFeatures.begin(), aLast = theFeatures.end();
 
   FeaturePtr aDeltaFeature;   
   double aMinDelta = -1;
-  XGUI_ViewerPrs aPrs;
+  ModuleBase_ViewerPrs aPrs;
   for (; anIt != aLast; anIt++) {
     aPrs = *anIt;
-    if (!aPrs.feature())
+    if (!aPrs.result())
       continue;
     boost::shared_ptr<SketchPlugin_Feature> aSketchFeature = 
-                           boost::dynamic_pointer_cast<SketchPlugin_Feature>(aPrs.feature());
+                           boost::dynamic_pointer_cast<SketchPlugin_Feature>(aPrs.result());
     if (!aSketchFeature)
       continue;
     double aDelta = aSketchFeature->distanceToPoint(
                                boost::shared_ptr<GeomAPI_Pnt2d>(new GeomAPI_Pnt2d(aX, anY)));
     if (aMinDelta < 0 || aMinDelta > aDelta) {
       aMinDelta = aDelta;
-      aDeltaFeature = aPrs.feature();
+      aDeltaFeature = aPrs.result();
     }
   }
   return aDeltaFeature;
@@ -302,13 +261,14 @@ void PartSet_Tools::createConstraint(FeaturePtr theSketch,
 }
 
 void PartSet_Tools::setConstraints(FeaturePtr theSketch, FeaturePtr theFeature,
-                                   const std::string& theAttribute, double theX, double theY)
+                                   const std::string& theAttribute,
+                                   double theClickedX, double theClickedY)
 {
   // find a feature point by the selection mode
   //boost::shared_ptr<GeomDataAPI_Point2D> aPoint = featurePoint(theMode);
-  boost::shared_ptr<GeomDataAPI_Point2D> aPoint =
+  boost::shared_ptr<GeomDataAPI_Point2D> aFeaturePoint =
         boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(theFeature->data()->attribute(theAttribute));
-  if (!aPoint)
+  if (!aFeaturePoint)
     return;
 
   // get all sketch features. If the point with the given coordinates belong to any sketch feature,
@@ -319,28 +279,28 @@ void PartSet_Tools::setConstraints(FeaturePtr theSketch, FeaturePtr theFeature,
 
   std::list<FeaturePtr > aFeatures = aRefList->list();
   std::list<FeaturePtr >::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end();
+  std::list<boost::shared_ptr<ModelAPI_Attribute> > anAttiributes;
+  boost::shared_ptr<GeomAPI_Pnt2d> aClickedPoint = boost::shared_ptr<GeomAPI_Pnt2d>
+                                                     (new GeomAPI_Pnt2d(theClickedX, theClickedY));
   for (; anIt != aLast; anIt++)
   {
     FeaturePtr aFeature = *anIt;
-    boost::shared_ptr<GeomDataAPI_Point2D> aFPoint;// = aFeature->findPoint(theX, theY);
+    // find the given point in the feature attributes
+    anAttiributes = aFeature->data()->attributes(GeomDataAPI_Point2D::type());
+    std::list<boost::shared_ptr<ModelAPI_Attribute> >::const_iterator anIt = anAttiributes.begin(),
+                                                                      aLast = anAttiributes.end();
+    boost::shared_ptr<GeomDataAPI_Point2D> aFPoint;
+    for (;anIt!=aLast && !aFPoint; anIt++) {
+      boost::shared_ptr<GeomDataAPI_Point2D> aCurPoint =
+                                          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(*anIt);
+      if (aCurPoint && aCurPoint->pnt()->distance(aClickedPoint) < Precision::Confusion())
+        aFPoint = aCurPoint;
+    }
     if (aFPoint)
-      PartSet_Tools::createConstraint(theSketch, aFPoint, aPoint);
+      PartSet_Tools::createConstraint(theSketch, aFPoint, aFeaturePoint);
   }
 }
 
-boost::shared_ptr<GeomDataAPI_Point2D> PartSet_Tools::findPoint(FeaturePtr theFeature,
-                                                                double theX, double theY)
-{
-  boost::shared_ptr<PartSet_FeaturePrs> aFeaturePrs = PartSet_Tools::createFeaturePrs(
-                                           theFeature->getKind(), FeaturePtr(), theFeature);
-
-  boost::shared_ptr<GeomDataAPI_Point2D> aPoint2D;
-  if (aFeaturePrs)
-    aPoint2D = aFeaturePrs->findPoint(theFeature, theX, theY);
-
-  return aPoint2D;
-}
-
 boost::shared_ptr<GeomAPI_Pln> PartSet_Tools::sketchPlane(FeaturePtr theSketch)
 {
   boost::shared_ptr<GeomAPI_Pln> aPlane;
@@ -380,7 +340,7 @@ boost::shared_ptr<GeomAPI_Pnt> PartSet_Tools::point3D(
 
 bool PartSet_Tools::isConstraintFeature(const std::string& theKind)
 {
-  return theKind == PartSet_ConstraintLengthPrs::getKind() ||
-         theKind == PartSet_ConstraintDistancePrs::getKind() ||
-         theKind == PartSet_ConstraintRadiusPrs::getKind();
+  return theKind == SKETCH_CONSTRAINT_DISTANCE_KIND ||
+         theKind == SKETCH_CONSTRAINT_LENGTH_KIND ||
+         theKind == SKETCH_CONSTRAINT_RADIUS_KIND;
 }