+ // conversion of type
+ XAO::Type aFieldType = aXaoField->getType();
+ std::string aTypeString = XAO::XaoUtils::fieldTypeToString(aFieldType);
+ ModelAPI_AttributeTables::ValueType aType =
+ ExchangePlugin_Tools::xaoType2valuesType(aTypeString);
+ // set components names
+ AttributeStringArrayPtr aComponents = aFieldFeature->stringArray("components_names");
+ aComponents->setSize(aXaoField->countComponents());
+ for(int aComp = 0; aComp < aXaoField->countComponents(); aComp++) {
+ aComponents->setValue(aComp, aXaoField->getComponentName(aComp));
+ }
+
+ AttributeIntArrayPtr aStamps = aFieldFeature->intArray("stamps");
+ aStamps->setSize(aXaoField->countSteps());
+ std::shared_ptr<ModelAPI_AttributeTables> aTables = aFieldFeature->tables("values");
+ aTables->setSize(
+ aXaoField->countElements() + 1, aXaoField->countComponents(), aXaoField->countSteps());
+ aTables->setType(aType);
+ // iterate steps
+ XAO::stepIterator aStepIter = aXaoField->begin();
+ for(int aStepIndex = 0; aStepIter != aXaoField->end(); aStepIter++, aStepIndex++) {
+ aStamps->setValue(aStepIndex, (*aStepIter)->getStamp());
+ for(int aRow = 1; aRow <= aXaoField->countElements(); aRow++) {
+ for(int aCol = 0; aCol < aXaoField->countComponents(); aCol++) {
+ ModelAPI_AttributeTables::Value aVal;
+ std::string aValStr = (*aStepIter)->getStringValue(aRow - 1, aCol);
+ switch(aType) {
+ case ModelAPI_AttributeTables::BOOLEAN:
+ aVal.myBool = aValStr == "true";
+ break;
+ case ModelAPI_AttributeTables::INTEGER:
+ aVal.myInt = atoi(aValStr.c_str());
+ break;
+ case ModelAPI_AttributeTables::DOUBLE:
+ aVal.myDouble = atof(aValStr.c_str());
+ break;
+ case ModelAPI_AttributeTables::STRING:
+ aVal.myStr = aValStr;
+ break;
+ }
+ aTables->setValue(aVal, aRow, aCol, aStepIndex);
+ }
+ }
+ }
+ // remove everything with zero-values: zeroes are treated as defaults
+ std::set<int> 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<ModelAPI_Feature>(aRefListOfGroups->owner()));
+
+// LCOV_EXCL_START