Salome HOME
Merge branch 'master' of newgeom:newgeom
[modules/shaper.git] / src / PartSet / PartSet_OperationFeatureCreate.cpp
index 794e472d3d161e272ca03a0817de6b975c4af8a5..f08d83972f67e4fd554625036240b6962221400a 100644 (file)
 #include <SketchPlugin_ConstraintRadius.h>
 #include <SketchPlugin_ConstraintParallel.h>
 #include <SketchPlugin_ConstraintPerpendicular.h>
+#include <SketchPlugin_ConstraintCoincidence.h>
 
 #include <GeomAPI_Pnt2d.h>
 
 #include <ModuleBase_OperationDescription.h>
 #include <ModuleBase_WidgetPoint2D.h>
-#include <ModuleBase_WidgetFeature.h>
-#include <ModuleBase_WidgetPoint2dDistance.h>
+#include <ModuleBase_WidgetValueFeature.h>
+#include <ModuleBase_ViewerPrs.h>
 
-#include <XGUI_ViewerPrs.h>
 #include <XGUI_Constants.h>
 
 #include <V3d_View.hxx>
@@ -54,14 +54,15 @@ PartSet_OperationFeatureCreate::~PartSet_OperationFeatureCreate()
 
 bool PartSet_OperationFeatureCreate::canProcessKind(const std::string& theId)
 {
-  return theId == SKETCH_LINE_KIND || theId == SKETCH_POINT_KIND ||
-         theId == SKETCH_CIRCLE_KIND ||
-         theId == SKETCH_ARC_KIND ||
-         theId == SKETCH_CONSTRAINT_DISTANCE_KIND ||
-         theId == SKETCH_CONSTRAINT_LENGTH_KIND ||
-         theId == SKETCH_CONSTRAINT_RADIUS_KIND ||
-         theId == SKETCH_CONSTRAINT_PARALLEL_KIND ||
-         theId == SKETCH_CONSTRAINT_PERPENDICULAR_KIND;
+  return theId == SketchPlugin_Line::ID() || theId == SketchPlugin_Point::ID() ||
+         theId == SketchPlugin_Circle::ID() ||
+         theId == SketchPlugin_Arc::ID() ||
+         theId == SketchPlugin_ConstraintDistance::ID() ||
+         theId == SketchPlugin_ConstraintLength::ID() ||
+         theId == SketchPlugin_ConstraintRadius::ID() ||
+         theId == SketchPlugin_ConstraintParallel::ID() ||
+         theId == SketchPlugin_ConstraintPerpendicular::ID() ||
+         theId == SketchPlugin_ConstraintCoincidence::ID();
 }
 
 bool PartSet_OperationFeatureCreate::canBeCommitted() const
@@ -82,23 +83,26 @@ std::list<int> PartSet_OperationFeatureCreate::getSelectionModes(FeaturePtr theF
   return aModes;
 }
 
-void PartSet_OperationFeatureCreate::init(FeaturePtr theFeature,
-                                       const std::list<XGUI_ViewerPrs>& /*theSelected*/,
-                                       const std::list<XGUI_ViewerPrs>& /*theHighlighted*/)
+void PartSet_OperationFeatureCreate::initSelection(const std::list<ModuleBase_ViewerPrs>& theSelected,
+                                                   const std::list<ModuleBase_ViewerPrs>& /*theHighlighted*/)
+{
+  myPreSelection = theSelected;
+}
+
+void PartSet_OperationFeatureCreate::initFeature(FeaturePtr theFeature)
 {
-  if (!theFeature || theFeature->getKind() != SKETCH_LINE_KIND)
-    return;
   myInitFeature = theFeature;
 }
 
+
 FeaturePtr PartSet_OperationFeatureCreate::sketch() const
 {
   return mySketch;
 }
 
 void PartSet_OperationFeatureCreate::mouseReleased(QMouseEvent* theEvent, Handle(V3d_View) theView,
-                                                const std::list<XGUI_ViewerPrs>& theSelected,
-                                                const std::list<XGUI_ViewerPrs>& /*theHighlighted*/)
+                                                const std::list<ModuleBase_ViewerPrs>& theSelected,
+                                                const std::list<ModuleBase_ViewerPrs>& /*theHighlighted*/)
 {
   if (canBeCommitted())
   {
@@ -109,14 +113,14 @@ void PartSet_OperationFeatureCreate::mouseReleased(QMouseEvent* theEvent, Handle
     return;
   }
 
-  double aX = 0, anY = 0;
-
   gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView);
+  double aX = aPoint.X(), anY = aPoint.Y();
+
   if (theSelected.empty()) {
     PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY);
   }
   else {
-    XGUI_ViewerPrs aPrs = theSelected.front();
+    ModuleBase_ViewerPrs aPrs = theSelected.front();
     const TopoDS_Shape& aShape = aPrs.shape();
     if (!aShape.IsNull()) // the point is selected
     {
@@ -134,28 +138,28 @@ void PartSet_OperationFeatureCreate::mouseReleased(QMouseEvent* theEvent, Handle
       {
         PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY);
         // move to selected line
-        if (feature()->getKind() == SKETCH_LINE_KIND) {
+        if (feature()->getKind() == SketchPlugin_Line::ID()) {
           //FeaturePtr aFeature = aPrs.feature();
           //projectPointOnLine(aFeature, myPointSelectionMode, aPoint, theView, aX, anY);
         }
       }
     }
   }
-  bool isApplyed = false;
-  if (isPointWidget())
-    isApplyed = setWidgetPoint(aX, anY);
-  else {
-    if (!theSelected.empty()) {
-      XGUI_ViewerPrs aPrs = theSelected.front();
-      FeaturePtr aFeature = aPrs.feature();
-      if (aFeature)
-        isApplyed = setWidgetFeature(aFeature);
-    }
+  ResultPtr aFeature;
+  if (!theSelected.empty()) {
+    ModuleBase_ViewerPrs aPrs = theSelected.front();
+    aFeature = aPrs.result();
   }
+  // TODO
+  //else
+  //  aFeature = feature(); // for the widget distance only
+
+  // TODO
+  /*bool isApplyed = setWidgetValue(aFeature, aX, anY);
   if (isApplyed) {
     flushUpdated();
     emit activateNextWidget(myActiveWidget);
-  }
+  }*/
 }
 
 void PartSet_OperationFeatureCreate::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView)
