From: spo Date: Thu, 26 Nov 2015 10:27:27 +0000 (+0300) Subject: Make import XAO with groups X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=7da06136840c36af0dc213e25544343f2bf28b41;p=modules%2Fshaper.git Make import XAO with groups --- diff --git a/src/ExchangePlugin/CMakeLists.txt b/src/ExchangePlugin/CMakeLists.txt index fcd6aa97a..f3460cbaa 100644 --- a/src/ExchangePlugin/CMakeLists.txt +++ b/src/ExchangePlugin/CMakeLists.txt @@ -9,6 +9,7 @@ INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/src/ModelAPI ${PROJECT_SOURCE_DIR}/src/GeomAPI ${PROJECT_SOURCE_DIR}/src/GeomAlgoAPI + ${PROJECT_SOURCE_DIR}/src/XAO ) SET(PROJECT_HEADERS @@ -42,6 +43,7 @@ SET(PROJECT_LIBRARIES ModelAPI GeomAPI GeomAlgoAPI + XAO ) SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES}) diff --git a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp index a0e7ebaaf..037c300e7 100644 --- a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp +++ b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp @@ -6,29 +6,35 @@ #include +#include +#include +#ifdef _DEBUG +#include +#include +#endif + +#include +#include + #include #include #include +#include #include #include -#include -#include - #include +#include #include #include #include #include #include +#include -#include -#include -#ifdef _DEBUG -#include -#include -#endif +#include +#include ExchangePlugin_ImportFeature::ExchangePlugin_ImportFeature() { @@ -79,15 +85,22 @@ bool ExchangePlugin_ImportFeature::importFile(const std::string& theFileName) 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; } - // Check if shape is valid - if ( aGeomShape->isNull() ) { + + // Check if shape is valid + if (aGeomShape->isNull()) { const static std::string aShapeError = "An error occurred while importing " + theFileName + ": " + anError; setError(aShapeError); @@ -104,6 +117,34 @@ bool ExchangePlugin_ImportFeature::importFile(const std::string& theFileName) 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); + } + } + } + return true; } diff --git a/src/GeomAlgoAPI/CMakeLists.txt b/src/GeomAlgoAPI/CMakeLists.txt index bdc7a8d58..b40fcd76e 100644 --- a/src/GeomAlgoAPI/CMakeLists.txt +++ b/src/GeomAlgoAPI/CMakeLists.txt @@ -39,6 +39,7 @@ SET(PROJECT_HEADERS GeomAlgoAPI_WireBuilder.h GeomAlgoAPI_Sewing.h GeomAlgoAPI_ShapeBuilder.h + GeomAlgoAPI_XAOImport.h ) SET(PROJECT_SOURCES @@ -74,12 +75,14 @@ SET(PROJECT_SOURCES GeomAlgoAPI_WireBuilder.cpp GeomAlgoAPI_Sewing.cpp GeomAlgoAPI_ShapeBuilder.cpp + GeomAlgoAPI_XAOImport.cpp ) SET(PROJECT_LIBRARIES GeomAPI GeomAlgoImpl ModelAPI + XAO ${CAS_OCAF} ${CAS_SHAPE} ${CAS_TKBO} @@ -109,6 +112,7 @@ INCLUDE_DIRECTORIES( ../GeomAPI ../GeomAlgoImpl ../ModelAPI + ../XAO ${CAS_INCLUDE_DIRS} ) diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp new file mode 100644 index 000000000..1440c8142 --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp @@ -0,0 +1,56 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: GEOMALGOAPI_XAOImport.cpp +// Created: Nov 25, 2015 +// Author: Sergey POKHODENKO + +#include + +#include + +#include + +#include +#include + +//============================================================================= +/*! + * + */ +//============================================================================= +std::shared_ptr XAOImport(const std::string& theFileName, + const std::string&, + std::string& theError, + XAO::Xao* theXao) +{ + assert(theXao); + + #ifdef _DEBUG + std::cout << "Import XAO from file " << theFileName << std::endl; + #endif + TopoDS_Shape aShape; + try { +// XAO::Xao aXao; + if (XAO::XaoExporter::readFromFile(theFileName, theXao/*&aXao*/)) { + XAO::Geometry* aGeometry = /*aXao*/theXao->getGeometry(); + XAO::Format aFormat = aGeometry->getFormat(); + if (aFormat == XAO::BREP) { + if (XAO::BrepGeometry* aBrepGeometry = dynamic_cast(aGeometry)) + aShape = aBrepGeometry->getTopoDS_Shape(); + } else { + theError = "Unsupported XAO geometry format:" + XAO::XaoUtils::shapeFormatToString(aFormat); + aShape.Nullify(); + } + } else { + theError = "XAO object was not read successful"; + aShape.Nullify(); + } + } catch (XAO::XAO_Exception& e) { + theError = e.what(); + aShape.Nullify(); + } + + std::shared_ptr aGeomShape(new GeomAPI_Shape); + aGeomShape->setImpl(new TopoDS_Shape(aShape)); + return aGeomShape; +} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h new file mode 100644 index 000000000..0bc5ec535 --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h @@ -0,0 +1,27 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +// File: GEOMALGOAPI_XAOImport.h +// Created: Nov 25, 2015 +// Author: Sergey POKHODENKO + +#ifndef GEOMALGOAPI_XAOIMPORT_H_ +#define GEOMALGOAPI_XAOIMPORT_H_ + +#include + +#include + +#include + +namespace XAO { +class Xao; +} // namespace 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); + +#endif /* GEOMALGOAPI_XAOIMPORT_H_ */ diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index b741787b9..f9936e232 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -1004,7 +1004,7 @@ void Model_AttributeSelection::setId(int theID) TopTools_IndexedMapOfShape aSubShapesMap; TopExp::MapShapes(aMainShape, aSubShapesMap); - const TopoDS_Shape& aSelShape = aSubShapesMap.FindKey(theID); + const TopoDS_Shape& aSelShape = aSubShapesMap.FindKey(theID); // exception std::shared_ptr aResult(new GeomAPI_Shape); aResult->setImpl(new TopoDS_Shape(aSelShape)); diff --git a/src/ModelAPI/ModelAPI_AttributeSelection.h b/src/ModelAPI/ModelAPI_AttributeSelection.h index 1af82645e..72033cd1d 100644 --- a/src/ModelAPI/ModelAPI_AttributeSelection.h +++ b/src/ModelAPI/ModelAPI_AttributeSelection.h @@ -53,6 +53,8 @@ class ModelAPI_AttributeSelection : public ModelAPI_Attribute /// Returns an id of the selection virtual int Id() = 0; + /// Defines an id of the selection + virtual void setId(int theID) = 0; /// Selects sub-shape by the textual Name virtual void selectSubShape(const std::string& theType, const std::string& theSubShapeName) = 0;