X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModel%2FModel_AttributeTables.cpp;h=b5bf6d096ea4e624a4ca5c02e300faa5d92507fe;hb=95375993f1f35e4716475c0b0c8e265c082c875d;hp=77930e5a2c6876ae23c3cbfd14c6719dcc50b16b;hpb=ced98007eba772ef7ef3a3e7d98fee8477e8de07;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeTables.cpp b/src/Model/Model_AttributeTables.cpp index 77930e5a2..b5bf6d096 100644 --- a/src/Model/Model_AttributeTables.cpp +++ b/src/Model/Model_AttributeTables.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: Model_AttributeTables.cpp -// Created: 14 Nov 2016 -// Author: Mikhail Ponikarov +// 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 "Model_AttributeTables.h" @@ -60,14 +73,13 @@ void Model_AttributeTables::setSize(const int theRows, const int theColumns, con Handle(TColStd_HArray1OfReal) anOldDouble, aNewDouble = (myType == ModelAPI_AttributeTables::DOUBLE) ? new TColStd_HArray1OfReal(0, aNewSize - 1) : Handle(TColStd_HArray1OfReal)(); - Handle(TColStd_HArray1OfByte) anOldBool, aNewBool = - (myType == ModelAPI_AttributeTables::BOOLEAN) ? - new TColStd_HArray1OfByte(0, aNewSize - 1) : Handle(TColStd_HArray1OfByte)(); + bool* anOldBool = 0; // an not work with internal arrays because of different indexing + Handle(TDataStd_BooleanArray) aBoolArray; // an existing array Handle(TColStd_HArray1OfInteger) anOldInt, aNewInt = - (myType == ModelAPI_AttributeTables::INTEGER) ? + (myType == ModelAPI_AttributeTables::INTEGER) ? new TColStd_HArray1OfInteger(0, aNewSize - 1) : Handle(TColStd_HArray1OfInteger)(); Handle(TColStd_HArray1OfExtendedString) anOldStr, aNewStr = - (myType == ModelAPI_AttributeTables::STRING) ? + (myType == ModelAPI_AttributeTables::STRING) ? new TColStd_HArray1OfExtendedString(0, aNewSize - 1) : Handle(TColStd_HArray1OfExtendedString)(); if (aSize != 0) { // copy the previous values into new positions, otherwise default values @@ -77,9 +89,14 @@ void Model_AttributeTables::setSize(const int theRows, const int theColumns, con case ModelAPI_AttributeTables::DOUBLE: anOldDouble = Handle(TDataStd_RealArray)::DownCast(anArray)->Array(); break; - case ModelAPI_AttributeTables::BOOLEAN: - anOldBool = Handle(TDataStd_BooleanArray)::DownCast(anArray)->InternalArray(); + case ModelAPI_AttributeTables::BOOLEAN: { + anOldBool = new bool[aSize]; + aBoolArray = Handle(TDataStd_BooleanArray)::DownCast(anArray); + for(int a = 0; a < aSize; a++) + anOldBool[a] = aBoolArray->Value(a); + aBoolArray->Init(0, aNewSize - 1); break; + } case ModelAPI_AttributeTables::INTEGER: anOldInt = Handle(TDataStd_IntegerArray)::DownCast(anArray)->Array(); break; @@ -87,6 +104,8 @@ void Model_AttributeTables::setSize(const int theRows, const int theColumns, con anOldStr = Handle(TDataStd_ExtStringArray)::DownCast(anArray)->Array(); break; } + } else if (myType == ModelAPI_AttributeTables::BOOLEAN) { + aBoolArray = TDataStd_BooleanArray::Set(myLab, 0, aNewSize - 1); } for(int aTable = 0; aTable < theTables; aTable++) { for(int aColumn = 0; aColumn < theColumns; aColumn++) { @@ -101,7 +120,7 @@ void Model_AttributeTables::setSize(const int theRows, const int theColumns, con break; } case ModelAPI_AttributeTables::BOOLEAN: { - aNewBool->SetValue(anIndex, aRestore ? anOldBool->Value(anOldIndex) : Standard_False); + aBoolArray->SetValue(anIndex, aRestore ? anOldBool[anOldIndex] : Standard_False); break; } case ModelAPI_AttributeTables::INTEGER: { @@ -121,8 +140,7 @@ void Model_AttributeTables::setSize(const int theRows, const int theColumns, con case ModelAPI_AttributeTables::DOUBLE: TDataStd_RealArray::Set(myLab, 0, aNewSize - 1)->ChangeArray(aNewDouble); break; - case ModelAPI_AttributeTables::BOOLEAN: - TDataStd_BooleanArray::Set(myLab, 0, aNewSize - 1)->SetInternalArray(aNewBool); + case ModelAPI_AttributeTables::BOOLEAN: // nothing to do: array was set in "else" of restore break; case ModelAPI_AttributeTables::INTEGER: TDataStd_IntegerArray::Set(myLab, 0, aNewSize - 1)->ChangeArray(aNewInt); @@ -151,10 +169,10 @@ void Model_AttributeTables::setType(ModelAPI_AttributeTables::ValueType theType) // remove the old attr int aSize = myRows * myCols * myTables; if (aSize != 0) { - myLab.ForgetAttribute(MY_ARRAY_ID(theType)); + myLab.ForgetAttribute(MY_ARRAY_ID(myType)); myType = theType; int aTables = myTables; - myTables = 0; // to let setSize know that there is no old array + myTables = 0; // to let setSize know that there is no old array setSize(myRows, myCols, aTables); } else { myType = theType; @@ -225,6 +243,26 @@ ModelAPI_AttributeTables::Value Model_AttributeTables::value( return aResult; } +std::string Model_AttributeTables::valueStr( + const int theRow, const int theColumn, const int theTable) +{ + std::ostringstream aStr; + switch(myType) { + case ModelAPI_AttributeTables::DOUBLE: + aStr<