//: abv 09.04.99: S4136: remove parameter lastpreci // szv#11:CASCADE30:01Feb00 BRepBuilderAPI::Precision(p) removed #include #include #include #include #include #include #include #include #include #include #include #include // Precision : #include #include // Pour les regularites #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #ifdef DEB static void monDBPE (const Handle(Message_Messenger)& S, const Handle(Standard_Transient)& ent, const Handle(Standard_Transient)& context) { if (ent.IsNull()) { S<<"(null)"; return; } DeclareAndCast(Interface_InterfaceModel,model,context); if (model.IsNull()) { S<DynamicType()->Name(); return; } model->Print (ent,S); S<<" "<TypeName(ent,Standard_False); } #endif */ //======================================================================= //function : XSControl_TransferReader //purpose : //======================================================================= XSControl_TransferReader::XSControl_TransferReader () { } //======================================================================= //function : SetController //purpose : //======================================================================= void XSControl_TransferReader::SetController(const Handle(XSControl_Controller)& control) { theController = control; theActor.Nullify(); Clear(-1); } //======================================================================= //function : SetActor //purpose : //======================================================================= void XSControl_TransferReader::SetActor (const Handle(Transfer_ActorOfTransientProcess)& actor) { theActor = actor; } //======================================================================= //function : Actor //purpose : //======================================================================= Handle(Transfer_ActorOfTransientProcess) XSControl_TransferReader::Actor () { if ( theActor.IsNull() && !theController.IsNull() && !theModel.IsNull()) theActor = theController->ActorRead(theModel); return theActor; } //======================================================================= //function : SetModel //purpose : //======================================================================= void XSControl_TransferReader::SetModel(const Handle(Interface_InterfaceModel)& model) { theModel = model; if (!theTransfer.IsNull()) theTransfer->SetModel(model); } //======================================================================= //function : SetGraph //purpose : //======================================================================= void XSControl_TransferReader::SetGraph(const Handle(Interface_HGraph)& graph) { if (graph.IsNull()) return; theGraph = graph; theModel = graph->Graph().Model(); if (!theTransfer.IsNull()) theTransfer->SetGraph(graph); } //======================================================================= //function : Model //purpose : //======================================================================= Handle(Interface_InterfaceModel) XSControl_TransferReader::Model () const { return theModel; } //======================================================================= //function : SetContext //purpose : //======================================================================= void XSControl_TransferReader::SetContext(const Standard_CString name, const Handle(Standard_Transient)& ctx) { if (theContext.IsNull()) theContext = new Dico_DictionaryOfTransient; theContext->SetItem (name,ctx); } //======================================================================= //function : GetContext //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::GetContext (const Standard_CString name, const Handle(Standard_Type)& type, Handle(Standard_Transient)& ctx) const { if (theContext.IsNull()) return Standard_False; if (!theContext->GetItem (name,ctx)) ctx.Nullify(); if (ctx.IsNull()) return Standard_False; if (type.IsNull()) return Standard_True; if (!ctx->IsKind(type)) ctx.Nullify(); return !ctx.IsNull(); } //======================================================================= //function : Context //purpose : //======================================================================= Handle(Dico_DictionaryOfTransient)& XSControl_TransferReader::Context () { return theContext; } //======================================================================= //function : SetFileName //purpose : //======================================================================= void XSControl_TransferReader::SetFileName (const Standard_CString name) { theFilename.Clear(); theFilename.AssignCat(name); } //======================================================================= //function : FileName //purpose : //======================================================================= Standard_CString XSControl_TransferReader::FileName () const { return theFilename.ToCString(); } //======================================================================= //function : Clear //purpose : //======================================================================= void XSControl_TransferReader::Clear (const Standard_Integer mode) { if (mode & 1) { theResults.Clear(); theShapeResult.Nullify(); } if (mode & 2) { theModel.Nullify(); theGraph.Nullify(); theTransfer.Nullify(); theActor.Nullify(); theFilename.Clear(); } // theContext.Nullify(); } //======================================================================= //function : TransientProcess //purpose : //======================================================================= Handle(Transfer_TransientProcess) XSControl_TransferReader::TransientProcess () const { return theTransfer; } //======================================================================= //function : SetTransientProcess //purpose : //======================================================================= void XSControl_TransferReader::SetTransientProcess (const Handle(Transfer_TransientProcess)& TP) { theTransfer = TP; } // ######################################################## // ########### RESULTATS ############ //======================================================================= //function : RecordResult //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::RecordResult (const Handle(Standard_Transient)& ent) { if (theModel.IsNull() || theTransfer.IsNull()) return Standard_False; Standard_Integer num = theModel->Number(ent); if (num == 0) return Standard_False; Handle(TCollection_HAsciiString) lab = theModel->StringLabel(ent); Handle(Transfer_ResultFromModel) res = new Transfer_ResultFromModel; res->Fill (theTransfer,ent); // Cas du resultat Shape : pour resultat principal, faire HShape ... Handle(Transfer_Binder) binder = res->MainResult()->Binder(); DeclareAndCast(TransferBRep_ShapeBinder,shb,binder); if (!shb.IsNull()) { Handle(Transfer_SimpleBinderOfTransient) trb = new Transfer_SimpleBinderOfTransient; trb->SetResult ( new TopoDS_HShape(shb->Result()) ); trb->Merge(binder); res->MainResult()->SetBinder (trb); } res->SetFileName(theFilename.ToCString()); theResults.Bind(num,res); return Standard_True; } //======================================================================= //function : IsRecorded //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::IsRecorded (const Handle(Standard_Transient)& ent) const { if (theModel.IsNull()) return Standard_False; Standard_Integer num = theModel->Number(ent); if (num == 0) return Standard_False; if(!theResults.IsBound(num)) return Standard_False; return (theResults.Find(num)->DynamicType() == STANDARD_TYPE(Transfer_ResultFromModel) ); } //======================================================================= //function : HasResult //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::HasResult (const Handle(Standard_Transient)& ent) const { if (theModel.IsNull()) return Standard_False; Standard_Integer num = theModel->Number(ent); if (num == 0) return Standard_False; if(!theResults.IsBound(num)) return Standard_False; DeclareAndCast(Transfer_ResultFromModel,fr,theResults.Find(num)); if (fr.IsNull()) return Standard_False; return fr->HasResult(); } //======================================================================= //function : RecordedList //purpose : //======================================================================= Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::RecordedList () const { Handle(TColStd_HSequenceOfTransient) li = new TColStd_HSequenceOfTransient(); if (theModel.IsNull()) return li; Standard_Integer i, nb = theModel->NbEntities(); for (i = 1; i <= nb; i ++) { if(theResults.IsBound(i)) if(!theResults.Find(i).IsNull()) li->Append (theModel->Value(i)); } return li; } //======================================================================= //function : Skip //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::Skip(const Handle(Standard_Transient)& ent) { if (theModel.IsNull() || theTransfer.IsNull()) return Standard_False; Standard_Integer num = theModel->Number(ent); if (num == 0) return Standard_False; theResults.Bind(num,ent); return Standard_True; } //======================================================================= //function : IsSkipped //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::IsSkipped (const Handle(Standard_Transient)& ent) const { if (theModel.IsNull()) return Standard_False; Standard_Integer num = theModel->Number(ent); if (num == 0) return Standard_False; if(!theResults.IsBound(num)) return Standard_False; return (theResults.Find(num)->DynamicType() != STANDARD_TYPE(Transfer_ResultFromModel) ); } //======================================================================= //function : IsMarked //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::IsMarked (const Handle(Standard_Transient)& ent) const { if (theModel.IsNull()) return Standard_False; Standard_Integer num = theModel->Number(ent); if (num == 0) return Standard_False; if(!theResults.IsBound(num)) return Standard_False; if (theResults.Find(num).IsNull()) return Standard_False; return Standard_True; } // ######### ACCES UN PEU PLUS FIN ######### //======================================================================= //function : FinalResult //purpose : //======================================================================= Handle(Transfer_ResultFromModel) XSControl_TransferReader::FinalResult (const Handle(Standard_Transient)& ent) const { Handle(Transfer_ResultFromModel) res; if (theModel.IsNull()) return res; Standard_Integer num = theModel->Number(ent); if (num == 0) return res; if(!theResults.IsBound(num)) return res; res = GetCasted(Transfer_ResultFromModel,theResults.Find(num)); return res; } //======================================================================= //function : FinalEntityLabel //purpose : //======================================================================= Standard_CString XSControl_TransferReader::FinalEntityLabel (const Handle(Standard_Transient)& ent) const { Handle(Transfer_ResultFromModel) resu = FinalResult (ent); if (resu.IsNull()) return ""; return resu->MainLabel(); } //======================================================================= //function : FinalEntityNumber //purpose : //======================================================================= Standard_Integer XSControl_TransferReader::FinalEntityNumber (const Handle(Standard_Transient)& ent) const { Handle(Transfer_ResultFromModel) resu = FinalResult (ent); if (resu.IsNull()) return 0; return resu->MainNumber(); } //======================================================================= //function : ResultFromNumber //purpose : //======================================================================= Handle(Transfer_ResultFromModel) XSControl_TransferReader::ResultFromNumber (const Standard_Integer num) const { Handle(Transfer_ResultFromModel) res; if ( num<1 || num>theModel->NbEntities() ) return res; if(!theResults.IsBound(num)) return res; res = GetCasted(Transfer_ResultFromModel,theResults.Find(num)); return res; } //======================================================================= //function : TransientResult //purpose : //======================================================================= Handle(Standard_Transient) XSControl_TransferReader::TransientResult (const Handle(Standard_Transient)& ent) const { Handle(Standard_Transient) tres; Handle(Transfer_ResultFromModel) res = FinalResult(ent); if (res.IsNull()) return tres; Handle(Transfer_ResultFromTransient) mres = res->MainResult(); if (mres.IsNull()) return tres; DeclareAndCast(Transfer_SimpleBinderOfTransient,bnd,mres->Binder()); if (bnd.IsNull()) return tres; if (!bnd->HasResult()) return tres; return bnd->Result(); } //======================================================================= //function : ShapeResult //purpose : //======================================================================= TopoDS_Shape XSControl_TransferReader::ShapeResult (const Handle(Standard_Transient)& ent) const { TopoDS_Shape tres; // DOIT RESTER NULL Handle(Transfer_ResultFromModel) res = FinalResult(ent); if (res.IsNull()) return tres; Handle(Transfer_ResultFromTransient) mres = res->MainResult(); if (mres.IsNull()) return tres; XSControl_Utils xu; TopoDS_Shape sh = xu.BinderShape (mres->Binder()); // Ouh la vilaine verrue Standard_Real tolang = Interface_Static::RVal("read.encoderegularity.angle"); if (tolang <= 0 || sh.IsNull()) return sh; ShapeFix::EncodeRegularity (sh,tolang); return sh; } //======================================================================= //function : ClearResult //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::ClearResult (const Handle(Standard_Transient)& ent, const Standard_Integer mode) { if (theModel.IsNull()) return Standard_False; Standard_Integer num = theModel->Number(ent); if (num == 0) return Standard_False; if(!theResults.IsBound(num)) return Standard_False; if (mode < 0) theResults.ChangeFind(num).Nullify(); else { DeclareAndCast(Transfer_ResultFromModel,resu,theResults.Find(num)); if (resu.IsNull()) return Standard_False; resu->Strip (mode); } return Standard_True; } // <<<< >>>> ATTENTION, pas terrible : mieux vaudrait // faire une map inverse et la consulter // ou muscler ResultFromModel ... //======================================================================= //function : EntityFromResult //purpose : //======================================================================= Handle(Standard_Transient) XSControl_TransferReader::EntityFromResult (const Handle(Standard_Transient)& res, const Standard_Integer mode) const { Handle(Standard_Transient) nulh; // cas de la shape XSControl_Utils xu; TopoDS_Shape sh = xu.BinderShape (res); if (!sh.IsNull()) return EntityFromShapeResult (sh,mode); Handle(Transfer_Binder) abinder; DeclareAndCast(Transfer_Binder,binder,res); Standard_Integer i,j,nb; if (mode == 0 || mode == 1) { // on regarde dans le TransientProcess (Roots ou tous Mappeds) if (!theTransfer.IsNull()) { nb = (mode == 0 ? theTransfer->NbRoots() : theTransfer->NbMapped()); for (j = 1; j <= nb; j ++) { i = (mode == 0 ? theModel->Number (theTransfer->Root(j)) : j); if (i == 0) continue; abinder = theTransfer->MapItem(i); if (abinder.IsNull()) continue; if (!binder.IsNull()) { if (binder == abinder) return theTransfer->Mapped(i); continue; } DeclareAndCast(Transfer_SimpleBinderOfTransient,trb,abinder); if (trb.IsNull()) continue; if (trb->Result() == res) return theTransfer->Mapped(i); } } return nulh; // Null } // Recherche dans theResults (racines) // 2 : Main only 3 : Main + one sub; 4 : all if (mode >= 2) { nb = theModel->NbEntities(); for (i = 1; i <= nb; i ++) { Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i); if (rec.IsNull()) return nulh; Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2); Standard_Integer ir,nr = list->Length(); for (ir = 1; ir <= nr; ir ++) { DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(ir)); if (rft.IsNull()) continue; if (rft->Binder() == binder) return rft->Start(); } } } // autres cas non encore implementes return nulh; } // <<<< >>>> ATTENTION, encore moins bien que le precedent //======================================================================= //function : EntityFromShapeResult //purpose : //======================================================================= Handle(Standard_Transient) XSControl_TransferReader::EntityFromShapeResult (const TopoDS_Shape& res, const Standard_Integer mode) const { Handle(Standard_Transient) nulh, samesh, partner; if (res.IsNull()) return nulh; Standard_Integer i,j,nb; XSControl_Utils xu; if (mode == 0 || mode == 1 || mode == -1) { // on regarde dans le TransientProcess if (!theTransfer.IsNull()) { nb = (mode == 0 ? theTransfer->NbRoots() : theTransfer->NbMapped()); for (j = 1; j <= nb; j ++) { i = (mode == 0 ? theModel->Number (theTransfer->Root(j)) : j); if (i == 0) continue; Handle(Standard_Transient) ent = theTransfer->Mapped(i); TopoDS_Shape sh = TransferBRep::ShapeResult (theTransfer,ent); if (!sh.IsNull()) { if (sh == res) return ent; // priorites moindre : Same (tjrs) ou Partner (mode < 0) if (sh.IsSame(res)) samesh = ent; if (mode == -1 && sh.IsPartner(res)) partner= ent; } } } // Ici, pas trouve de vraie egalite. Priorites moindres : Same puis Partner if (!samesh.IsNull()) return samesh; if (!partner.IsNull()) return partner; // calcule si mode = -1 return nulh; } // Recherche dans theResults (racines) // 2 : Main only 3 : Main + one sub; 4 : all if (mode >= 2) { nb = theModel->NbEntities(); for (i = 1; i <= nb; i ++) { Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i); if (rec.IsNull()) continue; Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2); Standard_Integer ir,nr = list->Length(); for (ir = 1; ir <= nr; ir ++) { DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(ir)); if (rft.IsNull()) continue; TopoDS_Shape sh = xu.BinderShape (rft->Binder()); if (!sh.IsNull() && sh == res) return rft->Start(); } } } return nulh; } //======================================================================= //function : EntitiesFromShapeList //purpose : //======================================================================= Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::EntitiesFromShapeList (const Handle(TopTools_HSequenceOfShape)& res, const Standard_Integer mode) const { Handle(TColStd_HSequenceOfTransient) lt = new TColStd_HSequenceOfTransient(); if (res.IsNull()) return lt; TopTools_MapOfShape shapes; // On convertit res en une map, pour test de presence rapide Standard_Integer i, j, nb = res->Length(); if (nb == 0) return lt; for (i = 1; i <= nb; i ++) shapes.Add (res->Value(i)); // A present, recherche et enregistrement XSControl_Utils xu; if (mode == 0 || mode == 1) { // on regarde dans le TransientProcess if (!theTransfer.IsNull()) { nb = (mode == 0 ? theTransfer->NbRoots() : theTransfer->NbMapped()); for (j = 1; j <= nb; j ++) { i = (mode == 0 ? theModel->Number (theTransfer->Root(j)) : j); if (i == 0) continue; TopoDS_Shape sh = xu.BinderShape (theTransfer->MapItem(i)); if (!sh.IsNull() && shapes.Contains(sh)) { lt->Append (theTransfer->Mapped(i)); j=nb; //skl (for looking for entities in checkbrep) } } } } // Recherche dans theResults (racines) // 2 : Main only 3 : Main + one sub; 4 : all if (mode >= 2) { nb = theModel->NbEntities(); for (i = 1; i <= nb; i ++) { Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i); if (rec.IsNull()) continue; Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2); Standard_Integer ir,nr = list->Length(); for (ir = 1; ir <= nr; ir ++) { DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(i)); if (rft.IsNull()) continue; TopoDS_Shape sh = xu.BinderShape (rft->Binder()); if (!sh.IsNull() && shapes.Contains(sh)) lt->Append (rft->Start()); } } } return lt; } // <<<< >>>> ATTENTION, level pas traite (utile ?) -> ResultFromModel //======================================================================= //function : CheckList //purpose : //======================================================================= Interface_CheckIterator XSControl_TransferReader::CheckList (const Handle(Standard_Transient)& ent, const Standard_Integer level) const { Interface_CheckIterator chl; if (theModel.IsNull() || ent.IsNull()) return chl; // Check-List COMPLETE ... tout le Modele if (ent == theModel) { Standard_Integer i,nb = theModel->NbEntities(); for (i = 1; i <= nb; i ++) { Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i); if (!rec.IsNull()) { Interface_CheckIterator chiter = rec->CheckList (Standard_False,2); chl.Merge (chiter); } } } // Check-List sur une LISTE ... else if (ent->IsKind(STANDARD_TYPE(TColStd_HSequenceOfTransient))) { DeclareAndCast(TColStd_HSequenceOfTransient,list,ent); Standard_Integer i,nb = list->Length(); for (i = 1; i <= nb; i ++) { Handle(Transfer_ResultFromModel) rec = FinalResult (list->Value(i)); if (!rec.IsNull()) { Interface_CheckIterator chiter = rec->CheckList (Standard_False,level); chl.Merge (chiter); } } } // sinon, Check-List sur une entite : Last ou FinalResult else if (level < 0) { if (theTransfer.IsNull()) return chl; chl.Add (theTransfer->Check(ent),theModel->Number(ent)); } else { Handle(Transfer_ResultFromModel) rec = FinalResult (ent); if (rec.IsNull()) return chl; chl = rec->CheckList(Standard_False,level); // manque level ... } if (ent == theModel) chl.SetName ("XSControl : CheckList complete Model"); else if (level < 0) chl.SetName ("XSControl : CheckList Last"); else if (level == 0) chl.SetName ("XSControl : CheckList Final Main"); else if (level == 1) chl.SetName ("XSControl : CheckList Final Main+Subs"); else if (level >= 2) chl.SetName ("XSControl : CheckList Final Complete"); return chl; } //======================================================================= //function : HasChecks //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::HasChecks (const Handle(Standard_Transient)& ent, const Standard_Boolean failsonly) const { Handle(Transfer_ResultFromModel) resu = FinalResult (ent); if (resu.IsNull()) return Standard_False; Standard_Integer stat = resu->ComputeCheckStatus (Standard_False); if (stat == 0) return Standard_False; if (stat > 1) return Standard_True; return (!failsonly); } //======================================================================= //function : CheckedList //purpose : //======================================================================= Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::CheckedList (const Handle(Standard_Transient)& ent, const Interface_CheckStatus withcheck, const Standard_Boolean level) const { Handle(TColStd_HSequenceOfTransient) res = new TColStd_HSequenceOfTransient(); if (ent.IsNull()) return res; if (ent == theModel) { Standard_Integer i,nb = theModel->NbEntities(); for (i = 1; i <= nb; i ++) { Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i); if (!rec.IsNull()) res->Append (rec->CheckedList(withcheck,level)); } } else if (ent->IsKind(STANDARD_TYPE(TColStd_HSequenceOfTransient))) { DeclareAndCast(TColStd_HSequenceOfTransient,list,ent); Standard_Integer i,nb = list->Length(); for (i = 1; i <= nb; i ++) { Handle(Transfer_ResultFromModel) rec = FinalResult (list->Value(i)); if (!rec.IsNull()) res->Append (rec->CheckedList(withcheck,level)); } } else { Handle(Transfer_ResultFromModel) rec = FinalResult (ent); if (!rec.IsNull()) res = rec->CheckedList(withcheck,level); } return res; } // ######################################################## // ########### TRANSFERT ############ // ######################################################## //======================================================================= //function : BeginTransfer //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::BeginTransfer () { if (theModel.IsNull()) return Standard_False; if (Actor().IsNull()) return Standard_False; theShapeResult.Nullify(); if (theTransfer.IsNull()) theTransfer = new Transfer_TransientProcess (theModel->NbEntities()); Handle(Transfer_ActorOfTransientProcess) actor; theTransfer->SetActor (actor); // -> RAZ actor = Actor(); theTransfer->SetActor (actor); // Set proprement dit theTransfer->SetErrorHandle (Standard_True); theTransfer->Context() = theContext; return Standard_True; } //======================================================================= //function : Recognize //purpose : //======================================================================= Standard_Boolean XSControl_TransferReader::Recognize (const Handle(Standard_Transient)& ent) { if (theActor.IsNull()) return Standard_False; return theActor->Recognize (ent); } //======================================================================= //function : TransferOne //purpose : //======================================================================= Standard_Integer XSControl_TransferReader::TransferOne (const Handle(Standard_Transient)& ent, const Standard_Boolean rec) { if (theActor.IsNull() || theModel.IsNull()) return 0; if (theTransfer.IsNull()) { if (!BeginTransfer()) return 0; } Handle(Message_Messenger) sout = theTransfer->Messenger(); Standard_Integer level = theTransfer->TraceLevel(); //BRepBuilderAPI::Precision (Interface_Static::RVal("read.precision.val")); //szv#11:CASCADE30:01Feb00 //Interface_Static::SetRVal("lastpreci",0.0); Transfer_TransferOutput TP (theTransfer,theModel); if (theGraph.IsNull()) theTransfer->SetModel(theModel); else theTransfer->SetGraph(theGraph); // pour le log-file if (level > 1) { Standard_Integer num = theModel->Number(ent); Handle(TCollection_HAsciiString) lab = theModel->StringLabel(ent); sout<<"\n*******************************************************************\n"; sout << "****** Transferring one Entity ******"<ToCString() << Interface_MSG::Blanks(14 - lab->Length())<<"******\n"; sout << "****** Type : "<TypeName(ent,Standard_False) << Interface_MSG::Blanks(44 - strlen(theModel->TypeName(ent,Standard_False))) << "******"; sout<<"\n*******************************************************************\n"; } // seule difference entre TransferRoots et TransferOne Standard_Integer res = 0; Handle(Standard_Transient) obj = ent; TP.Transfer (obj); theTransfer->SetRoot (obj); // Resultat ... Handle(Transfer_Binder) binder = theTransfer->Find (obj); if (binder.IsNull()) return res; if (rec) RecordResult (obj); if (!binder->HasResult()) return res; res ++; return res; } //======================================================================= //function : TransferList //purpose : //======================================================================= Standard_Integer XSControl_TransferReader::TransferList (const Handle(TColStd_HSequenceOfTransient)& list, const Standard_Boolean rec) { if (theActor.IsNull() || theModel.IsNull()) return 0; if (theTransfer.IsNull()) { if (!BeginTransfer()) return 0; } Handle(Message_Messenger) sout = theTransfer->Messenger(); Standard_Integer level = theTransfer->TraceLevel(); //BRepBuilderAPI::Precision (Interface_Static::RVal("read.precision.val")); //szv#11:CASCADE30:01Feb00 //Interface_Static::SetRVal("lastpreci",0.0); Transfer_TransferOutput TP (theTransfer,theModel); if (theGraph.IsNull()) theTransfer->SetModel(theModel); else theTransfer->SetGraph(theGraph); Standard_Integer i,nb = list->Length(); // Pour le log-file if (level > 0) { sout<<"\n*******************************************************************\n"; sout << "****** Transferring a list of "<Add (list->Value(i), theModel->TypeName(list->Value(i),Standard_False)); sl->SetName ("Entities to Transfer"); sl->PrintCount (sout); sout<<"\n*******************************************************************\n"; } // seule difference entre TransferRoots et TransferOne Standard_Integer res = 0; nb = list->Length(); Handle(Standard_Transient) obj; for (i = 1; i <= nb; i ++) { obj = list->Value(i); TP.Transfer (obj); theTransfer->SetRoot (obj); // Resultat ... Handle(Transfer_Binder) binder = theTransfer->Find (obj); if (binder.IsNull()) continue; if (rec) RecordResult (obj); if (!binder->HasResult()) continue; res ++; } return res; } // <<<< >>>> passage Graph : judicieux ? //======================================================================= //function : TransferRoots //purpose : //======================================================================= Standard_Integer XSControl_TransferReader::TransferRoots(const Interface_Graph& G) { if (theModel != G.Model()) return -1; if (!BeginTransfer()) return -1; Handle(Message_Messenger) sout = theTransfer->Messenger(); Standard_Integer level = theTransfer->TraceLevel(); //BRepBuilderAPI::Precision (Interface_Static::RVal("read.precision.val")); //szv#11:CASCADE30:01Feb00 //Interface_Static::SetRVal("lastpreci",0.0); Transfer_TransferOutput TP (theTransfer,theModel); if (theGraph.IsNull()) theTransfer->SetModel(theModel); else theTransfer->SetGraph(theGraph); // Pour le log-file if (level > 0) { Interface_EntityIterator roots = G.RootEntities(); Standard_Integer nb = roots.NbEntities(); sout<<"\n*******************************************************************\n"; sout << "****** Transferring the "<Add (roots.Value(),theModel->TypeName(roots.Value(),Standard_False)); sl->SetName ("Entities to Transfer"); sl->PrintCount (sout); sout<<"\n*******************************************************************\n"; } TP.TransferRoots (G); // Les entites transferees sont notees "asmain" Standard_Integer i,n = theTransfer->NbMapped(); for (i = 1; i <= n; i ++) { Handle(Standard_Transient) ent = theTransfer->Mapped(i); Handle(Transfer_Binder) bnd = theTransfer->MapItem(i); if (bnd.IsNull()) continue; if (!bnd->HasResult()) continue; RecordResult (ent); } // Resultat ... on note soigneuseument les Shapes theShapeResult = TransferBRep::Shapes (theTransfer,Standard_True); // ???? Et ici, il faut alimenter Imagine ... return theShapeResult->Length(); } //======================================================================= //function : TransferClear //purpose : //======================================================================= void XSControl_TransferReader::TransferClear(const Handle(Standard_Transient)& ent, const Standard_Integer level) { if (theTransfer.IsNull()) return; if (ent == theModel) { theTransfer->Clear(); return; } //// if (level > 0) list = TransferredList (list); // Standard_Integer i, nb = list->Length(); // theTransfer->ComputeScopes(); // for (i = 1; i <= nb; i ++) { // Handle(Standard_Transient) ent = list->Value(i); // theTransfer->Unbind (ent); theTransfer->RemoveResult (ent,level); ClearResult (ent,-1); // } } //======================================================================= //function : PrintStats //purpose : //======================================================================= void XSControl_TransferReader::PrintStats (const Standard_Integer what, const Standard_Integer mode) const { Handle(Message_Messenger) sout = theTransfer->Messenger(); // A ameliorer ... ! sout<<"\n*******************************************************************\n"; sout << "****** Statistics on Transfer (Read) ******"< 10) { sout<<" *** Not yet implemented"<Length(); Handle(IFSelect_SignatureList) counter; if (mode > 2) counter = new IFSelect_SignatureList (mode == 6); IFSelect_PrintCount pcm = IFSelect_CountByItem; if (mode == 6) pcm = IFSelect_ListByItem; sout<<"**** Nb Recorded : "<Value(i); if (mode == 0) { sout<<" "<Number(ent); continue; } if (mode == 1 || mode == 2) { sout<<"[ "<Print (ent,sout); sout<<" Type:"<TypeName(ent,Standard_False); } if (mode >= 3 && mode <= 6) { counter->Add (ent,theModel->TypeName(ent,Standard_False)); } } if (!counter.IsNull()) counter->PrintList(sout,theModel,pcm); sout<CheckList (Standard_False); return chl; } //======================================================================= //function : LastTransferList //purpose : //======================================================================= Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::LastTransferList (const Standard_Boolean roots) const { Handle(TColStd_HSequenceOfTransient) li = new TColStd_HSequenceOfTransient(); if (theTransfer.IsNull()) return li; Standard_Integer i,j,nb = (roots ? theTransfer->NbRoots() : theTransfer->NbMapped()); for (j = 1; j <= nb; j ++) { i = (roots ? theModel->Number (theTransfer->Root(j)) : j); Handle(Transfer_Binder) bnd = theTransfer->MapItem(i); if (bnd.IsNull()) continue; if (!bnd->HasResult()) continue; li->Append (theTransfer->Mapped(i)); } return li; } //======================================================================= //function : ShapeResultList //purpose : //======================================================================= Handle(TopTools_HSequenceOfShape) XSControl_TransferReader::ShapeResultList (const Standard_Boolean rec) { if (!rec) { if (theShapeResult.IsNull()) theShapeResult = TransferBRep::Shapes (theTransfer,Standard_True); if (theShapeResult.IsNull()) theShapeResult = new TopTools_HSequenceOfShape(); } else { if (theShapeResult.IsNull()) theShapeResult = new TopTools_HSequenceOfShape(); if (theModel.IsNull()) return theShapeResult; Handle(TColStd_HSequenceOfTransient) li = RecordedList(); theShapeResult = new TopTools_HSequenceOfShape(); Standard_Integer i, nb = theModel->NbEntities(); TopoDS_Shape sh; for (i = 1; i <= nb; i ++) { sh = ShapeResult (theModel->Value(i)); if (!sh.IsNull()) theShapeResult->Append(sh); } } return theShapeResult; } // **** UTILITAIRE DE STATISTIQUES GENERALES // BinderStatus retourne une valeur : // 0 Binder Null. 1 void 2 Warning seul 3 Fail seul // 11 Resultat OK. 12 Resultat+Warning. 13 Resultat+Fail //======================================================================= //function : //purpose : //======================================================================= static Standard_Integer BinderStatus (const Handle(Transfer_Binder)& binder, char* mess) { Standard_Integer stat = 0; mess[0] = '\0'; if (binder.IsNull()) { sprintf (mess,"(no data recorded)"); return 0; } Interface_CheckStatus cst = binder->Check()->Status(); if (cst == Interface_CheckOK) { stat = 11; if (binder->HasResult()) sprintf(mess,"%s",binder->ResultTypeName()); else { sprintf(mess,"(no result)"); stat = 1; } } else if (cst == Interface_CheckWarning) { stat = 12; if (binder->HasResult()) sprintf(mess,"%s (+ warning)",binder->ResultTypeName()); else { sprintf(mess,"(warning)"); stat = 2; } } else if (cst == Interface_CheckFail) { stat = 13; if (binder->HasResult()) sprintf(mess,"%s (+ FAIL)",binder->ResultTypeName()); else { sprintf(mess,"(FAIL)"); stat = 3; } } return stat; } //======================================================================= //function : //purpose : //======================================================================= static void PrintPercent(const Handle(Message_Messenger)& sout, const Standard_CString mess, const Standard_Integer nb, const Standard_Integer nl) { if (nb <= 0 || nl == 0) return; sout<<"****** "<Messenger(); char mess[250]; if (TP.IsNull()) return; if (what == 0) { TP->PrintStats(0,sout); return; } sout<<"\n*******************************************************************\n"; sout << "****** Statistics on Transfer Process (Read) ******"<Model(); if (what >= 1 && what <= 3) { Standard_Integer stat; Standard_Integer nbv = 0, nbw = 0, nbf = 0, nbr = 0, nbrw = 0, nbrf = 0, nbnr = 0, nbi = 0; Transfer_IteratorOfProcessForTransient itrp(Standard_True); if (what == 1) itrp = TP->RootResult(Standard_True); if (what == 2) itrp = TP->CompleteResult(Standard_True); if (what == 3) itrp = TP->AbnormalResult(); Standard_Integer i = 0, nb = itrp.Number(); if (!nolist) itrp.Filter (list); Standard_Integer nl = itrp.Number(); // apres filtrage Handle(IFSelect_SignatureList) counter; if (mode > 2) counter = new IFSelect_SignatureList (mode == 6); Standard_Boolean notrec = (!nolist && mode > 2); // noter les "no record" IFSelect_PrintCount pcm = IFSelect_CountByItem; if (mode == 6) pcm = IFSelect_ListByItem; sout <<"**** Entities in Model : "<NbEntities()<Add(ent,"(not recorded)"); else if (mode == 1 || mode == 2) { sout<<"["<Print (ent,sout); sout<<" "<TypeName(ent,Standard_False)<<" (not recorded)"<Number(ent); continue; } if (mode != 3) { stat = BinderStatus(binder,mess); // 0 Binder Null. 1 void 2 Warning seul 3 Fail seul // 11 Resultat OK. 12 Resultat+Warning. 13 Resultat+Fail if (stat == 0 || stat == 1) nbv ++; if (stat == 2) nbw ++; if (stat == 3) nbf ++; if (stat == 11) nbr ++; if (stat == 12) nbrw ++; if (stat == 13) nbrf ++; } // mode : 0 list num; 1 : num+label + type + result (abrege); 2 : complet if (mode == 1 || mode == 2) { sout<<"["<Print (ent,sout); sout<<" "<TypeName(ent,Standard_False); sout<<" Result:"<Check(); Standard_Integer newi,newnbw = ch->NbWarnings(), newnbf = ch->NbFails(); if (newnbw > 0) { sout<<" - Warnings : "<CWarning(newi)< 0) { sout<<" - Fails : "<CFail(newi)<= 3 && mode <= 6) { //IFSelect_PrintCount newpcm = IFSelect_CountByItem; //if (mode == 6) newpcm = IFSelect_ListByItem; if (mode == 3) counter->Add (ent,model->TypeName(ent,Standard_False)); if (mode == 4) counter->Add (ent,mess); if (mode >= 5) { TCollection_AsciiString mest (model->TypeName(ent,Standard_False)); mest.AssignCat(" -> "); mest.AssignCat(mess); //sprintf(mest,"%s -> %s",model->TypeName(ent,Standard_False),mess); counter->Add (ent,mest.ToCString()); } } // Fin de l iteration } if (!counter.IsNull()) counter->PrintList(sout,model,pcm); else sout< 0) { sout << "****** Percentages according Transfer Status ******"< 0) sout<<"****** Result : "<< (nbr+nbrw)*100/nl<<" %"< 0) sout<<"****** Result + FAIL : "<< (nbrf)*100/nl<<" %"< 0) sout<<"****** FAIL, no Result : "<< (nbf)*100/nl<<" %"< 0) sout<<"****** Just Warning : "<< (nbw)*100/nl<<" %"< 0) sout<<"****** Nothing Recorded: "<< (nbnr)*100/nl<<" %"<CheckList(Standard_False); chl.SetName("** TRANSFER READ CHECK **"); if (mode == 0) chl.Print (sout,model,(what == 5)); else { IFSelect_PrintCount pcm = IFSelect_CountByItem; if (mode == 2) pcm = IFSelect_ListByItem; Handle(IFSelect_CheckCounter) counter = new IFSelect_CheckCounter(Standard_True); counter->Analyse (chl,model,Standard_True,(what == 5)); counter->PrintList (sout,model,pcm); } } }