Salome HOME
Transfer BreakLink from Object to Gen
authorvsv <vsv@opencascade.com>
Mon, 23 Dec 2019 11:57:39 +0000 (14:57 +0300)
committervsv <vsv@opencascade.com>
Mon, 23 Dec 2019 11:57:39 +0000 (14:57 +0300)
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_Selection.cxx
src/SMESHGUI/SMESHGUI_Selection.h

index 776e7653ceda3727929c207ed060b5496865ea68..e70e976fa935977c6067d09a67eab187c6e2fe6d 100644 (file)
 #include <SALOMEDS_Study.hxx>
 #include <SALOMEDS_SObject.hxx>
 #include "utilities.h"
+#include <SALOME_LifeCycleCORBA.hxx>
 
 // OCCT includes
 #include <Standard_ErrorHandler.hxx>
@@ -1392,7 +1393,8 @@ namespace
       if (selected.Extent()) {
         Handle(SALOME_InteractiveObject) anIObject = selected.First();
         _PTR(Study) aStudy = SMESH::getStudy();
-        _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry());
+        std::string aEntry = anIObject->getEntry();
+        _PTR(SObject) aSObj = aStudy->FindObjectID(aEntry);
         if (aSObj) {
           std::string aName = aSObj->GetName();
           QMessageBox::StandardButton aRes = SUIT_MessageBox::warning(SMESHGUI::desktop(),
@@ -1400,9 +1402,26 @@ namespace
             QObject::tr("MSG_BREAK_SHAPER_LINK").arg(aName.c_str()),
             SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No);
           if (aRes == SUIT_MessageBox::Yes) {
-            GEOM::GEOM_Object_var aObject = SMESH::SObjectToInterface<GEOM::GEOM_Object>(aSObj);
-            if (!aObject->_is_nil())
-              aObject->BreakLinks();
+            SUIT_DataOwnerPtrList aList;
+            aSel->selected(aList, "ObjectBrowser", true);
+            SUIT_DataOwner* aOwn = aList.first();
+            LightApp_DataOwner* sowner = dynamic_cast<LightApp_DataOwner*>(aOwn);
+            QString aREntry = sowner->entry();
+
+            static GEOM::GEOM_Gen_var geomGen;
+            if (CORBA::is_nil(geomGen)) {
+              SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+                (SUIT_Session::session()->activeApplication());
+              if (app) {
+                SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA(app->namingService());
+                Engines::EngineComponent_var comp =
+                  ls->FindOrLoad_Component("FactoryServer", "SHAPERSTUDY");
+                geomGen = GEOM::GEOM_Gen::_narrow(comp);
+              }
+            }
+            if (!CORBA::is_nil(geomGen)) {
+              geomGen->BreakLink(aREntry.toStdString().c_str());
+            }
           }
         }
       }
index c7933455469e33d5890a6c6f92524354a85de287..ab4a1ca8ec4d3d1f80aab645f8770fd9e97e2493 100644 (file)
@@ -43,6 +43,8 @@
 #include <SalomeApp_Application.h>
 #include <LightApp_VTKSelector.h>
 #include <SVTK_ViewWindow.h>
+#include <LightApp_SelectionMgr.h>
+#include <LightApp_DataOwner.h>
 
 // IDL includes
 #include <SALOMEconfig.h>
@@ -77,6 +79,8 @@ void SMESHGUI_Selection::init( const QString& client, LightApp_SelectionMgr* mgr
 
   if( mgr )
   {
+    myOwners.clear();
+    mgr->selected(myOwners, client);
     for( int i=0, n=count(); i<n; i++ ) {
       myTypes.append( typeName( type( entry( i ) ) ) );
       myControls.append( controlMode( i ) );
@@ -614,10 +618,21 @@ bool SMESHGUI_Selection::hasGeomReference( int ind ) const
 bool SMESHGUI_Selection::canBreakLink( int ind ) const
 {
   if ( ind >= 0 && ind < myTypes.count()) {
-    _PTR(SObject) aSObject = SMESH::getStudy()->FindObjectID( entry( ind ).toUtf8().data() );
-    GEOM::GEOM_Object_var aObject = SMESH::SObjectToInterface<GEOM::GEOM_Object>(aSObject);
-    if (!aObject->_is_nil())
-      return aObject->IsParametrical();
+    if (isReference(ind)) {
+      SUIT_DataOwner* aOwn = myOwners.at(ind);
+      LightApp_DataOwner* sowner = dynamic_cast<LightApp_DataOwner*>(aOwn);
+      QString aEntry = sowner->entry();
+      _PTR(SObject) aSObject = SMESH::getStudy()->FindObjectID(aEntry.toStdString());
+      _PTR(SObject) aFatherObj = aSObject->GetFather();
+      _PTR(SComponent) aComponent = aFatherObj->GetFatherComponent();
+      if (aComponent->ComponentDataType() == "SMESH") {
+        QString aObjEntry = entry(ind);
+        _PTR(SObject) aGeomSObject = SMESH::getStudy()->FindObjectID(aObjEntry.toStdString());
+        GEOM::GEOM_Object_var aObject = SMESH::SObjectToInterface<GEOM::GEOM_Object>(aGeomSObject);
+        if (!aObject->_is_nil())
+          return aObject->IsParametrical();
+      }
+    }
   }
   return false;
 }
index 6ca2c0cb1d0357a276785579115ac7082f182a53..3ec17a9a86006376bc47966d9b075d2f2407f02b 100644 (file)
@@ -32,6 +32,7 @@
 
 // SALOME GUI includes
 #include <LightApp_Selection.h>
+#include <SUIT_DataOwner.h>
 
 // SALOME KERNEL includes
 #include <SALOMEDSClient_definitions.hxx>
@@ -96,6 +97,7 @@ private:
   QStringList             myTypes;
   QStringList             myControls;
   QList<SMESH_Actor*>     myActors;
+  SUIT_DataOwnerPtrList   myOwners;
 };
 
 #endif // SMESHGUI_SELECTION_H