Salome HOME
Mantis issue 0021565: [CEA 557] Opposite of the pipe
[modules/geom.git] / src / GEOM_I / GEOM_Gen_i.cc
index 49292bda414c14ae054eee9905e8585a2882508d..3dec744598d0d66bea80c39edcbf6df1f18dc184 100644 (file)
@@ -1,23 +1,24 @@
-//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012  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.
 //
-//  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
 
 #ifdef WNT
 #pragma warning( disable:4786 )
@@ -27,6 +28,7 @@
 
 #include "GEOM_Gen_i.hh"
 #include "GEOM_Object_i.hh"
+#include "GEOM_version.h"
 
 #include <set>
 #include <sstream>
@@ -181,11 +183,11 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
     anAttr = aStudyBuilder->FindOrCreateAttribute(aFather, "AttributeName");
     SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
     aName->SetValue("Geometry");
-    aName->Destroy();
+    aName->UnRegister();
     anAttr = aStudyBuilder->FindOrCreateAttribute(aFather, "AttributePixMap");
     SALOMEDS::AttributePixMap_var aPixMap=SALOMEDS::AttributePixMap::_narrow(anAttr);
     aPixMap->SetPixMap("ICON_OBJBROWSER_Geometry");
-    aPixMap->Destroy();
+    aPixMap->UnRegister();
     aStudyBuilder->DefineComponentInstance(aFather, (GEOM::GEOM_Gen_var)GEOM_Gen::_this());
   }
   if (aFather->_is_nil()) return aResultSO;
@@ -197,71 +199,69 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
       aResultSO = SALOMEDS::SObject::_duplicate(theSObject); //SRN: Added Aug 24,2004 : for  the method AddInStudy with theFather argumenet != NULL
       //THROW_SALOME_CORBA_EXCEPTION("Publish in study supervision graph error",SALOME::BAD_PARAM);
   }
-  anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR");
-  SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
   CORBA::String_var aGeomObjIOR = _orb->object_to_string(theObject);
-  anIOR->SetValue(aGeomObjIOR);
-  anIOR->Destroy();
+  aResultSO->SetAttrString("AttributeIOR",aGeomObjIOR);
 
-  anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributePixMap");
-  SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
   TCollection_AsciiString aShapeName("Shape_");
 