@@ -168,7 +172,7 @@ void PartSet_OperationFeatureCreate::mouseMoved(QMouseEvent* theEvent, Handle(V3
     double aX, anY;
     gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView);
     PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY);
-    setWidgetPoint(aX, anY);
+    setWidgetValue(feature(), aX, anY);
     flushUpdated();
   }
 }
@@ -187,13 +191,21 @@ void PartSet_OperationFeatureCreate::keyReleased(std::string theName, QKeyEvent*
 void PartSet_OperationFeatureCreate::onWidgetActivated(ModuleBase_ModelWidget* theWidget)
 {
   myActiveWidget = theWidget;
-
+  if ((myPreSelection.size() > 0) && myActiveWidget) {
+    const ModuleBase_ViewerPrs& aPrs = myPreSelection.front();
+    ModuleBase_WidgetValueFeature aValue;
+    aValue.setResult(aPrs.result());
+    if (myActiveWidget->setValue(&aValue)) {
+      myPreSelection.remove(aPrs);
+      emit activateNextWidget(myActiveWidget);
+    }
+  } 
   if (myInitFeature && myActiveWidget) {
     ModuleBase_WidgetPoint2D* aWgt = dynamic_cast<ModuleBase_WidgetPoint2D*>(myActiveWidget);
-    if (aWgt)
-      aWgt->initFromPrevious(myInitFeature);
-    myInitFeature = FeaturePtr();
-    emit activateNextWidget(myActiveWidget);
+    if (aWgt && aWgt->initFromPrevious(myInitFeature)) { 
+      myInitFeature = FeaturePtr();
+      emit activateNextWidget(myActiveWidget);
+    }
   }
 }
 
@@ -268,34 +280,14 @@ FeaturePtr PartSet_OperationFeatureCreate::createFeature(const bool theFlushMess
   return aNewFeature;
 }
 
-bool PartSet_OperationFeatureCreate::isPointWidget() const
-{
-  return dynamic_cast<ModuleBase_WidgetPoint2D*>(myActiveWidget) ||
-         dynamic_cast<ModuleBase_WidgetPoint2dDistance*>(myActiveWidget);
-}
-
-bool PartSet_OperationFeatureCreate::setWidgetPoint(double theX, double theY)
+bool PartSet_OperationFeatureCreate::setWidgetValue(FeaturePtr theFeature, double theX, double theY)
 {
-  boost::shared_ptr<GeomAPI_Pnt2d> aPoint(new GeomAPI_Pnt2d(theX, theY));
-  ModuleBase_WidgetPoint2D* aWidget = dynamic_cast<ModuleBase_WidgetPoint2D*>(myActiveWidget);
-  if (aWidget) {
-    aWidget->setPoint(aPoint);
-    return true;
-  } else {
-    ModuleBase_WidgetPoint2dDistance* aWgt = dynamic_cast<ModuleBase_WidgetPoint2dDistance*>(myActiveWidget);
-    if (aWgt) {
-      aWgt->setPoint(feature(), aPoint);
-      return true;
-    }
-  }
-  return false;
-}
-
-bool PartSet_OperationFeatureCreate::setWidgetFeature(const FeaturePtr& theFeature)
-{
-  ModuleBase_WidgetFeature* aWidget = dynamic_cast<ModuleBase_WidgetFeature*>(myActiveWidget);
-  if (!aWidget)
-    return false;
-
-  return aWidget->setFeature(theFeature);
+  ModuleBase_WidgetValueFeature* aValue = new ModuleBase_WidgetValueFeature();
+  aValue->setResult(theFeature->firstResult());
+  aValue->setPoint(boost::shared_ptr<GeomAPI_Pnt2d>(new GeomAPI_Pnt2d(theX, theY)));
+  bool isApplyed = myActiveWidget->setValue(aValue);
+
+  delete aValue;
+  myIsModified = (myIsModified || isApplyed);
+  return isApplyed;
 }