Salome HOME
[bos #32517][EDF] Dynamic log messages switched on and off by SALOME_VERBOSE environm...
[modules/geom.git] / src / EntityGUI / EntityGUI.cxx
index 25e0103f68eef9f2dacaf28e85e3a2316509c81f..b47285b72a5f96d04fdc9ec6322fed5ae79cbe88 100644 (file)
@@ -1,44 +1,70 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2022  CEA/DEN, EDF R&D, OPEN CASCADE
 //
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
-//  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.
+// 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.
+// 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
+// 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
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 // GEOM GEOMGUI : GUI for Geometry component
 // File   : EntityGUI.cxx
 // Author : Damien COQUERET, Open CASCADE S.A.S.
 //
 #include "EntityGUI.h"
 
-#include <GeometryGUI.h>
+#include "GeometryGUI.h"
+#include "GeometryGUI_Operations.h"
+#include "GEOMUtils.hxx"
 
+#include <LightApp_SelectionMgr.h>
+#include <OCCViewer_ViewManager.h>
+#include <OCCViewer_ViewModel.h>
+#include <OCCViewer_ViewPort3d.h>
+#include <OCCViewer_ViewWindow.h>
+#include <SALOME_ListIO.hxx>
 #include <SUIT_Desktop.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_Session.h>
 #include <SUIT_ViewWindow.h>
-#include <OCCViewer_ViewModel.h>
-#include <OCCViewer_ViewManager.h>
-#include <SalomeApp_Study.h>
 #include <SalomeApp_Application.h>
+#include <SalomeApp_Study.h>
+#include "utilities.h"
 
 #include <TopoDS_Shape.hxx>
+#include <TopoDS.hxx>
+#include <BRep_Tool.hxx>
+#include <ProjLib.hxx>
+#include <ElSLib.hxx>
+
+#include <QMouseEvent>
+#include <QApplication>
+
+#include "EntityGUI_SketcherDlg.h"        // Sketcher
+#include "EntityGUI_3DSketcherDlg.h"      // Sketcher
+#include "EntityGUI_IsolineDlg.h"         // Isoline
+#include "EntityGUI_SurfFromFaceDlg.h"    // Surface From Face
+#include "EntityGUI_SubShapeDlg.h"        // Method SUBSHAPE
+#include "EntityGUI_FeatureDetectorDlg.h" // Feature Detection
+#include "EntityGUI_PictureImportDlg.h"   // Import Picture in viewer
+#include "EntityGUI_FieldDlg.h"           // Create/Edit Field
+#include "EntityGUI_PolylineDlg.h"        // Create/Edit 2d polyline
+
+#include "GEOMImpl_Types.hxx"
 
-#include "EntityGUI_SketcherDlg.h" // Sketcher
-#include "EntityGUI_3DSketcherDlg.h" // Sketcher
-#include "EntityGUI_SubShapeDlg.h" // Method SUBSHAPE
 
 //=======================================================================
 // function : EntityGUI()
@@ -72,26 +98,253 @@ bool EntityGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent )
   QDialog* aDlg = NULL;
 
   switch ( theCommandID ) {
-  case 404: // SKETCHER
+  case GEOMOp::Op2dSketcher: // 2D SKETCHER
     getGeometryGUI()->ActiveWorkingPlane();
     aDlg = new EntityGUI_SketcherDlg( getGeometryGUI(), parent );
     break;
-  case 405: // 3D SKETCHER
+  case GEOMOp::Op3dSketcher: // 3D SKETCHER
     aDlg = new EntityGUI_3DSketcherDlg( getGeometryGUI(), parent );
     break;
-  case 407: // EXPLODE : use ic
+  case GEOMOp::OpIsoline:    // ISOLINE
+    aDlg = new EntityGUI_IsolineDlg( getGeometryGUI(), parent );
+    break;
+  case GEOMOp::OpSurfaceFromFace:    // SURFACE FROM FACE
+    aDlg = new EntityGUI_SurfFromFaceDlg( getGeometryGUI(), parent );
+    break;
+  case GEOMOp::OpExplode:    // EXPLODE
     aDlg = new EntityGUI_SubShapeDlg( getGeometryGUI(), parent );
     break;
+#ifdef WITH_OPENCV
+  case GEOMOp::OpFeatureDetect:    // FEATURE DETECTION
+    aDlg = new EntityGUI_FeatureDetectorDlg( getGeometryGUI(), parent );
+    break;
+#endif
+  case GEOMOp::OpPictureImport:    // IMPORT PICTURE IN VIEWER
+    aDlg = new EntityGUI_PictureImportDlg( getGeometryGUI(), parent );
+    break;
+  case GEOMOp::OpCreateField: // CREATE FIELD
+    aDlg = new EntityGUI_FieldDlg (getGeometryGUI(), GEOM::GEOM_Field::_nil(), 0,
+                                   parent);
+    break;
+  case GEOMOp::OpEditField: // EDIT FIELD
+  case GEOMOp::OpEditFieldPopup:
+  {
+    SALOME_ListIO aList;
+    aList.Clear();
+
+    LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
+    if (aSelMgr)
+      aSelMgr->selectedObjects(aList);
+    SALOME_ListIteratorOfListIO anIter (aList);
+
+    GEOM::GEOM_Field_var     field;
+    GEOM::GEOM_FieldStep_var step;
+
+    SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( SUIT_Session::session()->activeApplication()->activeStudy() );
+    if ( study )
+      for ( ; anIter.More(); anIter.Next() )
+      {
+        Handle(SALOME_InteractiveObject) anIObj = anIter.Value();
+        if ( !anIObj.IsNull() && anIObj->hasEntry() )
+        {
+          _PTR(SObject) obj = study->studyDS()->FindObjectID( anIObj->getEntry() );
+          if ( GeometryGUI::IsInGeomComponent( obj ))
+          {
+            CORBA::Object_var   corbaObj = GeometryGUI::ClientSObjectToObject( obj );
+            GEOM::GEOM_BaseObject_var bo = GEOM::GEOM_BaseObject::_narrow( corbaObj );
+            GEOM::GEOM_Field_var     f;
+            GEOM::GEOM_FieldStep_var s;
+            switch ( bo->GetType() ) {
+            case GEOM_FIELD:
+              f = GEOM::GEOM_Field::_narrow( corbaObj ); break;
+            case GEOM_FIELD_STEP:
+              step = GEOM::GEOM_FieldStep::_narrow( corbaObj );
+              if ( !step->_is_nil() )
+                f = step->GetField();
+              break;
+            default:
+              continue;
+            }
+            if ( !f->_is_nil() )
+            {
+              if ( !field->_is_nil() && !f->_is_equivalent( field ))
+              {
+                field = GEOM::GEOM_Field::_nil(); // several field selected
+                break;
+              }
+              field = f;
+            }
+          }
+        }
+      }
+    if ( !field->_is_nil()) {
+      int stepID;
+      if ( !step->_is_nil() ) {
+        stepID = step->GetID();
+      }
+      else {
+        GEOM::ListOfLong_var stepIDs = field->GetSteps();
+        if ( stepIDs->length() > 0 )
+          stepID = stepIDs[0];
+        else
+          stepID = 0;
+      }
+      aDlg = new EntityGUI_FieldDlg (getGeometryGUI(), field, stepID, parent); 
+      break;
+    }
+    SUIT_MessageBox::warning(parent, tr("WRN_WARNING"), tr("NO_FIELD"));
+    break;
+  }
+  case GEOMOp::Op2dPolylineEditor: // POLYLINE EDITOR
+    getGeometryGUI()->ActiveWorkingPlane();
+    aDlg = new EntityGUI_PolylineDlg( getGeometryGUI(), parent );
+    break;
   default:
     app->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) );
     break;
   }
   if ( aDlg )
     aDlg->show();