-  if ( aShape->GetType() == GEOM_GROUP ) {
+  CORBA::Long mytype=aShape->GetType();
+  if ( mytype == GEOM_GROUP ) {
     GEOM::GEOM_IGroupOperations_var anOp = GetIGroupOperations( theStudy->StudyId() );
     switch ( (TopAbs_ShapeEnum)anOp->GetType( aShape ) ) {
     case TopAbs_VERTEX:
-      aPixmap->SetPixMap( "ICON_OBJBROWSER_GROUP_PNT" );
+      aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_PNT" );
       aShapeName = "Group_Of_Vertices_";
       break;
     case TopAbs_EDGE:
-      aPixmap->SetPixMap( "ICON_OBJBROWSER_GROUP_EDGE" );
+      aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_EDGE");
       aShapeName = "Group_Of_Edges_";
       break;
     case TopAbs_FACE:
-      aPixmap->SetPixMap( "ICON_OBJBROWSER_GROUP_FACE" );
+      aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_FACE");
       aShapeName = "Group_Of_Faces_";
       break;
     case TopAbs_SOLID:
-      aPixmap->SetPixMap( "ICON_OBJBROWSER_GROUP_SOLID" );
+      aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_GROUP_SOLID");
       aShapeName = "Group_Of_Solids_";
       break;
     }
-  } else if ( aShape->GetType() == GEOM_MARKER ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_LCS" );
+  } else if ( mytype == GEOM_MARKER ) {
+    aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_LCS");
     aShapeName = "LocalCS_";
-  } else if ( aShape->GetType() > ADVANCED_BASE ) {
+  } else if ( mytype > ADVANCED_BASE ) {
     char buf[20];
     sprintf( buf, "%d", aShape->GetType() );
     std::string advId = "ICON_OBJBROWSER_ADVANCED_"; advId += buf;
-    aPixmap->SetPixMap( advId.c_str() );
+    aResultSO->SetAttrString("AttributePixMap",advId.c_str());
     aShapeName = "Advanced_";
-  } else if ( aShape->GetShapeType() == GEOM::COMPOUND ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_COMPOUND" );
+  } else {
+    GEOM::shape_type myshapetype=aShape->GetShapeType();
+    if ( myshapetype == GEOM::COMPOUND ) {
+    aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPOUND" );
     aShapeName = "Compound_";
-  } else if ( aShape->GetShapeType() == GEOM::COMPSOLID ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_COMPSOLID" );
+  } else if ( myshapetype == GEOM::COMPSOLID ) {
+    aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_COMPSOLID");
     aShapeName = "Compsolid_";
-  } else if ( aShape->GetShapeType() == GEOM::SOLID ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_SOLID" );
+  } else if ( myshapetype == GEOM::SOLID ) {
+    aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SOLID");
     aShapeName = "Solid_";
-  } else if ( aShape->GetShapeType() == GEOM::SHELL ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_SHELL" );
+  } else if ( myshapetype == GEOM::SHELL ) {
+    aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_SHELL");
     aShapeName = "Shell_";
-  } else if ( aShape->GetShapeType() == GEOM::FACE ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_FACE" );
+  } else if ( myshapetype == GEOM::FACE ) {
+    aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_FACE");
     aShapeName = "Face_";
-  } else if ( aShape->GetShapeType() == GEOM::WIRE ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_WIRE" );
+  } else if ( myshapetype == GEOM::WIRE ) {
+    aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_WIRE");
     aShapeName = "Wire_";
-  } else if ( aShape->GetShapeType() == GEOM::EDGE ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_EDGE" );
+  } else if ( myshapetype == GEOM::EDGE ) {
+    aResultSO->SetAttrString("AttributePixMap", "ICON_OBJBROWSER_EDGE");
     aShapeName = "Edge_";
-  } else if ( aShape->GetShapeType() == GEOM::VERTEX ) {
-    aPixmap->SetPixMap( "ICON_OBJBROWSER_VERTEX" );
+  } else if ( myshapetype == GEOM::VERTEX ) {
+    aResultSO->SetAttrString("AttributePixMap","ICON_OBJBROWSER_VERTEX" );
     aShapeName = "Vertex_";
   }
-  aPixmap->Destroy();
+  }
   //if (strlen(theName) == 0) aShapeName += TCollection_AsciiString(aResultSO->Tag());
   //else aShapeName = TCollection_AsciiString(CORBA::string_dup(theName));
 
@@ -324,10 +324,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
   aShape->SetStudyEntry(anID.in());
 
   //Set a name of the added shape
-  anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeName");
-  SALOMEDS::AttributeName_var aNameAttrib = SALOMEDS::AttributeName::_narrow(anAttr);
-  aNameAttrib->SetValue(aShapeName.ToCString());
-  aNameAttrib->Destroy();
+  aResultSO->SetAttrString("AttributeName",aShapeName.ToCString());
 
   //Set NoteBook variables used in the object creation
   TCollection_AsciiString aVars;
@@ -344,15 +341,12 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
     if(i != n-1)
       aVars += "|";
   }
-  anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeString");
-  SALOMEDS::AttributeString_var aStringAttrib = SALOMEDS::AttributeString::_narrow(anAttr);
-  aStringAttrib->SetValue(aVars.ToCString());
-  aStringAttrib->Destroy();
+  aResultSO->SetAttrString("AttributeString",aVars.ToCString());
 
-  aFather->Destroy();
+  aFather->UnRegister();
 
   //Set a name of the GEOM object
-  aShape->SetName(theName);
+  aShape->SetName(aShapeName.ToCString());
 
   return aResultSO._retn();
 }
