Salome HOME
updated copyright message
[modules/shaper.git] / src / PartSet / PartSet_WidgetPoint2d.cpp
index 8183806b9d66b41da4ca2e03093a3734821a68f8..9ba1d659a46c8d5b7ab0397aef82a0dff18fb568 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -106,43 +106,21 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent,
   myGroupBox = new QGroupBox(aPageName, theParent);
   myGroupBox->setFlat(false);
 
-  bool aAcceptVariables = theData->getBooleanAttribute(DOUBLE_WDG_ACCEPT_EXPRESSIONS, true);
+#ifdef _DEBUG
+  bool aAcceptVariables =
+#endif
+    theData->getBooleanAttribute(DOUBLE_WDG_ACCEPT_EXPRESSIONS, true);
 
   QGridLayout* aGroupLay = new QGridLayout(myGroupBox);
   ModuleBase_Tools::adjustMargins(aGroupLay);
   aGroupLay->setSpacing(2);
   aGroupLay->setColumnStretch(1, 1);
-  {
-    QLabel* aLabel = new QLabel(myGroupBox);
-
-    myXSpin = new ModuleBase_LabelValue(myGroupBox, tr("X"));
-    //ModuleBase_ParamSpinBox(myGroupBox);
-    //myXSpin->setAcceptVariables(aAcceptVariables);
-    //myXSpin->setMinimum(-DBL_MAX);
-    //myXSpin->setMaximum(DBL_MAX);
-    //myXSpin->setToolTip(tr("X"));
-    aGroupLay->addWidget(myXSpin, 0, 1);
-
-    //connect(myXSpin, SIGNAL(textChanged(const QString&)), this, SIGNAL(valuesModified()));
-    //myXSpin->setValueEnabled(isValueEnabled());
-  }
-  {
-    //QLabel* aLabel = new QLabel(myGroupBox);
-    //aLabel->setText(tr("Y "));
-    //aGroupLay->addWidget(aLabel, 1, 0);
-
-    myYSpin = new ModuleBase_LabelValue(myGroupBox, tr("Y"));
-    //ModuleBase_ParamSpinBox(myGroupBox);
-    //myYSpin = new ModuleBase_ParamSpinBox(myGroupBox);
-    //myYSpin->setAcceptVariables(aAcceptVariables);
-    //myYSpin->setMinimum(-DBL_MAX);
-    //myYSpin->setMaximum(DBL_MAX);
-    //myYSpin->setToolTip(tr("Y"));
-    aGroupLay->addWidget(myYSpin, 1, 1);
-
-    //connect(myYSpin, SIGNAL(textChanged(const QString&)), this, SIGNAL(valuesModified()));
-    //myYSpin->setValueEnabled(isValueEnabled());
-  }
+
+  myXSpin = new ModuleBase_LabelValue(myGroupBox, tr("X"));
+  aGroupLay->addWidget(myXSpin, 0, 1);
+  myYSpin = new ModuleBase_LabelValue(myGroupBox, tr("Y"));
+  aGroupLay->addWidget(myYSpin, 1, 1);
+
   QVBoxLayout* aLayout = new QVBoxLayout(this);
   ModuleBase_Tools::zeroMargins(aLayout);
   aLayout->addWidget(myGroupBox);
