// File: TopOpeBRepBuild_PaveSet.cxx // Created: Thu Jun 17 17:08:35 1993 // Author: Jean Yves LEBEY // #include #include #include #include #include #include #include #include #include #include #ifdef DEB Standard_IMPORT Standard_Boolean TopOpeBRepTool_GettraceVC(); #include #include #endif //======================================================================= //function : TopOpeBRepBuild_PaveSet //purpose : //======================================================================= TopOpeBRepBuild_PaveSet::TopOpeBRepBuild_PaveSet(const TopoDS_Shape& E) : myEdge(TopoDS::Edge(E)), myHasEqualParameters(Standard_False), myClosed(Standard_False), myPrepareDone(Standard_False), myRemovePV(Standard_True) { } //======================================================================= //function : RemovePV //purpose : //======================================================================= void TopOpeBRepBuild_PaveSet::RemovePV(const Standard_Boolean B) { myRemovePV = B; } //======================================================================= //function : Append //purpose : //======================================================================= void TopOpeBRepBuild_PaveSet::Append (const Handle(TopOpeBRepBuild_Pave)& PV) { myVertices.Append(PV); myPrepareDone = Standard_False; } #include #include //======================================================================= //function : SortPave //purpose : //======================================================================= void TopOpeBRepBuild_PaveSet::SortPave(const TopOpeBRepBuild_ListOfPave& List, TopOpeBRepBuild_ListOfPave& SortedList) { // NYI : sort a list o Items, giving a sorting function is impossible // NYI : --> foobar method complexity n2. Standard_Integer iPV=0,nPV = List.Extent(); Handle(TColStd_HArray1OfBoolean) HT = new TColStd_HArray1OfBoolean(0,nPV,Standard_False); TColStd_Array1OfBoolean& T = HT->ChangeArray1(); Handle(TopOpeBRepBuild_Pave) PV1; for (Standard_Integer i = 1; i <= nPV; i++) { Standard_Real parmin = RealLast(); TopOpeBRepBuild_ListIteratorOfListOfPave it(List); for (Standard_Integer itest = 1; it.More(); it.Next(),itest++) { if ( ! T(itest) ) { const Handle(TopOpeBRepBuild_Pave)& PV2 = it.Value(); Standard_Real par = PV2->Parameter(); if (par < parmin) { parmin = par; PV1 = PV2; iPV = itest; } } } SortedList.Append(PV1); T(iPV) = Standard_True; } // tete = FORWARD // modifier TopOpeBRepBuild_DataStructure::SortOnParameter Standard_Boolean found = Standard_False; TopOpeBRepBuild_ListIteratorOfListOfPave it(SortedList); TopOpeBRepBuild_ListOfPave L1,L2; for (; it.More(); it.Next() ) { const Handle(TopOpeBRepBuild_Pave)& PV = it.Value(); if ( ! found) { TopAbs_Orientation o = PV->Vertex().Orientation(); if (o == TopAbs_FORWARD) { found = Standard_True; L1.Append(PV); } else L2.Append(PV); } else L1.Append(PV); } SortedList.Clear(); SortedList.Append(L1); SortedList.Append(L2); } static Standard_Boolean FUN_islook(const TopoDS_Edge& e) { TopoDS_Vertex v1,v2; TopExp::Vertices(e,v1,v2); gp_Pnt p1 = BRep_Tool::Pnt(v1); gp_Pnt p2 = BRep_Tool::Pnt(v2); Standard_Real dp1p2 = p1.Distance(p2); Standard_Boolean islook = (Abs(dp1p2) > 1.e-8) ? Standard_True : Standard_False; return islook; } //======================================================================= //function : Prepare //purpose : //======================================================================= void TopOpeBRepBuild_PaveSet::Prepare() { // add the edge vertices to the list of interference // if an edge vertex VE is already in the list as interference VI : // - do not add VE in the list, // - if VI is INTERNAL, set VI orientation to VE orientation. // - remove VI from the list if : // VI is EXTERNAL or VE and VI have opposite orientations. // if (myPrepareDone) { return; } #ifdef DEB Standard_Boolean trc = Standard_False; trc = trc || TopOpeBRepTool_GettraceVC(); Standard_Integer iv=0;//,nv=myVertices.Extent(); if (trc) { TopOpeBRepBuild_ListIteratorOfListOfPave itd(myVertices); cout<ChangeVertex()); Standard_Boolean hasVSD = PV->HasSameDomain(); TopoDS_Vertex VSD; if (hasVSD) VSD = TopoDS::Vertex(PV->SameDomain()); TopAbs_Orientation VIori = VI.Orientation(); Standard_Real p = PV->Parameter(); cout<<"pvs : v "<<++iv<<" par "<ChangeVertex()); Standard_Boolean hasVSD = PV->HasSameDomain(); TopoDS_Vertex VSD; if (hasVSD) VSD = TopoDS::Vertex(PV->SameDomain()); TopAbs_Orientation VIori = VI.Orientation(); Standard_Boolean visameve = (VI.IsSame(VE)); Standard_Boolean vsdsameve = Standard_False; if (hasVSD) vsdsameve = (VSD.IsSame(VE)); Standard_Boolean samevertexprocessing = (visameve || vsdsameve) && !isEd; if (samevertexprocessing) { // if (VEbound) { // xpu: 29-05-97 if (VEbound || vsdsameve) { switch (VIori ) { case TopAbs_EXTERNAL : myVertices.Remove(it); break; case TopAbs_INTERNAL : VI.Orientation(VEori); break; case TopAbs_FORWARD : case TopAbs_REVERSED : //ofv: //if (VIori != VEori) myVertices.Remove(it); if (VIori != VEori)//ofv { myVertices.Remove(it);//ofv Standard_Boolean islook = FUN_islook(myEdge); if((VEbound && (vsdsameve ||visameve)) && islook) add = Standard_True;//ofv } break; } } //ofv: //addVE = Standard_False; addVE = (!add) ? Standard_False : Standard_True; break; } } // if VE not found in the list, add it if ( addVE ) { Standard_Real parVE = BRep_Tool::Parameter(VE,myEdge); Handle(TopOpeBRepBuild_Pave) newPV = new TopOpeBRepBuild_Pave(VE,parVE,Standard_True); myVertices.Prepend(newPV); EdgeVertexCount++; } } } // myRemovePV Standard_Integer ll = myVertices.Extent(); // if no more interferences vertices, clear the list if (ll == EdgeVertexCount) { myVertices.Clear(); } else if ( ll >= 2 ) { // sort the parametrized vertices on Parameter() value. TopOpeBRepBuild_ListOfPave List; List = myVertices; myVertices.Clear(); SortPave(List,myVertices); } #ifdef DEB if ( TopOpeBRepTool_GettraceVC() ) { myVerticesIt.Initialize(myVertices); if ( MoreLoop() ) cout<<"--- PaveSet : Prepare"<Vertex()); Standard_Real p = PV->Parameter(); Standard_Boolean b = PV->IsShape(); TopOpeBRepBuild_Builder::GdumpORIPARPNT(v.Orientation(),p,BRep_Tool::Pnt(v)); if (b) cout<<" is bound"; else cout<<" is not bound"; cout<Vertex(); p1 = it1.Value()->Parameter(); for (it2.Initialize(myVertices); (! myHasEqualParameters ) && it2.More(); it2.Next()) { const TopoDS_Shape& v2 = it2.Value()->Vertex(); if ( v2.IsEqual(v1) ) continue; p2 = it2.Value()->Parameter(); Standard_Real d = Abs(p1-p2); #ifdef DEB if (TopOpeBRepTool_GettraceVC()) { cout<<"VertexSet : p1,p2 d "<Vertex(); #endif p1 = it1.Value()->Parameter(); Standard_Real d = Abs(p1-f); if (d < Precision::PConfusion()) { myHasEqualParameters = Standard_True; myEqualParameters = f; #ifdef DEB if (TopOpeBRepTool_GettraceVC()) { cout<<"=*=*=*=*=*=*=*=*=*=*=*=*=*=*"<Vertex(); Standard_Real par = it.Value()->Parameter(); if (par > parmax) { Vmax = V; parmax = par; } if (par < parmin) { Vmin = V; parmin = par; } } myClosed = Vmin.IsSame(Vmax); return myClosed; }