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