@@ -624,7 +618,7 @@ CORBA::Boolean GEOM_Gen_i::CanCopy(SALOMEDS::SObject_ptr theObject) {
   SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
 
   CORBA::String_var aString=anIOR->Value();
-  anIOR->Destroy();
+  anIOR->UnRegister();
   CORBA::Object_var anObj = _orb->string_to_object(aString);
   GEOM::GEOM_Object_var anObject = GEOM::GEOM_Object::_narrow(anObj);
   // If the object is null one it can't be copied: return false
@@ -713,7 +707,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
   SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
   CORBA::String_var objStr = _orb->object_to_string(obj);
   anIOR->SetValue(objStr.in());
-  anIOR->Destroy();
+  anIOR->UnRegister();
 
   // Return the created in the Study SObject
   return aNewSO._retn();
@@ -748,7 +742,7 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::AddInStudy (SALOMEDS::Study_ptr theStudy,
     SALOMEDS::SObject_var aFatherSO = theStudy->FindObjectIOR(IOR.in());
     if(aFatherSO->_is_nil()) return aResultSO._retn();
     aResultSO = aStudyBuilder->NewObject(aFatherSO);
-    aFatherSO->Destroy();
+    aFatherSO->UnRegister();
     //aStudyBuilder->Addreference(aResultSO, aResultSO);
   }
 
@@ -760,16 +754,20 @@ SALOMEDS::SObject_ptr GEOM_Gen_i::AddInStudy (SALOMEDS::Study_ptr theStudy,
   if(aLength < 1) return aResultSO._retn();
 
   //Publish the arguments
+  TCollection_AsciiString aPrevID; // to avoid multiple references to same object
   for(Standard_Integer i = 0; i< aLength; i++) {
     GEOM::GEOM_Object_var anObject = aList[i];
     if(anObject->_is_nil()) continue;
     IOR = _orb->object_to_string(anObject);
     SALOMEDS::SObject_var aSO =  theStudy->FindObjectIOR(IOR.in());
     if(aSO->_is_nil()) continue;
+    CORBA::String_var anID = aSO->GetID();
+    if ( aPrevID == anID.in() ) continue;
+    aPrevID = anID.in();
     SALOMEDS::SObject_var aSubSO = aStudyBuilder->NewObject(aResultSO);
     aStudyBuilder->Addreference(aSubSO, aSO);
-    aSO->Destroy();
-    aSubSO->Destroy();
+    aSO->UnRegister();
+    aSubSO->UnRegister();
   }
 
   return aResultSO._retn();
@@ -801,7 +799,7 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapesO (SALOMEDS::Study_ptr     theStudy,
 
   aParts = RestoreSubShapes(theStudy, theObject, aSO, theArgs,
                             theFindMethod, theInheritFirstArg, theAddPrefix);
-  if (!CORBA::is_nil(aSO)) aSO->Destroy();
+  if (!CORBA::is_nil(aSO)) aSO->UnRegister();
   return aParts._retn();
 }
 
@@ -831,7 +829,7 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapesO (SALOMEDS::Study_ptr     theS
 
   aParts = RestoreGivenSubShapes(theStudy, theObject, aSO, theArgs,
                                  theFindMethod, theInheritFirstArg, theAddPrefix);
-  if (!CORBA::is_nil(aSO)) aSO->Destroy();
+  if (!CORBA::is_nil(aSO)) aSO->UnRegister();
   return aParts._retn();
 }
 
@@ -962,12 +960,13 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr     theStudy,
         theObject->SetMarkerTexture(aList[0]->GetMarkerTexture());
     }
 
-    anArgSO->Destroy();
+    anArgSO->UnRegister();
   }
   else {
     // Get interface, containing method, which we will use to reconstruct sub-shapes
-    GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(theStudy->StudyId());
-    GEOM::GEOM_IGroupOperations_var  aGroupOp  = GetIGroupOperations(theStudy->StudyId());
+    GEOM::GEOM_IShapesOperations_var  aShapesOp = GetIShapesOperations(theStudy->StudyId());
+    GEOM::GEOM_IGroupOperations_var    aGroupOp = GetIGroupOperations(theStudy->StudyId());
+    GEOM::GEOM_ITransformOperations_var aTrsfOp = GetITransformOperations(theStudy->StudyId());
 
     // Reconstruct arguments and tree of sub-shapes of the arguments
     CORBA::String_var anIOR;
@@ -996,6 +995,64 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr     theStudy,
             aSubO = aShapesOp->GetInPlace(theObject, anArgO);
           }
           break;