-  
+
   return true;
 }
 
+//=================================================================================
+// function : 0nMousePress()
+// purpose  : [static] manage mouse events
+//=================================================================================
+bool EntityGUI::OnMousePress( QMouseEvent* pe, SUIT_Desktop* /*parent*/, SUIT_ViewWindow* theViewWindow )
+{
+  QDialog* aDlg = getGeometryGUI()->GetActiveDialogBox();
+
+  // Create Point dialog, OCC viewer 
+  if ( aDlg && 
+       theViewWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() &&
+       pe->modifiers() != Qt::ControlModifier ) {
+    
+    gp_Pnt aPnt;
+  
+    if ( QString( aDlg->metaObject()->className() ).compare( "EntityGUI_SketcherDlg" ) == 0 ) 
+    { 
+      EntityGUI_SketcherDlg* aSketcherDlg = (EntityGUI_SketcherDlg*) aDlg;
+      ((OCCViewer_ViewWindow*)theViewWindow)->setSketcherStyle(true);
+      if ( aSketcherDlg->acceptMouseEvent() ) {
+        OCCViewer_Viewer* anOCCViewer =
+          ( (OCCViewer_ViewManager*)( theViewWindow->getViewManager() ) )->getOCCViewer();
+        Handle(AIS_InteractiveContext) ic = anOCCViewer->getAISContext();
+    
+        ic->InitSelected();
+        if ( pe->modifiers() == Qt::ShiftModifier )
+          ic->ShiftSelect( Standard_True );  // Append selection
+        else
+          ic->Select( Standard_True );       // New selection
+
+        ic->InitSelected();
+        if ( ic->MoreSelected() ) {
+          TopoDS_Shape aShape = ic->SelectedShape();
+          if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX )
+            aPnt = BRep_Tool::Pnt( TopoDS::Vertex( ic->SelectedShape() ) );
+        }
+        else {
+          OCCViewer_ViewPort3d* vp =  ((OCCViewer_ViewWindow*)theViewWindow)->getViewPort();
+          aPnt = GEOMUtils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
+        }
+        
+        Qt::KeyboardModifiers modifiers = pe->modifiers();
+        aSketcherDlg->OnPointSelected( modifiers, aPnt );  // "feed" the point to point construction dialog
+      } // acceptMouseEvent()
+    }
+#ifdef WITH_OPENCV
+    if (  QString( aDlg->metaObject()->className() ).compare( "EntityGUI_FeatureDetectorDlg" ) == 0 ) 
+    {
+      EntityGUI_FeatureDetectorDlg* aCornerDlg = (EntityGUI_FeatureDetectorDlg*) aDlg;
+      if ( aCornerDlg->acceptMouseEvent() ) {
+        OCCViewer_Viewer* anOCCViewer =
+          ( (OCCViewer_ViewManager*)( theViewWindow->getViewManager() ) )->getOCCViewer();
+        Handle(AIS_InteractiveContext) ic = anOCCViewer->getAISContext();   
+
+        ic->InitSelected();
+        ic->Select( Standard_True );       // New selection
+
+        ic->InitSelected();
+        TopoDS_Shape aShape;
+        if ( ic->MoreSelected() ) 
+          aShape = ic->SelectedShape();
+        if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX )
+            aPnt = BRep_Tool::Pnt( TopoDS::Vertex( ic->SelectedShape() ) );
+        else 
+        {
+          OCCViewer_ViewPort3d* vp =  ((OCCViewer_ViewWindow*)theViewWindow)->getViewPort();
+          aPnt = GEOMUtils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
+        }
+        
+//         aCornerDlg->OnPointSelected( aPnt );  // "feed" the point to corner detection dialog
+        
+//         QPoint start = QPoint(pe->x(),pe->y());
+        aCornerDlg->setStartPnt( aPnt );
+      } // acceptMouseEvent()
+      
+    }
+#endif
+  }
+
+  return false;
+}
+
+//=================================================================================
+// function : 0nMouseRelease()
+// purpose  : [static] manage mouse events
+//=================================================================================
+bool EntityGUI::OnMouseRelease( QMouseEvent* pe, SUIT_Desktop* /*parent*/, SUIT_ViewWindow* theViewWindow )
+{
+  ((OCCViewer_ViewWindow*)theViewWindow)->setSketcherStyle(false);
+#ifdef WITH_OPENCV
+  QDialog* aDlg = getGeometryGUI()->GetActiveDialogBox();
+  if ( aDlg && ( QString( aDlg->metaObject()->className() ).compare( "EntityGUI_FeatureDetectorDlg" ) == 0 ) &&
+       theViewWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() &&
+       pe->modifiers() != Qt::ControlModifier ) 
+  {   
+    EntityGUI_FeatureDetectorDlg* aCornerDlg = (EntityGUI_FeatureDetectorDlg*) aDlg;
+   
+    gp_Pnt aPnt; 
+      
+    if ( aCornerDlg->acceptMouseEvent() )
+    {
+//       QPoint end = QPoint(pe->x(),pe->y());
+      OCCViewer_ViewPort3d* vp =  ((OCCViewer_ViewWindow*)theViewWindow)->getViewPort();
+      aPnt = GEOMUtils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
+      aCornerDlg->setEndPnt( aPnt );
+    }    
+  }
+#endif
+  return false;
+}
+
+//=================================================================================
+// function : 0nMouseMove()
+// purpose  : [static] manage mouse events
+//=================================================================================
+bool EntityGUI::OnMouseMove( QMouseEvent* pe, SUIT_Desktop* /*parent*/, SUIT_ViewWindow* theViewWindow )
+{
+  QDialog* aDlg = getGeometryGUI()->GetActiveDialogBox();
+  
+  if ( aDlg && QString( aDlg->metaObject()->className() ).compare( "EntityGUI_SketcherDlg" ) == 0 &&
+       theViewWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) 
+  { 
+    EntityGUI_SketcherDlg* aSketcherDlg = (EntityGUI_SketcherDlg*) aDlg;
+    if ( aSketcherDlg->acceptMouseEvent() ) 
+    {    
+      OCCViewer_ViewPort3d* vp =  ((OCCViewer_ViewWindow*)theViewWindow)->getViewPort();
+      gp_Pnt aPnt = GEOMUtils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
+  
+      Qt::KeyboardModifiers modifiers = pe->modifiers();
+      if (QApplication::mouseButtons() == Qt::LeftButton )
+        aSketcherDlg->OnPointSelected( modifiers, aPnt, false );  // "feed" the point to point construction dialog
+    }
+  }
+    
+  return false;
+}
 
 //=====================================================================================
 // function : DisplaySimulationShape() 
