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_EntityIterator.hxx>
17 #include <Interface_Graph.hxx>
18 #include <Interface_HGraph.hxx>
19 #include <Interface_InterfaceModel.hxx>
20 #include <Interface_MSG.hxx>
21 #include <Message_Messenger.hxx>
22 #include <Standard_Transient.hxx>
23 #include <Standard_Type.hxx>
24 #include <TColStd_HSequenceOfTransient.hxx>
25 #include <Transfer_Binder.hxx>
26 #include <Transfer_TransientProcess.hxx>
27
IMPLEMENT_STANDARD_RTTIEXT(Transfer_TransientProcess,Transfer_ProcessForTransient)28 IMPLEMENT_STANDARD_RTTIEXT(Transfer_TransientProcess,Transfer_ProcessForTransient)
29
30 //=======================================================================
31 //function : Transfer_TransientProcess
32 //purpose :
33 //=======================================================================
34 Transfer_TransientProcess::Transfer_TransientProcess
35 (const Standard_Integer nb) : Transfer_ProcessForTransient (nb)
36 {
37 thetrroots = new TColStd_HSequenceOfTransient;
38 }
39
40
41 //=======================================================================
42 //function : SetModel
43 //purpose :
44 //=======================================================================
45
SetModel(const Handle (Interface_InterfaceModel)& model)46 void Transfer_TransientProcess::SetModel
47 (const Handle(Interface_InterfaceModel)& model)
48 {
49 themodel = model;
50 }
51
52
53 //=======================================================================
54 //function : Model
55 //purpose :
56 //=======================================================================
57
Handle(Interface_InterfaceModel)58 Handle(Interface_InterfaceModel) Transfer_TransientProcess::Model () const
59 {
60 return themodel;
61 }
62
63
SetGraph(const Handle (Interface_HGraph)& HG)64 void Transfer_TransientProcess::SetGraph(const Handle(Interface_HGraph)& HG)
65 {
66 thegraph = HG;
67 if (!thegraph.IsNull())
68 SetModel(thegraph->Graph().Model());
69 else
70 themodel.Nullify();
71 }
72
73
74 //=======================================================================
75 //function : HasGraph
76 //purpose :
77 //=======================================================================
78
HasGraph() const79 Standard_Boolean Transfer_TransientProcess::HasGraph () const
80 {
81 return !thegraph.IsNull();
82 }
83
84
85 //=======================================================================
86 //function : HGraph
87 //purpose :
88 //=======================================================================
89
Handle(Interface_HGraph)90 Handle(Interface_HGraph) Transfer_TransientProcess::HGraph () const
91 {
92 return thegraph;
93 }
94
95
96 //=======================================================================
97 //function : Graph
98 //purpose :
99 //=======================================================================
100
Graph() const101 const Interface_Graph& Transfer_TransientProcess::Graph () const
102 {
103 return thegraph->Graph();
104 }
105
106
107 //=======================================================================
108 //function : SetContext
109 //purpose :
110 //=======================================================================
111
SetContext(const Standard_CString name,const Handle (Standard_Transient)& ctx)112 void Transfer_TransientProcess::SetContext(const Standard_CString name,
113 const Handle(Standard_Transient)& ctx)
114 {
115 thectx.Bind(name,ctx);
116 }
117
118
119 //=======================================================================
120 //function : GetContext
121 //purpose :
122 //=======================================================================
123
GetContext(const Standard_CString name,const Handle (Standard_Type)& type,Handle (Standard_Transient)& ctx) const124 Standard_Boolean Transfer_TransientProcess::GetContext
125 (const Standard_CString name, const Handle(Standard_Type)& type,
126 Handle(Standard_Transient)& ctx) const
127 {
128 if (thectx.IsEmpty()) return Standard_False;
129 if (!thectx.Find(name, ctx))
130 ctx.Nullify();
131
132 if (ctx.IsNull()) return Standard_False;
133 if (type.IsNull()) return Standard_True;
134 if (!ctx->IsKind(type)) ctx.Nullify();
135 return !ctx.IsNull();
136 }
137
138
139 //=======================================================================
140 //function : Context
141 //purpose :
142 //=======================================================================
143
Context()144 NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)>& Transfer_TransientProcess::Context ()
145 {
146 return thectx;
147 }
148
149
150 //=======================================================================
151 //function : PrintTrace
152 //purpose :
153 //=======================================================================
154
PrintTrace(const Handle (Standard_Transient)& start,Standard_OStream & S) const155 void Transfer_TransientProcess::PrintTrace
156 (const Handle(Standard_Transient)& start, Standard_OStream& S) const
157 {
158 if (!start.IsNull()) {
159 if (!themodel.IsNull()) {
160 S << "Entity ";
161 themodel->Print (start, S, 1);
162 // S<<"id "; themodel->Print (start,S);
163 // S<<" Type:"<<themodel->TypeName (start);
164 }
165 else S<<"Entity Type:"<< Interface_InterfaceModel::ClassName(start->DynamicType()->Name());
166 // << start (handle) ??
167 }
168 }
169
170
171 //=======================================================================
172 //function : CheckNum
173 //purpose :
174 //=======================================================================
175
CheckNum(const Handle (Standard_Transient)& start) const176 Standard_Integer Transfer_TransientProcess::CheckNum
177 (const Handle(Standard_Transient)& start) const
178 {
179 return (themodel.IsNull() ? 0 : themodel->Number(start));
180 }
181
182
183 //=======================================================================
184 //function : TypedSharings
185 //purpose :
186 //=======================================================================
187
TypedSharings(const Handle (Standard_Transient)& start,const Handle (Standard_Type)& type) const188 Interface_EntityIterator Transfer_TransientProcess::TypedSharings
189 (const Handle(Standard_Transient)& start,
190 const Handle(Standard_Type)& type) const
191 {
192 Interface_EntityIterator iter;
193 if (thegraph.IsNull()) return iter;
194 return thegraph->Graph().TypedSharings (start,type);
195 }
196
197
198 //=======================================================================
199 //function : IsDataLoaded
200 //purpose :
201 //=======================================================================
202
IsDataLoaded(const Handle (Standard_Transient)& start) const203 Standard_Boolean Transfer_TransientProcess::IsDataLoaded
204 (const Handle(Standard_Transient)& start) const
205 {
206 if (themodel.IsNull()) return Standard_True;
207 Standard_Integer num = themodel->Number(start);
208 if (num == 0) return Standard_True;
209 if (themodel->IsUnknownEntity(num)) return Standard_False;
210 return !themodel->IsRedefinedContent(num);
211 }
212
213
214 //=======================================================================
215 //function : IsDataFail
216 //purpose :
217 //=======================================================================
218
IsDataFail(const Handle (Standard_Transient)& start) const219 Standard_Boolean Transfer_TransientProcess::IsDataFail
220 (const Handle(Standard_Transient)& start) const
221 {
222 if (themodel.IsNull()) return Standard_False;
223 Standard_Integer num = themodel->Number(start);
224 if (num == 0) return Standard_False;
225 if (themodel->IsErrorEntity(num)) return Standard_True;
226 const Handle(Interface_Check) ach = themodel->Check(num,Standard_False); // semantic
227 return ach->HasFailed();
228 }
229
230
231 //=======================================================================
232 //function : PrintStats
233 //purpose :
234 //=======================================================================
235
PrintStats(const Standard_Integer,Standard_OStream & S) const236 void Transfer_TransientProcess::PrintStats(const Standard_Integer /*mode*/,
237 Standard_OStream& S) const
238 {
239 S<<"\n*******************************************************************\n";
240 // if (mode == 1) { // Statistiques de base
241 S<< "******** Basic Statistics ********"<<std::endl;
242
243 Handle(Interface_InterfaceModel) model = Model();
244 if (model.IsNull()) S<<"**** Model unknown"<<std::endl;
245 else
246 S<<"**** Nb Entities : "<<model->NbEntities()<<std::endl;
247
248 Standard_Integer nbr = 0, nbe = 0, nbw = 0;
249 Standard_Integer i, max = NbMapped(), nbroots = NbRoots();
250 S<< "**** Nb Final Results : "<<nbroots<<std::endl;
251
252 for (i = 1; i <= max; i ++) {
253 const Handle(Transfer_Binder)& binder = MapItem(i);
254 if (binder.IsNull()) continue;
255 const Handle(Interface_Check) ach = binder->Check();
256 Transfer_StatusExec stat = binder->StatusExec();
257 if (stat != Transfer_StatusInitial && stat != Transfer_StatusDone)
258 nbe ++;
259 else {
260 if (ach->NbWarnings() > 0) nbw ++;
261 if (binder->HasResult()) nbr ++;
262 }
263 }
264 if (nbr > nbroots)
265 S<<"**** ( Itermediate Results : "<<nbr-nbroots<<" )\n";
266 if (nbe > 0)
267 S<<"**** Errors on : "<<Interface_MSG::Blanks(nbe,4)<<nbe<<" Entities\n";
268 if (nbw > 0)
269 S<<"**** Warnings on : "<<Interface_MSG::Blanks(nbw,4)<<nbw<<" Entities\n";
270 S<<"*******************************************************************";
271 // }
272 S<<std::endl;
273 }
274
275
276 //=======================================================================
277 //function : RootsForTransfer
278 //purpose :
279 //=======================================================================
280
Handle(TColStd_HSequenceOfTransient)281 Handle(TColStd_HSequenceOfTransient) Transfer_TransientProcess::RootsForTransfer()
282 {
283 return thetrroots;
284 }
285