From 7a64510d0d0a00811e11c8ba7e5528d4b54f0889 Mon Sep 17 00:00:00 2001 From: isn Date: Fri, 15 Sep 2017 20:18:16 +0300 Subject: [PATCH] HLR debug --- src/Contap/Contap_Contour.cxx | 21 +- src/HLRAppli/HLRAppli_ReflectLines.cxx | 28 ++- src/HLRAppli/HLRAppli_ReflectLines.hxx | 10 +- src/HLRBRep/HLRBRep_HLRToShape.cxx | 215 ++++++----------- src/HLRBRep/HLRBRep_HLRToShape.hxx | 3 +- src/HLRTopoBRep/HLRTopoBRep_DSFiller.cxx | 284 +++++++++++------------ src/QABugs/QABugs_20.cxx | 169 +++++++++++++- 7 files changed, 420 insertions(+), 310 deletions(-) diff --git a/src/Contap/Contap_Contour.cxx b/src/Contap/Contap_Contour.cxx index 07d4bf229f..bf7255e15f 100644 --- a/src/Contap/Contap_Contour.cxx +++ b/src/Contap/Contap_Contour.cxx @@ -1239,14 +1239,15 @@ void ComputeInternalPoints solution = Standard_False; math_Vector dir1(1,2), dir2(1,2); math_Vector prevX(1,2), prevPrevX (1,2); - int count = 0; - int revCount = 0; - double dot = 0; - double t = 0.5; + Standard_Integer count = 0; + Standard_Integer revCount = 0; + Standard_Integer maxRevCount = 10000; + Standard_Real dot = 0; + Standard_Real t = 0.5; while (!solution) { - X(1) =/* (XInf(1) + XSup(1)) /2.;*/ XInf(1) + t * (XSup(1) - XInf(1)); - X(2) = /*(XInf(2) + XSup(2)) /2.;*/XInf(2) + t * (XSup(2) - XInf(2)); + X(1) = XInf(1) + t * (XSup(1) - XInf(1)); + X(2) = XInf(2) + t * (XSup(2) - XInf(2)); rsnld.Perform(SFunc,X,infb,supb); if (!rsnld.IsDone()) { @@ -1304,13 +1305,11 @@ void ComputeInternalPoints else if (vtestb.Dot(vecref) < 0.) { XSup = X; } - else { + else + { XInf = X; - if (revCount > 10000) - { - //XInf = (X + prevPrevX)/2; + if (revCount > maxRevCount) t = 0.75; - } } } else { // on n est pas sur une solution diff --git a/src/HLRAppli/HLRAppli_ReflectLines.cxx b/src/HLRAppli/HLRAppli_ReflectLines.cxx index eb10157ef0..699df7ce3a 100644 --- a/src/HLRAppli/HLRAppli_ReflectLines.cxx +++ b/src/HLRAppli/HLRAppli_ReflectLines.cxx @@ -63,6 +63,29 @@ void HLRAppli_ReflectLines::SetAxes(const Standard_Real Nx, myProjector = HLRAlgo_Projector(T,IsPerspective,aFocus); } +void HLRAppli_ReflectLines::SetAxes(const Standard_Real Nx, + const Standard_Real Ny, + const Standard_Real Nz, + const Standard_Real XAt, + const Standard_Real YAt, + const Standard_Real ZAt, + const Standard_Real XUp, + const Standard_Real YUp, + const Standard_Real ZUp, + Standard_Boolean IsPerspective, + Standard_Real theFocus) +{ + gp_Pnt At (XAt,YAt,ZAt); + gp_Dir Zpers (Nx,Ny,Nz); + gp_Dir Ypers (XUp,YUp,ZUp); + gp_Dir Xpers = Ypers.Crossed(Zpers); + gp_Ax3 Axe (At, Zpers, Xpers); + gp_Trsf T; + T.SetTransformation(Axe); + myProjector = HLRAlgo_Projector(T,IsPerspective,theFocus); +} + + //======================================================================= //function : Perform //purpose : @@ -117,8 +140,9 @@ TopoDS_Shape HLRAppli_ReflectLines::GetResult() const //purpose : //======================================================================= TopoDS_Shape HLRAppli_ReflectLines::GetCompoundOfFaces(bool theMode, - TopTools_DataMapOfShapeShape& OrigFaceToProjFace ) const + TopTools_DataMapOfShapeShape& OrigFaceToProjFace, + TopTools_DataMapOfShapeShape& ProjFaceToOrigFace) const { HLRBRep_HLRToShape aHLRToShape( myHLRAlgo ); - return aHLRToShape.CompoundOfFaces(theMode, OrigFaceToProjFace); + return aHLRToShape.CompoundOfFaces(theMode, OrigFaceToProjFace, ProjFaceToOrigFace); } diff --git a/src/HLRAppli/HLRAppli_ReflectLines.hxx b/src/HLRAppli/HLRAppli_ReflectLines.hxx index d1c9266457..f059e96be2 100644 --- a/src/HLRAppli/HLRAppli_ReflectLines.hxx +++ b/src/HLRAppli/HLRAppli_ReflectLines.hxx @@ -48,6 +48,13 @@ public: //! the coordinates of the vertical direction vector. Standard_EXPORT void SetAxes (const Standard_Real Nx, const Standard_Real Ny, const Standard_Real Nz, const Standard_Real XAt, const Standard_Real YAt, const Standard_Real ZAt, const Standard_Real XUp, const Standard_Real YUp, const Standard_Real ZUp); + + Standard_EXPORT void SetAxes (const Standard_Real Nx, const Standard_Real Ny, const Standard_Real Nz, + const Standard_Real XAt, const Standard_Real YAt, const Standard_Real ZAt, + const Standard_Real XUp, const Standard_Real YUp, const Standard_Real ZUp, + Standard_Boolean IsPerspective, Standard_Real theFocus); + + Standard_EXPORT void Perform(); //! returns resulting compound of reflect lines @@ -62,7 +69,8 @@ public: const Standard_Boolean In3d) const; Standard_EXPORT TopoDS_Shape GetCompoundOfFaces(bool theMode, - TopTools_DataMapOfShapeShape& OrigFaceToProjFace) const; + TopTools_DataMapOfShapeShape& OrigFaceToProjFace, + TopTools_DataMapOfShapeShape& ProjFaceToOrigFace) const; diff --git a/src/HLRBRep/HLRBRep_HLRToShape.cxx b/src/HLRBRep/HLRBRep_HLRToShape.cxx index 808ad84e25..100f2fd460 100644 --- a/src/HLRBRep/HLRBRep_HLRToShape.cxx +++ b/src/HLRBRep/HLRBRep_HLRToShape.cxx @@ -569,7 +569,6 @@ public: myStop = 1; } return Standard_True; - //int nbpnt = an_inter->.NbPnt(); } void SetLine (const gp_Lin& theLine) @@ -623,8 +622,7 @@ static bool FuseVE(TopoDS_Shape& theRes) } static void ProcessHVertices(TopoDS_Shape& theRes, - NCollection_IndexedDataMap& theEdAd, - NCollection_DataMap& theEdBnd2d ) + NCollection_IndexedDataMap& theEdAd) { BRepTools_ReShape reshaper; ///hanging vertices => find closely located point on some edge or vertex @@ -661,22 +659,19 @@ static void ProcessHVertices(TopoDS_Shape& theRes, NCollection_UBTree aTreeVE; NCollection_UBTreeFiller aTreeFillerVE (aTreeVE); int nbEE = EE.Extent(); - //NCollection_Array1 anEdgeAdapters(1, nbEE); for (Standard_Integer i = 1; i <= nbEE; i++) { const TopoDS_Edge& anE = TopoDS::Edge(EE(i)); Bnd_Box2d aBB; theEdAd.Add(anE, BRepAdaptor_Curve2d(anE, aDraftPrFace)); BndLib_Add2dCurve::Add(*theEdAd.Seek(anE), 0, aBB); - theEdBnd2d.Bind(anE, aBB); aTreeFillerVE.Add(i, aBB); } aTreeFillerVE.Fill(); - HLRVE_BndBoxTreeSelector aSelectorVE(theEdAd, Precision::Infinite()); //min dist doesn't matter here + HLRVE_BndBoxTreeSelector aSelectorVE(theEdAd, Precision::Infinite()); //min dist doesn't matter here // - - TopTools_IndexedMapOfShape toadd, torem;//temp + TopTools_IndexedMapOfShape toadd, torem; for (int i = 1; i <= HV.Extent(); i++ ) { const TopoDS_Vertex& CHV = TopoDS::Vertex(HV(i)); @@ -685,20 +680,19 @@ static void ProcessHVertices(TopoDS_Shape& theRes, int id = VV.FindIndex(CHV); aSelectorVV.Reset(Precision::Infinite()); aSelectorVV.SetCurrentPoint( id ); - /*int resVV =*/ aTreeVV.Select(aSelectorVV); + aTreeVV.Select(aSelectorVV); double aMinDDistReached = aSelectorVV.GetMinDDist(); TopoDS_Vertex aResV = TopoDS::Vertex(VV(aSelectorVV.GetResVId())); // aSelectorVE.Reset(aMinDDistReached); aSelectorVE.SetCurrentPoint( CHVPnt ); - /*int resVE = */aTreeVE.Select(aSelectorVE); - + aTreeVE.Select(aSelectorVE); + // Extrema_POnCurv2d aPSolRes; BRepAdaptor_Curve2d aResEA; bool VEFound = aSelectorVE.GetPResult(aPSolRes, aResEA); if (VEFound) { - ///if (BRep_Tool::Degenerated(E)) //can be degenerted?? double aPar = aPSolRes.Parameter(); const TopoDS_Edge& aResE = aResEA.Edge(); TopoDS_Edge aDE1 = TopoDS::Edge(aResE.EmptyCopied().Oriented(TopAbs_FORWARD)); @@ -718,19 +712,29 @@ static void ProcessHVertices(TopoDS_Shape& theRes, gp_Pnt aNC; double aNTol; BRepLib::BoundingVertex(nls, aNC, aNTol); - gp_Pnt aFVP = BRep_Tool::Pnt(aFV); gp_Pnt aLVP = BRep_Tool::Pnt(aLV); - if (aFVP.Distance(aNC) < aNTol*1e10 || - aLVP.Distance(aNC) < aNTol*1e10) + double dF_NC = aFVP.Distance(aNC); + double dL_NC = aLVP.Distance(aNC); + double aFVTol = BRep_Tool::Tolerance(aFV); + double aLVTol = BRep_Tool::Tolerance(aLV); + bool aFt = (aNTol + aFVTol) > dF_NC; + bool aLt = (aNTol + aLVTol) > dL_NC; + + if (aFt || aLt) { nls.RemoveFirst(); - nls.Append(aResV); + //either aFt or aLt is true; dont consider when both true => degenerated case + TopoDS_Vertex maV; + if (aFt) + maV = TopoDS::Vertex(nls.Append(aFV)); + else + maV = TopoDS::Vertex(nls.Append(aLV)); BRepLib::BoundingVertex(nls, aNC, aNTol); - BRep_Builder().UpdateVertex(aResV, aNC, aNTol); - reshaper.Replace(CHV, aResV.Oriented(CHV.Orientation())); - if (HV.Contains(aResV)) //if the closest vertex lays on edge => never contains in HV - HV.RemoveKey(aResV); + BRep_Builder().UpdateVertex(maV, aNC, aNTol); + reshaper.Replace(CHV, maV.Oriented(CHV.Orientation())); + if (HV.Contains(maV)) + HV.RemoveKey(maV); } else { @@ -743,28 +747,11 @@ static void ProcessHVertices(TopoDS_Shape& theRes, BRep_Builder().Add(aDE2, CHV.Oriented(TopAbs_FORWARD)); BRep_Builder().Add(aDE2, aLV.Oriented(TopAbs_REVERSED)); // - - ///TODO temp - torem.Add(aResE); - toadd.Add(aDE1); - toadd.Add(aDE2); - //TopoDS_Compound aResCmp; - //BRep_Builder().MakeCompound(aResCmp); - //BRep_Builder().Add(aResCmp, aDE1); - //BRep_Builder().Add(aResCmp, aDE2); - // - //TopoDS_Wire aResW; - //BRep_Builder().MakeWire(aResW); - //BRep_Builder().Add(aResW, aDE1); - //BRep_Builder().Add(aResW, aDE2); - //TopoDS_Wire aResW = BRepBuilderAPI_MakeWire(aDE1, aDE2).Wire(); //this will control proper sharing and tolerance matching between vertices - /*{ //DEB - TopTools_IndexedMapOfShape VVVV; - TopExp::MapShapes(aResW, TopAbs_VERTEX, VVVV); - //cout << VVVV.Extent() << endl; - }*/ - //aResW.Orientation(aResE.Orientation()); - //reshape.Replace(aResE, aResCmp); + TopoDS_Wire nW; + BRep_Builder().MakeWire(nW); + BRep_Builder().Add(nW, aDE1); + BRep_Builder().Add(nW, aDE2); + reshaper.Replace(aResE, nW); } } else @@ -781,14 +768,7 @@ static void ProcessHVertices(TopoDS_Shape& theRes, HV.RemoveKey(aResV); } } - //DEB - for (int i =1; i<= torem.Extent() ;i++) - BRep_Builder().Remove(theRes, torem(i)); - //DEB - for (int i =1; i<= toadd.Extent() ;i++) - BRep_Builder().Add(theRes, toadd(i)); - // - theRes = reshaper.Apply(theRes); //replace only vertices + theRes = reshaper.Apply(theRes); } static void FillNode2LLMap(Standard_Integer NewNode, const Poly_MakeLoops2D::Link& NewLink, @@ -802,21 +782,26 @@ static void FillNode2LLMap(Standard_Integer NewNode, const Poly_MakeLoops2D::Lin static TopAbs_State GetStateOfSamplePoint(const TopoDS_Face& ff2, const IntTools_FClass2d& fclass, - const Bnd_Box2d& fbnd) + const Bnd_Box& bb1, + double mass1) { TopExp_Explorer exp(ff2, TopAbs_EDGE); //should contains at least one edge TopoDS_Edge fe2 = TopoDS::Edge(exp.Current()); BRepAdaptor_Curve2d afe2(fe2, ff2); gp_Pnt2d middlepoint = afe2.Value((afe2.LastParameter() + afe2.FirstParameter()) / 2.0); - Bnd_Box bb3d; - BRepBndLib::Add(ff2, bb3d); - Bnd_Box2d bb2d; - bb2d.Set(gp_Pnt2d(bb3d.CornerMin().X(), bb3d.CornerMin().Y())); - bb2d.Add(gp_Pnt2d(bb3d.CornerMax().X(), bb3d.CornerMax().Y())); - if (bb2d.IsOut(middlepoint)) - return TopAbs_OUT; - else - return fclass.Perform(middlepoint); + if (Abs(mass1)>1e-10) //?? toler + { + Bnd_Box2d bb2d; + double xmin, ymin, zmin, xmax, ymax, zmax; + bb1.Get(xmin, ymin, zmin, xmax, ymax, zmax); + bb2d.Add(gp_Pnt2d(xmin, ymin)); + bb2d.Add(gp_Pnt2d(xmax, ymax)); + if (mass1 > 0 && bb2d.IsOut(middlepoint)) + return TopAbs_OUT; + if (mass1 < 0 && bb2d.IsOut(middlepoint)) + return TopAbs_IN; + } + return fclass.Perform(middlepoint); } bool HLRBRep_ParComp(const HLRFL_BndBoxTreeSelector::FaceParam& a, @@ -827,15 +812,14 @@ bool HLRBRep_ParComp(const HLRFL_BndBoxTreeSelector::FaceParam& a, static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, NCollection_IndexedDataMap& anEdAd, - NCollection_DataMap theEdBnd2d, HLRAlgo_Projector& projector, const TopTools_ListOfShape& anOrigShapes, bool theMode, - TopTools_DataMapOfShapeShape& OrigFaceToProjFace ) + TopTools_DataMapOfShapeShape& OrigFaceToProjFace, + TopTools_DataMapOfShapeShape& ProjFaceToOrigFace) { NCollection_List theLoops; NCollection_List SelfLoops; - NCollection_DataMap aShToBnd2d; TopoDS_Face aDraftPrFace; BRep_Builder().MakeFace(aDraftPrFace, BRepLib::Plane(), Precision::Confusion()); TopTools_IndexedMapOfShape mN2V; @@ -860,9 +844,6 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, { const TopoDS_Wire& aW = BRepLib_MakeWire(E).Wire(); SelfLoops.Append(aW); - Bnd_Box2d aBB; - BndLib_Add2dCurve::Add(BRepAdaptor_Curve2d(E, aDraftPrFace), 0, aBB); - aShToBnd2d.Bind(aW, aBB); } continue; } @@ -872,11 +853,7 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, { anEdAd.Add(E, BRepAdaptor_Curve2d(E, aDraftPrFace)); anAd = anEdAd.Seek(E); - Bnd_Box2d aBB; - BndLib_Add2dCurve::Add(*anEdAd.Seek(E), 0, aBB); - theEdBnd2d.Bind(E, aBB); } - //NCollection_Handle adapt = new BRepAdaptor_Curve2d(E, aDraftPrFace); gp_Pnt2d Pnt; gp_Vec2d Vec; @@ -949,40 +926,19 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, Info2->myD1L = D1L; } } - - //DEBUG: print D1F - /*{ - NCollection_DataMap::Iterator it(mNode2ListOfLinks); - for (;it.More();it.Next()) - { - int nK = it.Key(); - Poly_MakeLoops2D::ListOfLink links = it.Value(); - Poly_MakeLoops2D::ListOfLink::Iterator itl(links); - cout << "next:" << endl; - for (;itl.More();itl.Next()) - { - BRepFill_TangentLinkInfo linfo = mL2TI(itl.Value()); - cout << linfo.myD1F.X() << " " << linfo.myD1F.Y() << endl; - TopoDS_Edge eee = mL2E(itl.Value()); - } - } - */ // BRepFill_PolyHelper helper(mL2TI, mNode2ListOfLinks); Poly_MakeLoops2D aLoopMaker(1, &helper, NCollection_BaseAllocator::CommonBaseAllocator() ); for (NCollection_DataMap::Iterator aMapIt (mL2E); aMapIt.More(); aMapIt.Next()) aLoopMaker.AddLink(aMapIt.Key()); - aLoopMaker.Perform(); //try to find loops + aLoopMaker.Perform(); //try to find loopsEdBnd2d Standard_Integer NbLoops = aLoopMaker.GetNbLoops(); Standard_Integer NbHangs = aLoopMaker.GetNbHanging(); cout << "NbLoops=" << NbLoops << endl; cout << "NbHangs=" << NbHangs << endl; - // if (NbLoops == 0 || NbHangs != 0 ) - // return Standard_False; - theLoops.Append(SelfLoops); for (Standard_Integer i = 1; i <= NbLoops; i++) //loops to wires { @@ -999,44 +955,20 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, E.Reverse(); //if null => probably this edge was passed as two links (based on the same edge); so skip this edge if (!E.IsNull()) - { aWM.Add(E); - aWBox2d.Add(theEdBnd2d(E)); - } } if (aWM.IsDone()) { TopoDS_Wire W = aWM.Wire(); - if (W.Closed()) - { + if (W.Closed()) theLoops.Append(W); - aShToBnd2d.Bind(W, aWBox2d); - } } } - //DEBUG - /* Poly_MakeLoops2D::ListOfLink theHLinks; - aLoopMaker.GetHangingLinks(theHLinks); - Poly_MakeLoops2D::ListOfLink::Iterator itt(theHLinks); - - TopoDS_Compound cmpH;BRep_Builder().MakeCompound(cmpH); - for (; itt.More();itt.Next()) - { - Poly_MakeLoops2D::Link alink = itt.Value(); - const Poly_MakeLoops2D::Link& Link = itt.Value(); - TopoDS_Edge E = mL2E(Link); - if (Link.flags & Poly_MakeLoops2D::LF_Reversed) - E.Reverse(); - //if null => probably this edge was passed as two links (based on the same edge); so skip this edge - if (!E.IsNull()) - BRep_Builder().Add(cmpH, E); - }*/ - // - IntTools_Context context1;// = new IntTools_Context(); NCollection_List::Iterator itL(theLoops); NCollection_IndexedDataMap lf1, lf2; + NCollection_DataMap f2mass; for (; itL.More(); itL.Next()) { const TopoDS_Wire& aW = itL.Value(); @@ -1046,11 +978,10 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, BRep_Builder().MakeFace(ff, BRepLib::Plane(), Precision::Confusion()); //plane is static; pcurves of edges are already based on this plane BRep_Builder().Add(ff, aW); - aShToBnd2d(aW).Enlarge(0.001); - aShToBnd2d.Bind(ff, aShToBnd2d(aW)); //bndbox still the same GProp_GProps pr; BRepGProp::SurfaceProperties(ff, pr); Standard_Real CurMass = pr.Mass(); + f2mass.Bind(ff, CurMass); if (Abs(CurMass) < 1e-10) //?? TODO continue; if (CurMass >= 0) @@ -1061,7 +992,6 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, NCollection_IndexedDataMap> FaceToIntWires; for (int i = 1; i <= lf1.Size() && !lf2.IsEmpty(); i++) { - //NCollection_Handle fclass; NCollection_Sequence intf; const TopoDS_Face& ff1 = TopoDS::Face(lf1.FindKey(i)); for (int j=1;j<= lf2.Size();j++) @@ -1071,11 +1001,10 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, if (pm < -nm) continue; const TopoDS_Face& ff2 = TopoDS::Face(lf2.FindKey(j)); - //if (!fclass) - // fclass = new BRepTopAdaptor_FClass2d(ff1, Precision::Confusion()); - IntTools_FClass2d& fclass = context1.FClass2d(ff1); - Bnd_Box2d fbnd = aShToBnd2d(ff1); - TopAbs_State st = GetStateOfSamplePoint(ff2, fclass, fbnd); + IntTools_FClass2d& fclass1 = context1.FClass2d(ff1); + const Bnd_Box& bb1 = context1.BndBox(ff1); + double mass1 = f2mass(ff1); + TopAbs_State st = GetStateOfSamplePoint(ff2, fclass1, bb1, mass1); if (st == TopAbs_IN) intf.Append(ff2); } @@ -1084,16 +1013,17 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, { if (intfInd.Contains(i)) continue; - //BRepTopAdaptor_FClass2d fclassInt(intf(i), Precision::Confusion()); - IntTools_FClass2d& fclassInt = context1.FClass2d(intf(i)); - Bnd_Box2d fbndi = aShToBnd2d(intf(i)); + const TopoDS_Face& intfi = intf(i); + IntTools_FClass2d& fclassInt = context1.FClass2d(intfi); + const Bnd_Box& bb1 = context1.BndBox(intfi); + double mass1 = f2mass(intfi); for (int j=1; j<= intf.Size();j++) { if (i==j) continue; if (intfInd.Contains(j)) continue; - TopAbs_State st = GetStateOfSamplePoint(intf(j), fclassInt, fbndi); + TopAbs_State st = GetStateOfSamplePoint(intf(j), fclassInt, bb1, mass1); if (st == TopAbs_OUT) //note that intf-faces are holes intfInd.Add(j); } @@ -1142,10 +1072,14 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, BRep_Builder().Add(cf, int_wire); } gp_Pnt2d p2d; - gp_Pnt p3d; - TopExp_Explorer exp(cf, TopAbs_EDGE); + gp_Pnt p3d; Handle(IntTools_Context) context = new IntTools_Context(); - BOPTools_AlgoTools3D::PointNearEdge( TopoDS::Edge(exp.Current()), cf, p2d, p3d, context); + int ierr = BOPTools_AlgoTools3D::PointInFace( cf, p3d, p2d, context); + if (ierr) + { + TopExp_Explorer exp(cf, TopAbs_EDGE); + BOPTools_AlgoTools3D::PointNearEdge( TopoDS::Edge(exp.Current()), cf, p2d, p3d, context); + } gp_Lin shot_line = projector.Shoot(p2d.X(), p2d.Y()); aSelFL.ResetResult(); @@ -1159,7 +1093,10 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, if (theMode) { std::sort(fp.begin(), fp.end(), HLRBRep_ParComp); - OrigFaceToProjFace.Bind(cf, fp.front().myF); + TopoDS_Face orF ; + orF = fp.front().myF; + OrigFaceToProjFace.Bind(orF, cf); + ProjFaceToOrigFace.Bind(cf, orF); } } } @@ -1168,7 +1105,8 @@ static TopoDS_Shape ProcessLoops(const TopoDS_Shape& theRes, } TopoDS_Shape HLRBRep_HLRToShape::CompoundOfFaces(bool theMode, - TopTools_DataMapOfShapeShape& OrigFaceToProjFace) + TopTools_DataMapOfShapeShape& OrigFaceToProjFace, + TopTools_DataMapOfShapeShape& ProjFaceToOrigFace) { // TopTools_ListOfShape anOrigShapes; @@ -1197,12 +1135,11 @@ TopoDS_Shape HLRBRep_HLRToShape::CompoundOfFaces(bool theMode, if( !FuseVE (aTotalOSh)) return TopoDS_Shape(); // - NCollection_DataMap theEdBnd2d; NCollection_IndexedDataMap anEdAd; - ProcessHVertices(aTotalOSh, anEdAd, theEdBnd2d); + ProcessHVertices(aTotalOSh, anEdAd); // - TopoDS_Shape aRes = ProcessLoops(aTotalOSh, anEdAd, theEdBnd2d, - myAlgo->Projector(), anOrigShapes, theMode, OrigFaceToProjFace); + TopoDS_Shape aRes = ProcessLoops(aTotalOSh, anEdAd, myAlgo->Projector(), anOrigShapes, theMode, + OrigFaceToProjFace, ProjFaceToOrigFace); // return aRes; } diff --git a/src/HLRBRep/HLRBRep_HLRToShape.hxx b/src/HLRBRep/HLRBRep_HLRToShape.hxx index d5054b282e..3e1648465f 100644 --- a/src/HLRBRep/HLRBRep_HLRToShape.hxx +++ b/src/HLRBRep/HLRBRep_HLRToShape.hxx @@ -133,7 +133,8 @@ public: const Standard_Boolean In3d); TopoDS_Shape CompoundOfFaces (bool theMode, - TopTools_DataMapOfShapeShape& OrigFaceToProjFace); + TopTools_DataMapOfShapeShape& OrigFaceToProjFace, + TopTools_DataMapOfShapeShape& ProjFaceToOrigFace); protected: diff --git a/src/HLRTopoBRep/HLRTopoBRep_DSFiller.cxx b/src/HLRTopoBRep/HLRTopoBRep_DSFiller.cxx index e098674a05..d3dbadda42 100644 --- a/src/HLRTopoBRep/HLRTopoBRep_DSFiller.cxx +++ b/src/HLRTopoBRep/HLRTopoBRep_DSFiller.cxx @@ -292,7 +292,7 @@ static bool ClarifyPoint(math_FunctionSetRoot& rsnld, Contap_SurfFunction& SFunc TopAbs_State state = const_cast(Domain) ->Classify(P2d,Precision::PConfusion()); if (state == TopAbs_IN || state == TopAbs_ON) - { + { const Handle(Adaptor3d_HSurface)& Surf = SFunc.Surface(); p3d = Adaptor3d_HSurfaceTool::Value(Surf,P2d.X(),P2d.Y()); return true; @@ -309,7 +309,8 @@ static bool ClarifyPoint(math_FunctionSetRoot& rsnld, Contap_SurfFunction& SFunc void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/, const TopoDS_Face& F, - Contap_Contour& FO, const BRepTopAdaptor_TopolTool* Domain, + Contap_Contour& FO, + const BRepTopAdaptor_TopolTool* Domain, HLRTopoBRep_Data& DS, const Standard_Boolean withPCurve) { @@ -385,8 +386,8 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/, Standard_Boolean InsuffisantNumberOfPoints=Standard_False; switch (Line.TypeContour()) { - - case Contap_Lin : + + case Contap_Lin : { C = new Geom_Line(Line.Line()); if (withPCurve) { @@ -396,8 +397,8 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/, } } break; - - case Contap_Circle : + + case Contap_Circle : { C = new Geom_Circle(Line.Circle()); if (withPCurve) { @@ -411,89 +412,89 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/, } } break; - - case Contap_Walking : + + case Contap_Walking : { // copy the points Standard_Integer ipF = Standard_Integer(parF); Standard_Integer ipL = Standard_Integer(parL); - + if(ipL-ipF < 1) { InsuffisantNumberOfPoints=Standard_True; //cout<<"\n !! Pb ds HLRTopoBRep_DSFiller.cxx (Contour App Nbp <3)"<Maxx) Maxx=P.X(); - if(P.Y()>Maxy) Maxy=P.Y(); - if(P.Z()>Maxz) Maxz=P.Z(); - Points.SetValue(i,P); - } - mults(1)=mults(nbp)=2; - //Handle(Geom_BSplineCurve) AppC; - //Handle(Geom2d_BSplineCurve) AppC2d; - //AppC = new Geom_BSplineCurve(Points,knots,mults,1); - - TColgp_Array1OfPnt2d Points2d(1,nbp); - for(Standard_Integer i=1;i<=nbp;i++) - { - Standard_Real u,v; - Line.Point(i+ipF-1).ParametersOnS2(u,v); - if(uMaxu) Maxu=u; - if(v>Maxv) Maxv=v; - Points2d.SetValue(i,gp_Pnt2d(u,v)); - } - //AppC2d = new Geom2d_BSplineCurve(Points2d,knots,mults,1); - - first = 1; - last = nbp; - - //Handle(BRepApprox_ApproxLine) AppLine; Handle(Geom2d_BSplineCurve) CNull; - //AppLine = new BRepApprox_ApproxLine(AppC,AppC2d,CNull); - + Standard_Integer dmin=4,dmax=8,niter=0; Standard_Boolean tg= Standard_False; BRepApprox_Approx Approx; - Standard_Real TOL3d,TOL2d,TOL=0.0001; - - Maxx-=Minx; Maxy-=Miny; Maxz-=Minz; - Maxu-=Minu; Maxv-=Minv; - if(Maxy>Maxx) Maxx=Maxy; - if(Maxz>Maxx) Maxx=Maxy; - if(Maxv>Maxu) Maxu=Maxv; - - TOL3d=TOL*Maxx; if(TOL3d<1e-12) TOL3d=1e-12; else if(TOL3d>0.1) TOL3d=0.1; - TOL2d=TOL*Maxu; if(TOL2d<1e-12) TOL2d=1e-12; else if(TOL2d>0.1) TOL2d=0.1; Contap_SurfFunction& SFunc = FO.SurfaceFunction(); const Handle(Adaptor3d_HSurface)& Surf = SFunc.Surface(); double cmax = 2.0; double c = 100; - int newsize; + int newsize = 0; NCollection_List lp2d; NCollection_List lp; - lp2d.Append(Points2d.First()); - lp.Append(Points.First()); - for (int jj=2; jj < Points.Size(); jj++ ) - { - gp_Pnt curPnt = Points(jj); - gp_Pnt2d curPnt2d = Points2d(jj); - double d3_1 = lp.Last().Distance(curPnt); - double d3_2 = curPnt.Distance(Points(jj+1)); + gp_Pnt firstPnt = Line.Point(ipF).Value(); + gp_Pnt2d firstPnt2d = Line.Point(ipF).ValueOnSurface(Standard_False); + lp2d.Append(firstPnt2d/*Points2d.First()*/); + lp.Append(firstPnt/*Points.First()*/); - double d1 = lp2d.Last().Distance(Points2d(jj)); - double d2 = Points2d(jj).Distance(Points2d(jj+1)); - double x0 = curPnt2d.X(); - double y0 = curPnt2d.Y(); + for (Standard_Integer jj=2;jj<=nbp-1;jj++) + { + const gp_Pnt& curPnt= Line.Point(jj+ipF-1).Value(); + gp_Pnt2d curPnt2d = Line.Point(jj+ipF-1).ValueOnSurface(Standard_False); + gp_Pnt2d nextPnt2d = Line.Point(jj+ipF).ValueOnSurface(Standard_False); + double x0 = curPnt2d.X(), y0= curPnt2d.Y(); + double d3_1 = lp.Last().Distance(curPnt); + double d3_2 = curPnt.Distance(Line.Point(jj+ipF).Value()); + double d1 = lp2d.Last().Distance(curPnt2d); + double d2 = curPnt2d.Distance(nextPnt2d); double coeff = d3_1/d3_2; c = 1.4; @@ -650,8 +606,8 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/, double t = 0; lp2d.Append(curPnt2d); lp.Append(curPnt); - double x1 = Points2d(jj+1).X(); - double y1 = Points2d(jj+1).Y(); + double x1 = nextPnt2d.X(); + double y1 = nextPnt2d.Y(); math_Vector tol(1,2), inf(1,2), sup(1,2); GetSurfInfo(Surf, tol, inf, sup); math_FunctionSetRoot rsnld(SFunc,tol,50); @@ -680,8 +636,8 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/, lp.Append(curPnt); } } - lp2d.Append(Points2d.Last()); - lp.Append(Points.Last()); + lp2d.Append(Line.Point(ipL).ValueOnSurface(Standard_False)); + lp.Append(Line.Point(ipL).Value()); // newsize = lp.Size(); @@ -694,11 +650,37 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/, NCollection_List::Iterator itl2(lp2d); for (int jj = 1;itl.More(), itl2.More();itl.Next(), itl2.Next(), jj++) { + const gp_Pnt& P= itl.Value(); + if(P.X()Maxx) Maxx=P.X(); + if(P.Y()>Maxy) Maxy=P.Y(); + if(P.Z()>Maxz) Maxz=P.Z(); + // + const gp_Pnt2d& P2d = itl2.Value(); + if(P2d.X()Maxu) Maxu=P2d.X(); + if(P2d.Y()>Maxv) Maxv=P2d.Y(); + nknots.SetValue(jj,(Standard_Real)jj); nmults.SetValue(jj,1); - newPoints2dA.SetValue(jj, itl2.Value()); - newPoints3dA.SetValue(jj, itl.Value()); + newPoints2dA.SetValue(jj, P2d); + newPoints3dA.SetValue(jj, P); } + + Standard_Real TOL3d,TOL2d,TOL=0.0001; + + Maxx-=Minx; Maxy-=Miny; Maxz-=Minz; + Maxu-=Minu; Maxv-=Minv; + if(Maxy>Maxx) Maxx=Maxy; + if(Maxz>Maxx) Maxx=Maxy; + if(Maxv>Maxu) Maxu=Maxv; + + TOL3d=TOL*Maxx; if(TOL3d<1e-12) TOL3d=1e-12; else if(TOL3d>0.1) TOL3d=0.1; + TOL2d=TOL*Maxu; if(TOL2d<1e-12) TOL2d=1e-12; else if(TOL2d>0.1) TOL2d=0.1; + nmults(1)=nmults(newsize)=2; Handle_BRepApprox_ApproxLine nAppLine ; Handle(Geom_BSplineCurve) nAppC = @@ -708,10 +690,6 @@ void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/, nAppLine = new BRepApprox_ApproxLine(nAppC,nAppC2d,CNull); - - //AppC2d = new Geom2d_BSplineCurve(Points2d,knots,mults,1); - //-- cout<<"\nHLRTopoBRep_DSFiller : nbp="<Main()); + STool->GetFreeShapes(Labels); + if ( Labels.Length() <=0 ) + { + cout << "no shapes" << endl; + return 0; + } + + TopoDS_Compound aShape; + BRep_Builder B; + B.MakeCompound ( aShape ); + for ( int i = 1; i <= Labels.Length(); i++) + { + TopoDS_Shape S = STool->GetShape ( Labels.Value(i) ); + B.Add ( aShape, S ); + } + // + + gp_Pnt anOrigin(0.,0.,0.); + gp_Dir aNormal(0.57735026918962573, -0.57735026918962573, 0.57735026918962573); + gp_Ax2 anAxes(anOrigin, aNormal); + gp_Dir aDX = anAxes.XDirection(); + + HLRAppli_ReflectLines Reflector(aShape); + + bool from_view = false; + if (strcmp(a[3],"from_view") == 0) + { + Handle(V3d_View) aView = ViewerTest::CurrentView(); + if (aView.IsNull()) + return 1; + from_view = true; + //Standard_Real aViewScale = aView->Scale(); + //Standard_Real aViewSize = 1.0; + //Graphic3d_Vec2i aCenter2d; + //gp_XYZ aViewProj, aViewUp, aViewAt, aViewEye; + //aView->Proj (aViewProj.ChangeCoord (1), aViewProj.ChangeCoord (2), aViewProj.ChangeCoord (3)); + //aView->Up (aViewUp .ChangeCoord (1), aViewUp .ChangeCoord (2), aViewUp .ChangeCoord (3)); + //aView->At (aViewAt .ChangeCoord (1), aViewAt .ChangeCoord (2), aViewAt .ChangeCoord (3)); + //aView->Eye (aViewEye .ChangeCoord (1), aViewEye .ChangeCoord (2), aViewEye .ChangeCoord (3)); + + //anOrigin.SetXYZ(aViewEye); + //aNormal.SetXYZ(aViewProj); + //aDX.SetXYZ(aViewUp); + + Handle(Graphic3d_Camera) aCamera = aView->Camera(); + const gp_Dir aDir = aCamera->Direction().Reversed(); + const gp_Pnt anAt = aCamera->Center(); + const gp_Dir anUp = aCamera->Up(); + + Reflector.SetAxes(aDir.X(), aDir.Y(), aDir.Z(), + anAt.X(), anAt.Y(), anAt.Z(), + anUp.X(), anUp.Y(), anUp.Z(), + !aCamera->IsOrthographic(), + aCamera->Scale()); + + } + else if (strcmp(a[3],"axo") == 0) + { + aNormal.SetCoord(0.57735026918962573, -0.57735026918962573, 0.57735026918962573); + aDX.SetCoord(-0.40824829046386307, 0.40824829046386307, 0.81649658092772615); + } + else if (strcmp(a[3],"top") == 0) + { + aNormal.SetCoord(0,0,1); + aDX.SetCoord(0,1,0); + } + else if (strcmp(a[3],"bottom") == 0) + { + aNormal.SetCoord(0,0,-1); + aDX.SetCoord(0,-1,0); + } + else if (strcmp(a[3],"front") == 0) + { + aNormal.SetCoord(0,-1,0); + aDX.SetCoord(0,0,1); + } + else if (strcmp(a[3],"back") == 0) + { + aNormal.SetCoord(0,1,0); + aDX.SetCoord(0,0,1); + } + else if (strcmp(a[3],"left") == 0) + { + aNormal.SetCoord(-1,0,0); + aDX.SetCoord(0,0,1); + } + else if (strcmp(a[3],"right") == 0) + { + aNormal.SetCoord(1,0,0); + aDX.SetCoord(0,0,1); + } + + if (!from_view) + Reflector.SetAxes(aNormal.X(), aNormal.Y(), aNormal.Z(), + anOrigin.X(), anOrigin.Y(), anOrigin.Z(), + aDX.X(), aDX.Y(), aDX.Z()); + + Reflector.Perform(); + + TopTools_DataMapOfShapeShape map3Dto2Dfaces, map2Dto3Dfaces; + TopoDS_Shape aFaces = Reflector.GetCompoundOfFaces(true, map3Dto2Dfaces, map2Dto3Dfaces); + + Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( aDoc->Main() ); + + Handle(TDocStd_Document) OutDoc; + DDocStd::GetDocument(a[1], OutDoc); + if ( OutDoc.IsNull() ) + { + di << a[2] << " is not a document\n"; + return 1; + } + + TopExp_Explorer exp(aFaces, TopAbs_FACE); + Handle(XCAFDoc_ShapeTool) SToolOut = XCAFDoc_DocumentTool::ShapeTool(OutDoc->Main()); + Handle(XCAFDoc_ColorTool) CToolOut = XCAFDoc_DocumentTool::ColorTool(OutDoc->Main()); + + for (;exp.More();exp.Next()) + { + TopoDS_Shape aCShape = exp.Current(); + TDF_Label aLabel; + aLabel = SToolOut->AddShape(aCShape, 0); + if (aLabel.IsNull()) + continue; + + const TopoDS_Shape& a3df = map2Dto3Dfaces(aCShape); + Quantity_Color aQColor; + if (!CTool->GetColor ( a3df, XCAFDoc_ColorGen, aQColor) ) + continue; + CToolOut->SetColor(aLabel, aQColor, XCAFDoc_ColorGen); + } + + return 0; +} //======================================================================= @@ -2623,8 +2779,13 @@ void QABugs::Commands_20(Draw_Interpretor& theCommands) { "OCC27341 res shape axo/top/bottom/front/back/left/right", __FILE__, OCC27341, group); theCommands.Add("OCC28991", - "OCC289911 res shape axo/top/bottom/front/back/left/right", + "OCC28991 res shape axo/top/bottom/front/back/left/right", __FILE__, OCC28991, group); + + theCommands.Add("OCC_HLRDEMO", + "OCC_HLRDEMO outdoc inpdoc axo/top/bottom/front/back/left/right", + __FILE__, OCC_HLRDEMO, group); + theCommands.Add ("OCC26747_1", "OCC26747_1 result", __FILE__, OCC26747_1, group); theCommands.Add ("OCC26747_2", "OCC26747_2 result", __FILE__, OCC26747_2, group); theCommands.Add ("OCC26747_3", "OCC26747_3 result", __FILE__, OCC26747_3, group); @@ -2642,5 +2803,7 @@ void QABugs::Commands_20(Draw_Interpretor& theCommands) { __FILE__, OCC28887, group); theCommands.Add("OCC28131", "OCC28131 name: creates face problematic for offset", __FILE__, OCC28131, group); + + return; } -- 2.39.5