+        case GEOM::FSM_MultiTransformed:
+          {
+            // Only for Multi-transformations
+            GEOM::GEOM_Object_var anArgOTrsf = aTrsfOp->TransformLikeOtherCopy(anArgO, theObject);
+            if (!CORBA::is_nil(anArgOTrsf)) {
+              CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry();
+              Handle(GEOM_Object) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry);
+              Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction();
+              anArgOTrsfFun->SetDescription("");
+              aSubO = aShapesOp->GetInPlace(theObject, anArgOTrsf);
+            }
+            /*
+            Handle(GEOM_Function) anOFun = theObject->GetLastFunction();
+            if (!anOFun.IsNull()) {
+              CORBA::String_var entryArg = anArgO->GetEntry();
+              Handle(GEOM_Object) anArgOImpl = _impl->GetObject(anArgO->GetStudyID(), entryArg);
+              if (!anArgOImpl.IsNull()) {
+                TopoDS_Shape anArgOShape = anArgOImpl->GetValue();
+                TopoDS_Shape aMultiArgShape;
+                //GEOM::GEOM_Object_var anArgOMulti; // ???
+                switch (anOFun->GetType()) {
+                case TRANSLATE_1D:
+                  {
+                    GEOMImpl_ITranslate aTI (anOFun);
+                    aMultiArgShape = GEOMImpl_ITransformOperations::TranslateShape1D(anArgOShape, &aTI);
+                    //anArgOMulti = aTrsfOp->Translate1D(anArgO, , , );
+                  }
+                  break;
+                case TRANSLATE_2D:
+                  {
+                    GEOMImpl_ITranslate aTI (anOFun);
+                    aMultiArgShape = GEOMImpl_ITransformOperations::TranslateShape2D(anArgOShape, &aTI);
+                  }
+                  break;
+                case ROTATE_1D:
+                  {
+                    GEOMImpl_IRotate aTI (anOFun);
+                    //aMultiArgShape = GEOMImpl_ITransformOperations::TranslateShape2D(anArgOShape, &aTI);
+                  }
+                  break;
+                case ROTATE_2D:
+                  {
+                    GEOMImpl_IRotate aTI (anOFun);
+                    //aMultiArgShape = GEOMImpl_ITransformOperations::TranslateShape2D(anArgOShape, &aTI);
+                  }
+                  break;
+                default:
+                  {}
+                }
+                GEOM::GEOM_Object_var anArgOMulti = (aMultiArgShape); // TODO
+                Handle(GEOM_Function) anArgOMultiFun = anArgOMulti->GetLastFunction();
+                anArgOMultiFun->SetDescription("");
+                aSubO = aShapesOp->GetInPlace(theObject, anArgOMulti);
+              }
+            }
+            */
+          }
+          break;
         case GEOM::FSM_Transformed:
           {
             // transformation, cannot use GetInPlace, operate with indices
@@ -1128,7 +1185,7 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr     theStudy,
             }
           }
         } // try to build from published parts
-        anArgSO->Destroy();
+        anArgSO->UnRegister();
       }
     } // process arguments
   }