@@ -99,6 +352,7 @@ bool EntityGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent )
 //=====================================================================================
 void EntityGUI::DisplaySimulationShape( const TopoDS_Shape& S1, const TopoDS_Shape& S2 ) 
 {
+  MESSAGE("EntityGUI::DisplaySimulationShape");
   SalomeApp_Application* app = getGeometryGUI()->getApp();
   if ( !app ) return;
 
@@ -111,8 +365,8 @@ void EntityGUI::DisplaySimulationShape( const TopoDS_Shape& S1, const TopoDS_Sha
   try {
     if ( !S1.IsNull() ) {
       /* erase any previous */
-      ic->Erase( mySimulationShape1, Standard_True, Standard_False );
-      ic->ClearPrs( mySimulationShape1 );
+      ic->Erase( mySimulationShape1, Standard_True );
+      ic->ClearPrs( mySimulationShape1, 0, Standard_True );
 
       mySimulationShape1 = new AIS_Shape( TopoDS_Shape() );
       mySimulationShape1->Set( S1 );
@@ -123,8 +377,8 @@ void EntityGUI::DisplaySimulationShape( const TopoDS_Shape& S1, const TopoDS_Sha
       mySimulationShape1->UnsetColor();
     }
     if ( !S2.IsNull() ) {
-      ic->Erase( mySimulationShape2, Standard_True, Standard_False );
-      ic->ClearPrs( mySimulationShape2 );
+      ic->Erase( mySimulationShape2, Standard_True );
+      ic->ClearPrs( mySimulationShape2, 0, Standard_True );
 
       mySimulationShape2 = new AIS_Shape( TopoDS_Shape() );
       mySimulationShape2->Set( S2 );
@@ -136,8 +390,8 @@ void EntityGUI::DisplaySimulationShape( const TopoDS_Shape& S1, const TopoDS_Sha
     }
     ic->UpdateCurrentViewer();
   }
-  catch( Standard_Failure ) {
-    MESSAGE( "Exception catched in EntityGUI::DisplaySimulationShape" );
+  catch( Standard_Failure& ) {
+    MESSAGE( "Exception caught in EntityGUI::DisplaySimulationShape" );
   } 
 }
 
@@ -147,6 +401,7 @@ void EntityGUI::DisplaySimulationShape( const TopoDS_Shape& S1, const TopoDS_Sha
 //==================================================================================
 void EntityGUI::EraseSimulationShape()
 {
+  MESSAGE("EntityGUI::EraseSimulationShape");
   SalomeApp_Application* app = getGeometryGUI()->getApp();
   if ( !app ) return;
 
@@ -166,10 +421,10 @@ void EntityGUI::EraseSimulationShape()
     if ( vw->getViewManager()->getType() == OCCViewer_Viewer::Type() ) {
       OCCViewer_Viewer* v3d = ( (OCCViewer_ViewManager*)( vw->getViewManager() ) )->getOCCViewer();
       Handle(AIS_InteractiveContext) ic = v3d->getAISContext();
-      ic->Erase( mySimulationShape1, Standard_True, Standard_False );
-      ic->ClearPrs( mySimulationShape1 );
-      ic->Erase( mySimulationShape2, Standard_True, Standard_False );
-      ic->ClearPrs( mySimulationShape2 );
+      ic->Erase( mySimulationShape1, Standard_True );
+      ic->Erase( mySimulationShape2, Standard_True );
+      ic->ClearPrs( mySimulationShape1, 0, Standard_True );
+      ic->ClearPrs( mySimulationShape2, 0, Standard_True );
       ic->UpdateCurrentViewer();
     } 
   }
@@ -195,13 +450,13 @@ bool EntityGUI::SObjectExist( const _PTR(SObject)& theFatherObject, const char*
     if ( SO->FindAttribute( anAttr, "AttributeIOR" ) ) {
       _PTR(AttributeIOR) anIOR ( anAttr  );
       if ( strcmp( anIOR->Value().c_str(), IOR ) == 0 )
-       return true;
+        return true;
     }
     if ( SO->ReferencedObject( RefSO ) ) {
       if ( RefSO->FindAttribute( anAttr, "AttributeIOR" ) ) {
         _PTR(AttributeIOR) anIOR ( anAttr );
-       if ( strcmp( anIOR->Value().c_str(), IOR ) == 0 )
-         return true;
+        if ( strcmp( anIOR->Value().c_str(), IOR ) == 0 )
+          return true;
       }
     }
   }