0023024: Update headers of OCCT files
[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-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 //--------------------------------------------------------------------
21 //--------------------------------------------------------------------
22
23 #include <IGESDefs_ToolAttributeTable.ixx>
24 #include <IGESData_ParamCursor.hxx>
25 #include <IGESDefs_AttributeDef.hxx>
26 #include <TColStd_HArray2OfTransient.hxx>
27 #include <TColStd_HArray1OfReal.hxx>
28 #include <TColStd_HArray1OfInteger.hxx>
29 #include <Interface_HArray1OfHAsciiString.hxx>
30 #include <IGESData_HArray1OfIGESEntity.hxx>
31 #include <TCollection_HAsciiString.hxx>
32 #include <Interface_Macros.hxx>
33 #include <IGESData_Dump.hxx>
34
35
36 IGESDefs_ToolAttributeTable::IGESDefs_ToolAttributeTable ()    {  }
37
38
39 void  IGESDefs_ToolAttributeTable::ReadOwnParams
40   (const Handle(IGESDefs_AttributeTable)& ent,
41    const Handle(IGESData_IGESReaderData)& IR, IGESData_ParamReader& PR) const
42
43   Standard_Integer nr = 1;
44   Standard_Integer j;
45   Standard_Boolean st = Standard_True;
46
47   Handle(IGESDefs_AttributeDef) ab = ent->Definition();  // formerly loaded
48   Handle(TColStd_HArray2OfTransient) list2;
49   if (ab.IsNull()) {
50     PR.AddFail("No Attribute Definition as Structure");
51     return;
52   }
53   Standard_Integer na = ab->NbAttributes();
54
55   if (ent->FormNumber() == 1)
56     st = PR.ReadInteger(PR.Current(),"No. of rows",nr);
57   if (st) list2 = new TColStd_HArray2OfTransient(1,na,1,nr);
58
59 //  AttributeDef repeated once (Form 0) or <nr> times (Form 1)
60   for (Standard_Integer k = 1; k <= nr; k ++)
61     {
62       for (Standard_Integer i = 1; i <= na; i ++)
63         {
64           Standard_Integer avc   = ab->AttributeValueCount(i);
65           Standard_Integer atype = ab->AttributeValueDataType(i);
66           switch (atype)
67             {
68             case 0 : 
69               for (j = 1; j <= avc; j ++)
70                 PR.SetCurrentNumber(PR.CurrentNumber() + 1);  // skip
71               break;
72             case 1 : {
73               Handle(TColStd_HArray1OfInteger) attrInt = new TColStd_HArray1OfInteger(1,avc);
74               list2->SetValue(i,k,attrInt);
75               Standard_Integer item;
76               for (j = 1; j <= avc; j ++)  {
77                 //st = PR.ReadInteger(PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
78                 if (PR.ReadInteger(PR.Current(),"Value",item))
79                   attrInt->SetValue(j,item);
80               }
81             }
82               break;
83             case 2 : {
84               Handle(TColStd_HArray1OfReal) attrReal = new TColStd_HArray1OfReal(1,avc);
85               list2->SetValue(i,k,attrReal);
86               Standard_Real item;
87               for (j = 1; j <= avc; j ++) {
88                 //st = PR.ReadReal(PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
89                 if (PR.ReadReal(PR.Current(),"Value",item))
90                   attrReal->SetValue(j,item);
91               }
92             }
93               break;
94             case 3 : {
95               Handle(Interface_HArray1OfHAsciiString) attrStr = new Interface_HArray1OfHAsciiString(1,avc);
96               list2->SetValue(i,k,attrStr);
97               Handle(TCollection_HAsciiString) item;
98               for (j = 1; j <= avc; j ++) {
99                 //st = PR.ReadText(PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
100                 if (PR.ReadText(PR.Current(),"Value",item))
101                   attrStr->SetValue(j,item);
102               }
103             }
104               break;
105             case 4 : {
106               Handle(IGESData_HArray1OfIGESEntity) attrEnt = new IGESData_HArray1OfIGESEntity(1,avc);
107               list2->SetValue(i,k,attrEnt);
108               Handle(IGESData_IGESEntity) item;
109               for (j = 1; j <= avc; j ++) {
110                 //st = PR.ReadEntity(IR,PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
111                 if (PR.ReadEntity(IR,PR.Current(),"Value",item))
112                   attrEnt->SetValue(j,item);
113               }
114             }
115               break;
116             case 5 :
117               for (j = 1; j <= avc; j ++)
118                   PR.SetCurrentNumber(PR.CurrentNumber() + 1);  // skip
119               break;
120             case 6 : {    // Here item takes value 0 or 1
121               Handle(TColStd_HArray1OfInteger) attrInt  = new TColStd_HArray1OfInteger(1,avc);
122               list2->SetValue(i,k,attrInt);
123               Standard_Integer item;
124               for (j = 1; j <= avc; j ++) {
125                   //st = PR.ReadInteger(PR.Current(),"Value",item); //szv#4:S4163:12Mar99 moved in if
126                   if (PR.ReadInteger(PR.Current(),"Value",item))
127                     attrInt->SetValue(j,item);
128                 }
129             }
130               break;
131               default : break;
132             }
133         }
134     }
135   DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
136   ent->Init(list2);
137 }
138
139 void  IGESDefs_ToolAttributeTable::WriteOwnParams
140   (const Handle(IGESDefs_AttributeTable)& ent, IGESData_IGESWriter& IW) const 
141 {
142   Handle(IGESDefs_AttributeDef) ab = ent->Definition();
143
144   Standard_Integer nr = ent->NbRows();
145   Standard_Integer na = ent->NbAttributes();
146   if (ent->FormNumber() == 1) IW.Send(nr);
147   for (Standard_Integer k = 1; k <= nr; k ++)
148     {
149       for (Standard_Integer i = 1; i <= na; i ++)
150         {
151           Standard_Integer count = ab->AttributeValueCount(i);
152           for (Standard_Integer j = 1;j <= count; j++)
153             {
154               switch(ab->AttributeValueDataType(i))
155                 {
156                 case 0 : IW.SendVoid();  break;
157                 case 1 : IW.Send(ent->AttributeAsInteger(i,k,j));  break;
158                 case 2 : IW.Send(ent->AttributeAsReal   (i,k,j));  break;
159                 case 3 : IW.Send(ent->AttributeAsString (i,k,j));  break;
160                 case 4 : IW.Send(ent->AttributeAsEntity (i,k,j));  break;
161                 case 5 : IW.SendVoid();  break;
162                 case 6 : IW.SendBoolean(ent->AttributeAsLogical(i,k,j)); break;
163                 default : break;
164                 }
165             }
166         }
167     }
168 }
169
170 void  IGESDefs_ToolAttributeTable::OwnShared
171   (const Handle(IGESDefs_AttributeTable)& ent, Interface_EntityIterator& iter) const
172 {
173   Handle(IGESDefs_AttributeDef) ab = ent->Definition();
174   Standard_Integer na = ent->NbAttributes();
175   Standard_Integer nr = ent->NbRows();
176   for (Standard_Integer k = 1; k <= nr; k ++)
177     {
178       for (Standard_Integer i = 1; i <= na; i ++)
179         {
180           if (ab->AttributeValueDataType(i) != 4) continue;
181           Standard_Integer avc = ab->AttributeValueCount(i);
182           for (Standard_Integer j = 1; j <= avc; j ++)
183             iter.GetOneItem(ent->AttributeAsEntity(i,k,j));
184         }
185     }
186 }
187
188 void  IGESDefs_ToolAttributeTable::OwnCopy
189   (const Handle(IGESDefs_AttributeTable)& another,
190    const Handle(IGESDefs_AttributeTable)& ent, Interface_CopyTool& TC) const
191
192   Standard_Integer j = 1;
193   Handle(IGESDefs_AttributeDef) ab = another->Definition();
194   Standard_Integer na = another->NbAttributes();
195   Standard_Integer nr = another->NbRows();
196   Handle(TColStd_HArray2OfTransient) list2 =
197     new TColStd_HArray2OfTransient(1,na,1,nr);
198   for (Standard_Integer k = 1; k <= nr; k ++)
199     {
200       for (Standard_Integer i = 1; i <= na; i ++)
201         {
202           Standard_Integer avc   = ab->AttributeValueCount(i);
203           Standard_Integer atype = ab->AttributeValueDataType(i);
204           switch (atype)
205             {
206             case 0 : ////    list2->SetValue(i,k,NULL);    par defaut
207               break;
208             case 1 : {
209               DeclareAndCast(TColStd_HArray1OfInteger,otherInt,
210                              another->AttributeList(i,k));
211               Handle(TColStd_HArray1OfInteger) attrInt  =
212                 new TColStd_HArray1OfInteger (1,avc);
213               list2->SetValue(i,k,attrInt);
214               for (j = 1; j <= avc; j++)
215                 attrInt->SetValue(j,otherInt->Value(j));
216             }
217               break;
218             case 2 : {
219               DeclareAndCast(TColStd_HArray1OfReal,otherReal,
220                              another->AttributeList(i,k));
221               Handle(TColStd_HArray1OfReal) attrReal  =
222                 new TColStd_HArray1OfReal (1,avc);
223               list2->SetValue(i,k,attrReal);
224               for (j = 1; j <= avc; j++)
225                 attrReal->SetValue(j,otherReal->Value(j));
226             }
227               break;
228             case 3 : {
229               DeclareAndCast(Interface_HArray1OfHAsciiString,otherStr,
230                              another->AttributeList(i,k));
231               Handle(Interface_HArray1OfHAsciiString) attrStr  =
232                 new Interface_HArray1OfHAsciiString (1,avc);
233               list2->SetValue(i,k,attrStr);
234               for (j = 1; j <= avc; j++)
235                 attrStr->SetValue
236                   (j,new TCollection_HAsciiString(otherStr->Value(j)));
237             }
238               break;
239             case 4 : {
240               DeclareAndCast(IGESData_HArray1OfIGESEntity,otherEnt,
241                              another->AttributeList(i,k));
242               Handle(IGESData_HArray1OfIGESEntity) attrEnt  =
243                 new IGESData_HArray1OfIGESEntity (1,avc);
244               list2->SetValue(i,k,attrEnt);
245               for (j = 1; j <= avc; j++)
246                 attrEnt->SetValue(j,GetCasted(IGESData_IGESEntity,
247                                               TC.Transferred(otherEnt->Value(j))));
248             }
249               break;
250             case 5 : /////            list2->SetValue(i,k,NULL);    par defaut
251               break;
252             case 6 :{    // Here item takes value 0 or 1
253               DeclareAndCast(TColStd_HArray1OfInteger,otherInt,
254                              another->AttributeList(i,k));
255               Handle(TColStd_HArray1OfInteger) attrInt  =
256                 new TColStd_HArray1OfInteger (1,avc);
257               list2->SetValue(i,k,attrInt);
258               for (j = 1; j <= avc; j++)
259                 attrInt->SetValue(j,otherInt->Value(j));
260             }
261               break;
262               default : break;
263             }
264         }
265     }
266   ent->Init(list2);
267 }
268
269 IGESData_DirChecker  IGESDefs_ToolAttributeTable::DirChecker
270   (const Handle(IGESDefs_AttributeTable)& /* ent */ ) const 
271
272   IGESData_DirChecker DC(422,0,1);
273   DC.Structure(IGESData_DefReference);
274   DC.GraphicsIgnored();
275   DC.BlankStatusIgnored();
276   DC.HierarchyStatusIgnored();
277   return DC;
278 }
279
280 void  IGESDefs_ToolAttributeTable::OwnCheck
281   (const Handle(IGESDefs_AttributeTable)& ent,
282    const Interface_ShareTool& , Handle(Interface_Check)& ach) const 
283 {
284   if (ent->Definition().IsNull())
285     if (ent->HasStructure()) ach->AddFail
286       ("Structure in Directory Entry is not an Attribute Definition Table");
287     else ach->AddFail("No Attribute Definition defined");
288   if (ent->FormNumber() == 0 && ent->NbRows() != 1)
289     ach->AddFail("Form 0 with several Rows");
290   if (ent->NbAttributes() != ent->Definition()->NbAttributes())
291     ach->AddFail("Mismatch between Definition (Structure) and Content");
292 }
293
294 void  IGESDefs_ToolAttributeTable::OwnDump
295   (const Handle(IGESDefs_AttributeTable)& ent, const IGESData_IGESDumper& dumper,
296    const Handle(Message_Messenger)& S, const Standard_Integer level) const
297
298   S << "IGESDefs_AttributeTable" << endl;
299
300   Handle(IGESDefs_AttributeDef) ab = ent->Definition();
301
302   Standard_Integer na = ent->NbAttributes();
303   Standard_Integer nr = ent->NbRows();
304   if (ent->FormNumber() == 1)
305     S << "Number of Rows (i.e. complete sets of Attributes) : " << nr << endl;
306   else S << "One set of Attributes" << endl;
307   S << "Number of defined Attributes : " << na << endl;
308   if (level <= 4) S <<
309     " [ structure : see Structure in Directory Entry; content : level > 4 ]" <<endl;
310   else
311     for (Standard_Integer k = 1; k <= nr; k ++)
312       {
313         for (Standard_Integer i = 1; i <= na; i ++)
314           {
315             Standard_Integer avc = ab->AttributeValueCount(i);
316             S << "[At.no."<<i<<" Row:"<<k<<"]";
317             switch (ab->AttributeValueDataType(i)) {
318               case 0 : S << "  (Void) ";   break;
319               case 1 : S << "  Integer";  break;
320               case 2 : S << "  Real   ";  break;
321               case 3 : S << "  String ";  break;
322               case 4 : S << "  Entity ";  break;
323               case 5 : S << " (Not used)"; break;
324               case 6 : S << "  Logical";  break;
325               default : break;
326             }
327             S << " :";
328             for (Standard_Integer j = 1;j <= avc; j++) {
329               S << "  ";
330               switch(ab->AttributeValueDataType(i)) {
331                 case 1 : S << ent->AttributeAsInteger(i,k,j);  break;
332                 case 2 : S << ent->AttributeAsReal   (i,k,j);  break;
333                 case 3 : IGESData_DumpString(S,ent->AttributeAsString (i,k,j));
334                   break;
335                 case 4 : dumper.Dump(ent->AttributeAsEntity (i,k,j),S,level-5);
336                   break;
337                 case 6 : S << (ent->AttributeAsLogical(i,k,j) ? "True" : "False");
338                   break;
339                 default : break;
340               }
341             }
342             S << endl;
343           }
344       }
345   S << endl;
346 }