@@ -1183,6 +1240,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapes(SALOMEDS::Study_ptr     theStudy,
     switch (theFindMethod) {
     case GEOM::FSM_GetInPlace:
       pd << "FSM_GetInPlace"; break;
+    case GEOM::FSM_MultiTransformed:
+      pd << "FSM_MultiTransformed"; break;
     case GEOM::FSM_Transformed:
       pd << "FSM_Transformed"; break;
     case GEOM::FSM_GetSame:
@@ -1221,8 +1280,9 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapesOneLevel (SALOMEDS::Study_ptr     th
   SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder();
 
   // Get interface, containing method, which we will use to reconstruct sub-shapes
-  GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(theStudy->StudyId());
-  GEOM::GEOM_IGroupOperations_var  aGroupOp  = GetIGroupOperations(theStudy->StudyId());
+  GEOM::GEOM_IShapesOperations_var  aShapesOp = GetIShapesOperations(theStudy->StudyId());
+  GEOM::GEOM_IGroupOperations_var    aGroupOp = GetIGroupOperations(theStudy->StudyId());
+  GEOM::GEOM_ITransformOperations_var aTrsfOp = GetITransformOperations(theStudy->StudyId());
 
   // Reconstruct published sub-shapes
   SALOMEDS::ChildIterator_var it = theStudy->NewChildIterator(theOldSO);
@@ -1253,6 +1313,19 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreSubShapesOneLevel (SALOMEDS::Study_ptr     th
             aNewSubO = aShapesOp->GetInPlace(theNewO, anOldSubO);
           }
           break;
+        case GEOM::FSM_MultiTransformed:
+          {
+            // Only for Multi-transformations
+            GEOM::GEOM_Object_var anArgOTrsf = aTrsfOp->TransformLikeOtherCopy(anOldSubO, theNewO);
+            if (!CORBA::is_nil(anArgOTrsf)) {
+              CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry();
+              Handle(GEOM_Object) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry);
+              Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction();
+              anArgOTrsfFun->SetDescription("");
+              aNewSubO = aShapesOp->GetInPlace(theNewO, anArgOTrsf);
+            }
+          }
+          break;
         case GEOM::FSM_Transformed:
           {
             // transformation, cannot use GetInPlace, operate with indices
@@ -1478,12 +1551,13 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr     theStu
         theObject->SetMarkerTexture(aList[0]->GetMarkerTexture());
     }
 
-    anArgSO->Destroy();
+    anArgSO->UnRegister();
   }
   else {
     // Get interface, containing method, which we will use to reconstruct sub-shapes
-    GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(theStudy->StudyId());
-    GEOM::GEOM_IGroupOperations_var  aGroupOp  = GetIGroupOperations(theStudy->StudyId());
+    GEOM::GEOM_IShapesOperations_var  aShapesOp = GetIShapesOperations(theStudy->StudyId());
+    GEOM::GEOM_IGroupOperations_var    aGroupOp = GetIGroupOperations(theStudy->StudyId());
+    GEOM::GEOM_ITransformOperations_var aTrsfOp = GetITransformOperations(theStudy->StudyId());
 
     // Reconstruct arguments and tree of sub-shapes of the arguments
     CORBA::String_var anIOR;
@@ -1512,6 +1586,19 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr     theStu
             aSubO = aShapesOp->GetInPlace(theObject, anArgO);
           }
           break;
+        case GEOM::FSM_MultiTransformed:
+          {
+            // Only for Multi-transformations
+            GEOM::GEOM_Object_var anArgOTrsf = aTrsfOp->TransformLikeOtherCopy(anArgO, theObject);
+            if (!CORBA::is_nil(anArgOTrsf)) {
+              CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry();
+              Handle(GEOM_Object) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry);
+              Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction();
+              anArgOTrsfFun->SetDescription("");
+              aSubO = aShapesOp->GetInPlace(theObject, anArgOTrsf);
+            }
+          }
+          break;
         case GEOM::FSM_Transformed:
           {
             // transformation, cannot use GetInPlace, operate with indices
@@ -1638,7 +1725,7 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr     theStu
             }
           }
         } // try to build from published parts
-        anArgSO->Destroy();
+        anArgSO->UnRegister();
       }
     } // process arguments
   }
