Salome HOME
Copyright update 2020
[modules/smesh.git] / src / PluginUtils / GeomSelectionTools.cxx
index 03151a6405b4420d3df7b491b9ff234e8acb4b48..8e634b1f055b93b3975d2442402b5a1353a01ce4 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 #include <SalomeApp_Application.h>
 #include <SUIT_Session.h>
 
-#include <SALOME_ListIO.hxx>
-#include <GEOM_Client.hxx>
-#include <SMESHGUI_Utils.h>
-#include <boost/shared_ptr.hpp>
 #include <GEOMImpl_Types.hxx>
+#include <GEOM_Client.hxx>
 #include <GEOM_wrap.hxx>
+#include <SALOME_ListIO.hxx>
+#include <SMESHGUI_Utils.h>
 
-#include <TopoDS.hxx>
-#include <BRep_Tool.hxx>
-#include <Handle_Geom_Surface.hxx>
 #include <BRepAdaptor_Surface.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Iterator.hxx>
 
 #include "utilities.h"
 
 
 /*!
  * Constructor
- * @param aStudy pointer to the Study
  *
  */
-GeomSelectionTools::GeomSelectionTools(_PTR(Study) aStudy)
-{
-  myStudy = aStudy;
-}
-
-/*!
- * Accessor to the Study used by this GeomSelectionTools object
- * @return The study used by the GeomSelectionTools class
- */
-_PTR(Study) GeomSelectionTools::getMyStudy()
+GeomSelectionTools::GeomSelectionTools()
 {
-    return myStudy;
 }
 
 /*!
@@ -139,7 +126,7 @@ std::string GeomSelectionTools::getFirstSelectedEntry()
  */
 std::string GeomSelectionTools::getEntryOfObject(Handle(SALOME_InteractiveObject) anIO){
   std::string entry="";
-  _PTR(SObject) aSO = myStudy->FindObjectID(anIO->getEntry());
+  _PTR(SObject) aSO = SalomeApp_Application::getStudy()->FindObjectID(anIO->getEntry());
   if (aSO){
     _PTR(SObject) aRefSObj;
     // If selected object is a reference
@@ -159,7 +146,7 @@ std::string GeomSelectionTools::getEntryOfObject(Handle(SALOME_InteractiveObject
  */
 std::string GeomSelectionTools::getNameFromEntry(std::string entry){
   std::string name = "";
-  _PTR(SObject) aSO = myStudy->FindObjectID(entry);
+  _PTR(SObject) aSO = SalomeApp_Application::getStudy()->FindObjectID(entry);
   if (aSO){
     _PTR(SObject) aRefSObj;
     // If selected object is a reference
@@ -182,7 +169,7 @@ std::string GeomSelectionTools::getFirstSelectedComponentDataType()
   Handle(SALOME_InteractiveObject) anIO;
   std::string DataType="";
   anIO=GeomSelectionTools::getFirstSelectedSalomeObject();
-  _PTR(SObject) aSO = myStudy->FindObjectID(anIO->getEntry());
+  _PTR(SObject) aSO = SalomeApp_Application::getStudy()->FindObjectID(anIO->getEntry());
   if (aSO){
     _PTR(SObject) aRefSObj;
     // If selected object is a reference
@@ -203,7 +190,7 @@ TopAbs_ShapeEnum GeomSelectionTools::entryToShapeType(std::string entry){
 //   MESSAGE("GeomSelectionTools::entryToShapeType"<<entry );
   TopoDS_Shape S = TopoDS_Shape();
   TopAbs_ShapeEnum ShapeType = TopAbs_SHAPE;
-   _PTR(SObject) aSO = myStudy->FindObjectID(entry);
+   _PTR(SObject) aSO = SalomeApp_Application::getStudy()->FindObjectID(entry);
   if (aSO){
     _PTR(SObject) aRefSObj;
     GEOM::GEOM_Object_var aShape;
@@ -212,7 +199,8 @@ TopAbs_ShapeEnum GeomSelectionTools::entryToShapeType(std::string entry){
     if ( aSO->ReferencedObject( aRefSObj ))
       aSO = aRefSObj;
     // MESSAGE("aSO->GetFatherComponent()->ComponentDataType(): " << aSO->GetFatherComponent()->ComponentDataType());
-    if (  strcmp(aSO->GetFatherComponent()->ComponentDataType().c_str(),"GEOM") == 0)
+    std::string aComponentType = aSO->GetFatherComponent()->ComponentDataType();
+    if (aComponentType == "GEOM" || aComponentType == "SHAPERSTUDY")
       aShape = SMESH::SObjectToInterface<GEOM::GEOM_Object>(aSO);
     if ( !aShape->_is_nil() ){
       // MESSAGE("Got the Geom Object ");
@@ -220,14 +208,14 @@ TopAbs_ShapeEnum GeomSelectionTools::entryToShapeType(std::string entry){
       SalomeApp_Application* anApp = GetSalomeApplication();
       if (anApp) {
 //         MESSAGE("Got Application");
-        Engines::EngineComponent_var component = anApp->lcc()->FindOrLoad_Component( "FactoryServer","GEOM" );
+        Engines::EngineComponent_var component = anApp->lcc()->FindOrLoad_Component( "FactoryServer", aComponentType.c_str());
         GEOM::GEOM_Gen_var _geomEngine = GEOM::GEOM_Gen::_narrow(component);
 //         MESSAGE("Got GEOM engine");
         // if the Geom Object is a group
         if (aShape->GetType() == GEOM_GROUP){
 //           MESSAGE("It's a group");
           GEOM::GEOM_IGroupOperations_wrap aGroupOp =
-            _geomEngine->GetIGroupOperations(myStudy->StudyId());
+            _geomEngine->GetIGroupOperations();
           ShapeType= (TopAbs_ShapeEnum)aGroupOp->GetType(aShape);
         }
         // if not
@@ -237,6 +225,12 @@ TopAbs_ShapeEnum GeomSelectionTools::entryToShapeType(std::string entry){
 //             MESSAGE("GEOM client is OK and GEOM engine is not null");
             S = aClient->GetShape( _geomEngine, aShape );
             ShapeType=S.ShapeType();
+            if ( ShapeType == TopAbs_COMPOUND )
+            {
+              TopoDS_Iterator it( S );
+              if ( it.More() )
+                ShapeType = it.Value().ShapeType();
+            }
           }
         }
       }
@@ -275,7 +269,6 @@ GeomAbs_SurfaceType GeomSelectionTools::getFaceInformation(TopoDS_Shape S)
   GeomAbs_SurfaceType surf_type=GeomAbs_OtherSurface ;
   if (!S.IsNull() &&  S.ShapeType()==TopAbs_FACE){
     TopoDS_Face f=TopoDS::Face(S);
-    Handle(Geom_Surface) surf = BRep_Tool::Surface(f);
     BRepAdaptor_Surface surf_adap(f);
 
     /* Global Information */