X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FExchangePlugin%2FExchangePlugin_ImportFeature.cpp;h=e6f2e8f3e28cdebdf29df214eb86a4a729e590b1;hb=5afcc18216ad228eafcaf632c5008d1aebd3122e;hp=2d8c81bb229a9b30aa2ef31fc677f46331de0d90;hpb=ced98007eba772ef7ef3a3e7d98fee8477e8de07;p=modules%2Fshaper.git diff --git a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp index 2d8c81bb2..e6f2e8f3e 100644 --- a/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp +++ b/src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: ExchangePlugin_ImportFeature.cpp -// Created: Aug 28, 2014 -// Authors: Sergey BELASH, Sergey POKHODENKO +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// +// 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 +// version 2.1 of the License, or (at your option) any later version. +// +// 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 +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include @@ -19,6 +32,7 @@ #include #include +#include #include #include @@ -189,7 +203,7 @@ void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName) // complex conversion of element index to reference id int anElementID = aXaoGroup->get(anElementIndex); std::string aReferenceString = - aXaoGeometry->getElementReference(aXaoGroup->getDimension(), anElementID); + aXaoGeometry->getElementReference(aXaoGroup->getDimension(), anElementID); int aReferenceID = XAO::XaoUtils::stringToInt(aReferenceString); aSelectionList->value(anElementIndex)->setId(aReferenceID); @@ -213,6 +227,29 @@ void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName) std::string aSelectionType = ExchangePlugin_Tools::xaoDimension2selectionType(aDimensionString); aSelectionList->setSelectionType(aSelectionType); + // limitation: now in XAO fields are related to everything, so, iterate all sub-shapes to fill + int aCountSelected = aXaoField->countElements(); + std::list::const_iterator aResIter = results().begin(); + for(; aResIter != results().end() && aCountSelected; aResIter++) { + ResultBodyPtr aBody = std::dynamic_pointer_cast(*aResIter); + if (!aBody.get()) + continue; + // check that only results that were created before this field are used + FeaturePtr aResultFeature = document()->feature(aBody); + if (!aResultFeature.get()) + continue; + GeomShapePtr aShape = aBody->shape(); + if (!aShape.get() || aShape->isNull()) + continue; + GeomAPI_ShapeExplorer anExp(aShape, GeomAPI_Shape::shapeTypeByStr(aSelectionType)); + for(; anExp.more(); anExp.next()) { + aSelectionList->append(aBody, anExp.current()); + aCountSelected--; + if (aCountSelected == 0) + break; + } + } + // conversion of type XAO::Type aFieldType = aXaoField->getType(); std::string aTypeString = XAO::XaoUtils::fieldTypeToString(aFieldType); @@ -241,7 +278,7 @@ void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName) std::string aValStr = (*aStepIter)->getStringValue(aRow - 1, aCol); switch(aType) { case ModelAPI_AttributeTables::BOOLEAN: - aVal.myBool = aValStr == "True"; + aVal.myBool = aValStr == "true"; break; case ModelAPI_AttributeTables::INTEGER: aVal.myInt = atoi(aValStr.c_str()); @@ -257,16 +294,50 @@ void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName) } } } + // remove everything with zero-values: zeroes are treated as defaults + std::set aRowsToRemove; + for(int aRow = 1; aRow < aTables->rows(); aRow++) { + bool isZero = true; + for(int aCol = 0; aCol < aTables->columns() && isZero; aCol++) { + for(int aStepIndex = 0; aStepIndex != aTables->tables() && isZero; aStepIndex++) { + if (aTables->valueStr(aRow, aCol, aStepIndex) != aTables->valueStr(0, aCol, aStepIndex)) + isZero = false; + } + } + if (isZero) + aRowsToRemove.insert(aRow - 1); // -1 to make prepared for remove from SelectionList + } + if (!aRowsToRemove.empty()) { // move usefull rows on bottom to the up of the tables + // number of rows passed during going through: the current rows will + // be moved up for this value + int aRemovedPassed = 0; + for(int aRow = 1; aRow < aTables->rows(); aRow++) { + if (aRowsToRemove.find(aRow - 1) != aRowsToRemove.end()) { + aRemovedPassed++; + } else if (aRemovedPassed != 0) { // copy the line up + for(int aCol = 0; aCol < aTables->columns(); aCol++) { + for(int aTable = 0; aTable != aTables->tables(); aTable++) { + aTables->setValue( + aTables->value(aRow, aCol, aTable), aRow - aRemovedPassed, aCol, aTable); + } + } + } + } + aTables->setSize(aTables->rows() - aRemovedPassed, aTables->columns(), aTables->tables()); + aSelectionList->remove(aRowsToRemove); // remove also selected elements + } } // Top avoid problems in Object Browser update: issue #1647. ModelAPI_EventCreator::get()->sendReordered( std::dynamic_pointer_cast(aRefListOfGroups->owner())); +// LCOV_EXCL_START } catch (XAO::XAO_Exception& e) { std::string anError = e.what(); setError("An error occurred while importing " + theFileName + ": " + anError); return; } +// LCOV_EXCL_STOP } //============================================================================ @@ -281,6 +352,7 @@ std::shared_ptr ExchangePlugin_ImportFeature::addFeature( return aNew; } +// LCOV_EXCL_START void ExchangePlugin_ImportFeature::removeFeature( std::shared_ptr theFeature) { @@ -289,6 +361,7 @@ void ExchangePlugin_ImportFeature::removeFeature( AttributeRefListPtr aList = reflist(FEATURES_ID()); aList->remove(theFeature); } +// LCOV_EXCL_STOP int ExchangePlugin_ImportFeature::numberOfSubs(bool forTree) const { @@ -303,6 +376,7 @@ std::shared_ptr ExchangePlugin_ImportFeature::subFeature( return aRes; } +// LCOV_EXCL_START int ExchangePlugin_ImportFeature::subFeatureId(const int theIndex) const { std::shared_ptr aRefList = std::dynamic_pointer_cast< @@ -320,6 +394,7 @@ int ExchangePlugin_ImportFeature::subFeatureId(const int theIndex) const } return aResultIndex; } +// LCOV_EXCL_STOP bool ExchangePlugin_ImportFeature::isSub(ObjectPtr theObject) const { @@ -340,5 +415,5 @@ void ExchangePlugin_ImportFeature::loadNamingDS( int aTag(1); std::string aNameMS = "Shape"; - theResultBody->loadFirstLevel(theGeomShape, aNameMS, aTag); + theResultBody->loadFirstLevel(theGeomShape, aNameMS); }