2 // File : SALOMEDS_TableOfStringAttribute.cxx
3 // Created : Mon Apr 7 10:13:30 2003
4 // Author : Sergey Ruin
7 // Copyright : Open CASCADE
9 #include <SALOMEDS_TableOfStringAttribute.ixx>
10 #include <Standard_Failure.hxx>
11 #include <SALOMEDS_DataMapIteratorOfDataMapOfIntegerString.hxx>
16 const Standard_GUID& SALOMEDS_TableOfStringAttribute::GetID()
18 static Standard_GUID SALOMEDS_TableOfStringAttributeID ("128371A2-8F52-11d6-A8A3-0001021E8C7F");
19 return SALOMEDS_TableOfStringAttributeID;
22 Handle(SALOMEDS_TableOfStringAttribute) SALOMEDS_TableOfStringAttribute::Set(const TDF_Label& label)
24 Handle(SALOMEDS_TableOfStringAttribute) anAttr;
25 if (!label.FindAttribute(SALOMEDS_TableOfStringAttribute::GetID(),anAttr)) {
26 anAttr = new SALOMEDS_TableOfStringAttribute();
27 label.AddAttribute(anAttr);
32 SALOMEDS_TableOfStringAttribute::SALOMEDS_TableOfStringAttribute() {
33 myRows = new TColStd_HSequenceOfExtendedString();
34 myCols = new TColStd_HSequenceOfExtendedString();
39 void SALOMEDS_TableOfStringAttribute::SetNbColumns(const Standard_Integer theNbColumns)
43 SALOMEDS_DataMapOfIntegerString aMap;
47 SALOMEDS_DataMapIteratorOfDataMapOfIntegerString anIterator(aMap);
48 for(; anIterator.More(); anIterator.Next()) {
49 int aRow = (int)(anIterator.Key()/myNbColumns) + 1;
50 int aCol = (int)(anIterator.Key() - myNbColumns*(aRow-1));
51 if(aCol == 0) { aCol = myNbColumns; aRow--; }
52 if(aCol > theNbColumns) continue;
53 int aKey = (aRow-1)*theNbColumns+aCol;
54 myTable.Bind(aKey, anIterator.Value());
57 myNbColumns = theNbColumns;
59 while (myCols->Length() < myNbColumns) { // append empty columns titles
60 myCols->Append(TCollection_ExtendedString(""));
64 void SALOMEDS_TableOfStringAttribute::SetTitle(const TCollection_ExtendedString& theTitle) {
69 TCollection_ExtendedString SALOMEDS_TableOfStringAttribute::GetTitle() const {
73 void SALOMEDS_TableOfStringAttribute::SetRowData(const Standard_Integer theRow,
74 const Handle(TColStd_HSequenceOfExtendedString)& theData)
76 if(theData->Length() > myNbColumns) SetNbColumns(theData->Length());
80 while (myRows->Length() < theRow) { // append new row titles
81 myRows->Append(TCollection_ExtendedString(""));
84 Standard_Integer i, aShift = (theRow-1)*myNbColumns, aLength = theData->Length();
85 for(i = 1; i <= aLength; i++) {
86 myTable.Bind(aShift + i, theData->Value(i));
89 if(theRow > myNbRows) myNbRows = theRow;
92 Handle(TColStd_HSequenceOfExtendedString) SALOMEDS_TableOfStringAttribute::GetRowData(const Standard_Integer theRow)
94 Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString();
95 Standard_Integer i, aShift = (theRow-1)*myNbColumns;
96 for(i = 1; i <= myNbColumns; i++) {
97 if(myTable.IsBound(aShift+i))
98 aSeq->Append(myTable.Find(aShift+i));
106 void SALOMEDS_TableOfStringAttribute::SetRowTitle(const Standard_Integer theRow,
107 const TCollection_ExtendedString& theTitle) {
109 myRows->SetValue(theRow,theTitle);
112 TCollection_ExtendedString SALOMEDS_TableOfStringAttribute::GetRowTitle(const Standard_Integer theRow) const {
113 return myRows->Value(theRow);
117 void SALOMEDS_TableOfStringAttribute::SetColumnData(const Standard_Integer theColumn,
118 const Handle(TColStd_HSequenceOfExtendedString)& theData)
120 if(theColumn > myNbColumns) SetNbColumns(theColumn);
124 Standard_Integer i, aLength = theData->Length();
125 for(i = 1; i <= aLength; i++) {
126 myTable.Bind(myNbColumns*(i-1)+theColumn, theData->Value(i));
129 if(aLength > myNbRows) {
131 while (myRows->Length() < myNbRows) { // append empty row titles
132 myRows->Append(TCollection_ExtendedString(""));
138 Handle(TColStd_HSequenceOfExtendedString) SALOMEDS_TableOfStringAttribute::GetColumnData(const Standard_Integer theColumn)
140 Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString;
142 Standard_Integer i, anIndex;
143 for(i = 1; i <= myNbRows; i++) {
144 anIndex = myNbColumns*(i-1) + theColumn;
145 if(myTable.IsBound(anIndex))
146 aSeq->Append(myTable.Find(anIndex));
154 void SALOMEDS_TableOfStringAttribute::SetColumnTitle(const Standard_Integer theColumn,
155 const TCollection_ExtendedString& theTitle) {
157 while(myCols->Length() < theColumn) myCols->Append(TCollection_ExtendedString(""));
158 myCols->SetValue(theColumn,theTitle);
161 TCollection_ExtendedString SALOMEDS_TableOfStringAttribute::GetColumnTitle(const Standard_Integer theColumn) const {
162 if(myCols.IsNull()) return "";
163 if(myCols->Length() < theColumn) return "";
164 return myCols->Value(theColumn);
168 Standard_Integer SALOMEDS_TableOfStringAttribute::GetNbRows() const
173 Standard_Integer SALOMEDS_TableOfStringAttribute::GetNbColumns() const
178 void SALOMEDS_TableOfStringAttribute::PutValue(const TCollection_ExtendedString& theValue,
179 const Standard_Integer theRow,
180 const Standard_Integer theColumn)
182 if(theColumn > myNbColumns) SetNbColumns(theColumn);
184 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
185 myTable.Bind(anIndex, theValue);
187 if(theRow > myNbRows) {
188 while (myRows->Length() < theRow) { // append empty row titles
189 myRows->Append(TCollection_ExtendedString(""));
195 Standard_Boolean SALOMEDS_TableOfStringAttribute::HasValue(const Standard_Integer theRow,
196 const Standard_Integer theColumn)
198 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
199 return myTable.IsBound(anIndex);
202 TCollection_ExtendedString SALOMEDS_TableOfStringAttribute::GetValue(const Standard_Integer theRow,
203 const Standard_Integer theColumn)
205 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
206 if(myTable.IsBound(anIndex)) return myTable.Find(anIndex);
208 Standard_Failure::Raise("Invalid cell index");
212 const Standard_GUID& SALOMEDS_TableOfStringAttribute::ID() const
217 void SALOMEDS_TableOfStringAttribute::Restore(const Handle(TDF_Attribute)& with)
219 Standard_Integer anIndex;
220 Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(with);
226 myTable = aTable->myTable;
227 myNbRows = aTable->myNbRows;
228 myNbColumns = aTable->myNbColumns;
229 myTitle = aTable->myTitle;
231 for(anIndex = 1; anIndex <= aTable->GetNbRows();anIndex++) {
232 SetRowTitle(anIndex,aTable->GetRowTitle(anIndex));
234 for(anIndex = 1; anIndex <= aTable->GetNbColumns(); anIndex++)
235 SetColumnTitle(anIndex, aTable->GetColumnTitle(anIndex));
238 Handle(TDF_Attribute) SALOMEDS_TableOfStringAttribute::NewEmpty() const
240 return new SALOMEDS_TableOfStringAttribute();
243 void SALOMEDS_TableOfStringAttribute::Paste(const Handle(TDF_Attribute)& into,
244 const Handle(TDF_RelocationTable)&) const
246 Standard_Integer anIndex;
247 Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(into);
249 aTable->myTable.Clear();
250 aTable->myCols->Clear();
251 aTable->myRows->Clear();
253 aTable->myTable = myTable;
254 aTable->myTitle = myTitle;
255 aTable->myNbRows = myNbRows;
256 aTable->myNbColumns = myNbColumns;
258 for(anIndex = 1; anIndex <= GetNbRows();anIndex++) {
259 aTable->SetRowTitle(anIndex,GetRowTitle(anIndex));
261 for(anIndex = 1; anIndex <= GetNbColumns(); anIndex++)
262 aTable->SetColumnTitle(anIndex, GetColumnTitle(anIndex));
266 Handle_TColStd_HSequenceOfInteger SALOMEDS_TableOfStringAttribute::GetSetRowIndices(const Standard_Integer theRow)
268 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
270 Standard_Integer i, aShift = myNbColumns*(theRow-1);
271 for(i = 1; i <= myNbColumns; i++) {
272 if(myTable.IsBound(aShift + i)) aSeq->Append(i);
278 Handle_TColStd_HSequenceOfInteger SALOMEDS_TableOfStringAttribute::GetSetColumnIndices(const Standard_Integer theColumn)
280 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
282 Standard_Integer i, anIndex;
283 for(i = 1; i <= myNbRows; i++) {
284 anIndex = myNbColumns*(i-1)+theColumn;
285 if(myTable.IsBound(anIndex)) aSeq->Append(i);
293 void SALOMEDS_TableOfStringAttribute::ConvertToString(ostrstream& theStream)
296 cout << "########## ConvertToString BEGIN " << endl;
299 l = myTitle.Length();
300 theStream << l << "\n";
302 theStream << myTitle.Value(i) << "\n";
305 theStream << myNbRows << "\n";
308 for(i=1; i<=myNbRows; i++) {
309 l = myRows->Value(i).Length();
310 theStream << l << "\n";
312 theStream << myRows->Value(i).Value(j) << "\n";
316 theStream << myNbColumns << "\n";
319 for(i=1; i<=myNbColumns; i++) {
320 l = myCols->Value(i).Length();
321 theStream << l << "\n";
323 theStream << myCols->Value(i).Value(j) << "\n";
326 //Store the table values
327 l = myTable.Extent();
328 theStream << l << "\n";
329 SALOMEDS_DataMapIteratorOfDataMapOfIntegerString anIterator(myTable);
330 for(; anIterator.More(); anIterator.Next()) {
331 theStream << anIterator.Key() << "\n";
332 theStream << anIterator.Value() << "\n";
333 // l = anIterator.Value().Length();
334 // theStream << l << "\n";
335 // for(j=1; j<=l; j++)
336 // theStream << anIterator.Value().Value(j) << "\n";
338 cout << "########## ConvertToString END " << endl;
342 bool SALOMEDS_TableOfStringAttribute::RestoreFromString(istrstream& theStream)
348 Standard_ExtCharacter anExtChar;
349 TCollection_ExtendedString aStr;
354 myTitle = TCollection_ExtendedString(l, 0);
355 for(i=1; i<=l; i++) {
356 theStream >> anExtChar;
357 myTitle.SetValue(i, anExtChar);
361 theStream >> myNbRows;
365 for(i=1; i<=myNbRows; i++) {
367 aStr = TCollection_ExtendedString(l,0);
368 for(j=1; j<=l; j++) {
369 theStream >> anExtChar;
370 aStr.SetValue(j, anExtChar);
372 myRows->Append(aStr);
376 theStream >> myNbColumns;
380 for(i=1; i<=myNbColumns; i++) {
382 aStr = TCollection_ExtendedString(l,0);
383 for(j=1; j<=l; j++) {
384 theStream >> anExtChar;
385 aStr.SetValue(j, anExtChar);
387 myCols->Append(aStr);
390 //Restore the table values
391 TCollection_AsciiString aValue;
394 for(i=1; i<=l; i++) {
395 Standard_Integer aKey;
398 myTable.Bind(aKey, aValue);
400 // aStr = TCollection_ExtendedString(l,0);
401 // for(j=1; j<=l; j++) {
402 // theStream >> anExtChar;
403 // aStr.SetValue(j, anExtChar);
405 // myTable.Bind(aKey, aStr);