0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- prepar...
[occt.git] / src / IGESSolid / IGESSolid_ToolManifoldSolid.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_IGESDumper.hxx>
22 #include <IGESData_IGESReaderData.hxx>
23 #include <IGESData_IGESWriter.hxx>
24 #include <IGESData_ParamCursor.hxx>
25 #include <IGESData_ParamReader.hxx>
26 #include <IGESData_Status.hxx>
27 #include <IGESSolid_HArray1OfShell.hxx>
28 #include <IGESSolid_ManifoldSolid.hxx>
29 #include <IGESSolid_Shell.hxx>
30 #include <IGESSolid_ToolManifoldSolid.hxx>
31 #include <Interface_Check.hxx>
32 #include <Interface_CopyTool.hxx>
33 #include <Interface_EntityIterator.hxx>
34 #include <Interface_Macros.hxx>
35 #include <Interface_ShareTool.hxx>
36 #include <Message_Msg.hxx>
37 #include <Standard_DomainError.hxx>
38 #include <TColStd_HArray1OfInteger.hxx>
39
40 // MGE 31/07/98
41 IGESSolid_ToolManifoldSolid::IGESSolid_ToolManifoldSolid ()    {  }
42
43
44 void  IGESSolid_ToolManifoldSolid::ReadOwnParams
45   (const Handle(IGESSolid_ManifoldSolid)& ent,
46    const Handle(IGESData_IGESReaderData)& IR, IGESData_ParamReader& PR) const
47 {
48
49   // MGE 31/07/98
50   // Building of messages
51   //========================================
52   Message_Msg Msg180("XSTEP_180");
53   //========================================
54
55   Standard_Boolean abool, shellFlag; //szv#4:S4163:12Mar99 `st` moved down
56   Standard_Integer nbshells, i;
57   Handle(TColStd_HArray1OfInteger) voidShellFlags;
58   Handle(IGESData_IGESEntity) shell;
59   Handle(IGESSolid_Shell) ashell;
60   Handle(IGESSolid_HArray1OfShell) voidShells;
61   IGESData_Status aStatus;
62
63   if (!PR.ReadEntity(IR, PR.Current(), aStatus, shell)){ //szv#4:S4163:12Mar99 `st=` not needed
64     Message_Msg Msg178("XSTEP_178");
65     switch(aStatus) {
66     case IGESData_ReferenceError: {  
67       Message_Msg Msg216 ("IGES_216");
68       Msg178.Arg(Msg216.Value());
69       PR.SendFail(Msg178);
70       break; }
71     case IGESData_EntityError: {
72       Message_Msg Msg217 ("IGES_217");
73       Msg178.Arg(Msg217.Value());
74       PR.SendFail(Msg178);
75       break; }
76     default:{
77     }
78     }
79   }
80
81   PR.ReadBoolean(PR.Current(), Msg180, shellFlag); //szv#4:S4163:12Mar99 `st=` not needed
82   Standard_Boolean st = PR.ReadInteger(PR.Current(), nbshells);
83   if(!st){
84     Message_Msg Msg181("XSTEP_181");
85     PR.SendFail(Msg181);
86   }
87 /*
88   st = PR.ReadEntity(IR, PR.Current(), "Shell", shell);
89   st = PR.ReadBoolean(PR.Current(), "Shell orientation", shellFlag);
90   st = PR.ReadInteger(PR.Current(), "Number of shells", nbshells);
91 */  
92   if (st && nbshells > 0)
93     {
94       voidShells = new IGESSolid_HArray1OfShell(1, nbshells);
95       voidShellFlags = new TColStd_HArray1OfInteger(1, nbshells); voidShellFlags->Init(0);
96       for (i=1; i<=nbshells; i++)
97         {
98           //st = PR.ReadEntity(IR, PR.Current(), Msg179,
99                              //STANDARD_TYPE(IGESSolid_Shell), ashell); //szv#4:S4163:12Mar99 moved in if
100           /*
101           st = PR.ReadEntity(IR, PR.Current(), "Void shells",
102                              STANDARD_TYPE(IGESSolid_Shell), ashell);
103           */
104           if (PR.ReadEntity(IR, PR.Current(), aStatus, STANDARD_TYPE(IGESSolid_Shell), ashell))
105             voidShells->SetValue(i, ashell);
106           else {
107             Message_Msg Msg179("XSTEP_179");
108             switch(aStatus) {
109             case IGESData_ReferenceError: {  
110               Message_Msg Msg216 ("IGES_216");
111               Msg179.Arg(Msg216.Value());
112               PR.SendFail(Msg179);
113               break; }
114             case IGESData_EntityError: {
115               Message_Msg Msg217 ("IGES_217");
116               Msg179.Arg(Msg217.Value());
117               PR.SendFail(Msg179);
118               break; }
119             case IGESData_TypeError: {
120               Message_Msg Msg218 ("IGES_218");
121               Msg179.Arg(Msg218.Value());
122               PR.SendFail(Msg179);
123               break; }
124             default:{
125             }
126             }
127           }
128
129           PR.ReadBoolean(PR.Current(), Msg180, abool); //szv#4:S4163:12Mar99 `st=` not needed
130           if (abool) voidShellFlags->SetValue(i, 1);
131         }
132     }
133   DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
134   ent->Init (Handle(IGESSolid_Shell)::DownCast (shell), shellFlag, voidShells, voidShellFlags);
135 }
136
137 void  IGESSolid_ToolManifoldSolid::WriteOwnParams
138   (const Handle(IGESSolid_ManifoldSolid)& ent, IGESData_IGESWriter& IW) const
139 {
140   Standard_Integer i;
141   Standard_Integer nbshells = ent->NbVoidShells();
142
143   IW.Send(ent->Shell());
144   IW.SendBoolean(ent->OrientationFlag());
145   IW.Send(nbshells);
146   for (i = 1; i <= nbshells; i ++)
147     {
148       IW.Send(ent->VoidShell(i));
149       IW.SendBoolean(ent->VoidOrientationFlag(i));
150     }
151 }
152
153 void  IGESSolid_ToolManifoldSolid::OwnShared
154   (const Handle(IGESSolid_ManifoldSolid)& ent, Interface_EntityIterator& iter) const
155 {
156   Standard_Integer i;
157   Standard_Integer nbshells = ent->NbVoidShells();
158
159   iter.GetOneItem(ent->Shell());
160   for (i = 1; i <= nbshells; i ++)    iter.GetOneItem(ent->VoidShell(i));
161 }
162
163 void  IGESSolid_ToolManifoldSolid::OwnCopy
164   (const Handle(IGESSolid_ManifoldSolid)& another,
165    const Handle(IGESSolid_ManifoldSolid)& ent, Interface_CopyTool& TC) const
166 {
167   DeclareAndCast(IGESSolid_Shell, shell, TC.Transferred(another->Shell()));
168   Standard_Boolean shellFlag = another->OrientationFlag();
169
170   Standard_Integer nbshells = another->NbVoidShells();
171   Handle(IGESSolid_HArray1OfShell) voidShells;
172   Handle(TColStd_HArray1OfInteger) voidFlags;
173   if (nbshells > 0)
174     {
175       voidShells = new IGESSolid_HArray1OfShell(1, nbshells);
176       voidFlags  = new TColStd_HArray1OfInteger(1, nbshells);
177       for (Standard_Integer i = 1; i <= nbshells; i ++)
178         {
179           DeclareAndCast(IGESSolid_Shell, voidshell,
180                          TC.Transferred(another->VoidShell(i)));
181           voidShells->SetValue(i, voidshell);
182           voidFlags->SetValue(i, (another->VoidOrientationFlag(i) ? 1 : 0));
183         }
184     }
185   ent->Init (shell, shellFlag, voidShells, voidFlags);
186 }
187
188 IGESData_DirChecker  IGESSolid_ToolManifoldSolid::DirChecker
189   (const Handle(IGESSolid_ManifoldSolid)& /* ent */ ) const
190 {
191   IGESData_DirChecker DC(186, 0);
192
193   DC.Structure  (IGESData_DefVoid);
194   DC.LineFont   (IGESData_DefVoid);
195   DC.LineWeight (IGESData_DefVoid);
196   DC.Color      (IGESData_DefAny);
197
198   return DC;
199 }
200
201 void  IGESSolid_ToolManifoldSolid::OwnCheck
202   (const Handle(IGESSolid_ManifoldSolid)& /* ent */,
203    const Interface_ShareTool& , Handle(Interface_Check)& /* ach */) const
204 {
205 }
206
207 void  IGESSolid_ToolManifoldSolid::OwnDump
208   (const Handle(IGESSolid_ManifoldSolid)& ent, const IGESData_IGESDumper& dumper,
209    Standard_OStream& S, const Standard_Integer level) const
210 {
211   S << "IGESSolid_ManifoldSolid\n";
212
213   Standard_Integer sublevel = (level <= 4) ? 0 : 1;
214   S << "Shell : ";
215   dumper.Dump(ent->Shell(),S, sublevel);
216   S << "\n";
217   if (ent->OrientationFlag())
218     S << "Orientation agrees with the underlying surface\n";
219   else
220     S << "Orientation does not agrees with the underlying surface\n";
221   S << "Void shells :\nOrientation flags : ";
222   IGESData_DumpEntities(S,dumper,-level,1, ent->NbVoidShells(),ent->VoidShell);
223   S << std::endl;
224   if (level > 4)
225     {
226       S << "[\n";
227       if (ent->NbVoidShells() > 0)
228         {
229           Standard_Integer upper = ent->NbVoidShells();
230           for (Standard_Integer i = 1; i <= upper; i ++)
231             {
232               S << "[" << i << "]:  "
233                 << "Void shell : ";
234               dumper.Dump (ent->VoidShell(i),S, sublevel);
235               S << "  - Orientation flag : ";
236               if (ent->VoidOrientationFlag(i)) S << "True\n";
237               else                             S << "False\n";
238             }
239         }
240       S << " ]\n";
241     }
242   S << std::endl;
243 }
244