Salome HOME
Copyright update 2020
[modules/shaper.git] / src / Model / Model_AttributeTables.cpp
index b89e7446d5b635788e9088ad7c5d47f56f5bac58..c0e79e4d0791ab5c7525ba2f8d57146b78ab63c7 100644 (file)
@@ -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-2020  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,9 +73,8 @@ 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) ?
         new TColStd_HArray1OfInteger(0, aNewSize - 1) : Handle(TColStd_HArray1OfInteger)();
@@ -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,7 +169,7 @@ 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