Salome HOME
IMP 0019918: Re-open popup for imported shapes.
[modules/geom.git] / src / RepairGUI / RepairGUI_DivideEdgeDlg.cxx
index 0d563cc0220657e2317228f2881d933ef2d3fc2f..7cea1fd993597e5fb4f4f6a0d2fb9c7dc7ebae01 100644 (file)
 #include <GEOMImpl_Types.hxx>
 
 #include <TopAbs.hxx>
+#include <Geom_Curve.hxx>
+#include <gp_Pnt.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Edge.hxx>
+#include <BRep_Tool.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
 #include <TColStd_IndexedMapOfInteger.hxx>
 
 //=================================================================================
@@ -95,7 +101,7 @@ RepairGUI_DivideEdgeDlg::RepairGUI_DivideEdgeDlg( GeometryGUI* theGeometryGUI, Q
 
   /***************************************************************/
 
-  setHelpFileName( "add_point_on_edge.htm" );
+  setHelpFileName( "add_point_on_edge_operation_page.html" );
 
   Init();
 }
@@ -118,7 +124,6 @@ void RepairGUI_DivideEdgeDlg::Init()
   myEditCurrentArgument = GroupPoints->LineEdit1;
 
   myObject = GEOM::GEOM_Object::_nil();
-  myIndex = -1;
 
   //myGeomGUI->SetState( 0 );
   initSelection();
@@ -127,6 +132,8 @@ void RepairGUI_DivideEdgeDlg::Init()
   connect( buttonOk(),    SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
   connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
 
+  connect( myValEdt,   SIGNAL( valueChanged( double ) ), this, SLOT( ValueChangedInSpinBox() ) );
+
   connect( GroupPoints->PushButton1, SIGNAL( clicked() ),       this, SLOT( SetEditCurrentArgument() ) );
   connect( GroupPoints->LineEdit1,   SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) );
 
@@ -136,6 +143,41 @@ void RepairGUI_DivideEdgeDlg::Init()
   initName( tr( "DEVIDE_EDGE_NEW_OBJECT_NAME" ) );
 }
 
+//=================================================================================
+// function : ValueChangedInSpinBox()
+// purpose  : On change value in spin box
+//=================================================================================
+void RepairGUI_DivideEdgeDlg::ValueChangedInSpinBox()
+{
+  displayPreview();
+}
+
+//=================================================================================
+// function : displayPreview()
+// purpose  : On display Preview
+//=================================================================================
+void RepairGUI_DivideEdgeDlg::displayPreview()
+{
+  if ( myObject->_is_nil() )
+    return;
+
+  TopoDS_Shape aShape;
+  gp_Pnt aPnt;
+  if ( GEOMBase::GetShape( myObject, aShape, TopAbs_SHAPE ) ) {
+    if (aShape.ShapeType() == TopAbs_EDGE) {
+      Standard_Real aFP, aLP, aP;
+       Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(aShape), aFP, aLP);
+       aP = aFP + (aLP - aFP) * myValEdt->value();
+       aPnt = aCurve->Value(aP);
+       BRepBuilderAPI_MakeVertex mkVertex (aPnt);
+       aShape = mkVertex.Shape();
+       // Build prs
+       SALOME_Prs* aPrs = getDisplayer()->BuildPrs( aShape );
+       if ( aPrs != 0 && !aPrs->IsNull() )
+         GEOMBase_Helper::displayPreview( aPrs, false, true );
+    }
+  }
+}
 
 //=================================================================================
 // function : ClickOnOk()
@@ -161,7 +203,6 @@ bool RepairGUI_DivideEdgeDlg::ClickOnApply()
 
   myEditCurrentArgument->setText( "" );
   myObject = GEOM::GEOM_Object::_nil();
-  myIndex = -1;
 
   initSelection();
 
@@ -179,46 +220,55 @@ void RepairGUI_DivideEdgeDlg::SelectionIntoArgument()
   myEditCurrentArgument->setText( "" );
 
   myObject = GEOM::GEOM_Object::_nil();
-  myIndex = -1;
 
