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 //: abv 09.04.99: S4136: remove parameter lastpreci
15 // szv#11:CASCADE30:01Feb00 BRepBuilderAPI::Precision(p) removed
17 #include <BRepBuilderAPI.hxx>
18 #include <BRepLib.hxx>
19 #include <IFSelect_CheckCounter.hxx>
20 #include <IFSelect_SignatureList.hxx>
21 #include <Interface_Check.hxx>
22 #include <Interface_CheckIterator.hxx>
23 #include <Interface_EntityIterator.hxx>
24 #include <Interface_Graph.hxx>
25 #include <Interface_HGraph.hxx>
26 #include <Interface_InterfaceModel.hxx>
27 #include <Interface_Macros.hxx>
28 #include <Interface_MSG.hxx>
29 #include <Interface_SignLabel.hxx>
30 #include <Interface_Static.hxx>
31 #include <Message_Messenger.hxx>
32 #include <ShapeFix.hxx>
33 #include <Standard_ErrorHandler.hxx>
34 #include <Standard_Failure.hxx>
35 #include <Standard_Transient.hxx>
36 #include <Standard_Type.hxx>
37 #include <TCollection_HAsciiString.hxx>
38 #include <TColStd_HSequenceOfTransient.hxx>
39 #include <TopoDS_HShape.hxx>
40 #include <TopoDS_Shape.hxx>
41 #include <TopTools_MapOfShape.hxx>
42 #include <Transfer_ActorOfTransientProcess.hxx>
43 #include <Transfer_IteratorOfProcessForTransient.hxx>
44 #include <Transfer_ResultFromModel.hxx>
45 #include <Transfer_ResultFromTransient.hxx>
46 #include <Transfer_SimpleBinderOfTransient.hxx>
47 #include <Transfer_TransferOutput.hxx>
48 #include <Transfer_TransientProcess.hxx>
49 #include <TransferBRep.hxx>
50 #include <TransferBRep_BinderOfShape.hxx>
51 #include <TransferBRep_ShapeBinder.hxx>
52 #include <XSControl_Controller.hxx>
53 #include <XSControl_TransferReader.hxx>
54 #include <XSControl_Utils.hxx>
55 #include <Message.hxx>
58 IMPLEMENT_STANDARD_RTTIEXT(XSControl_TransferReader,Standard_Transient)
60 //=======================================================================
61 //function : SetController
63 //=======================================================================
65 void XSControl_TransferReader::SetController(const Handle(XSControl_Controller)& control)
67 myController = control;
73 //=======================================================================
76 //=======================================================================
78 Handle(Transfer_ActorOfTransientProcess) XSControl_TransferReader::Actor ()
80 if ( myActor.IsNull() && !myController.IsNull() && !myModel.IsNull())
81 myActor = myController->ActorRead(myModel);
86 //=======================================================================
89 //=======================================================================
91 void XSControl_TransferReader::SetModel(const Handle(Interface_InterfaceModel)& model)
94 if (!myTP.IsNull()) myTP->SetModel(model);
98 //=======================================================================
101 //=======================================================================
103 void XSControl_TransferReader::SetGraph(const Handle(Interface_HGraph)& graph)
110 myModel = graph->Graph().Model();
114 if (!myTP.IsNull()) myTP->SetGraph(graph);
118 //=======================================================================
119 //function : SetContext
121 //=======================================================================
123 void XSControl_TransferReader::SetContext(const Standard_CString name,
124 const Handle(Standard_Transient)& ctx)
126 myContext.Bind(name,ctx);
130 //=======================================================================
131 //function : GetContext
133 //=======================================================================
135 Standard_Boolean XSControl_TransferReader::GetContext
136 (const Standard_CString name, const Handle(Standard_Type)& type,
137 Handle(Standard_Transient)& ctx) const
139 if (myContext.IsEmpty()) return Standard_False;
140 if (!myContext.Find(name, ctx))
142 if (ctx.IsNull()) return Standard_False;
143 if (type.IsNull()) return Standard_True;
144 if (!ctx->IsKind(type)) ctx.Nullify();
145 return !ctx.IsNull();
149 //=======================================================================
152 //=======================================================================
154 void XSControl_TransferReader::Clear (const Standard_Integer mode)
158 myShapeResult.Nullify();
170 // ########################################################
171 // ########### RESULTATS ############
174 //=======================================================================
175 //function : RecordResult
177 //=======================================================================
179 Standard_Boolean XSControl_TransferReader::RecordResult
180 (const Handle(Standard_Transient)& ent)
182 if (myModel.IsNull() || myTP.IsNull()) return Standard_False;
183 Standard_Integer num = myModel->Number(ent);
184 if (num == 0) return Standard_False;
185 Handle(TCollection_HAsciiString) lab = myModel->StringLabel(ent);
187 Handle(Transfer_ResultFromModel) res = new Transfer_ResultFromModel;
188 res->Fill (myTP,ent);
190 // Cas du resultat Shape : pour resultat principal, faire HShape ...
191 Handle(Transfer_Binder) binder = res->MainResult()->Binder();
192 DeclareAndCast(TransferBRep_ShapeBinder,shb,binder);
194 Handle(Transfer_SimpleBinderOfTransient) trb = new Transfer_SimpleBinderOfTransient;
195 trb->SetResult ( new TopoDS_HShape(shb->Result()) );
197 res->MainResult()->SetBinder (trb);
200 res->SetFileName(myFileName.ToCString());
201 myResults.Bind(num,res);
202 return Standard_True;
206 //=======================================================================
207 //function : IsRecorded
209 //=======================================================================
211 Standard_Boolean XSControl_TransferReader::IsRecorded
212 (const Handle(Standard_Transient)& ent) const
214 if (myModel.IsNull()) return Standard_False;
215 Standard_Integer num = myModel->Number(ent);
216 if (num == 0) return Standard_False;
217 if(!myResults.IsBound(num)) return Standard_False;
218 return (myResults.Find(num)->DynamicType() == STANDARD_TYPE(Transfer_ResultFromModel) );
222 //=======================================================================
223 //function : HasResult
225 //=======================================================================
227 Standard_Boolean XSControl_TransferReader::HasResult
228 (const Handle(Standard_Transient)& ent) const
230 if (myModel.IsNull()) return Standard_False;
231 Standard_Integer num = myModel->Number(ent);
232 if (num == 0) return Standard_False;
233 if(!myResults.IsBound(num)) return Standard_False;
234 DeclareAndCast(Transfer_ResultFromModel,fr,myResults.Find(num));
235 if (fr.IsNull()) return Standard_False;
236 return fr->HasResult();
240 //=======================================================================
241 //function : RecordedList
243 //=======================================================================
245 Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::RecordedList () const
247 Handle(TColStd_HSequenceOfTransient) li = new TColStd_HSequenceOfTransient();
248 if (myModel.IsNull()) return li;
249 Standard_Integer i, nb = myModel->NbEntities();
250 for (i = 1; i <= nb; i ++) {
251 if(myResults.IsBound(i))
252 if(!myResults.Find(i).IsNull()) li->Append (myModel->Value(i));
258 //=======================================================================
261 //=======================================================================
263 Standard_Boolean XSControl_TransferReader::Skip(const Handle(Standard_Transient)& ent)
265 if (myModel.IsNull() || myTP.IsNull()) return Standard_False;
266 Standard_Integer num = myModel->Number(ent);
267 if (num == 0) return Standard_False;
268 myResults.Bind(num,ent);
269 return Standard_True;
273 //=======================================================================
274 //function : IsSkipped
276 //=======================================================================
278 Standard_Boolean XSControl_TransferReader::IsSkipped
279 (const Handle(Standard_Transient)& ent) const
281 if (myModel.IsNull()) return Standard_False;
282 Standard_Integer num = myModel->Number(ent);
283 if (num == 0) return Standard_False;
284 if(!myResults.IsBound(num)) return Standard_False;
285 return (myResults.Find(num)->DynamicType() != STANDARD_TYPE(Transfer_ResultFromModel) );
289 //=======================================================================
290 //function : IsMarked
292 //=======================================================================
294 Standard_Boolean XSControl_TransferReader::IsMarked
295 (const Handle(Standard_Transient)& ent) const
297 if (myModel.IsNull()) return Standard_False;
298 Standard_Integer num = myModel->Number(ent);
299 if (num == 0) return Standard_False;
300 if(!myResults.IsBound(num)) return Standard_False;
301 if (myResults.Find(num).IsNull()) return Standard_False;
302 return Standard_True;
306 // ######### ACCES UN PEU PLUS FIN #########
309 //=======================================================================
310 //function : FinalResult
312 //=======================================================================
314 Handle(Transfer_ResultFromModel) XSControl_TransferReader::FinalResult
315 (const Handle(Standard_Transient)& ent) const
317 Handle(Transfer_ResultFromModel) res;
318 if (myModel.IsNull()) return res;
319 Standard_Integer num = myModel->Number(ent);
320 if (num == 0) return res;
321 if(!myResults.IsBound(num)) return res;
322 res = GetCasted(Transfer_ResultFromModel,myResults.Find(num));
327 //=======================================================================
328 //function : FinalEntityLabel
330 //=======================================================================
332 Standard_CString XSControl_TransferReader::FinalEntityLabel
333 (const Handle(Standard_Transient)& ent) const
335 Handle(Transfer_ResultFromModel) resu = FinalResult (ent);
336 if (resu.IsNull()) return "";
337 return resu->MainLabel();
341 //=======================================================================
342 //function : FinalEntityNumber
344 //=======================================================================
346 Standard_Integer XSControl_TransferReader::FinalEntityNumber
347 (const Handle(Standard_Transient)& ent) const
349 Handle(Transfer_ResultFromModel) resu = FinalResult (ent);
350 if (resu.IsNull()) return 0;
351 return resu->MainNumber();
355 //=======================================================================
356 //function : ResultFromNumber
358 //=======================================================================
360 Handle(Transfer_ResultFromModel) XSControl_TransferReader::ResultFromNumber
361 (const Standard_Integer num) const
363 Handle(Transfer_ResultFromModel) res;
364 if ( num<1 || num>myModel->NbEntities() ) return res;
365 if(!myResults.IsBound(num)) return res;
366 res = GetCasted(Transfer_ResultFromModel,myResults.Find(num));
371 //=======================================================================
372 //function : TransientResult
374 //=======================================================================
376 Handle(Standard_Transient) XSControl_TransferReader::TransientResult
377 (const Handle(Standard_Transient)& ent) const
379 Handle(Standard_Transient) tres;
380 Handle(Transfer_ResultFromModel) res = FinalResult(ent);
381 if (res.IsNull()) return tres;
382 Handle(Transfer_ResultFromTransient) mres = res->MainResult();
383 if (mres.IsNull()) return tres;
384 DeclareAndCast(Transfer_SimpleBinderOfTransient,bnd,mres->Binder());
385 if (bnd.IsNull()) return tres;
386 if (!bnd->HasResult()) return tres;
387 return bnd->Result();
391 //=======================================================================
392 //function : ShapeResult
394 //=======================================================================
396 TopoDS_Shape XSControl_TransferReader::ShapeResult
397 (const Handle(Standard_Transient)& ent) const
399 TopoDS_Shape tres; // DOIT RESTER NULL
400 Handle(Transfer_ResultFromModel) res = FinalResult(ent);
401 if (res.IsNull()) return tres;
402 Handle(Transfer_ResultFromTransient) mres = res->MainResult();
403 if (mres.IsNull()) return tres;
405 TopoDS_Shape sh = xu.BinderShape (mres->Binder());
407 // Ouh la vilaine verrue
408 Standard_Real tolang = Interface_Static::RVal("read.encoderegularity.angle");
409 if (tolang <= 0 || sh.IsNull()) return sh;
410 ShapeFix::EncodeRegularity (sh,tolang);
415 //=======================================================================
416 //function : ClearResult
418 //=======================================================================
420 Standard_Boolean XSControl_TransferReader::ClearResult
421 (const Handle(Standard_Transient)& ent, const Standard_Integer mode)
423 if (myModel.IsNull()) return Standard_False;
424 Standard_Integer num = myModel->Number(ent);
425 if (num == 0) return Standard_False;
426 if(!myResults.IsBound(num)) return Standard_False;
428 myResults.ChangeFind(num).Nullify();
430 DeclareAndCast(Transfer_ResultFromModel,resu,myResults.Find(num));
431 if (resu.IsNull()) return Standard_False;
434 return Standard_True;
438 // <<<< >>>> ATTENTION, pas terrible : mieux vaudrait
439 // faire une map inverse et la consulter
440 // ou muscler ResultFromModel ...
443 //=======================================================================
444 //function : EntityFromResult
446 //=======================================================================
448 Handle(Standard_Transient) XSControl_TransferReader::EntityFromResult
449 (const Handle(Standard_Transient)& res, const Standard_Integer mode) const
451 Handle(Standard_Transient) nulh;
454 TopoDS_Shape sh = xu.BinderShape (res);
455 if (!sh.IsNull()) return EntityFromShapeResult (sh,mode);
457 Handle(Transfer_Binder) abinder;
458 DeclareAndCast(Transfer_Binder,binder,res);
459 Standard_Integer i,j,nb;
461 if (mode == 0 || mode == 1) {
462 // on regarde dans le TransientProcess (Roots ou tous Mappeds)
463 if (!myTP.IsNull()) {
464 nb = (mode == 0 ? myTP->NbRoots() : myTP->NbMapped());
465 for (j = 1; j <= nb; j ++) {
466 i = (mode == 0 ? myModel->Number (myTP->Root(j)) : j);
467 if (i == 0) continue;
468 abinder = myTP->MapItem(i);
469 if (abinder.IsNull()) continue;
470 if (!binder.IsNull()) {
471 if (binder == abinder) return myTP->Mapped(i);
474 DeclareAndCast(Transfer_SimpleBinderOfTransient,trb,abinder);
475 if (trb.IsNull()) continue;
476 if (trb->Result() == res) return myTP->Mapped(i);
482 // Recherche dans myResults (racines)
483 // 2 : Main only 3 : Main + one sub; 4 : all
485 nb = myModel->NbEntities();
486 for (i = 1; i <= nb; i ++) {
487 Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
488 if (rec.IsNull()) return nulh;
489 Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2);
490 Standard_Integer ir,nr = list->Length();
491 for (ir = 1; ir <= nr; ir ++) {
492 DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(ir));
493 if (rft.IsNull()) continue;
494 if (rft->Binder() == binder) return rft->Start();
500 // autres cas non encore implementes
505 // <<<< >>>> ATTENTION, encore moins bien que le precedent
508 //=======================================================================
509 //function : EntityFromShapeResult
511 //=======================================================================
513 Handle(Standard_Transient) XSControl_TransferReader::EntityFromShapeResult
514 (const TopoDS_Shape& res, const Standard_Integer mode) const
516 Handle(Standard_Transient) nulh, samesh, partner;
517 if (res.IsNull()) return nulh;
518 Standard_Integer i,j,nb;
521 if (mode == 0 || mode == 1 || mode == -1) {
522 // on regarde dans le TransientProcess
523 if (!myTP.IsNull()) {
524 nb = (mode == 0 ? myTP->NbRoots() : myTP->NbMapped());
525 for (j = 1; j <= nb; j ++) {
526 i = (mode == 0 ? myModel->Number (myTP->Root(j)) : j);
527 if (i == 0) continue;
528 Handle(Standard_Transient) ent = myTP->Mapped(i);
529 TopoDS_Shape sh = TransferBRep::ShapeResult (myTP,ent);
531 if (sh == res) return ent;
532 // priorites moindre : Same (tjrs) ou Partner (mode < 0)
533 if (sh.IsSame(res)) samesh = ent;
534 if (mode == -1 && sh.IsPartner(res)) partner= ent;
538 // Ici, pas trouve de vraie egalite. Priorites moindres : Same puis Partner
539 if (!samesh.IsNull()) return samesh;
540 if (!partner.IsNull()) return partner; // calcule si mode = -1
544 // Recherche dans myResults (racines)
545 // 2 : Main only 3 : Main + one sub; 4 : all
547 nb = myModel->NbEntities();
548 for (i = 1; i <= nb; i ++) {
549 Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
550 if (rec.IsNull()) continue;
552 Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2);
553 Standard_Integer ir,nr = list->Length();
554 for (ir = 1; ir <= nr; ir ++) {
555 DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(ir));
556 if (rft.IsNull()) continue;
557 TopoDS_Shape sh = xu.BinderShape (rft->Binder());
558 if (!sh.IsNull() && sh == res) return rft->Start();
568 //=======================================================================
569 //function : EntitiesFromShapeList
571 //=======================================================================
573 Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::EntitiesFromShapeList
574 (const Handle(TopTools_HSequenceOfShape)& res,
575 const Standard_Integer mode) const
577 Handle(TColStd_HSequenceOfTransient) lt = new TColStd_HSequenceOfTransient();
578 if (res.IsNull()) return lt;
579 TopTools_MapOfShape shapes;
581 // On convertit res en une map, pour test de presence rapide
582 Standard_Integer i, j, nb = res->Length();
583 if (nb == 0) return lt;
584 for (i = 1; i <= nb; i ++) shapes.Add (res->Value(i));
586 // A present, recherche et enregistrement
589 if (mode == 0 || mode == 1) {
590 // on regarde dans le TransientProcess
591 if (!myTP.IsNull()) {
592 nb = (mode == 0 ? myTP->NbRoots() : myTP->NbMapped());
593 for (j = 1; j <= nb; j ++) {
594 i = (mode == 0 ? myModel->Number (myTP->Root(j)) : j);
595 if (i == 0) continue;
596 TopoDS_Shape sh = xu.BinderShape (myTP->MapItem(i));
597 if (!sh.IsNull() && shapes.Contains(sh)) {
598 lt->Append (myTP->Mapped(i));
599 j=nb; //skl (for looking for entities in checkbrep)
605 // Recherche dans myResults (racines)
606 // 2 : Main only 3 : Main + one sub; 4 : all
608 nb = myModel->NbEntities();
609 for (i = 1; i <= nb; i ++) {
610 Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
611 if (rec.IsNull()) continue;
613 Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2);
614 Standard_Integer ir,nr = list->Length();
615 for (ir = 1; ir <= nr; ir ++) {
616 DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(i));
617 if (rft.IsNull()) continue;
618 TopoDS_Shape sh = xu.BinderShape (rft->Binder());
619 if (!sh.IsNull() && shapes.Contains(sh)) lt->Append (rft->Start());
629 // <<<< >>>> ATTENTION, level pas traite (utile ?) -> ResultFromModel
632 //=======================================================================
633 //function : CheckList
635 //=======================================================================
637 Interface_CheckIterator XSControl_TransferReader::CheckList
638 (const Handle(Standard_Transient)& ent, const Standard_Integer level) const
640 Interface_CheckIterator chl;
641 if (myModel.IsNull() || ent.IsNull()) return chl;
642 // Check-List COMPLETE ... tout le Modele
643 if (ent == myModel) {
644 Standard_Integer i,nb = myModel->NbEntities();
645 for (i = 1; i <= nb; i ++) {
646 Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
648 Interface_CheckIterator chiter = rec->CheckList (Standard_False,2);
653 // Check-List sur une LISTE ...
654 else if (ent->IsKind(STANDARD_TYPE(TColStd_HSequenceOfTransient))) {
655 DeclareAndCast(TColStd_HSequenceOfTransient,list,ent);
656 Standard_Integer i,nb = list->Length();
657 for (i = 1; i <= nb; i ++) {
658 Handle(Transfer_ResultFromModel) rec = FinalResult (list->Value(i));
660 Interface_CheckIterator chiter = rec->CheckList (Standard_False,level);
666 // sinon, Check-List sur une entite : Last ou FinalResult
667 else if (level < 0) {
668 if (myTP.IsNull()) return chl;
669 chl.Add (myTP->Check(ent),myModel->Number(ent));
671 Handle(Transfer_ResultFromModel) rec = FinalResult (ent);
672 if (rec.IsNull()) return chl;
673 chl = rec->CheckList(Standard_False,level); // manque level ...
675 if (ent == myModel) chl.SetName ("XSControl : CheckList complete Model");
676 else if (level < 0) chl.SetName ("XSControl : CheckList Last");
677 else if (level == 0) chl.SetName ("XSControl : CheckList Final Main");
678 else if (level == 1) chl.SetName ("XSControl : CheckList Final Main+Subs");
679 else if (level >= 2) chl.SetName ("XSControl : CheckList Final Complete");
684 //=======================================================================
685 //function : HasChecks
687 //=======================================================================
689 Standard_Boolean XSControl_TransferReader::HasChecks
690 (const Handle(Standard_Transient)& ent, const Standard_Boolean failsonly) const
692 Handle(Transfer_ResultFromModel) resu = FinalResult (ent);
693 if (resu.IsNull()) return Standard_False;
694 Standard_Integer stat = resu->ComputeCheckStatus (Standard_False);
695 if (stat == 0) return Standard_False;
696 if (stat > 1) return Standard_True;
701 //=======================================================================
702 //function : CheckedList
704 //=======================================================================
706 Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::CheckedList
707 (const Handle(Standard_Transient)& ent,
708 const Interface_CheckStatus withcheck, const Standard_Boolean level) const
710 Handle(TColStd_HSequenceOfTransient) res = new TColStd_HSequenceOfTransient();
711 if (ent.IsNull()) return res;
713 if (ent == myModel) {
714 Standard_Integer i,nb = myModel->NbEntities();
715 for (i = 1; i <= nb; i ++) {
716 Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
717 if (!rec.IsNull()) res->Append (rec->CheckedList(withcheck,level));
719 } else if (ent->IsKind(STANDARD_TYPE(TColStd_HSequenceOfTransient))) {
720 DeclareAndCast(TColStd_HSequenceOfTransient,list,ent);
721 Standard_Integer i,nb = list->Length();
722 for (i = 1; i <= nb; i ++) {
723 Handle(Transfer_ResultFromModel) rec = FinalResult (list->Value(i));
724 if (!rec.IsNull()) res->Append (rec->CheckedList(withcheck,level));
727 Handle(Transfer_ResultFromModel) rec = FinalResult (ent);
728 if (!rec.IsNull()) res = rec->CheckedList(withcheck,level);
734 // ########################################################
735 // ########### TRANSFERT ############
736 // ########################################################
739 //=======================================================================
740 //function : BeginTransfer
742 //=======================================================================
744 Standard_Boolean XSControl_TransferReader::BeginTransfer ()
746 if (myModel.IsNull()) return Standard_False;
747 if (Actor().IsNull()) return Standard_False;
748 myShapeResult.Nullify();
750 if (myTP.IsNull()) myTP = new Transfer_TransientProcess
751 (myModel->NbEntities());
753 Handle(Transfer_ActorOfTransientProcess) actor;
754 myTP->SetActor (actor); // -> RAZ
756 myTP->SetActor (actor); // Set proprement dit
757 myTP->SetErrorHandle (Standard_True);
758 NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)>& aTPContext = myTP->Context();
759 aTPContext = myContext;
760 return Standard_True;
764 //=======================================================================
765 //function : Recognize
767 //=======================================================================
769 Standard_Boolean XSControl_TransferReader::Recognize
770 (const Handle(Standard_Transient)& ent)
772 if (myActor.IsNull()) return Standard_False;
773 return myActor->Recognize (ent);
777 //=======================================================================
778 //function : TransferOne
780 //=======================================================================
782 Standard_Integer XSControl_TransferReader::TransferOne
783 (const Handle(Standard_Transient)& ent, const Standard_Boolean rec)
785 if (myActor.IsNull() || myModel.IsNull()) return 0;
787 if (myTP.IsNull()) { if (!BeginTransfer()) return 0; }
789 Message_Messenger::StreamBuffer sout = myTP->Messenger()->SendInfo();
790 Standard_Integer level = myTP->TraceLevel();
793 Transfer_TransferOutput TP (myTP,myModel);
794 if (myGraph.IsNull()) myTP->SetModel(myModel);
795 else myTP->SetGraph(myGraph);
799 Standard_Integer num = myModel->Number(ent);
800 Handle(TCollection_HAsciiString) lab = myModel->StringLabel(ent);
801 sout<<"\n*******************************************************************\n";
802 sout << "****** Transferring one Entity ******"<<std::endl;
804 sout<<"****** N0 in file : "<<Interface_MSG::Blanks(num,5)<<num
805 <<" Ident : "<<lab->ToCString()
806 << Interface_MSG::Blanks(14 - lab->Length())<<"******\n";
807 sout << "****** Type : "<<myModel->TypeName(ent,Standard_False)
808 << Interface_MSG::Blanks((Standard_Integer) (44 - strlen(myModel->TypeName(ent,Standard_False))))
810 sout<<"\n*******************************************************************\n";
813 // seule difference entre TransferRoots et TransferOne
814 Standard_Integer res = 0;
815 Handle(Standard_Transient) obj = ent;
820 Handle(Transfer_Binder) binder = myTP->Find (obj);
821 if (binder.IsNull()) return res;
822 if (rec) RecordResult (obj);
824 if (!binder->HasResult()) return res;
831 //=======================================================================
832 //function : TransferList
834 //=======================================================================
836 Standard_Integer XSControl_TransferReader::TransferList
837 (const Handle(TColStd_HSequenceOfTransient)& list, const Standard_Boolean rec)
839 if (myActor.IsNull() || myModel.IsNull()) return 0;
841 if (myTP.IsNull()) { if (!BeginTransfer()) return 0; }
843 Standard_Integer level = myTP->TraceLevel();
845 Transfer_TransferOutput TP (myTP,myModel);
846 if (myGraph.IsNull()) myTP->SetModel(myModel);
847 else myTP->SetGraph(myGraph);
849 Standard_Integer i,nb = list->Length();
853 Message_Messenger::StreamBuffer sout = myTP->Messenger()->SendInfo();
854 sout<<"\n*******************************************************************\n";
855 sout << "****** Transferring a list of "<<Interface_MSG::Blanks(nb,5)<<" Entities ******"<<std::endl;
856 sout<<"\n*******************************************************************\n";
858 Handle(IFSelect_SignatureList) sl = new IFSelect_SignatureList;
859 for (i = 1; i <= nb; i ++)
860 sl->Add (list->Value(i), myModel->TypeName(list->Value(i),Standard_False));
861 sl->SetName ("Entities to Transfer");
862 sl->PrintCount (sout);
863 sout<<"\n*******************************************************************\n";
866 // seule difference entre TransferRoots et TransferOne
867 Standard_Integer res = 0;
869 Handle(Standard_Transient) obj;
871 for (i = 1; i <= nb; i ++) {
872 obj = list->Value(i);
877 Handle(Transfer_Binder) binder = myTP->Find (obj);
878 if (binder.IsNull()) continue;
879 if (rec) RecordResult (obj);
881 if (!binder->HasResult()) continue;
888 // <<<< >>>> passage Graph : judicieux ?
891 //=======================================================================
892 //function : TransferRoots
894 //=======================================================================
896 Standard_Integer XSControl_TransferReader::TransferRoots(const Interface_Graph& G)
898 if (myModel != G.Model()) return -1;
899 if (!BeginTransfer()) return -1;
900 Standard_Integer level = myTP->TraceLevel();
902 Transfer_TransferOutput TP (myTP,myModel);
903 if (myGraph.IsNull()) myTP->SetModel(myModel);
904 else myTP->SetGraph(myGraph);
908 Interface_EntityIterator roots = G.RootEntities();
909 Standard_Integer nb = roots.NbEntities();
910 Message_Messenger::StreamBuffer sout = myTP->Messenger()->SendInfo();
911 sout<<"\n*******************************************************************\n";
912 sout << "****** Transferring the "<<Interface_MSG::Blanks(nb,5)<<" Root Entities ******"<<std::endl;
913 sout<<"\n*******************************************************************\n";
914 Handle(IFSelect_SignatureList) sl = new IFSelect_SignatureList;
915 for (roots.Start(); roots.More(); roots.Next())
916 sl->Add (roots.Value(),myModel->TypeName(roots.Value(),Standard_False));
917 sl->SetName ("Entities to Transfer");
918 sl->PrintCount (sout);
919 sout<<"\n*******************************************************************\n";
922 TP.TransferRoots (G);
924 // Les entites transferees sont notees "asmain"
925 Standard_Integer i,n = myTP->NbMapped();
926 for (i = 1; i <= n; i ++) {
927 Handle(Standard_Transient) ent = myTP->Mapped(i);
928 Handle(Transfer_Binder) bnd = myTP->MapItem(i);
929 if (bnd.IsNull()) continue;
930 if (!bnd->HasResult()) continue;
934 // Resultat ... on note soigneuseument les Shapes
935 myShapeResult = TransferBRep::Shapes (myTP,Standard_True);
936 // ???? Et ici, il faut alimenter Imagine ...
937 return myShapeResult->Length();
941 //=======================================================================
942 //function : TransferClear
944 //=======================================================================
946 void XSControl_TransferReader::TransferClear(const Handle(Standard_Transient)& ent,
947 const Standard_Integer level)
949 if (myTP.IsNull()) return;
950 if (ent == myModel) { myTP->Clear(); return; }
952 myTP->RemoveResult (ent,level);
953 ClearResult (ent,-1);
958 //=======================================================================
959 //function : PrintStats
961 //=======================================================================
963 void XSControl_TransferReader::PrintStats (Standard_OStream& sout,
964 const Standard_Integer what,
965 const Standard_Integer mode) const
968 sout<<"\n*******************************************************************\n";
969 sout << "****** Statistics on Transfer (Read) ******"<<std::endl;
970 sout<<"\n*******************************************************************\n";
971 if (what > 10) { sout<<" *** Not yet implemented"<<std::endl; return; }
973 sout << "****** Data recorded on Last Transfer ******"<<std::endl;
974 PrintStatsProcess (myTP,what,mode);
976 // reste what = 10 : on liste les racines des final results
977 sout << "****** Final Results ******"<<std::endl;
978 if (myModel.IsNull()) { sout<<"**** Model unknown"<<std::endl; return; }
979 Handle(TColStd_HSequenceOfTransient) list = RecordedList();
980 Standard_Integer i, nb = list->Length();
981 Handle(IFSelect_SignatureList) counter;
982 if (mode > 2) counter = new IFSelect_SignatureList (mode == 6);
983 IFSelect_PrintCount pcm = IFSelect_CountByItem;
984 if (mode == 6) pcm = IFSelect_ListByItem;
986 sout<<"**** Nb Recorded : "<<nb<<" : entities n0s : ";
987 for (i = 1; i <= nb; i ++) {
988 Handle(Standard_Transient) ent = list->Value(i);
989 if (mode == 0) { sout<<" "<<myModel->Number(ent); continue; }
990 if (mode == 1 || mode == 2) {
991 sout<<"[ "<<Interface_MSG::Blanks (i,6)<<" ]:";
992 myModel->Print (ent, sout);
993 sout<<" Type:"<<myModel->TypeName(ent,Standard_False);
995 if (mode >= 3 && mode <= 6) {
996 counter->Add (ent,myModel->TypeName(ent,Standard_False));
999 if (!counter.IsNull()) counter->PrintList (sout, myModel, pcm);
1005 // ########################################################
1006 // ########### TRANSFERT ############
1009 //=======================================================================
1010 //function : LastCheckList
1012 //=======================================================================
1014 Interface_CheckIterator XSControl_TransferReader::LastCheckList () const
1016 Interface_CheckIterator chl;
1017 if (!myTP.IsNull()) chl = myTP->CheckList (Standard_False);
1022 //=======================================================================
1023 //function : LastTransferList
1025 //=======================================================================
1027 Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::LastTransferList
1028 (const Standard_Boolean roots) const
1030 Handle(TColStd_HSequenceOfTransient) li = new TColStd_HSequenceOfTransient();
1031 if (myTP.IsNull()) return li;
1032 Standard_Integer i,j,nb =
1033 (roots ? myTP->NbRoots() : myTP->NbMapped());
1034 for (j = 1; j <= nb; j ++) {
1035 i = (roots ? myModel->Number (myTP->Root(j)) : j);
1036 Handle(Transfer_Binder) bnd = myTP->MapItem(i);
1037 if (bnd.IsNull()) continue;
1038 if (!bnd->HasResult()) continue;
1039 li->Append (myTP->Mapped(i));
1045 //=======================================================================
1046 //function : ShapeResultList
1048 //=======================================================================
1050 const Handle(TopTools_HSequenceOfShape) & XSControl_TransferReader::ShapeResultList
1051 (const Standard_Boolean rec)
1054 if (myShapeResult.IsNull()) myShapeResult = TransferBRep::Shapes (myTP,Standard_True);
1055 if (myShapeResult.IsNull()) myShapeResult = new TopTools_HSequenceOfShape();
1057 if (myShapeResult.IsNull()) myShapeResult = new TopTools_HSequenceOfShape();
1058 if (myModel.IsNull()) return myShapeResult;
1059 Handle(TColStd_HSequenceOfTransient) li = RecordedList();
1060 myShapeResult = new TopTools_HSequenceOfShape();
1061 Standard_Integer i, nb = myModel->NbEntities();
1063 for (i = 1; i <= nb; i ++) {
1064 sh = ShapeResult (myModel->Value(i));
1065 if (!sh.IsNull()) myShapeResult->Append(sh);
1068 return myShapeResult;
1072 // **** UTILITAIRE DE STATISTIQUES GENERALES
1074 // BinderStatus retourne une valeur :
1075 // 0 Binder Null. 1 void 2 Warning seul 3 Fail seul
1076 // 11 Resultat OK. 12 Resultat+Warning. 13 Resultat+Fail
1078 //=======================================================================
1081 //=======================================================================
1082 static Standard_Integer BinderStatus (const Handle(Transfer_Binder)& binder, char* mess)
1084 Standard_Integer stat = 0;
1086 if (binder.IsNull()) { sprintf (mess,"(no data recorded)"); return 0; }
1087 Interface_CheckStatus cst = binder->Check()->Status();
1088 if (cst == Interface_CheckOK) {
1090 if (binder->HasResult()) sprintf(mess,"%s",binder->ResultTypeName());
1091 else { sprintf(mess,"(no result)"); stat = 1; }
1092 } else if (cst == Interface_CheckWarning) {
1094 if (binder->HasResult()) sprintf(mess,"%s (+ warning)",binder->ResultTypeName());
1095 else { sprintf(mess,"(warning)"); stat = 2; }
1096 } else if (cst == Interface_CheckFail) {
1098 if (binder->HasResult()) sprintf(mess,"%s (+ FAIL)",binder->ResultTypeName());
1099 else { sprintf(mess,"(FAIL)"); stat = 3; }
1105 //=======================================================================
1108 //=======================================================================
1109 static void PrintPercent(const Handle(Message_Messenger)& sout, const Standard_CString mess,
1110 const Standard_Integer nb, const Standard_Integer nl)
1112 if (nb <= 0 || nl == 0) return;
1113 Message_Messenger::StreamBuffer aSender = sout->SendInfo();
1114 aSender<<"****** "<<mess<<": ";
1115 if (nb == nl) aSender<<"100 %"<<std::endl;
1116 else if (nb*100/nl == 0) aSender<<"< 1 %"<<std::endl;
1117 else aSender<<(nb*100/nl < 10 ? " " : " ")<<nb*100/nl<<" %"<<std::endl;
1121 //=======================================================================
1122 //function : PrintStatsProcess
1124 //=======================================================================
1126 void XSControl_TransferReader::PrintStatsProcess(const Handle(Transfer_TransientProcess)& TP,
1127 const Standard_Integer what,
1128 const Standard_Integer mode)
1130 Handle(TColStd_HSequenceOfTransient) list; // null
1131 XSControl_TransferReader::PrintStatsOnList (TP,list,what,mode);
1135 //=======================================================================
1136 //function : PrintStatsOnList
1138 //=======================================================================
1140 void XSControl_TransferReader::PrintStatsOnList(const Handle(Transfer_TransientProcess)& TP,
1141 const Handle(TColStd_HSequenceOfTransient)& list,
1142 const Standard_Integer what,
1143 const Standard_Integer mode)
1145 Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo();
1148 if (TP.IsNull()) return;
1149 if (what == 0) { TP->PrintStats(0,sout); return; }
1151 sout<<"\n*******************************************************************\n";
1152 sout << "****** Statistics on Transfer Process (Read) ******"<<std::endl;
1153 if (what == 1) sout << "****** Individual Transfers (Roots) ******\n";
1154 if (what == 2) sout << "****** All recorded data about Transfer ******\n";
1155 if (what == 3) sout << "****** Abnormal records ******\n";
1156 if (what == 1 || what == 2 || what == 3) {
1157 if (mode == 0) sout<<"****** (n0s of recorded entities) ******\n";
1158 if (mode == 1) sout<<"****** (per entity : type + result) ******\n";
1159 if (mode == 2) sout<<"****** (per entity : type + result/status) ******\n";
1160 if (mode == 3) sout<<"****** (count per type of entity) ******\n";
1161 if (mode == 4) sout<<"****** (count per type of result) ******\n";
1162 if (mode == 5) sout<<"****** (count per couple entity-type / result-type/status) ******\n";
1163 if (mode == 6) sout<<"****** (list per couple entity-type / result-type/status) ******\n";
1165 if (what == 4) sout << "****** Check messages ******\n";
1166 if (what == 5) sout << "****** Fail messages ******\n";
1167 sout<<"*******************************************************************\n";
1169 // Cas what = 1,2,3 : contenu du TP (binders)
1171 Standard_Boolean nolist = list.IsNull();
1172 Handle(Interface_InterfaceModel) model = TP->Model();
1173 if (what >= 1 && what <= 3) {
1175 Standard_Integer stat;
1176 Standard_Integer nbv = 0, nbw = 0, nbf = 0, nbr = 0, nbrw = 0, nbrf = 0, nbnr = 0, nbi = 0;
1177 Transfer_IteratorOfProcessForTransient itrp(Standard_True);
1178 if (what == 1) itrp = TP->RootResult(Standard_True);
1179 if (what == 2) itrp = TP->CompleteResult(Standard_True);
1180 if (what == 3) itrp = TP->AbnormalResult();
1181 Standard_Integer i = 0, nb = itrp.Number();
1182 if (!nolist) itrp.Filter (list);
1183 Standard_Integer nl = itrp.Number(); // apres filtrage
1184 Handle(IFSelect_SignatureList) counter;
1185 if (mode > 2) counter = new IFSelect_SignatureList (mode == 6);
1186 Standard_Boolean notrec = (!nolist && mode > 2); // noter les "no record"
1187 IFSelect_PrintCount pcm = IFSelect_CountByItem;
1188 if (mode == 6) pcm = IFSelect_ListByItem;
1190 sout <<"**** Entities in Model : "<<model->NbEntities()<<std::endl;
1191 sout <<"**** Nb Items (Transfer) : "<<nb<<std::endl;
1193 sout<<"**** Nb Items (Listed) : "<<nl<<std::endl;
1195 for (itrp.Start(); itrp.More(); itrp.Next()) {
1197 Handle(Transfer_Binder) binder = itrp.Value();
1198 Handle(Standard_Transient) ent = itrp.Starting();
1199 if (binder.IsNull()) {
1201 if (notrec) counter->Add(ent,"(not recorded)");
1202 else if (mode == 1 || mode == 2) {
1203 sout<<"["<<Interface_MSG::Blanks (nbi,4)<<nbi<<" ]:";
1204 model->Print (ent, sout);
1205 sout<<" "<<model->TypeName(ent,Standard_False)<<" (not recorded)"<<std::endl;
1209 if (mode == 0) { sout<<" "<<model->Number(ent); continue; }
1211 stat = BinderStatus(binder,mess);
1212 // 0 Binder Null. 1 void 2 Warning seul 3 Fail seul
1213 // 11 Resultat OK. 12 Resultat+Warning. 13 Resultat+Fail
1214 if (stat == 0 || stat == 1) nbv ++;
1215 if (stat == 2) nbw ++;
1216 if (stat == 3) nbf ++;
1217 if (stat == 11) nbr ++;
1218 if (stat == 12) nbrw ++;
1219 if (stat == 13) nbrf ++;
1222 // mode : 0 list num; 1 : num+label + type + result (abrege); 2 : complet
1223 if (mode == 1 || mode == 2) {
1224 sout<<"["<<Interface_MSG::Blanks (i,4)<<i<<" ]:";
1225 model->Print (ent, sout);
1226 sout<<" "<<model->TypeName(ent,Standard_False);
1227 sout<<" Result:"<<mess<<std::endl;
1228 if (mode == 1) continue;
1230 const Handle(Interface_Check)& ch = binder->Check();
1231 Standard_Integer newi,newnbw = ch->NbWarnings(), newnbf = ch->NbFails();
1234 sout<<" - Warnings : "<<newnbw<<":\n";
1235 for (newi = 1; newi <= newnbw; newi ++) sout<<ch->CWarning(newi)<<std::endl;
1238 sout<<" - Fails : "<<newnbf<<":\n";
1239 for (newi = 1; newi <= newnbf; newi ++) sout<<ch->CFail(newi)<<std::endl;
1244 // mode : 3, counts per type of starting entity (class type)
1245 // 4 : counts per result type and/or status
1246 // 5 : counts per couple (starting type / result type/status)
1247 // 6 : idem plus gives for each item, the list of numbers of
1248 // entities in the starting model
1249 if (mode >= 3 && mode <= 6) {
1250 //IFSelect_PrintCount newpcm = IFSelect_CountByItem;
1251 //if (mode == 6) newpcm = IFSelect_ListByItem;
1252 if (mode == 3) counter->Add (ent,model->TypeName(ent,Standard_False));
1253 if (mode == 4) counter->Add (ent,mess);
1255 TCollection_AsciiString mest (model->TypeName(ent,Standard_False));
1256 mest.AssignCat(" -> ");
1257 mest.AssignCat(mess);
1258 //sprintf(mest,"%s -> %s",model->TypeName(ent,Standard_False),mess);
1259 counter->Add (ent,mest.ToCString());
1263 // Fin de l iteration
1265 if (!counter.IsNull()) counter->PrintList (sout, model, pcm);
1266 else sout<<std::endl;
1268 if (mode != 3 && nbi > 0) {
1269 sout << "****** Percentages according Transfer Status ******"<<std::endl;
1270 PrintPercent (TP->Messenger(),"Result ",nbr+nbrw,nl);
1271 PrintPercent (TP->Messenger(),"Result + FAIL ",nbrf,nl);
1272 PrintPercent (TP->Messenger(),"FAIL, no Result ",nbf,nl);
1273 PrintPercent (TP->Messenger(),"Just Warning ",nbw,nl);
1274 PrintPercent (TP->Messenger(),"Nothing Recorded",nbnr,nl);
1275 /* if (nbr+nbrw > 0)
1276 sout<<"****** Result : "<< (nbr+nbrw)*100/nl<<" %"<<std::endl;
1278 sout<<"****** Result + FAIL : "<< (nbrf)*100/nl<<" %"<<std::endl;
1280 sout<<"****** FAIL, no Result : "<< (nbf)*100/nl<<" %"<<std::endl;
1282 sout<<"****** Just Warning : "<< (nbw)*100/nl<<" %"<<std::endl;
1284 sout<<"****** Nothing Recorded: "<< (nbnr)*100/nl<<" %"<<std::endl; */
1289 // Cas what = 4,5 : check-list
1291 if (what == 4 || what == 5) {
1293 Interface_CheckIterator chl = TP->CheckList(Standard_False);
1294 chl.SetName("** TRANSFER READ CHECK **");
1297 chl.Print (sout, model, (what == 5));
1300 IFSelect_PrintCount pcm = IFSelect_CountByItem;
1301 if (mode == 2) pcm = IFSelect_ListByItem;
1302 Handle(IFSelect_CheckCounter) counter = new IFSelect_CheckCounter(Standard_True);
1303 counter->Analyse (chl,model,Standard_True,(what == 5));
1304 counter->PrintList (sout, model, pcm);