0025748: Parallel version of progress indicator
[occt.git] / src / XSControl / XSControl_TransferWriter.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
15 #include <Interface_Check.hxx>
16 #include <Interface_CheckIterator.hxx>
17 #include <Interface_InterfaceModel.hxx>
18 #include <Interface_Macros.hxx>
19 #include <Interface_Static.hxx>
20 #include <Message_Messenger.hxx>
21 #include <Standard_ErrorHandler.hxx>
22 #include <Standard_Failure.hxx>
23 #include <Standard_Transient.hxx>
24 #include <Standard_Type.hxx>
25 #include <TopoDS_Shape.hxx>
26 #include <Transfer_ActorOfFinderProcess.hxx>
27 #include <Transfer_FinderProcess.hxx>
28 #include <Transfer_SimpleBinderOfTransient.hxx>
29 #include <Transfer_TransientMapper.hxx>
30 #include <XSControl_Controller.hxx>
31 #include <XSControl_TransferWriter.hxx>
32 #include <XSControl_Utils.hxx>
33 #include <ShapeUpgrade_RemoveLocations.hxx>
34
35 IMPLEMENT_STANDARD_RTTIEXT(XSControl_TransferWriter,Standard_Transient)
36
37
38 //=======================================================================
39 //function : Clear
40 //purpose  : 
41 //=======================================================================
42
43 void XSControl_TransferWriter::Clear (const Standard_Integer mode)
44 {
45   if (mode < 0 || myTransferWriter.IsNull())
46     myTransferWriter = new Transfer_FinderProcess;
47   else myTransferWriter->Clear();
48 }
49
50 //=======================================================================
51 //function : PrintStats
52 //purpose  : 
53 //=======================================================================
54
55 void XSControl_TransferWriter::PrintStats (const Standard_Integer , const Standard_Integer ) const
56 {
57   Message_Messenger::StreamBuffer sout = myTransferWriter->Messenger()->SendInfo();
58 //  A ameliorer ... !
59   sout<<"\n*******************************************************************\n";
60   sout << "******        Statistics on Transfer (Write)                 ******"<<std::endl;
61   sout<<"\n*******************************************************************\n";
62   sout << "******        Transfer Mode = "<<myTransferMode;
63   Standard_CString modehelp = myController->ModeWriteHelp (myTransferMode);
64   if (modehelp && modehelp[0] != 0) sout<<"  I.E.  "<<modehelp;
65   sout<<"       ******"<<std::endl;
66 }
67
68
69 //  ##########    LES ACTIONS    ##########
70
71 //=======================================================================
72 //function : RecognizeTransient
73 //purpose  : 
74 //=======================================================================
75
76 Standard_Boolean XSControl_TransferWriter::RecognizeTransient (const Handle(Standard_Transient)& obj)
77 {
78   if (myController.IsNull()) return Standard_False;
79   XSControl_Utils xu;
80   TopoDS_Shape sh = xu.BinderShape (obj);
81   if (!sh.IsNull()) return RecognizeShape (sh);
82   return myController->RecognizeWriteTransient (obj,myTransferMode);
83 }
84
85 //=======================================================================
86 //function : TransferWriteTransient
87 //purpose  : 
88 //=======================================================================
89
90 IFSelect_ReturnStatus XSControl_TransferWriter::TransferWriteTransient
91   (const Handle(Interface_InterfaceModel)& model,
92    const Handle(Standard_Transient)& obj,
93    const Message_ProgressRange& theProgress)
94 {
95   IFSelect_ReturnStatus status = IFSelect_RetVoid;
96   if (myController.IsNull()) return IFSelect_RetError;
97   if (model.IsNull()) return IFSelect_RetVoid;
98
99   if (myTransferWriter.IsNull()) myTransferWriter = new Transfer_FinderProcess;
100   Handle(Transfer_ActorOfFinderProcess) nulact;
101   myTransferWriter->SetActor (nulact);
102   Handle(Standard_Transient) resultat;
103   Message_Messenger::StreamBuffer sout = myTransferWriter->Messenger()->SendInfo();
104   try {
105     OCC_CATCH_SIGNALS
106     PrintStats(myTransferMode);
107     sout << "******        Transferring Transient, CDL Type = ";
108     sout<<obj->DynamicType()->Name()<<"   ******"<<std::endl;
109     status = myController->TransferWriteTransient
110       (obj,myTransferWriter,model, myTransferMode, theProgress);
111   }
112   catch(Standard_Failure const& anException) {
113     sout<<"****  ****  TransferWriteShape, EXCEPTION : ";
114     sout<<anException.GetMessageString(); 
115     sout<<std::endl;
116     status = IFSelect_RetFail;
117   }
118   return status;
119 }
120
121 //=======================================================================
122 //function : RecognizeShape
123 //purpose  : 
124 //=======================================================================
125
126 Standard_Boolean XSControl_TransferWriter::RecognizeShape (const TopoDS_Shape& shape)
127 {
128   if (myController.IsNull()) return Standard_False;
129   if (shape.IsNull()) return Standard_False;
130   return myController->RecognizeWriteShape (shape,myTransferMode);
131 }
132
133 //=======================================================================
134 //function : TransferWriteShape
135 //purpose  : 
136 //=======================================================================
137
138 IFSelect_ReturnStatus XSControl_TransferWriter::TransferWriteShape
139   (const Handle(Interface_InterfaceModel)& theModel,
140    const TopoDS_Shape& theShape,
141    const Message_ProgressRange& theProgress)
142 {
143   IFSelect_ReturnStatus status = IFSelect_RetVoid;
144   if (myController.IsNull()) return IFSelect_RetError;
145   if (theModel.IsNull()) return IFSelect_RetVoid;
146
147   TopoDS_Shape aShape = theShape;
148   Standard_Boolean isNMMode = Interface_Static::IVal("write.step.nonmanifold") != 0;
149   if (isNMMode)
150   {
151     ShapeUpgrade_RemoveLocations aRemLoc;
152     aRemLoc.SetRemoveLevel(TopAbs_COMPOUND);
153     aRemLoc.Remove(aShape);
154     aShape = aRemLoc.GetResult();
155   }
156
157   if (myTransferWriter.IsNull()) myTransferWriter = new Transfer_FinderProcess;
158 //  effacer l actor : Controller s en charge
159   Handle(Transfer_ActorOfFinderProcess) nulact;
160   myTransferWriter->SetActor (nulact);
161   Handle(Standard_Transient) resultat;
162   Message_Messenger::StreamBuffer sout = myTransferWriter->Messenger()->SendInfo();
163   try {
164     OCC_CATCH_SIGNALS
165     PrintStats(myTransferMode);
166     sout << "******        Transferring Shape, ShapeType = " << aShape.ShapeType();
167     sout<<"                      ******"<<std::endl;
168     status = myController->TransferWriteShape
169       (aShape,myTransferWriter, theModel, myTransferMode, theProgress);
170   }
171   catch(Standard_Failure const& anException) {
172     sout<<"****  ****  TransferWriteShape, EXCEPTION : "; 
173     sout<<anException.GetMessageString(); 
174     sout<<std::endl;
175     status = IFSelect_RetFail;
176   }
177   return status;
178 }
179
180 //=======================================================================
181 //function : CheckList
182 //purpose  : 
183 //=======================================================================
184
185 Interface_CheckIterator XSControl_TransferWriter::CheckList () const
186 {
187   Interface_CheckIterator  chl;
188   if (myTransferWriter.IsNull()) return chl;
189   Standard_Integer i, nb = myTransferWriter->NbMapped();
190   for (i = 1; i <= nb; i ++) {
191     DeclareAndCast(Transfer_SimpleBinderOfTransient,tb,myTransferWriter->MapItem(i));
192     if (tb.IsNull()) continue;
193     Handle(Interface_Check) ach = tb->Check();
194     if (ach->NbFails() == 0 || ach->NbWarnings() == 0) continue;
195     DeclareAndCast(Transfer_TransientMapper,tm,myTransferWriter->Mapped(i));
196     if (tm.IsNull()) ach->GetEntity (myTransferWriter->Mapped(i));
197     else  ach->GetEntity (tm->Value());
198     chl.Add(ach);
199   }
200   return chl;
201 }
202
203 //=======================================================================
204 //function : ResultCheckList
205 //purpose  : 
206 //=======================================================================
207
208 Interface_CheckIterator XSControl_TransferWriter::ResultCheckList
209   (const Handle(Interface_InterfaceModel)& model) const
210 {
211   Interface_CheckIterator  chl;
212   if (myTransferWriter.IsNull()) return chl;
213   Standard_Integer i, nb = myTransferWriter->NbMapped();
214   for (i = 1; i <= nb; i ++) {
215     DeclareAndCast(Transfer_SimpleBinderOfTransient,tb,myTransferWriter->MapItem(i));
216     if (tb.IsNull()) continue;
217     const Handle(Interface_Check) ach = tb->Check();
218     if (ach->NbFails() == 0 || ach->NbWarnings() == 0) continue;
219     Handle(Standard_Transient) ent = tb->Result();
220     if (!ent.IsNull() && !model.IsNull()) chl.Add(ach,model->Number(ent));
221     else  chl.Add(ach,0);
222   }
223   return chl;
224 }