1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
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.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 // pdn 26.02.99 added initializing of compound in function OneShape
15 //: gka 14.04.99: S4136: apply scaling
17 #include <BRep_Builder.hxx>
18 #include <IFSelect_Functions.hxx>
19 #include <Interface_Check.hxx>
20 #include <Interface_InterfaceModel.hxx>
21 #include <Interface_ShareFlags.hxx>
22 #include <Interface_Static.hxx>
23 #include <Message.hxx>
24 #include <Message_Messenger.hxx>
25 #include <Message_ProgressSentry.hxx>
26 #include <ShapeExtend_Explorer.hxx>
27 #include <Standard_Transient.hxx>
28 #include <TopoDS_Compound.hxx>
29 #include <TopoDS_Shape.hxx>
30 #include <Transfer_Binder.hxx>
31 #include <Transfer_IteratorOfProcessForTransient.hxx>
32 #include <Transfer_TransientProcess.hxx>
33 #include <XSControl_Controller.hxx>
34 #include <XSControl_Reader.hxx>
35 #include <XSControl_TransferReader.hxx>
36 #include <XSControl_WorkSession.hxx>
38 //#include <ShapeCustom.hxx>
39 //#include <ShapeAlgo.hxx>
40 //#include <ShapeAlgo_AlgoContainer.hxx>
41 //=======================================================================
42 //function : XSControl_Reader
44 //=======================================================================
45 XSControl_Reader::XSControl_Reader ()
47 SetWS (new XSControl_WorkSession);
51 //=======================================================================
52 //function : XSControl_Reader
54 //=======================================================================
56 XSControl_Reader::XSControl_Reader (const Standard_CString norm)
62 //=======================================================================
63 //function : XSControl_Reader
65 //=======================================================================
67 XSControl_Reader::XSControl_Reader(const Handle(XSControl_WorkSession)& WS,
68 const Standard_Boolean scratch)
74 //=======================================================================
77 //=======================================================================
79 Standard_Boolean XSControl_Reader::SetNorm (const Standard_CString norm)
81 if (thesession.IsNull()) SetWS (new XSControl_WorkSession);
82 Standard_Boolean stat = thesession->SelectNorm (norm);
84 thesession->InitTransferReader(0);
85 thesession->InitTransferReader(4);
91 //=======================================================================
94 //=======================================================================
96 void XSControl_Reader::SetWS(const Handle(XSControl_WorkSession)& WS,
97 const Standard_Boolean scratch)
99 therootsta = Standard_False;
102 // Il doit y avoir un Controller ... Sinon onverra plus tard (apres SetNorm)
103 if (thesession->NormAdaptor().IsNull()) return;
104 Handle(Interface_InterfaceModel) model = thesession->Model ();
105 if (scratch || model.IsNull()) model = thesession->NewModel ();
106 thesession->InitTransferReader(0);
107 thesession->InitTransferReader(4);
111 //=======================================================================
114 //=======================================================================
116 Handle(XSControl_WorkSession) XSControl_Reader::WS () const
122 //=======================================================================
123 //function : ReadFile
125 //=======================================================================
127 IFSelect_ReturnStatus XSControl_Reader::ReadFile
128 (const Standard_CString filename)
130 IFSelect_ReturnStatus stat = thesession->ReadFile(filename);
131 thesession->InitTransferReader(4);
136 Handle(Interface_InterfaceModel) XSControl_Reader::Model () const
138 return thesession->Model();
142 //=======================================================================
143 //function : GiveList
145 //=======================================================================
147 Handle(TColStd_HSequenceOfTransient) XSControl_Reader::GiveList
148 (const Standard_CString first, const Standard_CString second)
150 if (first && first[0] != '\0') {
151 return thesession->GiveList (first,second);
154 Handle(TColStd_HSequenceOfTransient) list = new TColStd_HSequenceOfTransient();
155 Standard_Integer i,nbr = NbRootsForTransfer();
156 for (i = 1; i <= nbr; i ++) list->Append (RootForTransfer(i));
161 //=======================================================================
162 //function : GiveList
164 //=======================================================================
166 Handle(TColStd_HSequenceOfTransient) XSControl_Reader::GiveList
167 (const Standard_CString first, const Handle(Standard_Transient)& list)
169 return thesession->GiveListFromList (first,list);
173 //=======================================================================
174 //function : NbRootsForTransfer
176 //=======================================================================
178 Standard_Integer XSControl_Reader::NbRootsForTransfer ()
180 if (therootsta) return theroots.Length();
181 therootsta = Standard_True;
182 Interface_ShareFlags sf (thesession->Graph());
183 Standard_Integer i, nbr = sf.NbRoots();
184 for (i = 1; i <= nbr; i ++) {
185 // on filtre les racines qu on sait transferer
186 Handle(Standard_Transient) start = sf.Root(i);
187 if (thesession->TransferReader()->Recognize(start)) theroots.Append(start);
189 return theroots.Length();
193 //=======================================================================
194 //function : RootForTransfer
196 //=======================================================================
198 Handle(Standard_Transient) XSControl_Reader::RootForTransfer
199 (const Standard_Integer num)
201 Handle(Standard_Transient) voidroot;
202 Standard_Integer nbr = NbRootsForTransfer();
203 if (num < 1 || num > nbr) return voidroot;
204 return theroots.Value(num);
208 // #### TRANSFERT ####
211 //=======================================================================
212 //function : TransferOneRoot
214 //=======================================================================
216 Standard_Boolean XSControl_Reader::TransferOneRoot(const Standard_Integer num)
218 return TransferEntity (RootForTransfer (num));
222 //=======================================================================
223 //function : TransferOne
225 //=======================================================================
227 Standard_Boolean XSControl_Reader::TransferOne(const Standard_Integer num)
229 return TransferEntity (thesession->StartingEntity (num));
233 //=======================================================================
234 //function : TransferEntity
236 //=======================================================================
238 Standard_Boolean XSControl_Reader::TransferEntity
239 (const Handle(Standard_Transient)& start)
241 if (start.IsNull()) return Standard_False;
242 const Handle(XSControl_TransferReader) &TR = thesession->TransferReader();
244 if (TR->TransferOne (start) == 0) return Standard_False;
245 TopoDS_Shape sh = TR->ShapeResult(start);
246 //ShapeExtend_Explorer STU;
247 //SMH May 00: allow empty shapes (STEP CAX-IF, external references)
248 //if (STU.ShapeType(sh,Standard_True) == TopAbs_SHAPE) return Standard_False; // nulle-vide
249 theshapes.Append(sh);
250 return Standard_True;
254 //=======================================================================
255 //function : TransferList
257 //=======================================================================
259 Standard_Integer XSControl_Reader::TransferList
260 (const Handle(TColStd_HSequenceOfTransient)& list)
262 if (list.IsNull()) return 0;
263 Standard_Integer nbt = 0;
264 Standard_Integer i, nb = list->Length();
265 const Handle(XSControl_TransferReader) &TR = thesession->TransferReader();
268 ShapeExtend_Explorer STU;
269 for (i = 1; i <= nb; i ++) {
270 Handle(Standard_Transient) start = list->Value(i);
271 if (TR->TransferOne (start) == 0) continue;
272 TopoDS_Shape sh = TR->ShapeResult(start);
273 if (STU.ShapeType(sh,Standard_True) == TopAbs_SHAPE) continue; // nulle-vide
274 theshapes.Append(sh);
281 //=======================================================================
282 //function : TransferRoots
284 //=======================================================================
286 Standard_Integer XSControl_Reader::TransferRoots ()
288 NbRootsForTransfer();
289 Standard_Integer nbt = 0;
290 Standard_Integer i, nb = theroots.Length();
291 const Handle(XSControl_TransferReader) &TR = thesession->TransferReader();
295 ShapeExtend_Explorer STU;
296 const Handle(Transfer_TransientProcess) &proc = thesession->TransferReader()->TransientProcess();
297 Message_ProgressSentry PS ( proc->GetProgress(), "Root", 0, nb, 1 );
298 for (i = 1; i <= nb && PS.More(); i ++,PS.Next()) {
299 Handle(Standard_Transient) start = theroots.Value(i);
300 if (TR->TransferOne (start) == 0) continue;
301 TopoDS_Shape sh = TR->ShapeResult(start);
302 if (STU.ShapeType(sh,Standard_True) == TopAbs_SHAPE) continue; // nulle-vide
303 theshapes.Append(sh);
310 //=======================================================================
311 //function : ClearShapes
313 //=======================================================================
315 void XSControl_Reader::ClearShapes ()
321 //=======================================================================
322 //function : NbShapes
324 //=======================================================================
326 Standard_Integer XSControl_Reader::NbShapes () const
328 return theshapes.Length();
332 //=======================================================================
335 //=======================================================================
337 TopTools_SequenceOfShape& XSControl_Reader::Shapes()
343 //=======================================================================
346 //=======================================================================
348 TopoDS_Shape XSControl_Reader::Shape (const Standard_Integer num) const
350 return theshapes.Value(num);
354 //=======================================================================
355 //function : OneShape
357 //=======================================================================
359 TopoDS_Shape XSControl_Reader::OneShape () const
362 Standard_Integer i,nb = theshapes.Length();
363 if (nb == 0) return sh;
364 if (nb == 1) return theshapes.Value(1);
367 //pdn 26.02.99 testing S4133
369 for (i = 1; i <= nb; i ++) B.Add (C,theshapes.Value(i));
373 //=======================================================================
374 //function : PrintCheckLoad
376 //=======================================================================
377 void XSControl_Reader::PrintCheckLoad (Standard_OStream& theStream,
378 const Standard_Boolean failsonly,
379 const IFSelect_PrintCount mode) const
381 thesession->PrintCheckList (theStream, thesession->ModelCheckList(),failsonly, mode);
384 //=======================================================================
385 //function : PrintCheckLoad
387 //=======================================================================
388 void XSControl_Reader::PrintCheckLoad (const Standard_Boolean failsonly,
389 const IFSelect_PrintCount mode) const
391 Message_Messenger::StreamBuffer aBuffer = Message::SendInfo();
392 PrintCheckLoad (aBuffer, failsonly, mode);
395 //=======================================================================
396 //function : PrintCheckTransfer
398 //=======================================================================
399 void XSControl_Reader::PrintCheckTransfer(Standard_OStream& theStream,
400 const Standard_Boolean failsonly,
401 const IFSelect_PrintCount mode) const
403 thesession->PrintCheckList (theStream, thesession->TransferReader()->LastCheckList(), failsonly, mode);
406 //=======================================================================
407 //function : PrintCheckTransfer
409 //=======================================================================
410 void XSControl_Reader::PrintCheckTransfer(const Standard_Boolean failsonly,
411 const IFSelect_PrintCount mode) const
413 Message_Messenger::StreamBuffer aBuffer = Message::SendInfo();
414 PrintCheckTransfer(aBuffer, failsonly, mode);
417 //=======================================================================
418 //function : PrintStatsTransfer
420 //=======================================================================
421 void XSControl_Reader::PrintStatsTransfer (Standard_OStream& theStream,
422 const Standard_Integer what,
423 const Standard_Integer mode) const
425 thesession->TransferReader()->PrintStats (theStream, what,mode);
428 //=======================================================================
429 //function : PrintStatsTransfer
431 //=======================================================================
432 void XSControl_Reader::PrintStatsTransfer (const Standard_Integer what,
433 const Standard_Integer mode) const
435 Message_Messenger::StreamBuffer aBuffer = Message::SendInfo();
436 PrintStatsTransfer (aBuffer, what, mode);
439 //=======================================================================
440 //function : GetStatsTransfer
442 //=======================================================================
444 void XSControl_Reader::GetStatsTransfer (const Handle(TColStd_HSequenceOfTransient)& list,
445 Standard_Integer& nbMapped,
446 Standard_Integer& nbWithResult,
447 Standard_Integer& nbWithFail) const
449 const Handle(Transfer_TransientProcess) &TP = thesession->TransferReader()->TransientProcess();
450 Transfer_IteratorOfProcessForTransient itrp(Standard_True);
451 itrp = TP->CompleteResult(Standard_True);
452 if(!list.IsNull()) itrp.Filter (list);
453 nbMapped = nbWithFail = nbWithResult = 0;
455 for (itrp.Start(); itrp.More(); itrp.Next()) {
456 Handle(Transfer_Binder) binder = itrp.Value();
457 Handle(Standard_Transient) ent = itrp.Starting();
459 if (binder.IsNull()) nbWithFail++;
461 if(!binder->HasResult()) nbWithFail++;
464 Interface_CheckStatus cst = binder->Check()->Status();
465 if ((cst == Interface_CheckOK)||(cst == Interface_CheckWarning))