Salome HOME
updated copyright message
[modules/shaper.git] / src / PartSet / PartSet_WidgetPoint2d.h
old mode 100755 (executable)
new mode 100644 (file)
index 3c9fc33..f162e77
@@ -1,8 +1,21 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File:        PartSet_WidgetPoint2d.h
-// Created:     25 Apr 2014
-// Author:      Natalia ERMOLAEVA
+// Copyright (C) 2014-2023  CEA, EDF
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
 
 #ifndef PartSet_WidgetPoint2D_H
 #define PartSet_WidgetPoint2D_H
@@ -12,6 +25,7 @@
 
 #include <ModelAPI_CompositeFeature.h>
 #include <ModuleBase_ModelWidget.h>
+#include <ModuleBase_ViewerPrs.h>
 
 #include <QObject>
 
 #include <V3d_View.hxx>
 
 class ModelAPI_Feature;
+class ModelAPI_AttributeRefAttr;
+class GeomDataAPI_Point2D;
 class ModuleBase_IWorkshop;
 class ModuleBase_ParamSpinBox;
 class ModuleBase_IViewWindow;
+class ModuleBase_LabelValue;
+class PartSet_ExternalObjectsMgr;
 class GeomAPI_Pnt2d;
 class ModuleBase_IWorkshop;
 
@@ -50,11 +68,29 @@ Q_OBJECT
   /// Destructor
   virtual ~PartSet_WidgetPoint2D();
 
-  /// Checks if the selection presentation is valid in widget 
+  /// Fills given container with selection modes if the widget has it
+  /// \param [out] theModuleSelectionModes module additional modes, -1 means all default modes
+  /// \param theModes [out] a container of modes
+  virtual void selectionModes(int& theModuleSelectionModes, QIntList& theModes);
+
+  /// Checks if the selection presentation is valid in widget
   /// \param theValue a selected presentation in the view
   /// \return a boolean value
   virtual bool isValidSelectionCustom(const std::shared_ptr<ModuleBase_ViewerPrs>& theValue);
 
+  /// Checks all attribute validators returns valid. It tries on the given selection
+  /// to current attribute by setting the value inside and calling validators. After this,
+  /// the previous attribute value is restored.The valid/invalid value is cashed.
+  /// \param theValue a selected presentation in the view
+  /// \param theAttribute the attribute
+  /// \return a boolean value
+  bool isValidSelectionForAttribute_(const std::shared_ptr<ModuleBase_ViewerPrs>& theValue,
+                                     const std::shared_ptr<ModelAPI_Attribute>& theAttribute);
+
+  /// Fills the attribute with the value of the selected owner
+  /// \param thePrs a selected owner
+  bool setSelectionCustom(const std::shared_ptr<ModuleBase_ViewerPrs>& theValue);
+
   /// Set the given wrapped value to the current widget
   /// This value should be processed in the widget according to the needs
   /// \param theValues the wrapped widget values
@@ -63,7 +99,7 @@ Q_OBJECT
                             const bool theToValidate);
 
   /// Select the internal content if it can be selected. It is empty in the default realization
-  virtual void selectContent();
+  //virtual void selectContent();
 
   /// Returns list of widget controls
   /// \return a control list
@@ -110,7 +146,22 @@ Q_OBJECT
   virtual void mouseReleased(ModuleBase_IViewWindow* theWindow, QMouseEvent* theEvent);
 
   /// Fill preselection used in mouseReleased
-  void setPreSelection(const std::shared_ptr<ModuleBase_ViewerPrs>& thePreSelected);
+  //virtual void setPreSelection(const std::shared_ptr<ModuleBase_ViewerPrs>& thePreSelected);
+  virtual void setPreSelection(const std::shared_ptr<ModuleBase_ViewerPrs>& thePreSelected,
+                               ModuleBase_IViewWindow* theWnd,
+                               QMouseEvent* theEvent);
+
+  /// Return an object and geom shape by the viewer presentation
+  /// \param thePrs a selection
+  /// \param theObject an output object
+  /// \param theShape a shape of the selection
+  void getGeomSelection_(const std::shared_ptr<ModuleBase_ViewerPrs>& theValue,
+                         std::shared_ptr<ModelAPI_Object>& theObject,
+                         std::shared_ptr<GeomAPI_Shape>& theShape);
+
+  /// Return reference to external objects manager
+  /// \return manager instance
+  PartSet_ExternalObjectsMgr* getExternalObjectMgr() const { return myExternalObjectMgr; }
 
 signals:
   /// Signal about selection of an existing vertex from an object
@@ -138,6 +189,9 @@ protected:
   /// The methiod called when widget is activated
   virtual void activateCustom();
 
+  //! Switch On/Off highlighting of the widget
+  virtual void setHighlighted(bool isHighlighted);
+
   /// Returns true if the feature contains Point2D attribute with the same coordinates
   /// The attribute of the widget is not processed.
   /// \param theFeature a feature
@@ -152,25 +206,31 @@ protected:
 
   /// Compute the feature default value and fill the controls with it
   /// or store the control value to the feature
-  /// The widget is not initialize the attribute value in order to avoid the 
+  /// The widget is not initialize the attribute value in order to avoid the
   /// incorrect visualization in Sketch. E.g. by a line creation, the line should not
   /// be visualized immediatelly when the end point widget is activated.
   virtual void initializeValueByActivate();
 
  private:
-   /// Returns point 2d from selected vertex
-   /// \param theView a view window
-   /// \param theShape a vertex shape
-   /// \param theX an output value of X coordinate
-   /// \param theY an output value of Y coordinate
-   bool getPoint2d(const Handle(V3d_View)& theView, const TopoDS_Shape& theShape, 
-                   double& theX, double& theY) const;
+   /// Creates constrains of the clicked point
+   /// \param theClickedX the horizontal coordnate of the point
+   /// \param theClickedY the vertical coordnate of the point
+   bool setConstraintToPoint(double theClickedX, double theClickedY,
+                             const std::shared_ptr<ModuleBase_ViewerPrs>& theValue);
 
    /// Create a coincidence constraint between the attribute and the parameter object
    /// \theObject a result object
    /// \return true if succed
-   bool setConstraintWith(const ObjectPtr& theObject);
+   bool setConstraintToObject(const ObjectPtr& theObject);
 
+   /// Process selected value
+   /// \param theValue the selected object
+   /// \param theX X coordinate of clicked point
+   /// \param theY Y coordinate of clicked point
+   void processSelection(const ModuleBase_ViewerPrsPtr& theValue, double theX, double theY);
+
+
+public:
    /// Returns if the feature is an orphan point, circle or an arc. Returns true if it
    /// has no a coincident to other lines. It processes point, circle and arc features
    /// In circle an arc features, only centers are processed, for other points, it returns
@@ -187,25 +247,67 @@ protected:
    /// \param theShape a shape to be exploded
    /// \param thePoint a point
    /// \return boolean value
-   static bool shapeContainsPoint(const std::shared_ptr<GeomAPI_Shape>& theShape,
-                                  const std::shared_ptr<GeomAPI_Pnt2d>& thePoint,
-                                  const CompositeFeaturePtr& theSketch);
+   static bool shapeExploreHasVertex(const std::shared_ptr<GeomAPI_Shape>& theShape,
+                                     const std::shared_ptr<GeomAPI_Pnt2d>& thePoint,
+                                     const CompositeFeaturePtr& theSketch);
+
+  /// Finds in the feature's sub-features first Point2D attribute with the given point coordinates
+  /// \param theFeature a feature with sub-feature attributes
+  /// \param thePoint a point to provided searched coordinates
+  /// \return found point or null
+  static std::shared_ptr<GeomDataAPI_Point2D> findFirstEqualPointInArgumentFeatures(
+                  const FeaturePtr& theFeature, const std::shared_ptr<GeomAPI_Pnt2d>& thePoint);
+
+  /// Finds in the feature first Point2D attribute with the given point coordinates
+  /// \param theFeature a feature with point attributes
+  /// \param thePoint a point to provided searched coordinates
+  /// \return found point or null
+  static std::shared_ptr<GeomDataAPI_Point2D> findFirstEqualPoint(const FeaturePtr& theFeature,
+                                       const std::shared_ptr<GeomAPI_Pnt2d>& thePoint);
+
+  /// Finds in the sketch attribute point of any feature that is nearest to the given point
+  /// \param theSketch a sketch, that is a container of features
+  /// \param theSkipFeature a feature that do not participate in the search
+  /// \param thePoint a point to provided searched coordinates
+  /// \return found point or null
+  static std::shared_ptr<GeomDataAPI_Point2D> findFirstEqualPointInSketch(
+                                       const CompositeFeaturePtr& theSketch,
+                                       const FeaturePtr& theSkipFeature,
+                                       const std::shared_ptr<GeomAPI_Pnt2d>& thePoint);
+
+private:
+  /// Returns attribute reference if the key is defined in XML definition of this control
+  /// \return found attribute or null
+  std::shared_ptr<ModelAPI_AttributeRefAttr> attributeRefAttr() const;
+
+  /// Finds first equal point attribute in sketch and set it to reference attribute
+  /// \param theClickedX the horizontal coordnate of the point
+  /// \param theClickedY the vertical coordnate of the point
+  void fillRefAttribute(const std::shared_ptr<ModuleBase_ViewerPrs>& theValue);
+  void fillRefAttribute(double theClickedX, double theClickedY,
+                        const std::shared_ptr<ModuleBase_ViewerPrs>& theValue);
+  void fillRefAttribute(const ObjectPtr& theObject);
+
+  ObjectPtr getGeomSelection(const std::shared_ptr<ModuleBase_ViewerPrs>& theValue);
 
 protected:
   ModuleBase_IWorkshop* myWorkshop; ///< workshop
 
 private:
-
   QGroupBox* myGroupBox;  ///< the parent group box for all intenal widgets
-  ModuleBase_ParamSpinBox* myXSpin;  ///< the spin box for the X coordinate
-  ModuleBase_ParamSpinBox* myYSpin;  ///< the spin box for the Y coordinate
+  //ModuleBase_ParamSpinBox* myXSpin;  ///< the spin box for the X coordinate
+  //ModuleBase_ParamSpinBox* myYSpin;  ///< the spin box for the Y coordinate
+  ModuleBase_LabelValue* myXSpin; ///< the label for the X coordinate
+  ModuleBase_LabelValue* myYSpin; ///< the label for the Y coordinate
+  PartSet_ExternalObjectsMgr* myExternalObjectMgr; ///< reference to external objects manager
 
-   /// value used as selection in mouse release method
+  /// value used as selection in mouse release method
   std::shared_ptr<ModuleBase_ViewerPrs> myPreSelected;
 
   /// it is important during restart operation
   CompositeFeaturePtr mySketch;
 
+  std::string myRefAttribute; /// if not empty, coincidences are not set but attribute is filled
   bool myValueIsCashed; /// boolean state if the value is cashed during value state change
   bool myIsFeatureVisibleInCash; /// boolean value if the feature was visible when cash if filled
   double myXValueInCash; /// the cashed X value during value state change