X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FExchangePlugin%2FExchangePlugin_ImportFeature.cpp;h=e2d29c9c85ad7b2c8255a96617f8e068d9c1e5b0;hb=1d8c393b3a52defdabe34c17f1f370e71d317531;hp=a0c659805f2f72c7a7ad9441c91a3fad5107f316;hpb=853952fd4ddc93c0cd6a7122d37b618199864396;p=modules%2Fshaper.git diff --git a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp index a0c659805..e2d29c9c8 100644 --- a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp +++ b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp @@ -1,26 +1,28 @@ -/* - * ExchangePlugin_ImportFeature.cpp - * - * Created on: Aug 28, 2014 - * Author: sbh - */ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: ExchangePlugin_ImportFeature.cpp +// Created: Aug 28, 2014 +// Author: Sergey BELASH #include +#include +#include +#include +#include + #include + #include -#include +#include + #include +#include #include #include #include #include -#include -#include -#include -#include - #include #include #ifdef _DEBUG @@ -28,17 +30,6 @@ #include #endif -#ifdef WIN32 -# define _separator_ '\\' -#else -# define _separator_ '/' -#endif - -typedef TopoDS_Shape (*importFunctionPointer)(const TCollection_AsciiString&, - const TCollection_AsciiString&, - TCollection_AsciiString&, - const TDF_Label&); - ExchangePlugin_ImportFeature::ExchangePlugin_ImportFeature() { } @@ -61,7 +52,7 @@ const std::string& ExchangePlugin_ImportFeature::getKind() */ void ExchangePlugin_ImportFeature::initAttributes() { - data()->addAttribute(ExchangePlugin_ImportFeature::FILE_PATH_ID(), ModelAPI_AttributeString::type()); + data()->addAttribute(ExchangePlugin_ImportFeature::FILE_PATH_ID(), ModelAPI_AttributeString::typeId()); } /* @@ -69,91 +60,62 @@ void ExchangePlugin_ImportFeature::initAttributes() */ void ExchangePlugin_ImportFeature::execute() { - AttributeStringPtr aFilePathAttr = boost::dynamic_pointer_cast( - data()->attribute(ExchangePlugin_ImportFeature::FILE_PATH_ID())); + AttributeStringPtr aFilePathAttr = + this->string(ExchangePlugin_ImportFeature::FILE_PATH_ID()); std::string aFilePath = aFilePathAttr->value(); - if(aFilePath.empty()) + if (aFilePath.empty()) return; + importFile(aFilePath); } bool ExchangePlugin_ImportFeature::importFile(const std::string& theFileName) { // retrieve the file and plugin library names - TCollection_AsciiString aFileName (theFileName.c_str()); - OSD_Path aPath(aFileName); - TCollection_AsciiString aFormatName = aPath.Extension(); - // ".brep" -> "BREP". TCollection_AsciiString are numbered from 1 - aFormatName = aFormatName.SubString(2, aFormatName.Length()); - aFormatName.UpperCase(); - - // Load plugin library and get the "Import" method - LibHandle anImportLib = loadImportPlugin(std::string(aFormatName.ToCString())); - if(!anImportLib) - return false; - importFunctionPointer fp = (importFunctionPointer) GetProc(anImportLib, "Import"); - // Perform the import - TCollection_AsciiString anError; - TDF_Label anUnknownLabel = TDF_Label(); - TopoDS_Shape aShape = fp(aFileName, - aFormatName, - anError, - anUnknownLabel); + // ".brep" -> "BREP" + std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(theFileName); + + // Perform the import + std::string anError; + + std::shared_ptr aGeomShape; + if (anExtension == "BREP" || anExtension == "BRP") { + aGeomShape = BREPImport(theFileName, anExtension, anError); + } else if (anExtension == "STEP" || anExtension == "STP") { + aGeomShape = STEPImport(theFileName, anExtension, anError); + } else if (anExtension == "IGES" || anExtension == "IGS") { + aGeomShape = IGESImport(theFileName, anExtension, anError); + } // Check if shape is valid - if ( aShape.IsNull() ) { - std::string aShapeError = "An error occurred while importing " + theFileName + ": "; - aShapeError = aShapeError + std::string(anError.ToCString()); - Events_Error::send(aShapeError, this); - #ifdef _DEBUG - std::cerr << aShapeError << std::endl; - #endif - return false; - } - // Pass the results into the model - std::string anObjectName = aPath.Name().ToCString(); - data()->setName(anObjectName); - boost::shared_ptr aResult = document()->createBody(data()); - boost::shared_ptr aGeomShape(new GeomAPI_Shape); - aGeomShape->setImpl(new TopoDS_Shape(aShape)); - aResult->store(aGeomShape); - setResult(aResult); - - return true; + if ( aGeomShape->isNull() ) { + const static std::string aShapeError = + "An error occurred while importing " + theFileName + ": " + anError; + setError(aShapeError); + return false; + } + + // Pass the results into the model + std::string anObjectName = GeomAlgoAPI_Tools::File_Tools::name(theFileName); + data()->setName(anObjectName); + std::shared_ptr aResultBody = document()->createBody(data()); + + //LoadNamingDS of the imported shape + loadNamingDS(aGeomShape, aResultBody); + + setResult(aResultBody); + + return true; } -LibHandle ExchangePlugin_ImportFeature::loadImportPlugin(const std::string& theFormatName) +//============================================================================ +void ExchangePlugin_ImportFeature::loadNamingDS( + std::shared_ptr theGeomShape, + std::shared_ptr theResultBody) { - std::string aLibName = library(theFormatName + ID()); - LibHandle anImportLib = LoadLib(aLibName.c_str()); - std::string anImportError = "Failed to load " + aLibName + ": "; - if(!anImportLib) { -#ifdef WIN32 - LPVOID lpMsgBuf; - ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - 0, ::GetLastError(), 0, (LPTSTR) &lpMsgBuf, 0, 0); - anImportError = anImportError + std::string((char*) lpMsgBuf); - ::LocalFree(lpMsgBuf); -#else - anImportError = anImportError + std::string(dlerror()); -#endif - Events_Error::send(anImportError, this); -#ifdef _DEBUG - std::cerr << anImportError << std::endl; -#endif - return false; - } - // Test loaded plugin for existence of valid "Import" function: - importFunctionPointer fp = (importFunctionPointer) GetProc(anImportLib, "Import"); - if (!fp) { - std::string aFunctionError = "No valid \"Import\" function was found in the " + aLibName; - Events_Error::send(aFunctionError, this); -#ifdef _DEBUG - std::cerr << aFunctionError << std::endl; -#endif - UnLoadLib(anImportLib) - return NULL; - } - return anImportLib; + //load result + theResultBody->getBodyBuilder()->store(theGeomShape); + + int aTag(1); + std::string aNameMS = "Shape"; + theResultBody->getBodyBuilder()->loadFirstLevel(theGeomShape, aNameMS, aTag); }