From 8c0029b9aa11fe375397faaa17ba6259f58ec3ee Mon Sep 17 00:00:00 2001 From: spo Date: Fri, 27 Nov 2015 13:29:27 +0300 Subject: [PATCH] Improve XAO import: group_list --- .../ExchangePlugin_ImportFeature.cpp | 148 +++++++++++------- .../ExchangePlugin_ImportFeature.h | 20 ++- src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp | 6 +- src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h | 1 - 4 files changed, 111 insertions(+), 64 deletions(-) diff --git a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp index 037c300e7..143bad9ac 100644 --- a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp +++ b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp @@ -24,14 +24,18 @@ #include -#include +#include #include +#include #include #include #include +#include #include #include #include +#include +#include #include #include @@ -45,20 +49,15 @@ ExchangePlugin_ImportFeature::~ExchangePlugin_ImportFeature() // TODO Auto-generated destructor stub } -/* - * Returns the unique kind of a feature - */ -const std::string& ExchangePlugin_ImportFeature::getKind() -{ - return ExchangePlugin_ImportFeature::ID(); -} - /* * Request for initialization of data model of the feature: adding all attributes */ void ExchangePlugin_ImportFeature::initAttributes() { data()->addAttribute(ExchangePlugin_ImportFeature::FILE_PATH_ID(), ModelAPI_AttributeString::typeId()); + data()->addAttribute(ExchangePlugin_ImportFeature::GROUP_LIST_ID(), ModelAPI_AttributeRefList::typeId()); + + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), ExchangePlugin_ImportFeature::GROUP_LIST_ID()); } /* @@ -66,86 +65,121 @@ void ExchangePlugin_ImportFeature::initAttributes() */ void ExchangePlugin_ImportFeature::execute() { - AttributeStringPtr aFilePathAttr = - this->string(ExchangePlugin_ImportFeature::FILE_PATH_ID()); + AttributeStringPtr aFilePathAttr = string(ExchangePlugin_ImportFeature::FILE_PATH_ID()); std::string aFilePath = aFilePathAttr->value(); - if (aFilePath.empty()) + if (aFilePath.empty()) { + setError("File path is empty."); return; + } importFile(aFilePath); } -bool ExchangePlugin_ImportFeature::importFile(const std::string& theFileName) +std::shared_ptr ExchangePlugin_ImportFeature::createResultBody( + std::shared_ptr aGeomShape) { - // retrieve the file and plugin library names - // ".brep" -> "BREP" + std::shared_ptr aResultBody = document()->createBody(data()); + //LoadNamingDS of the imported shape + loadNamingDS(aGeomShape, aResultBody); + return aResultBody; +} + +void ExchangePlugin_ImportFeature::importFile(const std::string& theFileName) +{ + // "*.brep" -> "BREP" std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(theFileName); + if (anExtension == "XAO") { + importXAO(theFileName); + return; + } + // Perform the import std::string anError; - std::shared_ptr aGeomShape; - std::shared_ptr aXao; 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); - } else if (anExtension == "XAO") { - std::shared_ptr aTmpXao(new XAO::Xao); - aGeomShape = XAOImport(theFileName, anExtension, anError, aTmpXao.get()); - if (!aGeomShape->isNull()) - aXao = aTmpXao; + } else { + anError = "Cann't read files with extension: " + anExtension; } // Check if shape is valid - if (aGeomShape->isNull()) { - const static std::string aShapeError = - "An error occurred while importing " + theFileName + ": " + anError; - setError(aShapeError); - return false; + if (!anError.empty()) { + setError("An error occurred while importing " + theFileName + ": " + anError); + return; } // 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(createResultBody(aGeomShape)); +} + +void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName) +{ + std::string anError; + + XAO::Xao aXao; + std::shared_ptr aGeomShape = XAOImport(theFileName, anError, &aXao); + + if (!anError.empty()) { + setError("An error occurred while importing " + theFileName + ": " + anError); + return; + } + XAO::Geometry* aXaoGeometry = aXao.getGeometry(); + data()->setName(aXaoGeometry->getName()); + + std::shared_ptr aResultBody = createResultBody(aGeomShape); + aResultBody->data()->setName(aXaoGeometry->getName()); setResult(aResultBody); - if (aXao.get()) { - XAO::Geometry* aXaoGeometry = aXao->getGeometry(); - - // Creates group results - for (int aGroupIndex = 0; aGroupIndex < aXao->countGroups(); ++aGroupIndex) { - XAO::Group* aXaoGroup = aXao->getGroup(aGroupIndex); - - std::shared_ptr aGroupFeature = document()->addFeature("Group", false); - if (aGroupFeature) { - if (!aXaoGroup->getName().empty()) - aGroupFeature->data()->setName(aXaoGroup->getName()); - AttributeSelectionListPtr aSelectionList = aGroupFeature->selectionList("group_list"); - aSelectionList->setSelectionType(XAO::XaoUtils::dimensionToString(aXaoGroup->getDimension())); - - for (int anElementIndex = 0; anElementIndex < aXaoGroup->count(); ++anElementIndex) { - aSelectionList->append(aResultBody, GeomShapePtr()); - int anElementID = aXaoGroup->get(anElementIndex); - std::string aReferenceString = - aXaoGeometry->getElementReference(aXaoGroup->getDimension(), anElementID); - int aReferenceID = XAO::XaoUtils::stringToInt(aReferenceString); - aSelectionList->value(anElementIndex)->setId(aReferenceID); - } - - document()->setCurrentFeature(aGroupFeature, true); - } - } + // Process groups + AttributeRefListPtr aRefListOfGroups = reflist(ExchangePlugin_ImportFeature::GROUP_LIST_ID()); + + // Remove previous groups stored in RefList + std::list anGroupList = aRefListOfGroups->list(); + std::list::iterator anGroupIt = anGroupList.begin(); + for (; anGroupIt != anGroupList.end(); ++anGroupIt) { + std::shared_ptr aFeature = + std::dynamic_pointer_cast(*anGroupIt); + if (aFeature) + document()->removeFeature(aFeature); } - return true; + // Create new groups + for (int aGroupIndex = 0; aGroupIndex < aXao.countGroups(); ++aGroupIndex) { + XAO::Group* aXaoGroup = aXao.getGroup(aGroupIndex); + + std::shared_ptr aGroupFeature = document()->addFeature("Group", false); + + // group name + if (!aXaoGroup->getName().empty()) + aGroupFeature->data()->setName(aXaoGroup->getName()); + + // fill selection + AttributeSelectionListPtr aSelectionList = aGroupFeature->selectionList("group_list"); + aSelectionList->setSelectionType(XAO::XaoUtils::dimensionToString(aXaoGroup->getDimension())); + for (int anElementIndex = 0; anElementIndex < aXaoGroup->count(); ++anElementIndex) { + aSelectionList->append(aResultBody, GeomShapePtr()); + // complex conversion of element index to reference id + int anElementID = aXaoGroup->get(anElementIndex); + std::string aReferenceString = + aXaoGeometry->getElementReference(aXaoGroup->getDimension(), anElementID); + int aReferenceID = XAO::XaoUtils::stringToInt(aReferenceString); + + aSelectionList->value(anElementIndex)->setId(aReferenceID); + } + + aRefListOfGroups->append(aGroupFeature); + + document()->setCurrentFeature(aGroupFeature, true); + } } //============================================================================ diff --git a/src/ExchangePlugin/ExchangePlugin_ImportFeature.h b/src/ExchangePlugin/ExchangePlugin_ImportFeature.h index d7cf695b4..566a7b9e5 100644 --- a/src/ExchangePlugin/ExchangePlugin_ImportFeature.h +++ b/src/ExchangePlugin/ExchangePlugin_ImportFeature.h @@ -35,13 +35,22 @@ class ExchangePlugin_ImportFeature : public ModelAPI_Feature static const std::string MY_FILE_PATH_ID("file_path"); return MY_FILE_PATH_ID; } + /// attribute name of group list + inline static const std::string& GROUP_LIST_ID() + { + static const std::string MY_GROUP_LIST_ID("group_list"); + return MY_GROUP_LIST_ID; + } /// Default constructor EXCHANGEPLUGIN_EXPORT ExchangePlugin_ImportFeature(); /// Default destructor EXCHANGEPLUGIN_EXPORT virtual ~ExchangePlugin_ImportFeature(); /// Returns the unique kind of a feature - EXCHANGEPLUGIN_EXPORT virtual const std::string& getKind(); + EXCHANGEPLUGIN_EXPORT virtual const std::string& getKind() + { + return ExchangePlugin_ImportFeature::ID(); + } /// Request for initialization of data model of the feature: adding all attributes EXCHANGEPLUGIN_EXPORT virtual void initAttributes(); @@ -54,7 +63,14 @@ class ExchangePlugin_ImportFeature : public ModelAPI_Feature protected: /// Performs the import of the file - EXCHANGEPLUGIN_EXPORT bool importFile(const std::string& theFileName); + EXCHANGEPLUGIN_EXPORT void importFile(const std::string& theFileName); + + /// Performs the import of XAO file + EXCHANGEPLUGIN_EXPORT void importXAO(const std::string& theFileName); + + /// Creates and prepares a result body from the shape + std::shared_ptr createResultBody( + std::shared_ptr aGeomShape); private: /// Loads Naming data structure to the document diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp index 1440c8142..b0309c273 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp @@ -19,7 +19,6 @@ */ //============================================================================= std::shared_ptr XAOImport(const std::string& theFileName, - const std::string&, std::string& theError, XAO::Xao* theXao) { @@ -30,9 +29,8 @@ std::shared_ptr XAOImport(const std::string& theFileName, #endif TopoDS_Shape aShape; try { -// XAO::Xao aXao; - if (XAO::XaoExporter::readFromFile(theFileName, theXao/*&aXao*/)) { - XAO::Geometry* aGeometry = /*aXao*/theXao->getGeometry(); + if (XAO::XaoExporter::readFromFile(theFileName, theXao)) { + XAO::Geometry* aGeometry = theXao->getGeometry(); XAO::Format aFormat = aGeometry->getFormat(); if (aFormat == XAO::BREP) { if (XAO::BrepGeometry* aBrepGeometry = dynamic_cast(aGeometry)) diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h index 0bc5ec535..70e25ada8 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h @@ -20,7 +20,6 @@ class Xao; /// Implementation of the import XAO files algorithms GEOMALGOAPI_EXPORT std::shared_ptr XAOImport(const std::string& theFileName, - const std::string& theFormatName, std::string& theError, XAO::Xao* theXao); -- 2.39.2