0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- prepar...
[occt.git] / src / IGESDefs / IGESDefs_ToolAttributeTable.cxx
1 // Created by: CKY / Contract Toubro-Larsen
2 // Copyright (c) 1993-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 //--------------------------------------------------------------------
17 //--------------------------------------------------------------------
18
19 #include <IGESData_DirChecker.hxx>
20 #include <IGESData_Dump.hxx>
21 #include <IGESData_HArray1OfIGESEntity.hxx>
22 #include <IGESData_IGESDumper.hxx>
23 #include <IGESData_IGESReaderData.hxx>
24 #include <IGESData_IGESWriter.hxx>
25 #include <IGESData_ParamCursor.hxx>
26 #include <IGESData_ParamReader.hxx>
27 #include <IGESDefs_AttributeDef.hxx>
28 #include <IGESDefs_AttributeTable.hxx>
29 #include <IGESDefs_ToolAttributeTable.hxx>
30 #include <Interface_Check.hxx>
31 #include <Interface_CopyTool.hxx>
32 #include <Interface_EntityIterator.hxx>
33 #include <Interface_HArray1OfHAsciiString.hxx>
34 #include <Interface_Macros.hxx>
35 #include <Interface_ShareTool.hxx>
36 #include <Message_Messenger.hxx>
37 #include <Standard_DomainError.hxx>
38 #include <TCollection_HAsciiString.hxx>
39 #include <TColStd_HArray1OfInteger.hxx>
40 #include <TColStd_HArray1OfReal.hxx>
41 #include <TColStd_HArray2OfTransient.hxx>
42
43 IGESDefs_ToolAttributeTable::IGESDefs_ToolAttributeTable ()    {  }
44
45
46 void  IGESDefs_ToolAttributeTable::ReadOwnParams
47   (const Handle(IGESDefs_AttributeTable)& ent,
48    const Handle(IGESData_IGESReaderData)& IR, IGESData_ParamReader& PR) const
49
50   Standard_Integer nr = 1;
51   Standard_Integer j;
52   Standard_Boolean st = Standard_True;
53
54   Handle(IGESDefs_AttributeDef) ab = ent->Definition();  // formerly loaded
55   Handle(TColStd_HArray2OfTransient) list2;
56   if (ab.IsNull()) {
57     PR.AddFail("No Attribute Definition as Structure");
58     return;
59   }
60   Standard_Integer na = ab->NbAttributes();
61
62   if (ent->FormNumber() == 1)
63     st = PR.ReadInteger(PR.Current(),"No. of rows",nr);
64   if (st) list2 = new TColStd_HArray2OfTransient(1,na,1,nr);
65
66 //  AttributeDef repeated once (Form 0) or <nr> times (Form 1)
67   for (Standard_Integer k = 1; k <= nr; k ++)
68     {
69       for (Standard_Integer i = 1; i <= na; i ++)
70         {
71           Standard_Integer avc   = ab->AttributeValueCount(i);
72           Standard_Integer atype = ab->AttributeValueDataType(i);
73           switch (atype)
74             {
75             case 0 : 
76               for (j = 1; j <= avc; j ++)
77                 PR.SetCurrentNumber(PR.CurrentNumber() + 1);  // skip
78               break;
79             case 1 : {
80               Handle(TColStd_HArray1OfInteger) attrInt = new TColStd_HArray1OfInteger(1,avc);
81               list2->SetValue(i,k,attrInt);
82               Standard_Integer item;
83               for (j = 1; j <= avc; j ++)  {
84                 //st = PR.ReadInteger(PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
85                 if (PR.ReadInteger(PR.Current(),"Value",item))
86                   attrInt->SetValue(j,item);
87               }
88             }
89               break;
90             case 2 : {
91               Handle(TColStd_HArray1OfReal) attrReal = new TColStd_HArray1OfReal(1,avc);
92               list2->SetValue(i,k,attrReal);
93               Standard_Real item;
94               for (j = 1; j <= avc; j ++) {
95                 //st = PR.ReadReal(PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
96                 if (PR.ReadReal(PR.Current(),"Value",item))
97                   attrReal->SetValue(j,item);
98               }
99             }
100               break;
101             case 3 : {
102               Handle(Interface_HArray1OfHAsciiString) attrStr = new Interface_HArray1OfHAsciiString(1,avc);
103               list2->SetValue(i,k,attrStr);
104               Handle(TCollection_HAsciiString) item;
105               for (j = 1; j <= avc; j ++) {
106                 //st = PR.ReadText(PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
107                 if (PR.ReadText(PR.Current(),"Value",item))
108                   attrStr->SetValue(j,item);
109               }
110             }
111               break;
112             case 4 : {
113               Handle(IGESData_HArray1OfIGESEntity) attrEnt = new IGESData_HArray1OfIGESEntity(1,avc);
114               list2->SetValue(i,k,attrEnt);
115               Handle(IGESData_IGESEntity) item;
116               for (j = 1; j <= avc; j ++) {
117                 //st = PR.ReadEntity(IR,PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
118                 if (PR.ReadEntity(IR,PR.Current(),"Value",item))
119                   attrEnt->SetValue(j,item);
120               }
121             }
122               break;
123             case 5 :
124               for (j = 1; j <= avc; j ++)
125                   PR.SetCurrentNumber(PR.CurrentNumber() + 1);  // skip
126               break;
127             case 6 : {    // Here item takes value 0 or 1
128               Handle(TColStd_HArray1OfInteger) attrInt  = new TColStd_HArray1OfInteger(1,avc);
129               list2->SetValue(i,k,attrInt);
130               Standard_Integer item;
131               for (j = 1; j <= avc; j ++) {
132                   //st = PR.ReadInteger(PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
133                   if (PR.ReadInteger(PR.Current(),"Value",item))
134                     attrInt->SetValue(j,item);
135                 }
136             }
137               break;
138               default : break;
139             }
140         }
141     }
142   DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
143   ent->Init(list2);
144 }
145
146 void  IGESDefs_ToolAttributeTable::WriteOwnParams
147   (const Handle(IGESDefs_AttributeTable)& ent, IGESData_IGESWriter& IW) const 
148 {
149   Handle(IGESDefs_AttributeDef) ab = ent->Definition();
150
151   Standard_Integer nr = ent->NbRows();
152   Standard_Integer na = ent->NbAttributes();
153   if (ent->FormNumber() == 1) IW.Send(nr);
154   for (Standard_Integer k = 1; k <= nr; k ++)
155     {
156       for (Standard_Integer i = 1; i <= na; i ++)
157         {
158           Standard_Integer count = ab->AttributeValueCount(i);
159           for (Standard_Integer j = 1;j <= count; j++)
160             {
161               switch(ab->AttributeValueDataType(i))
162                 {
163                 case 0 : IW.SendVoid();  break;
164                 case 1 : IW.Send(ent->AttributeAsInteger(i,k,j));  break;
165                 case 2 : IW.Send(ent->AttributeAsReal   (i,k,j));  break;
166                 case 3 : IW.Send(ent->AttributeAsString (i,k,j));  break;
167                 case 4 : IW.Send(ent->AttributeAsEntity (i,k,j));  break;
168                 case 5 : IW.SendVoid();  break;
169                 case 6 : IW.SendBoolean(ent->AttributeAsLogical(i,k,j)); break;
170                 default : break;
171                 }
172             }
173         }
174     }
175 }
176
177 void  IGESDefs_ToolAttributeTable::OwnShared
178   (const Handle(IGESDefs_AttributeTable)& ent, Interface_EntityIterator& iter) const
179 {
180   Handle(IGESDefs_AttributeDef) ab = ent->Definition();
181   Standard_Integer na = ent->NbAttributes();
182   Standard_Integer nr = ent->NbRows();
183   for (Standard_Integer k = 1; k <= nr; k ++)
184     {
185       for (Standard_Integer i = 1; i <= na; i ++)
186         {
187           if (ab->AttributeValueDataType(i) != 4) continue;
188           Standard_Integer avc = ab->AttributeValueCount(i);
189           for (Standard_Integer j = 1; j <= avc; j ++)
190             iter.GetOneItem(ent->AttributeAsEntity(i,k,j));
191         }
192     }
193 }
194
195 void  IGESDefs_ToolAttributeTable::OwnCopy
196   (const Handle(IGESDefs_AttributeTable)& another,
197    const Handle(IGESDefs_AttributeTable)& ent, Interface_CopyTool& TC) const
198
199   Standard_Integer j = 1;
200   Handle(IGESDefs_AttributeDef) ab = another->Definition();
201   Standard_Integer na = another->NbAttributes();
202   Standard_Integer nr = another->NbRows();
203   Handle(TColStd_HArray2OfTransient) list2 =
204     new TColStd_HArray2OfTransient(1,na,1,nr);
205   for (Standard_Integer k = 1; k <= nr; k ++)
206     {
207       for (Standard_Integer i = 1; i <= na; i ++)
208         {
209           Standard_Integer avc   = ab->AttributeValueCount(i);
210           Standard_Integer atype = ab->AttributeValueDataType(i);
211           switch (atype)
212             {
213             case 0 : ////    list2->SetValue(i,k,NULL);    par defaut
214               break;
215             case 1 : {
216               DeclareAndCast(TColStd_HArray1OfInteger,otherInt,
217                              another->AttributeList(i,k));
218               Handle(TColStd_HArray1OfInteger) attrInt  =
219                 new TColStd_HArray1OfInteger (1,avc);
220               list2->SetValue(i,k,attrInt);
221               for (j = 1; j <= avc; j++)
222                 attrInt->SetValue(j,otherInt->Value(j));
223             }
224               break;
225             case 2 : {
226               DeclareAndCast(TColStd_HArray1OfReal,otherReal,
227                              another->AttributeList(i,k));
228               Handle(TColStd_HArray1OfReal) attrReal  =
229                 new TColStd_HArray1OfReal (1,avc);
230               list2->SetValue(i,k,attrReal);
231               for (j = 1; j <= avc; j++)
232                 attrReal->SetValue(j,otherReal->Value(j));
233             }
234               break;
235             case 3 : {
236               DeclareAndCast(Interface_HArray1OfHAsciiString,otherStr,
237                              another->AttributeList(i,k));
238               Handle(Interface_HArray1OfHAsciiString) attrStr  =
239                 new Interface_HArray1OfHAsciiString (1,avc);
240               list2->SetValue(i,k,attrStr);
241               for (j = 1; j <= avc; j++)
242                 attrStr->SetValue
243                   (j,new TCollection_HAsciiString(otherStr->Value(j)));
244             }
245               break;
246             case 4 : {
247               DeclareAndCast(IGESData_HArray1OfIGESEntity,otherEnt,
248                              another->AttributeList(i,k));
249               Handle(IGESData_HArray1OfIGESEntity) attrEnt  =
250                 new IGESData_HArray1OfIGESEntity (1,avc);
251               list2->SetValue(i,k,attrEnt);
252               for (j = 1; j <= avc; j++)
253                 attrEnt->SetValue(j,GetCasted(IGESData_IGESEntity,
254                                               TC.Transferred(otherEnt->Value(j))));
255             }
256               break;
257             case 5 : /////            list2->SetValue(i,k,NULL);    par defaut
258               break;
259             case 6 :{    // Here item takes value 0 or 1
260               DeclareAndCast(TColStd_HArray1OfInteger,otherInt,
261                              another->AttributeList(i,k));
262               Handle(TColStd_HArray1OfInteger) attrInt  =
263                 new TColStd_HArray1OfInteger (1,avc);
264               list2->SetValue(i,k,attrInt);
265               for (j = 1; j <= avc; j++)
266                 attrInt->SetValue(j,otherInt->Value(j));
267             }
268               break;
269               default : break;
270             }
271         }
272     }
273   ent->Init(list2);
274 }
275
276 IGESData_DirChecker  IGESDefs_ToolAttributeTable::DirChecker
277   (const Handle(IGESDefs_AttributeTable)& /* ent */ ) const 
278
279   IGESData_DirChecker DC(422,0,1);
280   DC.Structure(IGESData_DefReference);
281   DC.GraphicsIgnored();
282   DC.BlankStatusIgnored();
283   DC.HierarchyStatusIgnored();
284   return DC;
285 }
286
287 void  IGESDefs_ToolAttributeTable::OwnCheck
288   (const Handle(IGESDefs_AttributeTable)& ent,
289    const Interface_ShareTool& , Handle(Interface_Check)& ach) const 
290 {
291   if (ent->Definition().IsNull()) {
292     if (ent->HasStructure()) ach->AddFail
293       ("Structure in Directory Entry is not an Attribute Definition Table");
294     else ach->AddFail("No Attribute Definition defined");
295   }
296   if (ent->FormNumber() == 0 && ent->NbRows() != 1)
297     ach->AddFail("Form 0 with several Rows");
298   if (ent->NbAttributes() != ent->Definition()->NbAttributes())
299     ach->AddFail("Mismatch between Definition (Structure) and Content");
300 }
301
302 void  IGESDefs_ToolAttributeTable::OwnDump
303   (const Handle(IGESDefs_AttributeTable)& ent, const IGESData_IGESDumper& dumper,
304    Standard_OStream& S, const Standard_Integer level) const
305
306   S << "IGESDefs_AttributeTable\n";
307
308   Handle(IGESDefs_AttributeDef) ab = ent->Definition();
309
310   Standard_Integer na = ent->NbAttributes();
311   Standard_Integer nr = ent->NbRows();
312   if (ent->FormNumber() == 1)
313     S << "Number of Rows (i.e. complete sets of Attributes) : " << nr << "\n";
314   else S << "One set of Attributes\n";
315   S << "Number of defined Attributes : " << na << "\n";
316   if (level <= 4) S <<
317     " [ structure : see Structure in Directory Entry; content : level > 4 ]\n";
318   else
319     for (Standard_Integer k = 1; k <= nr; k ++)
320       {
321         for (Standard_Integer i = 1; i <= na; i ++)
322           {
323             Standard_Integer avc = ab->AttributeValueCount(i);
324             S << "[At.no."<<i<<" Row:"<<k<<"]";
325             switch (ab->AttributeValueDataType(i)) {
326               case 0 : S << "  (Void) ";   break;
327               case 1 : S << "  Integer";  break;
328               case 2 : S << "  Real   ";  break;
329               case 3 : S << "  String ";  break;
330               case 4 : S << "  Entity ";  break;
331               case 5 : S << " (Not used)"; break;
332               case 6 : S << "  Logical";  break;
333               default : break;
334             }
335             S << " :";
336             for (Standard_Integer j = 1;j <= avc; j++) {
337               S << "  ";
338               switch(ab->AttributeValueDataType(i)) {
339                 case 1 : S << ent->AttributeAsInteger(i,k,j);  break;
340                 case 2 : S << ent->AttributeAsReal   (i,k,j);  break;
341                 case 3 : IGESData_DumpString(S,ent->AttributeAsString (i,k,j));
342                   break;
343                 case 4 : dumper.Dump(ent->AttributeAsEntity (i,k,j),S,level-5);
344                   break;
345                 case 6 : S << (ent->AttributeAsLogical(i,k,j) ? "True" : "False");
346                   break;
347                 default : break;
348               }
349             }
350             S << "\n";
351           }
352       }
353   S << std::endl;
354 }