@@ -155,8 +133,6 @@ PartSet_WidgetPoint2D::PartSet_WidgetPoint2D(QWidget* theParent,
 
 bool PartSet_WidgetPoint2D::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& theValue)
 {
-  bool aValid = true;
-
   PartSet_Module* aModule = dynamic_cast<PartSet_Module*>(myWorkshop->module());
   if (aModule->sketchReentranceMgr()->isInternalEditActive())
     return true; /// when internal edit is started a new feature is created. I has not results, AIS
@@ -243,10 +219,10 @@ bool PartSet_WidgetPoint2D::setSelectionCustom(const ModuleBase_ViewerPrsPtr& th
   GeomShapePtr aShape = theValue->shape();
   if (aShape.get() && !aShape->isNull()) {
     Handle(V3d_View) aView = myWorkshop->viewer()->activeView();
-    double aX = 0, aY = 0;
     const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
-    if (getPoint2d(aView, aTDShape, aX, aY)) {
-      fillRefAttribute(aX, aY, theValue);
+    GeomPnt2dPtr aPnt = PartSet_Tools::getPnt2d(aView, aTDShape, mySketch);
+    if (aPnt) {
+      fillRefAttribute(aPnt->x(), aPnt->y(), theValue);
       isDone = true;
     }
     else if (aTDShape.ShapeType() == TopAbs_EDGE) {
@@ -306,21 +282,24 @@ bool PartSet_WidgetPoint2D::setSelection(QList<ModuleBase_ViewerPrsPtr>& theValu
     GeomShapePtr aShape = aValue->shape();
     if (aShape.get() && !aShape->isNull()) {
       Handle(V3d_View) aView = myWorkshop->viewer()->activeView();
-      double aX = 0, aY = 0;
       const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
-      if (getPoint2d(aView, aTDShape, aX, aY)) {
-        isDone = setPoint(aX, aY);
-        setConstraintToPoint(aX, aY, aValue);
+      GeomPnt2dPtr aPnt = PartSet_Tools::getPnt2d(aView, aTDShape, mySketch);
+
+      if (aPnt) {
+        //isDone = setPoint(aPnt->x(), aPnt->y());
+        //setConstraintToPoint(aPnt->x(), aPnt->y(), aValue);
+        processSelection(aValue, aPnt->x(), aPnt->y());
+        isDone = true;
       }
     }
   }
   return isDone;
 }
 
-void PartSet_WidgetPoint2D::selectContent()
-{
- // myXSpin->selectAll();
-}
+//void PartSet_WidgetPoint2D::selectContent()
+//{
+// // myXSpin->selectAll();
+//}
 
 bool PartSet_WidgetPoint2D::setPoint(double theX, double theY)
 {
@@ -476,24 +455,6 @@ void PartSet_WidgetPoint2D::deactivate()
   ModuleBase_ModelWidget::deactivate();
 }
 
-bool PartSet_WidgetPoint2D::getPoint2d(const Handle(V3d_View)& theView,
-                                       const TopoDS_Shape& theShape,
-                                       double& theX, double& theY) const
-{
-  if (!theShape.IsNull()) {
-    if (theShape.ShapeType() == TopAbs_VERTEX) {
-      const TopoDS_Vertex& aVertex = TopoDS::Vertex(theShape);
-      if (!aVertex.IsNull()) {
-        // A case when point is taken from existing vertex
-        gp_Pnt aPoint = BRep_Tool::Pnt(aVertex);
-        PartSet_Tools::convertTo2D(aPoint, mySketch, theView, theX, theY);
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
 bool PartSet_WidgetPoint2D::setConstraintToPoint(double theClickedX, double theClickedY,
                                   const std::shared_ptr<ModuleBase_ViewerPrs>& theValue)
 {
@@ -596,12 +557,36 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo
     aFirstValue = myPreSelected;
   }
 
+  double aX=0, aY=0;
+  bool aHasPoint = false;
+  if (aFirstValue.get()) {
+    GeomShapePtr aShape = aFirstValue->shape();
+    if (aShape.get() && aShape->shapeType() == GeomAPI_Shape::VERTEX) {
+      const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
+      GeomPnt2dPtr aPnt = PartSet_Tools::getPnt2d(aView, aTDShape, mySketch);
+      aX = aPnt->x();
+      aY = aPnt->y();
+      aHasPoint = true;
+    }
+  }
+  if (!aHasPoint) {
+    gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
+    PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, aY);
+  }
+  processSelection(aFirstValue, aX, aY);
+}
+
+void PartSet_WidgetPoint2D::processSelection(const ModuleBase_ViewerPrsPtr& theValue,
+  double theX, double theY)
+{
+  if (!setPoint(theX, theY))
+    return;
   // if we have selection and use it
-  if (aFirstValue.get() && isValidSelectionCustom(aFirstValue) &&
-      aFirstValue->shape().get()) { /// Trihedron Axis may be selected, but shape is empty
-    GeomShapePtr aGeomShape = aFirstValue->shape();
+  if (theValue.get() && isValidSelectionCustom(theValue) && theValue->shape().get()) {
+    /// Trihedron Axis may be selected, but shape is empty
+    GeomShapePtr aGeomShape = theValue->shape();
     TopoDS_Shape aShape = aGeomShape->impl<TopoDS_Shape>();
-    ObjectPtr aObject = aFirstValue->object();
+    ObjectPtr aObject = theValue->object();
 
     FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aObject);
     bool anExternal = false;
@@ -627,29 +612,12 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo
       }
     }
     if (anExternal) {
-      double aX = 0, aY = 0;
-      if (getPoint2d(aView, aShape, aX, aY) && isFeatureContainsPoint(myFeature, aX, aY)) {
-        // do not create a constraint to the point, which already used by the feature
-        // if the feature contains the point, focus is not switched
-        setPoint(aX, aY);
-      }
-      else {
-        if (getPoint2d(aView, aShape, aX, aY))
-          setPoint(aX, aY);
-        else {
-          if (aShape.ShapeType() == TopAbs_EDGE) {
-            // point is taken from mouse event and set in attribute. It should be done before set
-            // coinident constraint to the external line. If a point is created, it should be in
-            // the mouse clicked point
-            gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(),
-                                                               theWindow->v3dView());
-            PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, aY);
-            setPoint(aX, aY);
-          }
+      if (!isFeatureContainsPoint(myFeature, theX, theY)) {
+        if (aShape.ShapeType() == TopAbs_EDGE) {
           setValueState(Stored); // in case of edge selection, Apply state should also be updated
         }
         bool anOrphanPoint = aShape.ShapeType() == TopAbs_VERTEX ||
-                              isOrphanPoint(aSelectedFeature, mySketch, aX, aY);
+                              isOrphanPoint(aSelectedFeature, mySketch, theX, theY);
         if (anExternal) {
           // we should not stop reentrant operation on external objects because
           anOrphanPoint = true;
@@ -657,7 +625,7 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo
           if (aShape.ShapeType() == TopAbs_VERTEX) {
             FeaturePtr aFixedFeature = ModelAPI_Feature::feature(aFixedObject);
             if (aFixedFeature.get() && aFixedFeature->getKind() == SketchPlugin_Point::ID()) {
-              anOrphanPoint = isOrphanPoint(aFixedFeature, mySketch, aX, aY);
+              anOrphanPoint = isOrphanPoint(aFixedFeature, mySketch, theX, theY);
             }
           }
         }
@@ -670,34 +638,25 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo
         if (!anOrphanPoint)
           emit vertexSelected(); // it stops the reentrant operation
 
+        myPreSelected.reset();
         emit focusOutWidget(this);
       }
     }
-    if (!anExternal) {
-      double aX = 0, aY = 0;
-      bool isProcessed = false;
-      if (getPoint2d(aView, aShape, aX, aY) && isFeatureContainsPoint(myFeature, aX, aY)) {
-        // when the point is selected, the coordinates of the point should be set into the attribute
-        // if the feature contains the point, focus is not switched
-        setPoint(aX, aY);
-      }
-      else {
+    else {
+      if (!isFeatureContainsPoint(myFeature, theX, theY)) {
+        double aX = 0, aY = 0;
         bool anOrphanPoint = isOrphanPoint(aSelectedFeature, mySketch, aX, aY);
         // do not set a coincidence constraint in the attribute if the feature contains a point
         // with the same coordinates. It is important for line creation in order to do not set
         // the same constraints for the same points, oterwise the result line has zero length.
         bool isAuxiliaryFeature = false;
-        if (getPoint2d(aView, aShape, aX, aY)) {
-          setPoint(aX, aY);
-          setConstraintToPoint(aX, aY, aFirstValue);
+        if (aShape.ShapeType() == TopAbs_VERTEX) {
+          setConstraintToPoint(theX, theY, theValue);
         }
         else if (aShape.ShapeType() == TopAbs_EDGE) {
           // point is taken from mouse event and set in attribute. It should be done before setting
           // coinident constraint to the external line. If a point is created, it should be in
           // the mouse clicked point
-          gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView());
-          PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, aY);
-          setPoint(aX, aY);
           setConstraintToObject(aObject);
           setValueState(Stored); // in case of edge selection, Apply state should also be updated
           isAuxiliaryFeature = PartSet_Tools::isAuxiliarySketchEntity(aObject);
@@ -711,14 +670,15 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo
         updateObject(feature());
         if (!anOrphanPoint && !anExternal && !isAuxiliaryFeature)
           emit vertexSelected();
+        myPreSelected.reset();
         emit focusOutWidget(this);
       }
     }
   }
   // The selection could be a center of an external circular object
-  else if (aFirstValue.get() && (!aFirstValue->interactive().IsNull())) {
+  else if (theValue.get() && (!theValue->interactive().IsNull())) {
     Handle(PartSet_CenterPrs) aAIS =
-        Handle(PartSet_CenterPrs)::DownCast(aFirstValue->interactive());
+        Handle(PartSet_CenterPrs)::DownCast(theValue->interactive());
     if (!aAIS.IsNull()) {
       gp_Pnt aPntComp = aAIS->Component()->Pnt();
       GeomVertexPtr aVertPtr(new GeomAPI_Vertex(aPntComp.X(), aPntComp.Y(), aPntComp.Z()));
@@ -738,26 +698,19 @@ void PartSet_WidgetPoint2D::mouseReleased(ModuleBase_IViewWindow* theWindow, QMo
       // external objects e.g. selection of trihedron axis when input end arc point
       updateObject(feature());
 
-      double aX = 0, aY = 0;
-      if (getPoint2d(aView, aShape, aX, aY)) {
-        // do not create a constraint to the point, which already used by the feature
-        // if the feature contains the point, focus is not switched
-        setPoint(aX, aY);
-      }
       emit vertexSelected(); // it stops the reentrant operation
+      myPreSelected.reset();
       emit focusOutWidget(this);
     }
   }
   else {
     // A case when point is taken from mouse event
-    gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView());
-    double aX = 0, aY = 0;
-    PartSet_Tools::convertTo2D(aPoint, mySketch, aView, aX, aY);
 
     // if the feature contains the point, focus is not switched
-    if (!setPoint(aX, aY) || isFeatureContainsPoint(myFeature, aX, aY))
+    if (isFeatureContainsPoint(myFeature, theX, theY))
       return;
 
+    myPreSelected.reset();
     emit focusOutWidget(this);
   }
 }
@@ -769,7 +722,6 @@ void PartSet_WidgetPoint2D::setPreSelection(
 {
   myPreSelected = thePreSelected;
   mouseReleased(theWnd, theEvent);
-  myPreSelected = ModuleBase_ViewerPrsPtr();
 }
 
 void PartSet_WidgetPoint2D::getGeomSelection_(const std::shared_ptr<ModuleBase_ViewerPrs>& theValue,