@@ -1691,6 +1778,8 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapes(SALOMEDS::Study_ptr     theStu
     switch (theFindMethod) {
     case GEOM::FSM_GetInPlace:
       pd << "FSM_GetInPlace"; break;
+    case GEOM::FSM_MultiTransformed:
+      pd << "FSM_MultiTransformed"; break;
     case GEOM::FSM_Transformed:
       pd << "FSM_Transformed"; break;
     case GEOM::FSM_GetSame:
@@ -1729,8 +1818,9 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapesOneLevel (SALOMEDS::Study_ptr
   SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder();
 
   // Get interface, containing method, which we will use to reconstruct sub-shapes
-  GEOM::GEOM_IShapesOperations_var aShapesOp = GetIShapesOperations(theStudy->StudyId());
-  GEOM::GEOM_IGroupOperations_var  aGroupOp  = GetIGroupOperations(theStudy->StudyId());
+  GEOM::GEOM_IShapesOperations_var  aShapesOp = GetIShapesOperations(theStudy->StudyId());
+  GEOM::GEOM_IGroupOperations_var    aGroupOp = GetIGroupOperations(theStudy->StudyId());
+  GEOM::GEOM_ITransformOperations_var aTrsfOp = GetITransformOperations(theStudy->StudyId());
 
   // Reconstruct published sub-shapes
   SALOMEDS::ChildIterator_var it = theStudy->NewChildIterator(theOldSO);
@@ -1769,6 +1859,19 @@ GEOM::ListOfGO* GEOM_Gen_i::RestoreGivenSubShapesOneLevel (SALOMEDS::Study_ptr
             aNewSubO = aShapesOp->GetInPlace(theNewO, anOldSubO);
           }
           break;
+        case GEOM::FSM_MultiTransformed:
+          {
+            // Only for Multi-transformations
+            GEOM::GEOM_Object_var anArgOTrsf = aTrsfOp->TransformLikeOtherCopy(anOldSubO, theNewO);
+            if (!CORBA::is_nil(anArgOTrsf)) {
+              CORBA::String_var anArgOTrsfEntry = anArgOTrsf->GetEntry();
+              Handle(GEOM_Object) anArgOTrsfImpl = _impl->GetObject(anArgOTrsf->GetStudyID(), anArgOTrsfEntry);
+              Handle(GEOM_Function) anArgOTrsfFun = anArgOTrsfImpl->GetLastFunction();
+              anArgOTrsfFun->SetDescription("");
+              aNewSubO = aShapesOp->GetInPlace(theNewO, anArgOTrsf);
+            }
+          }
+          break;
         case GEOM::FSM_Transformed:
           {
             // transformation, cannot use GetInPlace, operate with indices
@@ -2211,13 +2314,13 @@ GEOM::GEOM_Object_ptr GEOM_Gen_i::AddSubShape (GEOM::GEOM_Object_ptr theMainShap
   if (CORBA::is_nil(theMainShape) || theIndices.length() < 1)
     return GEOM::GEOM_Object::_nil();
   CORBA::String_var entry = theMainShape->GetEntry();
-  Handle(GEOM_Object) aMainsShape = _impl->GetObject(theMainShape->GetStudyID(), entry);
-  if (aMainsShape.IsNull()) return GEOM::GEOM_Object::_nil();
+  Handle(GEOM_Object) aMainShape = _impl->GetObject(theMainShape->GetStudyID(), entry);
+  if (aMainShape.IsNull()) return GEOM::GEOM_Object::_nil();
 
   Handle(TColStd_HArray1OfInteger) anArray = new TColStd_HArray1OfInteger(1, theIndices.length());
   for(Standard_Integer i = 0; i<theIndices.length(); i++) anArray->SetValue(i+1, theIndices[i]);
 
-  Handle(GEOM_Object) anObject = _impl->AddSubShape(aMainsShape, anArray, true);
+  Handle(GEOM_Object) anObject = _impl->AddSubShape(aMainShape, anArray, true);
   if(anObject.IsNull()) return GEOM::GEOM_Object::_nil();
 
   TCollection_AsciiString anEntry;
@@ -2321,12 +2424,12 @@ char* GEOM_Gen_i::getObjectInfo(CORBA::Long studyId, const char* entry)
   if (!aSObj->_is_nil() && aSObj->FindAttribute(anAttr, "AttributeIOR")) {
     SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
     CORBA::String_var aVal = anIOR->Value();
-    anIOR->Destroy();
+    anIOR->UnRegister();
     CORBA::Object_var anObject = aStudy->ConvertIORToObject(aVal);
     aGeomObject = GEOM::GEOM_Object::_narrow(anObject);
   }
   if (!aSObj->_is_nil() )
-    aSObj->Destroy();
+    aSObj->UnRegister();
 
   const char* aTypeInfo = "Object";
   if ( !aGeomObject->_is_nil() ) {
@@ -2449,6 +2552,16 @@ char* GEOM_Gen_i::getObjectInfo(CORBA::Long studyId, const char* entry)
   return ret;
 }
 
+// Version information
+char* GEOM_Gen_i::getVersion()
+{
+#if GEOM_DEVELOPMENT
+  return CORBA::string_dup(GEOM_VERSION_STR"dev");
+#else
+  return CORBA::string_dup(GEOM_VERSION_STR);
+#endif
+}
+
 //=====================================================================================
 // EXPORTED METHODS
 //=====================================================================================