2 // File : SALOMEDS_TableOfIntegerAttribute.cxx
3 // Created : Tue Oct 8 10:13:30 2002
4 // Author : Michael Ponikarov
7 // Copyright : Open CASCADE
8 // Modified by: Sergey Ruin
11 #include <SALOMEDS_TableOfIntegerAttribute.ixx>
12 #include <Standard_Failure.hxx>
13 #include <TColStd_DataMapIteratorOfDataMapOfIntegerInteger.hxx>
17 const Standard_GUID& SALOMEDS_TableOfIntegerAttribute::GetID()
19 static Standard_GUID SALOMEDS_TableOfIntegerAttributeID ("128371A0-8F52-11d6-A8A3-0001021E8C7F");
20 return SALOMEDS_TableOfIntegerAttributeID;
23 Handle(SALOMEDS_TableOfIntegerAttribute) SALOMEDS_TableOfIntegerAttribute::Set(const TDF_Label& label)
25 Handle(SALOMEDS_TableOfIntegerAttribute) anAttr;
26 if (!label.FindAttribute(SALOMEDS_TableOfIntegerAttribute::GetID(),anAttr)) {
27 anAttr = new SALOMEDS_TableOfIntegerAttribute();
28 label.AddAttribute(anAttr);
33 SALOMEDS_TableOfIntegerAttribute::SALOMEDS_TableOfIntegerAttribute() {
34 myRows = new TColStd_HSequenceOfExtendedString();
35 myCols = new TColStd_HSequenceOfExtendedString();
40 void SALOMEDS_TableOfIntegerAttribute::SetNbColumns(const Standard_Integer theNbColumns)
44 TColStd_DataMapOfIntegerInteger aMap;
48 TColStd_DataMapIteratorOfDataMapOfIntegerInteger anIterator(aMap);
49 for(; anIterator.More(); anIterator.Next()) {
50 int aRow = (int)(anIterator.Key()/myNbColumns) + 1;
51 int aCol = (int)(anIterator.Key() - myNbColumns*(aRow-1));
52 if(aCol == 0) { aCol = myNbColumns; aRow--; }
53 if(aCol > theNbColumns) continue;
54 int aKey = (aRow-1)*theNbColumns+aCol;
55 myTable.Bind(aKey, anIterator.Value());
58 myNbColumns = theNbColumns;
60 while (myCols->Length() < myNbColumns) { // append empty columns titles
61 myCols->Append(TCollection_ExtendedString(""));
65 void SALOMEDS_TableOfIntegerAttribute::SetTitle(const TCollection_ExtendedString& theTitle) {
70 TCollection_ExtendedString SALOMEDS_TableOfIntegerAttribute::GetTitle() const {
74 void SALOMEDS_TableOfIntegerAttribute::SetRowData(const Standard_Integer theRow,
75 const Handle(TColStd_HSequenceOfInteger)& theData)
77 if(theData->Length() > myNbColumns) SetNbColumns(theData->Length());
81 while (myRows->Length() < theRow) { // append new row titles
82 myRows->Append(TCollection_ExtendedString(""));
85 Standard_Integer i, aShift = (theRow-1)*myNbColumns, aLength = theData->Length();
86 for(i = 1; i <= aLength; i++) {
87 myTable.Bind(aShift + i, theData->Value(i));
90 if(theRow > myNbRows) myNbRows = theRow;
93 Handle(TColStd_HSequenceOfInteger) SALOMEDS_TableOfIntegerAttribute::GetRowData(const Standard_Integer theRow)
95 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger();
96 Standard_Integer i, aShift = (theRow-1)*myNbColumns;
97 for(i = 1; i <= myNbColumns; i++) {
98 if(myTable.IsBound(aShift+i))
99 aSeq->Append(myTable.Find(aShift+i));
107 void SALOMEDS_TableOfIntegerAttribute::SetRowTitle(const Standard_Integer theRow,
108 const TCollection_ExtendedString& theTitle) {
110 myRows->SetValue(theRow,theTitle);
113 TCollection_ExtendedString SALOMEDS_TableOfIntegerAttribute::GetRowTitle(const Standard_Integer theRow) const {
114 return myRows->Value(theRow);
118 void SALOMEDS_TableOfIntegerAttribute::SetColumnData(const Standard_Integer theColumn,
119 const Handle(TColStd_HSequenceOfInteger)& theData)
121 if(theColumn > myNbColumns) SetNbColumns(theColumn);
125 Standard_Integer i, aLength = theData->Length();
126 for(i = 1; i <= aLength; i++) {
127 myTable.Bind(myNbColumns*(i-1)+theColumn, theData->Value(i));
130 if(aLength > myNbRows) {
132 while (myRows->Length() < myNbRows) { // append empty row titles
133 myRows->Append(TCollection_ExtendedString(""));
139 Handle(TColStd_HSequenceOfInteger) SALOMEDS_TableOfIntegerAttribute::GetColumnData(const Standard_Integer theColumn)
141 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
143 Standard_Integer i, anIndex;
144 for(i = 1; i <= myNbRows; i++) {
145 anIndex = myNbColumns*(i-1) + theColumn;
146 if(myTable.IsBound(anIndex))
147 aSeq->Append(myTable.Find(anIndex));
155 void SALOMEDS_TableOfIntegerAttribute::SetColumnTitle(const Standard_Integer theColumn,
156 const TCollection_ExtendedString& theTitle) {
158 while(myCols->Length() < theColumn) myCols->Append(TCollection_ExtendedString(""));
159 myCols->SetValue(theColumn,theTitle);
162 TCollection_ExtendedString SALOMEDS_TableOfIntegerAttribute::GetColumnTitle(const Standard_Integer theColumn) const {
163 if(myCols.IsNull()) return "";
164 if(myCols->Length() < theColumn) return "";
165 return myCols->Value(theColumn);
169 Standard_Integer SALOMEDS_TableOfIntegerAttribute::GetNbRows() const
174 Standard_Integer SALOMEDS_TableOfIntegerAttribute::GetNbColumns() const
179 void SALOMEDS_TableOfIntegerAttribute::PutValue(const Standard_Integer theValue,
180 const Standard_Integer theRow,
181 const Standard_Integer theColumn)
183 if(theColumn > myNbColumns) SetNbColumns(theColumn);
185 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
186 myTable.Bind(anIndex, theValue);
188 if(theRow > myNbRows) {
189 while (myRows->Length() < theRow) { // append empty row titles
190 myRows->Append(TCollection_ExtendedString(""));
196 Standard_Boolean SALOMEDS_TableOfIntegerAttribute::HasValue(const Standard_Integer theRow,
197 const Standard_Integer theColumn)
199 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
200 return myTable.IsBound(anIndex);
203 Standard_Integer SALOMEDS_TableOfIntegerAttribute::GetValue(const Standard_Integer theRow,
204 const Standard_Integer theColumn)
206 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
207 if(myTable.IsBound(anIndex)) return myTable.Find(anIndex);
209 Standard_Failure::Raise("Invalid cell index");
213 const Standard_GUID& SALOMEDS_TableOfIntegerAttribute::ID() const
218 void SALOMEDS_TableOfIntegerAttribute::Restore(const Handle(TDF_Attribute)& with)
220 Standard_Integer anIndex;
221 Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(with);
227 myTable = aTable->myTable;
228 myNbRows = aTable->myNbRows;
229 myNbColumns = aTable->myNbColumns;
230 myTitle = aTable->myTitle;
232 for(anIndex = 1; anIndex <= aTable->GetNbRows();anIndex++) {
233 SetRowTitle(anIndex,aTable->GetRowTitle(anIndex));
235 for(anIndex = 1; anIndex <= aTable->GetNbColumns(); anIndex++)
236 SetColumnTitle(anIndex, aTable->GetColumnTitle(anIndex));
239 Handle(TDF_Attribute) SALOMEDS_TableOfIntegerAttribute::NewEmpty() const
241 return new SALOMEDS_TableOfIntegerAttribute();
244 void SALOMEDS_TableOfIntegerAttribute::Paste(const Handle(TDF_Attribute)& into,
245 const Handle(TDF_RelocationTable)&) const
247 Standard_Integer anIndex;
248 Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(into);
250 aTable->myTable.Clear();
251 aTable->myCols->Clear();
252 aTable->myRows->Clear();
254 aTable->myTable = myTable;
255 aTable->myTitle = myTitle;
256 aTable->myNbRows = myNbRows;
257 aTable->myNbColumns = myNbColumns;
259 for(anIndex = 1; anIndex <= GetNbRows();anIndex++) {
260 aTable->SetRowTitle(anIndex,GetRowTitle(anIndex));
262 for(anIndex = 1; anIndex <= GetNbColumns(); anIndex++)
263 aTable->SetColumnTitle(anIndex, GetColumnTitle(anIndex));
267 Handle_TColStd_HSequenceOfInteger SALOMEDS_TableOfIntegerAttribute::GetSetRowIndices(const Standard_Integer theRow)
269 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
271 Standard_Integer i, aShift = myNbColumns*(theRow-1);
272 for(i = 1; i <= myNbColumns; i++) {
273 if(myTable.IsBound(aShift + i)) aSeq->Append(i);
279 Handle_TColStd_HSequenceOfInteger SALOMEDS_TableOfIntegerAttribute::GetSetColumnIndices(const Standard_Integer theColumn)
281 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
283 Standard_Integer i, anIndex;
284 for(i = 1; i <= myNbRows; i++) {
285 anIndex = myNbColumns*(i-1)+theColumn;
286 if(myTable.IsBound(anIndex)) aSeq->Append(i);
293 void SALOMEDS_TableOfIntegerAttribute::ConvertToString(ostrstream& theStream)
297 theStream.precision(64);
300 l = myTitle.Length();
301 theStream << l << "\n";
303 theStream << myTitle.Value(i) << "\n";
306 theStream << myNbRows << "\n";
309 for(i=1; i<=myNbRows; i++) {
310 l = myRows->Value(i).Length();
311 theStream << l << "\n";
313 theStream << myRows->Value(i).Value(j) << "\n";
317 theStream << myNbColumns << "\n";
320 for(i=1; i<=myNbColumns; i++) {
321 l = myCols->Value(i).Length();
322 theStream << l << "\n";
324 theStream << myCols->Value(i).Value(j) << "\n";
327 //Store the table values
328 l = myTable.Extent();
329 theStream << l << "\n";
330 TColStd_DataMapIteratorOfDataMapOfIntegerInteger anIterator(myTable);
331 for(; anIterator.More(); anIterator.Next()) {
332 theStream << anIterator.Key() << "\n";
333 theStream << anIterator.Value() << "\n";
339 bool SALOMEDS_TableOfIntegerAttribute::RestoreFromString(istrstream& theStream)
345 Standard_ExtCharacter anExtChar;
346 TCollection_ExtendedString aStr;
351 myTitle = TCollection_ExtendedString(l, 0);
352 for(i=1; i<=l; i++) {
353 theStream >> anExtChar;
354 myTitle.SetValue(i, anExtChar);
358 theStream >> myNbRows;
362 for(i=1; i<=myNbRows; i++) {
364 aStr = TCollection_ExtendedString(l,0);
365 for(j=1; j<=l; j++) {
366 theStream >> anExtChar;
367 aStr.SetValue(j, anExtChar);
369 myRows->Append(aStr);
373 theStream >> myNbColumns;
377 for(i=1; i<=myNbColumns; i++) {
379 aStr = TCollection_ExtendedString(l,0);
380 for(j=1; j<=l; j++) {
381 theStream >> anExtChar;
382 aStr.SetValue(j, anExtChar);
384 myCols->Append(aStr);
387 //Restore the table values
390 for(i=1; i<=l; i++) {
394 myTable.Bind(aKey, aValue);