Salome HOME
0021179: EDF 1654 SMESH GEOM: better look'n'feel
[modules/geom.git] / src / IGESImport / IGESImport.cxx
index 08a72d7d8578db2d5fbba2f5b1d6e4f8ffc3d55d..cff70de1861e89bc3e0b2a54a8aef281a94fab2d 100644 (file)
@@ -1,29 +1,28 @@
-//  Copyright (C) 2007-2008  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
-//
-// File:        IGESImport.cxx
-// Created:     Wed May 19 14:36:35 2004
-// Author:      Pavel TELKOV
-//              <ptv@mutex.nnov.opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  File:        IGESImport.cxx
+//  Created:     Wed May 19 14:36:35 2004
+//  Author:      Pavel TELKOV
+
 #include "utilities.h"
 
 #include <Basics_Utils.hxx>
 #include <IFSelect_ReturnStatus.hxx>
 #include <IGESControl_Reader.hxx>
 #include <IGESData_IGESModel.hxx>
+#include <IGESData_IGESEntity.hxx>
 
-#include <TCollection_HAsciiString.hxx>
-#include <TopoDS_Shape.hxx>
+#include <Interface_Static.hxx>
+#include <Interface_InterfaceModel.hxx>
+#include <XSControl_TransferReader.hxx>
+#include <XSControl_WorkSession.hxx>
+#include <Transfer_TransientProcess.hxx>
+#include <Transfer_Binder.hxx>
+#include <TransferBRep.hxx>
+
+#include <TNaming_Builder.hxx>
+#include <TDF_TagSource.hxx>
+#include <TDataStd_Name.hxx>
 #include <TDF_Label.hxx>
 
+#include <TCollection_HAsciiString.hxx>
+#include <TopoDS_Shape.hxx>
 #include <TopoDS_Vertex.hxx>
 #include <BRep_Builder.hxx>
 #include <gp_Pnt.hxx>
-#include <Interface_Static.hxx>
 
 #ifdef WNT
  #if defined IGESIMPORT_EXPORTS || defined IGESImport_EXPORTS
@@ -71,7 +81,7 @@ IGESIMPORT_EXPORT
   TopoDS_Shape Import (const TCollection_AsciiString& theFileName,
                        const TCollection_AsciiString& theFormatName,
                        TCollection_AsciiString&       theError,
-                       const TDF_Label&)
+                       const TDF_Label&               theShapeLabel)
   {
     // Set "C" numeric locale to save numbers correctly
     Kernel_Utils::Localizer loc;
@@ -84,19 +94,19 @@ IGESIMPORT_EXPORT
 
       if (status == IFSelect_RetDone) {
 
-        if( theFormatName == "IGES_UNIT" ) {
-          Handle(IGESData_IGESModel) aModel = 
+        if (theFormatName == "IGES_UNIT") {
+          Handle(IGESData_IGESModel) aModel =
             Handle(IGESData_IGESModel)::DownCast(aReader.Model());
           gp_Pnt P(1.0,0.0,0.0);
-          if(!aModel.IsNull()) {
-            Handle(TCollection_HAsciiString) aUnitName = 
+          if (!aModel.IsNull()) {
+            Handle(TCollection_HAsciiString) aUnitName =
               aModel->GlobalSection().UnitName();
             //cout<<"aUnitName = "<<aUnitName->ToCString()<<endl;
             //cout<<"aUnitFlag = "<<aModel->GlobalSection().UnitFlag()<<endl;
-            if( aUnitName->String()=="MM" ) {
+            if (aUnitName->String()=="MM") {
               P = gp_Pnt(0.001,0.0,0.0);
             }
-            else if( aUnitName->String()=="CM" ) {
+            else if (aUnitName->String()=="CM") {
               P = gp_Pnt(0.01,0.0,0.0);
             }
           }
@@ -106,12 +116,12 @@ IGESIMPORT_EXPORT
           aResShape = V;
           return aResShape;
         }
-        if( theFormatName == "IGES_SCALE" ) {
+        if (theFormatName == "IGES_SCALE") {
           //cout<<"need re-scale a model"<<endl;
           // set UnitFlag to 'meter'
-          Handle(IGESData_IGESModel) aModel = 
+          Handle(IGESData_IGESModel) aModel =
             Handle(IGESData_IGESModel)::DownCast(aReader.Model());
-          if(!aModel.IsNull()) {
+          if (!aModel.IsNull()) {
             IGESData_GlobalSection aGS = aModel->GlobalSection();
             aGS.SetUnitFlag(6);
             aModel->SetGlobalSection(aGS);
@@ -128,6 +138,38 @@ IGESIMPORT_EXPORT
         MESSAGE("ImportIGES : count of shapes produced = " << aReader.NbShapes());
         aResShape = aReader.OneShape();
 
+        // BEGIN: Store names of sub-shapes from file
+        Handle(Interface_InterfaceModel) Model = aReader.WS()->Model();
+        Handle(XSControl_TransferReader) TR = aReader.WS()->TransferReader();
+        if (!TR.IsNull()) {
+          Handle(Transfer_TransientProcess) TP = /*TransientProcess();*/TR->TransientProcess();
+          Standard_Integer nb = Model->NbEntities();
+          for (Standard_Integer i = 1; i <= nb; i++) {
+            Handle(IGESData_IGESEntity) ent = Handle(IGESData_IGESEntity)::DownCast(Model->Value(i));
+            if (ent.IsNull() || ! ent->HasName()) continue;
+
+            // find target shape
+            Handle(Transfer_Binder) binder = TP->Find(ent);
+            if (binder.IsNull()) continue;
+            TopoDS_Shape S = TransferBRep::ShapeResult(binder);
+            if (S.IsNull()) continue;
+
+            // create label and set shape
+            TDF_Label L;
+            TDF_TagSource aTag;
+            L = aTag.NewChild(theShapeLabel);
+            TNaming_Builder tnBuild (L);
+            tnBuild.Generated(S);
+
+            // set a name
+            TCollection_AsciiString string = ent->NameValue()->String();
+            string.LeftAdjust();
+            string.RightAdjust();
+            TCollection_ExtendedString str (string);
+            TDataStd_Name::Set(L, str);
+          }
+        }
+        // END: Store names
       } else {
 //        switch (status) {
 //        case IFSelect_RetVoid: