Integration of OCCT 6.5.0 from SVN
[occt.git] / src / IGESAppli / IGESAppli_ToolElementResults.cxx
1 //--------------------------------------------------------------------
2 //
3 //  File Name : IGESAppli_ElementResults.cxx
4 //  Date      :
5 //  Author    : CKY / Contract Toubro-Larsen
6 //  Copyright : MATRA-DATAVISION 1993
7 //
8 //--------------------------------------------------------------------
9
10 // UNFINISHED & UNSTARTED
11 #include <IGESAppli_ToolElementResults.ixx>
12 #include <IGESData_ParamCursor.hxx>
13 #include <TColStd_HArray1OfReal.hxx>
14 #include <TColStd_HArray1OfInteger.hxx>
15 #include <IGESBasic_HArray1OfHArray1OfReal.hxx>
16 #include <IGESBasic_HArray1OfHArray1OfInteger.hxx>
17 #include <IGESAppli_FiniteElement.hxx>
18 #include <IGESAppli_HArray1OfFiniteElement.hxx>
19 #include <IGESDimen_GeneralNote.hxx>
20 #include <IGESData_Dump.hxx>
21 #include <Interface_Macros.hxx>
22 #include <stdio.h>
23
24
25 IGESAppli_ToolElementResults::IGESAppli_ToolElementResults ()    {  }
26
27      
28 void  IGESAppli_ToolElementResults::ReadOwnParams
29   (const Handle(IGESAppli_ElementResults)& ent,
30    const Handle(IGESData_IGESReaderData)& IR, IGESData_ParamReader& PR)  const
31 {
32   //Standard_Boolean st; //szv#4:S4163:12Mar99 not needed
33   Standard_Integer num = 0;
34   Handle(IGESDimen_GeneralNote) aNote;
35   Standard_Integer aSubcaseNumber = 0;
36   Standard_Real    aTime = 0;
37   Standard_Integer nv = 0;
38   Standard_Integer aResultReportFlag = 0;
39   Handle(TColStd_HArray1OfInteger) allElementIdentifiers;
40   Handle(IGESAppli_HArray1OfFiniteElement)    allElements;
41   Handle(TColStd_HArray1OfInteger) allElementTopologyType;
42   Handle(TColStd_HArray1OfInteger) allNbLayers;
43   Handle(TColStd_HArray1OfInteger) allDataLayerFlag;
44   Handle(TColStd_HArray1OfInteger) allNbResultDataLocs;
45   Handle(IGESBasic_HArray1OfHArray1OfInteger) allResultDataLoc;
46   Handle(IGESBasic_HArray1OfHArray1OfReal)    allResultData;
47
48   //szv#4:S4163:12Mar99 `st=` not needed
49   PR.ReadEntity(IR, PR.Current(), "General Note", STANDARD_TYPE(IGESDimen_GeneralNote), aNote);
50   PR.ReadInteger(PR.Current(), "Subcase Number", aSubcaseNumber);
51   PR.ReadReal(PR.Current(), "Time", aTime);
52   PR.ReadInteger(PR.Current(), "Number of Result Values", nv);
53   PR.ReadInteger(PR.Current(), "Result Report Flag", aResultReportFlag);
54   PR.ReadInteger(PR.Current(), "Number of Finite Elements", num);
55
56   if (num > 0) {
57     allElementIdentifiers  = new TColStd_HArray1OfInteger(1, num);
58     allElements            = new IGESAppli_HArray1OfFiniteElement(1, num);
59     allElementTopologyType = new TColStd_HArray1OfInteger(1, num);
60     allNbLayers            = new TColStd_HArray1OfInteger(1, num);
61     allDataLayerFlag       = new TColStd_HArray1OfInteger(1, num);
62     allNbResultDataLocs    = new TColStd_HArray1OfInteger(1, num);
63     allResultDataLoc       = new IGESBasic_HArray1OfHArray1OfInteger(1, num);
64     allResultData          = new IGESBasic_HArray1OfHArray1OfReal(1, num);
65 // ??  WHAT ABOUT FILLING  ?
66   }
67   else PR.AddFail("Number of Finite Elements: Not Positive");
68
69   for (Standard_Integer nume = 1; nume <= num; nume ++) {
70     Standard_Integer ival, nl, nrl, numv;
71     ival = nl = nrl = numv = 0;
72     Handle(IGESAppli_FiniteElement) aFEM;
73     Handle(TColStd_HArray1OfInteger) rdrl;
74     Handle(TColStd_HArray1OfReal) vres;
75     //szv#4:S4163:12Mar99 moved in if
76     if (PR.ReadInteger (PR.Current(), "FEM Element Identifier", ival))
77       allElementIdentifiers->SetValue(nume,ival);
78     if (PR.ReadEntity (IR,PR.Current(), "FEM Element Entity", STANDARD_TYPE(IGESAppli_FiniteElement), aFEM))
79       allElements->SetValue (nume,aFEM);
80     if (PR.ReadInteger (PR.Current(), "FEM Element Topology Type", ival))
81       allElementTopologyType->SetValue (nume,ival);
82     if (PR.ReadInteger (PR.Current(), "Nb. of layers", nl))
83       allNbLayers->SetValue (nume,nl);
84     if (PR.ReadInteger (PR.Current(), "Data Layer Flag", ival))
85       allDataLayerFlag->SetValue (nume,ival);
86     if (PR.ReadInteger (PR.Current(), "Nb. of result data locations", nrl))
87       allNbResultDataLocs->SetValue (nume,nrl);
88     if (PR.ReadInts (PR.CurrentList(nrl), "Result data locations", rdrl))
89       allResultDataLoc->SetValue (nume,rdrl);
90     PR.ReadInteger (PR.Current(), "Nb. of result data locations", numv); //szv#4:S4163:12Mar99 `st=` not needed
91     if (PR.ReadReals (PR.CurrentList(numv), "Result Data", vres))
92       allResultData->SetValue(nume,vres);
93   }
94
95   DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
96   ent->Init(aNote, aSubcaseNumber, aTime, nv, aResultReportFlag,
97             allElementIdentifiers, allElements, allElementTopologyType,
98             allNbLayers, allDataLayerFlag, allNbResultDataLocs,
99             allResultDataLoc, allResultData);
100 }
101
102 void  IGESAppli_ToolElementResults::WriteOwnParams
103   (const Handle(IGESAppli_ElementResults)& ent, IGESData_IGESWriter& IW) const
104 {
105   Standard_Integer i,j;  Standard_Integer num = ent->NbElements();
106   IW.Send(ent->Note());
107   IW.Send(ent->SubCaseNumber());
108   IW.Send(ent->Time());
109   IW.Send(ent->NbResultValues());
110   IW.Send(ent->ResultReportFlag());
111   IW.Send(num);
112   for ( i = 1; i <= num; i++ ) {
113     Standard_Integer nl   = ent->NbLayers(i);
114     Standard_Integer nrl  = ent->NbResultDataLocs(i);
115     Standard_Integer numv = ent->NbResults(i);
116     IW.Send(ent->ElementIdentifier(i));
117     IW.Send(ent->Element(i));
118     IW.Send(ent->ElementTopologyType(i));
119     IW.Send(nl);
120     IW.Send(ent->DataLayerFlag(i));
121     IW.Send(nrl);
122     for (j = 1; j <= nrl;  j ++) IW.Send(ent->ResultDataLoc(i,j));
123     IW.Send(numv);
124     for (j = 1; j <= numv; j ++) IW.Send(ent->ResultData(i,j));
125   }
126 }
127
128 void  IGESAppli_ToolElementResults::OwnShared
129   (const Handle(IGESAppli_ElementResults)& ent, Interface_EntityIterator& iter) const
130 {
131   Standard_Integer i; Standard_Integer num = ent->NbElements();
132   iter.GetOneItem(ent->Note());
133   for ( i = 1; i <= num; i++ )
134     iter.GetOneItem(ent->Element(i));
135 }
136
137 void  IGESAppli_ToolElementResults::OwnCopy
138   (const Handle(IGESAppli_ElementResults)& another,
139    const Handle(IGESAppli_ElementResults)& ent, Interface_CopyTool& TC) const
140 {
141   Standard_Integer i,j;
142   Standard_Integer num = another->NbElements();
143   DeclareAndCast(IGESDimen_GeneralNote,aNote,TC.Transferred(another->Note()));
144   Standard_Integer aSubcaseNumber = another->SubCaseNumber();
145   Standard_Real    aTime = another->Time();
146   Standard_Integer nv    = another->NbResultValues();
147   Standard_Integer aResultReportFlag = another->ResultReportFlag();
148
149   Handle(TColStd_HArray1OfInteger) allElementIdentifiers;
150   Handle(IGESAppli_HArray1OfFiniteElement)    allElements;
151   Handle(TColStd_HArray1OfInteger) allElementTopologyType;
152   Handle(TColStd_HArray1OfInteger) allNbLayers;
153   Handle(TColStd_HArray1OfInteger) allDataLayerFlag;
154   Handle(TColStd_HArray1OfInteger) allNbResultDataLocs;
155   Handle(IGESBasic_HArray1OfHArray1OfInteger) allResultDataLoc;
156   Handle(IGESBasic_HArray1OfHArray1OfReal)    allResultData;
157   if (num > 0) {
158     allElementIdentifiers  = new TColStd_HArray1OfInteger(1, num);
159     allElements            = new IGESAppli_HArray1OfFiniteElement(1, num);
160     allElementTopologyType = new TColStd_HArray1OfInteger(1, num);
161     allNbLayers            = new TColStd_HArray1OfInteger(1, num);
162     allDataLayerFlag       = new TColStd_HArray1OfInteger(1, num);
163     allNbResultDataLocs    = new TColStd_HArray1OfInteger(1, num);
164     allResultDataLoc       = new IGESBasic_HArray1OfHArray1OfInteger(1, num);
165     allResultData          = new IGESBasic_HArray1OfHArray1OfReal(1, num);
166   }
167   for (i = 1; i <= num; i ++) {
168     Standard_Integer nl,nrl,numv;
169     allElementIdentifiers->SetValue(i,another->ElementIdentifier(i));
170     allElements->SetValue
171       (i,GetCasted(IGESAppli_FiniteElement,TC.Transferred(another->Element(i))));
172     allElementTopologyType->SetValue(i,another->ElementTopologyType(i));
173     nl   = another->NbLayers(i);
174     allNbLayers->SetValue(i,nl);
175     allDataLayerFlag->SetValue(i,another->DataLayerFlag(i));
176     nrl  = another->NbResultDataLocs(i);
177     allNbResultDataLocs->SetValue(i,nrl);
178     Handle(TColStd_HArray1OfInteger) rdrl = new TColStd_HArray1OfInteger(1,nrl);
179     allResultDataLoc->SetValue(i,rdrl);
180     for (j = 1; j <= nrl; j ++) rdrl->SetValue(j,another->ResultDataLoc(i,j));
181     numv = another->NbResults(i);
182     Handle(TColStd_HArray1OfReal) vres = new TColStd_HArray1OfReal(1,numv);
183     for (j = 1; j <= numv; j ++) vres->SetValue(j,another->ResultData(i,j));
184     allResultData->SetValue(i,vres);
185   }
186   ent->Init
187     (aNote, aSubcaseNumber, aTime, nv, aResultReportFlag,
188      allElementIdentifiers, allElements, allElementTopologyType,
189      allNbLayers, allDataLayerFlag, allNbResultDataLocs,
190      allResultDataLoc, allResultData);
191   ent->SetFormNumber(another->FormNumber());
192 }
193
194
195 IGESData_DirChecker  IGESAppli_ToolElementResults::DirChecker
196   (const Handle(IGESAppli_ElementResults)& /* ent  */) const
197 {
198   IGESData_DirChecker DC(148, 0, 34);
199   DC.Structure(IGESData_DefVoid);
200   DC.GraphicsIgnored();
201   DC.LineFont(IGESData_DefVoid);
202   DC.LineWeight(IGESData_DefVoid);
203   DC.Color(IGESData_DefAny);
204   DC.BlankStatusIgnored();
205   DC.UseFlagRequired(3);
206   DC.HierarchyStatusIgnored();
207   return DC;
208 }
209
210 void  IGESAppli_ToolElementResults::OwnCheck
211   (const Handle(IGESAppli_ElementResults)& ent,
212    const Interface_ShareTool& , Handle(Interface_Check)& ach) const
213   // UNFINISHED
214 {
215   Standard_Integer rrf = ent->ResultReportFlag();
216   if (rrf < 0 || rrf > 3) ach->AddFail("Result Report Flag not in [0-3]");
217   Standard_Integer nv = ent->NbResultValues();
218   Standard_Boolean OK = Standard_True;
219   switch (ent->FormNumber()) {
220     case  0 : if (nv <  0) OK = Standard_False;  break;
221     case  1 : if (nv != 1) OK = Standard_False;  break;
222     case  2 : if (nv != 1) OK = Standard_False;  break;
223     case  3 : if (nv != 3) OK = Standard_False;  break;
224     case  4 : if (nv != 6) OK = Standard_False;  break;
225     case  5 : if (nv != 3) OK = Standard_False;  break;
226     case  6 : if (nv != 3) OK = Standard_False;  break;
227     case  7 : if (nv != 3) OK = Standard_False;  break;
228     case  8 : if (nv != 3) OK = Standard_False;  break;
229     case  9 : if (nv != 3) OK = Standard_False;  break;
230     case 10 : if (nv != 1) OK = Standard_False;  break;
231     case 11 : if (nv != 1) OK = Standard_False;  break;
232     case 12 : if (nv != 3) OK = Standard_False;  break;
233     case 13 : if (nv != 1) OK = Standard_False;  break;
234     case 14 : if (nv != 1) OK = Standard_False;  break;
235     case 15 : if (nv != 3) OK = Standard_False;  break;
236     case 16 : if (nv != 1) OK = Standard_False;  break;
237     case 17 : if (nv != 3) OK = Standard_False;  break;
238     case 18 : if (nv != 3) OK = Standard_False;  break;
239     case 19 : if (nv != 3) OK = Standard_False;  break;
240     case 20 : if (nv != 3) OK = Standard_False;  break;
241     case 21 : if (nv != 3) OK = Standard_False;  break;
242     case 22 : if (nv != 3) OK = Standard_False;  break;
243     case 23 : if (nv != 6) OK = Standard_False;  break;
244     case 24 : if (nv != 6) OK = Standard_False;  break;
245     case 25 : if (nv != 6) OK = Standard_False;  break;
246     case 26 : if (nv != 6) OK = Standard_False;  break;
247     case 27 : if (nv != 6) OK = Standard_False;  break;
248     case 28 : if (nv != 6) OK = Standard_False;  break;
249     case 29 : if (nv != 9) OK = Standard_False;  break;
250     case 30 : if (nv != 9) OK = Standard_False;  break;
251     case 31 : if (nv != 9) OK = Standard_False;  break;
252     case 32 : if (nv != 9) OK = Standard_False;  break;
253     case 33 : if (nv != 9) OK = Standard_False;  break;
254     case 34 : if (nv != 9) OK = Standard_False;  break;
255     default : ach->AddFail("Incorrect Form Number");    break;
256   }
257   if (!OK) ach->AddFail
258     ("Incorrect count of real values in array V for FEM node");
259   Standard_Integer ne = ent->NbElements();
260   for (Standard_Integer i = 1; i <= ne; i ++) {
261     char mess[100];
262     Standard_Integer dlf = ent->DataLayerFlag(i);
263     Standard_Integer nl  = ent->NbLayers(i);
264     Standard_Integer nrl = ent->NbResultDataLocs(i);
265     if (dlf < 0 || dlf > 4)
266       ach->AddFail("One of the Data Layer Flags not in [0-4]");
267     if (dlf < 4 && ent->NbLayers(i) != 1) {
268       sprintf(mess,"Nb. of Layers n0.%d not ONE while Data Layer Flag is in [0-3]",i);
269       ach->AddFail(mess);
270     }
271     if (rrf == 1 || rrf == 2)
272       if (nrl != 1 || ent->ResultDataLoc(i,1) != 0) {
273         sprintf(mess,"Result Data Locs n0.%d incorrect for Result Report = 1 or 2",i);
274         ach->AddFail(mess);
275       }
276     if (ent->NbResults(i) != (nv*nl*nrl)) {
277       sprintf(mess,"Nb. of results for Element n0.%d incorrect, should be %d",
278               i,nv*nl*nrl);
279       ach->AddFail(mess);
280     }
281   }
282 }
283
284 void  IGESAppli_ToolElementResults::OwnDump
285   (const Handle(IGESAppli_ElementResults)& ent, const IGESData_IGESDumper& dumper,
286    const Handle(Message_Messenger)& S, const Standard_Integer level) const // UNFINISHED
287 {
288   Standard_Integer sublevel = (level > 4) ? 1 : 0;
289   S << "IGESAppli_ElementResults" << endl;
290   S << "General Note   : ";
291   dumper.Dump(ent->Note(),S, sublevel);
292   S << endl;
293   S << "Subcase Number : " << ent->SubCaseNumber() << endl;
294   S << "Time           : " << ent->Time() << endl;
295   S << "Number of Result Values : " << ent->NbResultValues() << endl;
296   S << "Result Report Flag  : " << ent->ResultReportFlag() << endl;
297   S << "Element Identifiers : ";
298   IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->ElementIdentifier);
299   S << endl << "Elements : ";
300   IGESData_DumpEntities(S,dumper ,level,1, ent->NbElements(),ent->Element);
301   S << endl << "Element Topology Types : ";
302   IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->ElementTopologyType);
303   S << endl << "Numbers of Layers      : ";
304   IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->NbLayers);
305   S << endl << "Data Layer Flags       : ";
306   IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->DataLayerFlag);
307   S << endl << "Numbers of Result Data Locations : ";
308   IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->NbResultDataLocs);
309   S << endl << "Result Data Locations : ";  S << " TO BE DONE  ";
310
311 //  ??  A VERIFIER DE PRES, pas du tout sur que ce soit bon
312 //      cf aussi Write et Copy
313   if (level <= 4) S << " [ ask level > 4 for more, > 5 for complete ]" << endl;
314   else {
315     Standard_Integer i;// svv Jan 10 2000 : porting on DEC 
316     for (i = 1; i <= ent->NbElements(); i ++) {
317       Standard_Integer nloc = ent->NbResultDataLocs(i);
318       S << " ["<<i<<":NbLoc="<<nloc<<"]:";
319       for (Standard_Integer j = 1; j <= nloc; j ++)
320         S << " " << ent->ResultDataLoc (i,j);
321       S << endl;
322     }
323     S << "Result Data : ";
324
325     for (i = 1; i <= ent->NbElements(); i ++) {
326       Standard_Integer nres = ent->NbResults(i);
327       S << " ["<<i<<":NbRes="<<nres<<"]:";
328       if (level <= 5) S << " [ ask level > 5 for complete Data ]" << endl;
329       else {
330         for (Standard_Integer j = 1; j <= nres; j ++)
331           S << " " << ent->ResultData(i,j);    // ?? is it all ?? UNFINISHED
332       }
333     }
334   }
335 }