X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FExchangePlugin%2FExchangePlugin_ImportFeature.cpp;h=d5eaf23603fbf028461b5a8a289d1b9f2995b5cf;hb=b67410b7e66bb035081015af2245b62223510474;hp=85cdffe56b199ae0329a5d6f2ff60ddc0e6eb871;hpb=2265bb69d407b8f7020330fb4ca68e7f6aa2fdd0;p=modules%2Fshaper.git diff --git a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp index 85cdffe56..d5eaf2360 100644 --- a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp +++ b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp @@ -1,34 +1,42 @@ // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -/* - * ExchangePlugin_ImportFeature.cpp - * - * Created on: Aug 28, 2014 - * Author: sbh - */ +// File: ExchangePlugin_ImportFeature.cpp +// Created: Aug 28, 2014 +// Authors: Sergey BELASH, Sergey POKHODENKO #include -#include -#include -#include +#include +#include + #include +#include + +#include +#include +#include +#include +#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 + +#include ExchangePlugin_ImportFeature::ExchangePlugin_ImportFeature() { @@ -39,20 +47,17 @@ 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::type()); + data()->addAttribute(ExchangePlugin_ImportFeature::FILE_PATH_ID(), ModelAPI_AttributeString::typeId()); + AttributePtr aFeaturesAttribute = data()->addAttribute(ExchangePlugin_ImportFeature::FEATURES_ID(), ModelAPI_AttributeRefList::typeId()); + aFeaturesAttribute->setIsArgument(false); + + ModelAPI_Session::get()->validators()->registerNotObligatory( + getKind(), ExchangePlugin_ImportFeature::FEATURES_ID()); } /* @@ -60,70 +65,206 @@ void ExchangePlugin_ImportFeature::initAttributes() */ void ExchangePlugin_ImportFeature::execute() { - AttributeStringPtr aFilePathAttr = std::dynamic_pointer_cast( - data()->attribute(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 - 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(); + 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 - TCollection_AsciiString anError; - TDF_Label anUnknownLabel = TDF_Label(); - - TopoDS_Shape aShape; - if (aFormatName == "BREP") { - aShape = BREPImport::Import(aFileName, aFormatName, anError, anUnknownLabel); - } else if (aFormatName == "STEP") { - aShape = STEPImport::Import(aFileName, aFormatName, anError, anUnknownLabel); + 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); + } else { + anError = "Unsupported format: " + anExtension; + } + + // Check if shape is valid + if (!anError.empty()) { + setError("An error occurred while importing " + theFileName + ": " + anError); + return; } - // Check if shape is valid - if ( aShape.IsNull() ) { - const static std::string aShapeError = - "An error occurred while importing " + theFileName + ": " + anError.ToCString(); - setError(aShapeError); - return false; - } // Pass the results into the model - std::string anObjectName = aPath.Name().ToCString(); + std::string anObjectName = GeomAlgoAPI_Tools::File_Tools::name(theFileName); data()->setName(anObjectName); - std::shared_ptr aResultBody = document()->createBody(data()); - std::shared_ptr aGeomShape(new GeomAPI_Shape); - aGeomShape->setImpl(new TopoDS_Shape(aShape)); - //LoadNamingDS of the imported shape - loadNamingDS(aGeomShape, aResultBody); + setResult(createResultBody(aGeomShape)); +} + +void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName) +{ + try { + 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(); + + // use the geometry name or the file name for the feature + std::string aBodyName = aXaoGeometry->getName(); + if (aBodyName.empty()) + aBodyName = GeomAlgoAPI_Tools::File_Tools::name(theFileName); + data()->setName(aBodyName); + + ResultBodyPtr aResultBody = createResultBody(aGeomShape); setResult(aResultBody); - return true; + // Process groups + std::shared_ptr aRefListOfGroups = + std::dynamic_pointer_cast(data()->attribute(FEATURES_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 = ModelAPI_Feature::feature(*anGroupIt); + if (aFeature) + document()->removeFeature(aFeature); + } + + // Create new groups + for (int aGroupIndex = 0; aGroupIndex < aXao.countGroups(); ++aGroupIndex) { + XAO::Group* aXaoGroup = aXao.getGroup(aGroupIndex); + + std::shared_ptr aGroupFeature = addFeature("Group"); + + // group name + if (!aXaoGroup->getName().empty()) + aGroupFeature->data()->setName(aXaoGroup->getName()); + + // fill selection + AttributeSelectionListPtr aSelectionList = aGroupFeature->selectionList("group_list"); + + // conversion of dimension + XAO::Dimension aGroupDimension = aXaoGroup->getDimension(); + std::string aDimensionString = XAO::XaoUtils::dimensionToString(aXaoGroup->getDimension()); + std::string aSelectionType = ExchangePlugin_Tools::xaoDimension2selectionType(aDimensionString); + + aSelectionList->setSelectionType(aSelectionType); + 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); + } + } + + } catch (XAO::XAO_Exception& e) { + std::string anError = e.what(); + setError("An error occurred while importing " + theFileName + ": " + anError); + return; + } +} + +//============================================================================ +std::shared_ptr ExchangePlugin_ImportFeature::addFeature( + std::string theID) +{ + std::shared_ptr aNew = document()->addFeature(theID, false); + if (aNew) + data()->reflist(FEATURES_ID())->append(aNew); + // set as current also after it becomes sub to set correctly enabled for other subs + //document()->setCurrentFeature(aNew, false); + return aNew; +} + +void ExchangePlugin_ImportFeature::removeFeature( + std::shared_ptr theFeature) +{ + if (!data()->isValid()) + return; + AttributeRefListPtr aList = reflist(FEATURES_ID()); + aList->remove(theFeature); +} + +int ExchangePlugin_ImportFeature::numberOfSubs(bool forTree) const +{ + return data()->reflist(FEATURES_ID())->size(true); +} + +std::shared_ptr ExchangePlugin_ImportFeature::subFeature( + const int theIndex, bool forTree) +{ + ObjectPtr anObj = data()->reflist(FEATURES_ID())->object(theIndex, false); + FeaturePtr aRes = std::dynamic_pointer_cast(anObj); + return aRes; +} + +int ExchangePlugin_ImportFeature::subFeatureId(const int theIndex) const +{ + std::shared_ptr aRefList = std::dynamic_pointer_cast< + ModelAPI_AttributeRefList>(data()->attribute(FEATURES_ID())); + std::list aFeatures = aRefList->list(); + std::list::const_iterator anIt = aFeatures.begin(); + int aResultIndex = 1; // number of the counted (created) features, started from 1 + int aFeatureIndex = -1; // number of the not-empty features in the list + for (; anIt != aFeatures.end(); anIt++) { + if (anIt->get()) + aFeatureIndex++; + if (aFeatureIndex == theIndex) + break; + aResultIndex++; + } + return aResultIndex; +} + +bool ExchangePlugin_ImportFeature::isSub(ObjectPtr theObject) const +{ + // check is this feature of result + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature) + return data()->reflist(FEATURES_ID())->isInList(aFeature); + return false; } //============================================================================ void ExchangePlugin_ImportFeature::loadNamingDS( - std::shared_ptr theGeomShape, - std::shared_ptr theResultBody) -{ + std::shared_ptr theGeomShape, + std::shared_ptr theResultBody) +{ //load result theResultBody->store(theGeomShape); - + int aTag(1); std::string aNameMS = "Shape"; theResultBody->loadFirstLevel(theGeomShape, aNameMS, aTag); - std::string aNameDE = "DiscEdges"; - theResultBody->loadDisconnectedEdges(theGeomShape, aNameDE, aTag); - std::string aNameDV = "DiscVertexes"; - theResultBody->loadDisconnectedVertexes(theGeomShape, aNameDV, aTag); }