Salome HOME
Copyright update 2022
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_ShapeByMeshDlg.cxx
index 82b5202bbb4bf5c6ff99fde8481717c4de8ada99..175372ab59e3f53c9312f3e18521726779b7df67 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  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
@@ -6,7 +6,7 @@
 // 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.
+// 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
@@ -287,7 +287,7 @@ void SMESHGUI_ShapeByMeshOp::SetMesh (SMESH::SMESH_Mesh_ptr thePtr)
       myHasSolids = nbShapes[ TopAbs_SOLID ];
     }
 
-  // disable inexistant elem types
+  // disable inexistent elem types
   for ( int i = 0; i < myDlg->myElemTypeGroup->buttons().count(); ++i ) {
     if ( QAbstractButton* button = myDlg->myElemTypeGroup->button( i ) )
       button->setEnabled( hasElement[ i ] );
@@ -314,28 +314,25 @@ void SMESHGUI_ShapeByMeshOp::commitOperation()
       // GEOM_Object is published -> no need to UnRegister()
       myGeomObj = GEOM::GEOM_Object::_duplicate
         (SMESHGUI::GetSMESHGen()->GetGeometryByMeshElement
-         ( myMesh.in(), elemID, myDlg->myGeomName->text().toLatin1().constData()) );
+         ( myMesh.in(), elemID, myDlg->myGeomName->text().toUtf8().constData()) );
     }
     else
     {
-      GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
-      _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+      GEOM::GEOM_Object_var aMeshShape = myMesh->GetShapeToMesh();
 
-      if (geomGen->_is_nil() || !aStudy)
+      GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen( aMeshShape );
+      if ( geomGen->_is_nil() )
         return;
 
-      GEOM::GEOM_IShapesOperations_wrap aShapesOp =
-        geomGen->GetIShapesOperations(aStudy->StudyId());
-      if (aShapesOp->_is_nil() )
+      GEOM::GEOM_IShapesOperations_wrap aShapesOp = geomGen->GetIShapesOperations();
+      if ( aShapesOp->_is_nil() )
         return;
 
       TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE;
 
-      std::map<double, GEOM::GEOM_Object_wrap> aGeomObjectsMap;
+      std::map<int, GEOM::GEOM_Object_wrap> aGeomObjectsMap;
       GEOM::GEOM_Object_wrap aGeomObject;
 
-      GEOM::GEOM_Object_var aMeshShape = myMesh->GetShapeToMesh();
-
       for ( int i = 0; i < aListId.count(); i++ )
       {
         aGeomObject = // received object need UnRegister()!
@@ -343,7 +340,7 @@ void SMESHGUI_ShapeByMeshOp::commitOperation()
 
         if (aGeomObject->_is_nil()) continue;
 
-        double anId = aShapesOp->GetSubShapeIndex(aMeshShape, aGeomObject);
+        int anId = aShapesOp->GetSubShapeIndex(aMeshShape, aGeomObject);
         if (aShapesOp->IsDone() && !aGeomObjectsMap.count(anId) )
         {
           aGeomObjectsMap[anId] = aGeomObject;
@@ -363,33 +360,31 @@ void SMESHGUI_ShapeByMeshOp::commitOperation()
       }
       else if (aNumberOfGO > 1)
       {
-        GEOM::GEOM_IGroupOperations_wrap aGroupOp =
-          geomGen->GetIGroupOperations(aStudy->StudyId());
-        if(aGroupOp->_is_nil())
+        GEOM::GEOM_IGroupOperations_wrap aGroupOp = geomGen->GetIGroupOperations();
+        if ( aGroupOp->_is_nil() )
           return;
 
         GEOM::ListOfGO_var aGeomObjects = new GEOM::ListOfGO();
         aGeomObjects->length( aNumberOfGO );
 
         int i = 0;
-        std::map<double, GEOM::GEOM_Object_wrap>::iterator anIter;
+        std::map<int, GEOM::GEOM_Object_wrap>::iterator anIter;
         for (anIter = aGeomObjectsMap.begin(); anIter!=aGeomObjectsMap.end(); anIter++)
-          aGeomObjects[i++] = (*anIter).second.in();
+          aGeomObjects[i++] = GEOM::GEOM_Object::_duplicate( (*anIter).second.in() );
 
         //create geometry group
         aGeomObject = aGroupOp->CreateGroup(aMeshShape, aGroupType);
-        aGroupOp->UnionList(myGeomObj, aGeomObjects);
+        aGroupOp->UnionList(aGeomObject, aGeomObjects);
 
-        if (!aGroupOp->IsDone())
+        if ( !aGroupOp->IsDone() )
           return;
       }
 
       // publish the GEOM object in study
       QString aNewGeomGroupName ( myDlg->myGeomName->text() );
-      SALOMEDS::Study_var aStudyVar = _CAST(Study,aStudy)->GetStudy();
       SALOMEDS::SObject_wrap aNewGroupSO =
-        geomGen->AddInStudy( aStudyVar, aGeomObject, 
-                             aNewGeomGroupName.toLatin1().data(), aMeshShape);
+        geomGen->AddInStudy( aGeomObject,
+                             aNewGeomGroupName.toUtf8().data(), aMeshShape);
 
       // get a GEOM_Object already published, which doesn't need UnRegister()
       CORBA::Object_var obj = aNewGroupSO->GetObject();
@@ -421,7 +416,7 @@ void SMESHGUI_ShapeByMeshOp::onSelectionDone()
   try {
     SALOME_ListIO aList;
     selectionMgr()->selectedObjects(aList);
-    if (!myIsMultipleAllowed && aList.Extent() != 1)
+    if ( aList.IsEmpty() || ( !myIsMultipleAllowed && aList.Extent() != 1) )
       return;
 
     SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(aList.First());
@@ -474,7 +469,7 @@ void SMESHGUI_ShapeByMeshOp::activateSelection()
 //purpose  : SLOT. Called when element type changed.
 //=======================================================================
 
-void SMESHGUI_ShapeByMeshOp::onTypeChanged (int theType)
+void SMESHGUI_ShapeByMeshOp::onTypeChanged (int /*theType*/)
 {
   setElementID("");
   activateSelection();
@@ -503,7 +498,7 @@ void SMESHGUI_ShapeByMeshOp::onElemIdChanged(const QString& theNewText)
         case VOLUME: type = SMDSAbs_Volume; break;
         default: return;
         }
-        TColStd_MapOfInteger newIndices;
+        SVTK_TVtkIDsMap newIndices;
         QStringList aListId = theNewText.split( " ", QString::SkipEmptyParts);
         for ( int i = 0; i < aListId.count(); i++ ) {
           if ( const SMDS_MeshElement * e = aMesh->FindElement( aListId[ i ].toInt() ))