-  if ( IObjectCount() == 1 ) {
-    Handle(SALOME_InteractiveObject) anIO = firstIObject();
+  LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
+  SALOME_ListIO aSelList;
+  aSelMgr->selectedObjects(aSelList);
+
+  if ( aSelList.Extent() == 1 ) {
+    Handle(SALOME_InteractiveObject) anIO = aSelList.First();
     Standard_Boolean aRes;
-    GEOM::GEOM_Object_var aSelectedObj = GEOMBase::ConvertIOinGEOMObject( anIO, aRes );
-    if ( !CORBA::is_nil( aSelectedObj ) && aRes ) {
+    GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes );
+    if ( !CORBA::is_nil( aSelectedObject ) && aRes ) {
+      QString aName = GEOMBase::GetName( aSelectedObject );
       TopoDS_Shape aShape;
-      if ( GEOMBase::GetShape( aSelectedObj, aShape, TopAbs_SHAPE ) ) {
+      if ( GEOMBase::GetShape( aSelectedObject, aShape, TopAbs_SHAPE ) ) {
         const int aType = aShape.ShapeType();
         if ( aType <= TopAbs_EDGE ) {
          // edge, wire, face, shell, solid, compound
           GEOM::short_array anIndexes;
 
           TColStd_IndexedMapOfInteger aMap;
-          SalomeApp_Application* anApp =
-            (SalomeApp_Application*)(SUIT_Session::session()->activeApplication());
-          anApp->selectionMgr()->GetIndexes( anIO, aMap );
-
-          if ( !aMap.IsEmpty() ) { 
-           // subshape selection
-            myIndex = aMap( 1 );
-            myObject = aSelectedObj;
-            myEditCurrentArgument->setText( tr( "GEOM_EDGE" ) + "_1" );
+          aSelMgr->GetIndexes( anIO, aMap );
+
+          if ( aMap.Extent() == 1 ) { // local selection
+            int anIndex = aMap( 1 );
+            myEditCurrentArgument->setText( aName += QString( ":edge_%1" ).arg( anIndex ) );
+
+           //Find SubShape Object in Father
+           GEOM::GEOM_Object_var aFindedObject = GEOMBase_Helper::findObjectInFather( aSelectedObject, aName );
+           if ( aFindedObject == GEOM::GEOM_Object::_nil() ) { // Object not found in study
+             GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
+             myObject = aShapesOp->GetSubShape( aSelectedObject, anIndex );
+           }
+           else {
+             myObject = aFindedObject; // get Object from study
+           }
           }
           else if ( aType == TopAbs_EDGE ) { 
            // single shape selection
-            myIndex = -1;
-            myObject = aSelectedObj;
+            myObject = aSelectedObject;
             myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) );
           }
           else {
            // face, shell, solid or compound was selected, and NOT its subshape.
-            myIndex = -1;
             myObject = GEOM::GEOM_Object::_nil();
           }
         }
       }
     }
   }
+  displayPreview();
 }
 
 //=================================================================================
@@ -258,8 +308,7 @@ void RepairGUI_DivideEdgeDlg::ActivateThisDialog()
   connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(),
           SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
 
-  myObject = GEOM::GEOM_Object::_nil();
-  myIndex = -1;
+//  myObject = GEOM::GEOM_Object::_nil();
 
   //myGeomGUI->SetState( 0 );
   initSelection();
@@ -275,16 +324,6 @@ void RepairGUI_DivideEdgeDlg::enterEvent( QEvent* )
     ActivateThisDialog();
 }
 
-//=================================================================================
-// function : closeEvent()
-// purpose  :
-//=================================================================================
-void RepairGUI_DivideEdgeDlg::closeEvent( QCloseEvent* e )
-{
-  //myGeomGUI->SetState( -1 );
-  GEOMBase_Skeleton::closeEvent( e );
-}
-
 
 //=================================================================================
 // function : createOperation
@@ -311,7 +350,7 @@ bool RepairGUI_DivideEdgeDlg::isValid( QString& )
 bool RepairGUI_DivideEdgeDlg::execute( ObjectList& objects )
 {
   GEOM::GEOM_Object_var anObj = GEOM::GEOM_IHealingOperations::_narrow( getOperation() )->DivideEdge
-    ( myObject, myIndex, myValEdt->value(), getIsByParameter() );
+    ( myObject, -1, myValEdt->value(), getIsByParameter() );
   bool aResult = !anObj->_is_nil();
   if ( aResult )
     objects.push_back( anObj._retn() );
@@ -337,3 +376,15 @@ void RepairGUI_DivideEdgeDlg::initSelection()
   GEOM::GEOM_Object_var aNullGeomObject;
   localSelection( aNullGeomObject, TopAbs_EDGE ); // load local selection on ALL objects
 }
+
+//=================================================================================
+// function : addSubshapeToStudy
+// purpose  : virtual method to add new SubObjects if local selection
+//=================================================================================
+void RepairGUI_DivideEdgeDlg::addSubshapesToStudy()
+{
+  QMap<QString, GEOM::GEOM_Object_var> objMap;
+  objMap[GroupPoints->LineEdit1->text()] = myObject;
+
+  addSubshapesToFather( objMap );
+}