X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FIGESImport%2FIGESImport.cxx;h=3eba471083b4dc0dfa027e06af350932b8187a88;hb=48f5c2df5815348d168fd8e80fcc9e52dd69f137;hp=3e3bb302de19a345d668c803af02f44e1b318820;hpb=9499b99fe2dcb53e1ea364f97986f8f432b04600;p=modules%2Fgeom.git diff --git a/src/IGESImport/IGESImport.cxx b/src/IGESImport/IGESImport.cxx index 3e3bb302d..3eba47108 100644 --- a/src/IGESImport/IGESImport.cxx +++ b/src/IGESImport/IGESImport.cxx @@ -1,39 +1,74 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// 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 -// +// // 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 +// 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 +// +// 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 +// 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 -// +// File: IGESImport.cxx +// Created: Wed May 19 14:36:35 2004 +// Author: Pavel TELKOV #include "utilities.h" +#include + #include #include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include -#include +#include #include +#include +#include +#include + +#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC #ifdef WNT -#include + #if defined IGESIMPORT_EXPORTS || defined IGESImport_EXPORTS + #if defined WIN32 + #define IGESIMPORT_EXPORT __declspec( dllexport ) + #else + #define IGESIMPORT_EXPORT + #endif + #else + #if defined WIN32 + #define IGESIMPORT_EXPORT __declspec( dllimport ) + #else + #define IGESIMPORT_EXPORT + #endif + #endif #else -#define SALOME_WNT_EXPORT + #define IGESIMPORT_EXPORT #endif //============================================================================= @@ -44,17 +79,112 @@ extern "C" { -SALOME_WNT_EXPORT - TopoDS_Shape Import (const TCollection_AsciiString& theFileName, - const TCollection_AsciiString& /*theFormatName*/, - TCollection_AsciiString& theError) + IGESIMPORT_EXPORT + Handle(TCollection_HAsciiString) GetValue (const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theParameterName, + TCollection_AsciiString& theError) { + Handle(TCollection_HAsciiString) aValue; + + if (theParameterName != "LEN_UNITS") { + theError = theParameterName + " parameter reading is not supported by IGES plugin"; + return aValue; + } + + // Set "C" numeric locale to save numbers correctly + Kernel_Utils::Localizer loc; + IGESControl_Reader aReader; + + Interface_Static::SetCVal("xstep.cascade.unit","M"); + + try { + OCC_CATCH_SIGNALS; + + IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); + if (status == IFSelect_RetDone) { + Handle(IGESData_IGESModel) aModel = + Handle(IGESData_IGESModel)::DownCast(aReader.Model()); + if (!aModel.IsNull()) { + aValue = aModel->GlobalSection().UnitName(); + + //if (!aValue.IsNull()) { + // Handle(TCollection_HAsciiString) aPrefix = new TCollection_HAsciiString ("UNIT_"); + // aValue->Prepend(aPrefix); + //} + } + } + else { + theError = theFileName + " reading failed"; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + theError = aFail->GetMessageString(); + } + + return aValue; + } + +IGESIMPORT_EXPORT + TopoDS_Shape Import (const TCollection_AsciiString& theFileName, + const TCollection_AsciiString& theFormatName, + TCollection_AsciiString& theError, + const TDF_Label& theShapeLabel) + { TopoDS_Shape aResShape; + + // Set "C" numeric locale to save numbers correctly + Kernel_Utils::Localizer loc; + + IGESControl_Reader aReader; + + Interface_Static::SetCVal("xstep.cascade.unit","M"); + try { + OCC_CATCH_SIGNALS; + IFSelect_ReturnStatus status = aReader.ReadFile(theFileName.ToCString()); if (status == IFSelect_RetDone) { + + // BEGIN: old code + 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 = + aModel->GlobalSection().UnitName(); + if (!aUnitName.IsNull()) { + if (aUnitName->String()=="MM") { + P = gp_Pnt(0.001,0.0,0.0); + } + else if (aUnitName->String()=="CM") { + P = gp_Pnt(0.01,0.0,0.0); + } + } + } + BRep_Builder B; + TopoDS_Vertex V; + B.MakeVertex(V,P,1.e-7); + aResShape = V; + return aResShape; + } + // END: old code + + if (theFormatName == "IGES_SCALE") { + //cout<<"need re-scale a model"<GlobalSection(); + aGS.SetUnitFlag(6); + aModel->SetGlobalSection(aGS); + } + } + MESSAGE("ImportIGES : all Geometry Transfer"); //OCC 5.1.2 porting // aReader.Clear(); @@ -65,6 +195,38 @@ SALOME_WNT_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: @@ -83,7 +245,7 @@ SALOME_WNT_EXPORT // break; // } theError = "Wrong format of the imported file. Can't import file."; - aResShape.Nullify(); + aResShape.Nullify(); } } catch(Standard_Failure) {