0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- prepar...
[occt.git] / src / IGESSolid / IGESSolid_ToolLoop.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 //pdn 20.04.99 STC22655 avoid of exceptions on empty loops
19
20 #include <IGESBasic_HArray1OfHArray1OfIGESEntity.hxx>
21 #include <IGESBasic_HArray1OfHArray1OfInteger.hxx>
22 #include <IGESData_DirChecker.hxx>
23 #include <IGESData_Dump.hxx>
24 #include <IGESData_HArray1OfIGESEntity.hxx>
25 #include <IGESData_IGESDumper.hxx>
26 #include <IGESData_IGESEntity.hxx>
27 #include <IGESData_IGESReaderData.hxx>
28 #include <IGESData_IGESWriter.hxx>
29 #include <IGESData_ParamCursor.hxx>
30 #include <IGESData_ParamReader.hxx>
31 #include <IGESData_Status.hxx>
32 #include <IGESSolid_EdgeList.hxx>
33 #include <IGESSolid_Loop.hxx>
34 #include <IGESSolid_ToolLoop.hxx>
35 #include <IGESSolid_VertexList.hxx>
36 #include <Interface_Check.hxx>
37 #include <Interface_CopyTool.hxx>
38 #include <Interface_EntityIterator.hxx>
39 #include <Interface_Macros.hxx>
40 #include <Interface_ShareTool.hxx>
41 #include <Message_Msg.hxx>
42 #include <Standard_DomainError.hxx>
43 #include <TColStd_HArray1OfInteger.hxx>
44
45 #include <stdio.h>
46 // MGE 03/08/98
47 //=======================================================================
48 //function : IGESSolid_ToolLoop
49 //purpose  : 
50 //=======================================================================
51 IGESSolid_ToolLoop::IGESSolid_ToolLoop ()
52 {
53 }
54
55
56 //=======================================================================
57 //function : ReadOwnParams
58 //purpose  : 
59 //=======================================================================
60
61 void IGESSolid_ToolLoop::ReadOwnParams (const Handle(IGESSolid_Loop)& ent,
62                                         const Handle(IGESData_IGESReaderData)& IR,
63                                         IGESData_ParamReader& PR) const
64 {
65   // MGE 03/08/98
66
67   Standard_Boolean abool; //szv#4:S4163:12Mar99 `st` moved down
68   Standard_Integer nbedges = 0;
69   Standard_Integer i, j;
70   Standard_Integer anint;
71   Handle(IGESData_IGESEntity) anent;
72   Handle(TColStd_HArray1OfInteger) tempTypes;
73   Handle(IGESData_HArray1OfIGESEntity) tempEdges;
74   Handle(TColStd_HArray1OfInteger) tempIndex;
75   Handle(TColStd_HArray1OfInteger) tempOrientation;
76   Handle(TColStd_HArray1OfInteger) nbParameterCurves;
77   Handle(IGESBasic_HArray1OfHArray1OfInteger) isoparametricFlags;
78   Handle(IGESBasic_HArray1OfHArray1OfIGESEntity) tempCurves;
79   IGESData_Status aStatus;
80
81   //st = PR.ReadInteger(PR.Current(),Msg184, nbedges); //szv#4:S4163:12Mar99 moved in if
82   //st = PR.ReadInteger(PR.Current(), "Number of edges", nbedges);
83   Standard_Boolean sb = PR.ReadInteger(PR.Current(), nbedges);
84   if (sb && (nbedges > 0)) {
85    
86     Message_Msg Msg180("XSTEP_180");
87     Message_Msg Msg190("XSTEP_190");
88
89     tempTypes = new TColStd_HArray1OfInteger(1, nbedges);
90     tempEdges = new IGESData_HArray1OfIGESEntity(1, nbedges);
91     tempIndex = new TColStd_HArray1OfInteger(1, nbedges);
92     tempOrientation = new TColStd_HArray1OfInteger(1, nbedges);
93     nbParameterCurves = new TColStd_HArray1OfInteger(1, nbedges);
94     isoparametricFlags =
95       new IGESBasic_HArray1OfHArray1OfInteger(1, nbedges);
96     tempCurves =
97       new IGESBasic_HArray1OfHArray1OfIGESEntity(1, nbedges);
98     
99     for (i=1; i<= nbedges; i++)
100       {
101         //st = PR.ReadInteger(PR.Current(), Msg190, anint); //szv#4:S4163:12Mar99 moved in if
102         //st = PR.ReadInteger(PR.Current(), "Edge types", anint);
103         if (PR.ReadInteger(PR.Current(), anint))
104           tempTypes->SetValue(i, anint);
105         else  PR.SendFail(Msg190);
106         
107         if (!PR.ReadEntity(IR, PR.Current(), aStatus, anent)){ //szv#4:S4163:12Mar99 `st=` not needed
108             Message_Msg Msg193("XSTEP_193");
109             switch(aStatus) {
110             case IGESData_ReferenceError: {  
111               Message_Msg Msg216 ("IGES_216");
112               Msg193.Arg(Msg216.Value());
113               PR.SendFail(Msg193);
114               break; }
115             case IGESData_EntityError: {
116               Message_Msg Msg217 ("IGES_217");
117               Msg193.Arg(Msg217.Value());
118               PR.SendFail(Msg193);
119               break; }
120             default:{
121             }
122             }
123           }
124         //st = PR.ReadEntity(IR, PR.Current(), "Edges", anent);
125         //if (!st) {  }    // WARNING : Two possible Types : //szv#4:S4163:12Mar99 not needed
126         if (!anent->IsKind(STANDARD_TYPE(IGESSolid_VertexList))
127             && !anent->IsKind(STANDARD_TYPE(IGESSolid_EdgeList)) )
128           PR.SendFail(Msg190);
129         else  tempEdges->SetValue(i, anent);
130         
131         //st = PR.ReadInteger(PR.Current(), Msg191, anint); //szv#4:S4163:12Mar99 moved in if
132         //st = PR.ReadInteger(PR.Current(), "List index", anint);
133         if (PR.ReadInteger(PR.Current(), anint))
134           tempIndex->SetValue(i, anint);
135         else{
136           Message_Msg Msg191("XSTEP_191");
137           PR.SendFail(Msg191);
138         }
139         
140         //st = PR.ReadBoolean(PR.Current(), Msg180, abool); //szv#4:S4163:12Mar99 moved in if
141         //st = PR.ReadBoolean(PR.Current(), "Orientation flags", abool);
142         if (PR.ReadBoolean(PR.Current(), Msg180, abool))
143           tempOrientation->SetValue(i, (abool ? 1 : 0));    // bool;
144         
145         Standard_Boolean st = PR.ReadInteger(PR.Current(),anint);
146         if(!st){
147           Message_Msg Msg192("XSTEP_192");
148           PR.SendFail(Msg192);
149         }
150         //st = PR.ReadInteger(PR.Current(), "Number of parameter curves", anint);
151         if (st && anint > 0)
152           {
153             Message_Msg Msg195("XSTEP_195");
154             nbParameterCurves->SetValue(i, anint);
155             Handle(IGESData_HArray1OfIGESEntity) tmpents =
156               new IGESData_HArray1OfIGESEntity(1, anint);
157             Handle(TColStd_HArray1OfInteger) tmpints =
158               new TColStd_HArray1OfInteger(1, anint);
159             for (j = 1; j <= anint; j ++)
160               {
161                 //st = PR.ReadBoolean(PR.Current(), Msg195, abool); //szv#4:S4163:12Mar99 moved in if
162                 //st = PR.ReadBoolean(PR.Current(), "Isoparametric flags", abool);
163                 if (PR.ReadBoolean(PR.Current(), Msg195, abool))
164                   tmpints->SetValue(j, (abool ? 1 : 0));    // bool;
165                 
166                 //st = PR.ReadEntity(IR, PR.Current(), Msg194, anent); //szv#4:S4163:12Mar99 moved in if
167                 //st = PR.ReadEntity(IR, PR.Current(), "Curves", anent);
168                 if (PR.ReadEntity(IR, PR.Current(), aStatus, anent))
169                   tmpents->SetValue(j, anent);
170                 else {
171                   Message_Msg Msg194("XSTEP_194");
172                   switch(aStatus) {
173                   case IGESData_ReferenceError: {  
174                     Message_Msg Msg216 ("IGES_216");
175                     Msg194.Arg(Msg216.Value());
176                     PR.SendFail(Msg194);
177                     break; }
178                   case IGESData_EntityError: {
179                     Message_Msg Msg217 ("IGES_217");
180                     Msg194.Arg(Msg217.Value());
181                     PR.SendFail(Msg194);
182                     break; }
183                   default:{
184                   }
185                   }
186                 }
187               }
188             isoparametricFlags->SetValue(i, tmpints);
189             tempCurves->SetValue(i, tmpents);
190           }
191         else  nbParameterCurves->SetValue(i, anint);
192       }
193   }
194   else {
195     //pdn 20.04.99 STC22655 avoid of exceptions on empty loops
196     Message_Msg Msg184("XSTEP_184");
197     PR.SendFail(Msg184);
198     return;
199   }   
200
201   DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
202   ent->Init
203     (tempTypes, tempEdges, tempIndex, tempOrientation,
204      nbParameterCurves, isoparametricFlags, tempCurves);
205 }
206
207
208 //=======================================================================
209 //function : WriteOwnParams
210 //purpose  : 
211 //=======================================================================
212
213 void IGESSolid_ToolLoop::WriteOwnParams(const Handle(IGESSolid_Loop)& ent,
214                                         IGESData_IGESWriter& IW) const
215 {
216   Standard_Integer i, j;
217   Standard_Integer length = ent->NbEdges();
218
219   IW.Send(length);
220   for (i = 1; i <= length; i ++)
221     {
222       IW.Send(ent->EdgeType(i));
223       IW.Send(ent->Edge(i));
224       IW.Send(ent->ListIndex(i));
225       IW.SendBoolean(ent->Orientation(i));
226       IW.Send(ent->NbParameterCurves(i));
227       for (j = 1; j <= ent->NbParameterCurves(i); j ++)
228         {
229           IW.SendBoolean(ent->IsIsoparametric(i,j));
230           IW.Send(ent->ParametricCurve(i,j));
231         }
232     }
233 }
234
235
236 //=======================================================================
237 //function : OwnShared
238 //purpose  : 
239 //=======================================================================
240
241 void IGESSolid_ToolLoop::OwnShared(const Handle(IGESSolid_Loop)& ent,
242                                    Interface_EntityIterator& iter) const
243 {
244   Standard_Integer i, j;
245   Standard_Integer length = ent->NbEdges();
246
247   for (i = 1; i <= length; i ++)
248     {
249       iter.GetOneItem(ent->Edge(i));
250       for (j = 1; j <= ent->NbParameterCurves(i); j ++)
251         iter.GetOneItem(ent->ParametricCurve(i,j));
252     }
253 }
254
255
256 //=======================================================================
257 //function : OwnCopy
258 //purpose  : 
259 //=======================================================================
260
261 void IGESSolid_ToolLoop::OwnCopy(const Handle(IGESSolid_Loop)& another,
262                                  const Handle(IGESSolid_Loop)& ent,
263                                  Interface_CopyTool& TC) const
264 {
265   Standard_Integer nbedges = another->NbEdges();
266   Standard_Integer i, j;
267   Standard_Integer anint;
268
269   Handle(TColStd_HArray1OfInteger) tempTypes =
270     new TColStd_HArray1OfInteger(1, nbedges);
271   Handle(IGESData_HArray1OfIGESEntity) tempEdges =
272     new IGESData_HArray1OfIGESEntity(1, nbedges);
273   Handle(TColStd_HArray1OfInteger) tempIndex =
274     new TColStd_HArray1OfInteger(1, nbedges);
275   Handle(TColStd_HArray1OfInteger) tempOrientation =
276     new TColStd_HArray1OfInteger(1, nbedges);
277   Handle(TColStd_HArray1OfInteger) nbParameterCurves =
278     new TColStd_HArray1OfInteger(1, nbedges);
279   Handle(IGESBasic_HArray1OfHArray1OfInteger) isoparametricFlags =
280     new IGESBasic_HArray1OfHArray1OfInteger(1, nbedges);
281   Handle(IGESBasic_HArray1OfHArray1OfIGESEntity) tempCurves =
282     new IGESBasic_HArray1OfHArray1OfIGESEntity(1, nbedges);
283
284   for (i = 1; i <= nbedges; i ++)
285     {
286       tempTypes->SetValue(i, another->EdgeType(i));
287
288       DeclareAndCast(IGESData_IGESEntity, anent,
289                      TC.Transferred(another->Edge(i)));
290       tempEdges->SetValue(i, anent);
291
292       tempIndex->SetValue(i, another->ListIndex(i));
293
294       tempOrientation->SetValue(i, (another->Orientation(i) ? 1 : 0) );
295
296       anint = another->NbParameterCurves(i);
297       nbParameterCurves->SetValue(i, anint);
298
299       Handle(IGESData_HArray1OfIGESEntity) tmpents;
300       if (anint > 0) tmpents = new IGESData_HArray1OfIGESEntity(1, anint);
301       Handle(TColStd_HArray1OfInteger) tmpints;
302       if (anint > 0) tmpints = new TColStd_HArray1OfInteger(1, anint);
303       for (j = 1; j <= anint; j ++)
304         {
305           tmpints->SetValue(j, (another->IsIsoparametric(i, j) ? 1 : 0) );
306
307           DeclareAndCast(IGESData_IGESEntity, localent,
308                          TC.Transferred(another->ParametricCurve(i, j)));
309           tmpents->SetValue(j, localent);
310         }
311       isoparametricFlags->SetValue(i, tmpints);
312       tempCurves->SetValue(i, tmpents);
313     }
314   ent->Init(tempTypes, tempEdges, tempIndex, tempOrientation,
315             nbParameterCurves, isoparametricFlags, tempCurves);
316 }
317
318
319 //=======================================================================
320 //function : DirChecker
321 //purpose  : 
322 //=======================================================================
323
324 IGESData_DirChecker IGESSolid_ToolLoop::DirChecker
325   (const Handle(IGESSolid_Loop)& /* ent  */) const
326 {
327   IGESData_DirChecker DC(508, 0,1);
328
329   DC.Structure  (IGESData_DefVoid);
330   DC.LineFont   (IGESData_DefVoid);
331   DC.LineWeight (IGESData_DefVoid);
332   DC.Color      (IGESData_DefVoid);
333
334   DC.SubordinateStatusRequired(1);
335   return DC;
336 }
337
338
339 //=======================================================================
340 //function : OwnCheck
341 //purpose  : 
342 //=======================================================================
343
344 void IGESSolid_ToolLoop::OwnCheck(const Handle(IGESSolid_Loop)& ent,
345                                   const Interface_ShareTool&,
346                                   Handle(Interface_Check)& ach) const
347 {
348   // MGE 03/08/98
349   // Building of messages
350   //========================================
351   //Message_Msg Msg190("XSTEP_190");
352   //========================================
353
354   Standard_Integer upper = ent->NbEdges();
355   for (Standard_Integer i = 1; i <= upper; i ++)
356     if (ent->EdgeType(i) != 0 && ent->EdgeType(i) != 1) {
357       Message_Msg Msg190("XSTEP_190");
358       ach->SendFail(Msg190);
359     }
360 }
361
362
363 //=======================================================================
364 //function : OwnDump
365 //purpose  : 
366 //=======================================================================
367
368 void IGESSolid_ToolLoop::OwnDump(const Handle(IGESSolid_Loop)& ent,
369                                  const IGESData_IGESDumper& dumper,
370                                  Standard_OStream& S,
371                                  const Standard_Integer level) const
372 {
373   Standard_Integer i, j;
374   Standard_Integer nbedges  = ent->NbEdges();
375   Standard_Integer sublevel = (level <= 4) ? 0 : 1;
376
377   S << "IGESSolid_Loop\n"
378     << "Edge types :\n"
379     << "Edges      :\n"
380     << "List index :\n"
381     << "Orientation flags :\n"
382     << "Parametric flags  : ";
383   IGESData_DumpEntities(S,dumper,-level,1, nbedges,ent->Edge);
384   S << "\n";
385   if (level > 4)
386     {
387       S << "[ ";
388       for (i = 1; i <= nbedges; i ++)
389         {
390           Standard_Integer nbc = ent->NbParameterCurves(i);
391           S << "[" << i << "]:  "
392             << "Edge type : " << ent->EdgeType(i) << "  "
393             << "Edge : ";
394           dumper.Dump (ent->Edge(i),S, sublevel);
395           S << "  - Index : " << ent->ListIndex(i)
396             << ", Orientation flag : " << ( ent->Orientation(i) ? "Positive" : "Negative" )
397             << ", Number of parametric curves : " << nbc;
398           if (nbc != 0)
399             {
400               if (level <= 5) S << "[ ask level > 5 for content ]";
401               else {
402                 S << ":\n [ ";
403                 for (j = 1; j <= nbc; j ++)
404                   {
405                     S << "[" << j << "]:  "
406                       << "Isoparametric flag : "
407                       << ( ent->IsIsoparametric(i,j) ? "True" : "False" ) << "  "
408                       << "Parametric curve : ";
409                     dumper.Dump (ent->ParametricCurve(i,j),S, sublevel);
410                     S << "\n";
411                   }
412                 S << " ]";
413               }
414             }
415           S << "\n";
416         }
417       S << " ]";
418     }
419   S << std::endl;
420 }