0024023: Revamp the OCCT Handle -- general
[occt.git] / src / IGESControl / IGESControl_Reader.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 //gka 06.01.99 S3767
15 //abv 10.04.99 S4136: eliminate using BRepAPI::Precision()
16 #include <IGESControl_Reader.ixx>
17 #include <IGESControl_Controller.hxx>
18 #include <XSControl_Controller.hxx>
19 #include <XSControl_TransferReader.hxx>
20 #include <Interface_ShareFlags.hxx>
21
22 #include <IFSelect_Functions.hxx>
23 #include <Interface_InterfaceModel.hxx>
24 #include <IGESData_IGESModel.hxx>
25
26 #include <Interface_Static.hxx>
27 #include <Interface_Check.hxx>
28
29 // S3767 dce 18/01/1999
30 #include <Message_Msg.hxx>
31 #include <Transfer_TransientProcess.hxx>
32 #include <Transfer_IteratorOfProcessForTransient.hxx>
33 #include <Transfer_Binder.hxx>
34 #include <TopoDS_Shape.hxx>
35 #include <Interface_CheckIterator.hxx>
36 #include <Transfer_IteratorOfProcessForTransient.hxx>
37 #include <IFSelect_CheckCounter.hxx>//Transfer_Iterator.hxx>
38 #include <Dico_DictionaryOfTransient.hxx>
39 #include <Dico_DictionaryOfInteger.hxx>
40 #include <Dico_IteratorOfDictionaryOfInteger.hxx>
41 #include <Dico_IteratorOfDictionaryOfTransient.hxx>
42 #include <Interface_Macros.hxx>
43 #include <IGESData_IGESEntity.hxx>
44 #include <TColStd_HSequenceOfInteger.hxx>
45 #include <OSD_Timer.hxx>
46 #include <Transfer_TransferOutput.hxx>
47 #include <ShapeExtend_Explorer.hxx>
48 #include <Message_Messenger.hxx>
49 #include <Transfer_ActorOfTransientProcess.hxx>
50 #include <IGESToBRep_Actor.hxx>
51 #include <IGESData_FileProtocol.hxx>
52 #include <TransferBRep.hxx>
53 #include <ShapeFix_ShapeTolerance.hxx>
54 #include <BRepLib.hxx>
55 // add of stdio.h for NT compilation
56 #include <stdio.h>
57
58
59 //=======================================================================
60 //function : IGESControl_Reader
61 //purpose  : 
62 //=======================================================================
63
64 IGESControl_Reader::IGESControl_Reader ()
65 {
66   IGESControl_Controller::Init();
67   SetWS (new XSControl_WorkSession);
68   SetNorm("IGES");
69   theReadOnlyVisible = Standard_False;
70 }
71
72
73 //=======================================================================
74 //function : IGESControl_Reader
75 //purpose  : 
76 //=======================================================================
77
78 IGESControl_Reader::IGESControl_Reader
79   (const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch)
80 {
81   IGESControl_Controller::Init();
82   SetWS (WS,scratch);
83   SetNorm ("IGES");
84   theReadOnlyVisible = Standard_False;
85 }
86
87
88 //=======================================================================
89 //function : IGESModel
90 //purpose  : 
91 //=======================================================================
92
93 Handle(IGESData_IGESModel) IGESControl_Reader::IGESModel () const
94 {
95   return Handle(IGESData_IGESModel)::DownCast(Model());
96 }
97
98
99
100 //=======================================================================
101 //function : NbRootsForTransfer
102 //purpose  : 
103 //=======================================================================
104
105 Standard_Integer  IGESControl_Reader::NbRootsForTransfer()
106 {
107   if (therootsta) return theroots.Length();
108   therootsta = Standard_True;
109   
110   Handle(IGESData_IGESModel) model = IGESModel(); 
111   if (model.IsNull()) return 0;
112   
113   Handle(XSControl_WorkSession) session = WS();
114   Handle(Interface_Protocol) protocol = session->Protocol();
115   Handle(XSControl_Controller) controller = session->NormAdaptor();
116   Handle(Transfer_ActorOfTransientProcess) actor = controller->ActorRead(model);
117   
118   Interface_ShareFlags SH (model,protocol);
119    
120   // sln 11.06.2002 OCC448
121   Interface_Static::SetIVal("read.iges.onlyvisible",theReadOnlyVisible);
122   
123   Standard_Integer nb = model->NbEntities();
124   for (Standard_Integer i = 1; i <= nb; i ++) {
125     Handle(IGESData_IGESEntity) ent = model->Entity(i);
126     if ( SH.IsShared(ent) || ! actor->Recognize (ent) ) continue;
127     // on ajoute un traitement pour ne prendre que les entites visibles
128     if ( ! theReadOnlyVisible || ent->BlankStatus() == 0 ) {
129       theroots.Append(ent);
130     }
131   }
132   
133   return theroots.Length();
134 }
135
136 //  ####    Reliquat de methodes a reprendre    ####
137
138 //=======================================================================
139 // Function : PrintTransferInfo
140 // Purpose  : Print statistics information on transfer using MoniTool message management
141 // Created  : 18/01/98 DCE for S3767
142 // Modified : 
143 //=======================================================================
144
145 void  IGESControl_Reader::PrintTransferInfo
146   (const IFSelect_PrintFail failsonly, const IFSelect_PrintCount mode) const
147 {
148   Standard_Integer nbWarn = 0, nbFail= 0, nbEntities =0, nbRoots = 0, nbResults = 0;  
149   Handle(Transfer_TransientProcess) TP = WS()->MapReader();
150   Handle(Message_Messenger) TF = TP->Messenger();
151   Handle(Interface_InterfaceModel) model = TP->Model();
152   if (! model.IsNull()) {
153     nbEntities = model->NbEntities();
154     nbRoots = TP->NbRoots();
155     //nbResults = TP->NbMapped();
156     Transfer_IteratorOfProcessForTransient iterTrans = TP->RootResult(Standard_True);
157     Handle(Dico_DictionaryOfInteger) dicoCountResult = new Dico_DictionaryOfInteger;
158     Handle(Dico_DictionaryOfInteger) dicoCountMapping = new Dico_DictionaryOfInteger;
159     for (iterTrans.Start(); iterTrans.More() ; iterTrans.Next() ) {
160       nbResults++;
161       // Init for dicoCountResult for IFSelect_ResultCount
162       if ( mode == IFSelect_ResultCount ) {
163         char mess[300];
164         const Handle(Transfer_Binder) aBinder = iterTrans.Value();
165         sprintf(mess,"\t%s",aBinder->ResultTypeName());
166         Standard_Boolean deja;
167         Standard_Integer& nb = dicoCountResult->NewItem(mess,deja);
168         if (!deja) nb = 0;
169         nb ++;  
170       }
171       // Init for dicoCountMapping for IFSelect_Mapping
172       else if ( mode == IFSelect_Mapping ) {
173         char mess[300];
174         const Handle(Transfer_Binder) aBinder = iterTrans.Value();
175         DeclareAndCast(IGESData_IGESEntity,igesEnt,iterTrans.Starting());
176         
177         sprintf(mess,"%d\t%d\t%s\t%s", igesEnt->TypeNumber(), igesEnt->FormNumber(),
178                 "%d", aBinder->ResultTypeName());
179         //cout << mess << endl;
180         Standard_Boolean deja;
181         Standard_Integer& nb = dicoCountMapping->NewItem(mess,deja);
182         if (!deja) nb = 0;
183         nb ++;
184       } 
185     }
186
187     Interface_CheckIterator checkIterator = TP->CheckList(Standard_False);
188     Handle(Dico_DictionaryOfInteger) dicoCount = new Dico_DictionaryOfInteger;
189     Handle(Dico_DictionaryOfTransient) dicoList = new Dico_DictionaryOfTransient;
190     // Init the dicoCount dicoList and nbWarn ,nb Fail.
191     for(checkIterator.Start(); checkIterator.More(); checkIterator.Next() ) {
192       char mess[300];
193       const Handle(Interface_Check) aCheck = checkIterator.Value(); 
194       Handle(Standard_Transient) ent = model->Value(checkIterator.Number());
195       DeclareAndCast(IGESData_IGESEntity,igesEnt,ent);
196       Standard_Integer type = igesEnt->TypeNumber(), form = igesEnt->FormNumber();
197       Standard_Integer nw = aCheck->NbWarnings(), nf = aCheck->NbFails(), i;
198       for(i = 1; (failsonly==IFSelect_FailAndWarn) && (i<= nw); i++) {
199         sprintf(mess,"\t W\t%d\t%d\t%s",type,form,aCheck->CWarning(i));
200         Standard_Boolean deja;
201         Standard_Integer& nb = dicoCount->NewItem(mess,deja);
202         if (!deja) nb = 0;
203         nb ++;
204         Handle(Standard_Transient)& anitem = dicoList->NewItem(mess,deja);
205         DeclareAndCast(TColStd_HSequenceOfInteger,alist,anitem);
206         if (!deja) { alist = new TColStd_HSequenceOfInteger(); anitem = alist;  }
207         alist->Append(model->Number(igesEnt)*2-1);
208       }
209       for(i = 1; i<= nf; i++) {
210         sprintf(mess,"\t F\t%d\t%d\t%s",type,form,aCheck->CFail(i));
211         // TF << mess << endl;
212         Standard_Boolean deja;
213         Standard_Integer& nb = dicoCount->NewItem(mess,deja);
214         if (!deja) nb = 0;
215         nb ++;
216         Handle(Standard_Transient)& anitem = dicoList->NewItem(mess,deja);
217         DeclareAndCast(TColStd_HSequenceOfInteger,alist,anitem);
218         if (!deja) { alist = new TColStd_HSequenceOfInteger(); anitem = alist;  }
219         alist->Append(model->Number(igesEnt)*2-1);
220       }
221       nbWarn += nw;
222       nbFail += nf;
223     }
224     Message_Msg msg3000("IGES_3000");  // *************************
225     TF->Send (msg3000, Message_Info); //smh#14
226     
227     switch (mode) {
228     case IFSelect_GeneralInfo : {
229       Message_Msg msg3005("IGES_3005");TF->Send(msg3005, Message_Info);
230       Message_Msg msg3010("IGES_3010");msg3010.Arg(nbEntities);TF->Send(msg3010, Message_Info);
231       Message_Msg msg3011("IGES_3011");msg3011.Arg(nbRoots);TF->Send(msg3011, Message_Info);      
232       Message_Msg msg3015("IGES_3015");msg3015.Arg(nbResults);TF->Send(msg3015, Message_Info);
233       Message_Msg msg3020("IGES_3020");msg3020.Arg(nbWarn);TF->Send(msg3020, Message_Info);
234       Message_Msg msg3025("IGES_3025");msg3025.Arg(nbFail);TF->Send(msg3025, Message_Info);
235       break;
236     }
237     case IFSelect_CountByItem : 
238     case IFSelect_ListByItem : {
239       Message_Msg msg3030("IGES_3030");
240       TF->Send(msg3030, Message_Info);
241       Dico_IteratorOfDictionaryOfInteger dicoCountIter(dicoCount);
242       Dico_IteratorOfDictionaryOfTransient dicoListIter(dicoList);
243       for(dicoCountIter.Start(),dicoListIter.Start(); 
244           dicoCountIter.More() && dicoListIter.More();
245           dicoCountIter.Next(),dicoListIter.Next()) {
246         TF << dicoCountIter.Value() << dicoCountIter.Name() << endl;
247         if (mode == IFSelect_ListByItem) {
248           DeclareAndCast(TColStd_HSequenceOfInteger, entityList, dicoListIter.Value());
249           Standard_Integer length = entityList->Length();
250           Message_Msg msg3035("IGES_3035");
251           TF->Send(msg3035, Message_Info);
252           char line[80];
253           sprintf(line,"\t\t\t");
254           TF << line ;
255           Standard_Integer nbInLine =0;
256           for(Standard_Integer i = 1; i <= length ; i++ ) {
257             // IDT_Out << (entityList->Value(i)) << " ";
258             sprintf(line,"\t %d", entityList->Value(i));
259             TF << line ;
260             if (++nbInLine == 6) {
261               nbInLine = 0;
262               sprintf(line,"\n\t\t\t");
263               TF << line ;
264             }
265           }
266           TF << endl ;
267         }
268       }
269       break;
270     }
271     case IFSelect_ResultCount : { 
272       Message_Msg msg3040("IGES_3040");TF->Send(msg3040, Message_Info);
273       Message_Msg msg3011("IGES_3011");msg3011.Arg(nbRoots);TF->Send(msg3011, Message_Info);      
274       Message_Msg msg3015("IGES_3015");msg3015.Arg(nbResults);TF->Send(msg3015, Message_Info);
275       Message_Msg msg3045("IGES_3045");TF->Send(msg3045, Message_Info);
276       Dico_IteratorOfDictionaryOfInteger dicoCountIter(dicoCountResult);
277       for(dicoCountIter.Start(); dicoCountIter.More(); dicoCountIter.Next()) {
278         TF << dicoCountIter.Value() << dicoCountIter.Name() << endl;
279       }
280       break;
281     }
282     case IFSelect_Mapping : { 
283       Message_Msg msg3040("IGES_3050");TF->Send(msg3040, Message_Info);
284       Message_Msg msg3011("IGES_3011");msg3011.Arg(nbRoots);TF->Send(msg3011, Message_Info);      
285       Message_Msg msg3015("IGES_3015");msg3015.Arg(nbResults);TF->Send(msg3015, Message_Info);
286       Message_Msg msg3045("IGES_3055");TF->Send(msg3045, Message_Info);
287       // Add failed entities in dicoCountMapping
288       if (nbRoots!=nbResults) {
289         for( Standard_Integer i = 1; i <= nbRoots ; i++) {
290           DeclareAndCast(IGESData_IGESEntity, root, TP->Root(i));
291           if (!TP->IsBound(root)) {
292             char mess[300];
293     
294             sprintf(mess,"%d\t%d \t%s\t%s", root->TypeNumber(), root->FormNumber(),
295                     "%d", "Failed");
296             //cout << mess << endl;
297             Standard_Boolean deja;
298             Standard_Integer& nb = dicoCountMapping->NewItem(mess,deja);
299         if (!deja) nb = 0;
300             nb ++;          
301           }
302         }
303       }
304       Dico_IteratorOfDictionaryOfInteger dicoCountIter(dicoCountMapping);
305       for(dicoCountIter.Start(); dicoCountIter.More(); dicoCountIter.Next()) {
306         char mess[80];
307         sprintf(mess, dicoCountIter.Name().ToCString() , dicoCountIter.Value());
308         TF << mess << endl; //dicoCountIter.Value() << dicoCountIter.Name() << endl;
309       }
310       break;
311     }
312     default: break;
313     }
314   }
315 }