// Created on: 1991-07-02 // Created by: Remi LEQUETTE // Copyright (c) 1991-1999 Matra Datavision // Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //================================================================================================= //================================================================================================= // function : UpdateCurves // purpose : Insert a 3d curve with location // in a list of curve representations //================================================================================================= static void UpdateCurves(NCollection_List>& lcr, const occ::handle& C, const TopLoc_Location& L) { NCollection_List>::Iterator itcr(lcr); occ::handle GC; double f = 0., l = 0.; while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull()) { GC->Range(f, l); if (GC->IsCurve3D()) { break; } } itcr.Next(); } if (itcr.More()) { itcr.Value()->Curve3D(C); itcr.Value()->Location(L); } else { occ::handle C3d = new BRep_Curve3D(C, L); // test if there is already a range if (!GC.IsNull()) { C3d->SetRange(f, l); } lcr.Append(C3d); } } //================================================================================================= // function : UpdateCurves // purpose : Insert a pcurve on surface with location // in a list of curve representations // Remove the pcurve on from if is null //================================================================================================= static void UpdateCurves(NCollection_List>& lcr, const occ::handle& C, const occ::handle& S, const TopLoc_Location& L) { NCollection_List>::Iterator itcr(lcr); occ::handle cr; occ::handle GC; double f = -Precision::Infinite(), l = Precision::Infinite(); // search the range of the 3d curve // and remove any existing representation while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull()) { if (GC->IsCurve3D()) { // if (!C.IsNull()) { //xpu031198, degenerate edge // xpu151298 : parameters can be set for null curves // see lbo & flo, to determine whether range is defined // compare first and last parameters with default values. GC->Range(f, l); } if (GC->IsCurveOnSurface(S, L)) { // remove existing curve on surface // cr is used to keep a reference on the curve representation // this avoid deleting it as its content may be referenced by C or S cr = itcr.Value(); lcr.Remove(itcr); } else { itcr.Next(); } } else { itcr.Next(); } } if (!C.IsNull()) { occ::handle COS = new BRep_CurveOnSurface(C, S, L); double aFCur = 0.0, aLCur = 0.0; COS->Range(aFCur, aLCur); if (!Precision::IsInfinite(f)) { aFCur = f; } if (!Precision::IsInfinite(l)) { aLCur = l; } COS->SetRange(aFCur, aLCur); lcr.Append(COS); } } //================================================================================================= // function : UpdateCurves // purpose : Insert a pcurve on surface with location // in a list of curve representations // Remove the pcurve on from if is null //================================================================================================= static void UpdateCurves(NCollection_List>& lcr, const occ::handle& C, const occ::handle& S, const TopLoc_Location& L, const gp_Pnt2d& Pf, const gp_Pnt2d& Pl) { NCollection_List>::Iterator itcr(lcr); occ::handle cr; occ::handle GC; double f = -Precision::Infinite(), l = Precision::Infinite(); // search the range of the 3d curve // and remove any existing representation while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull()) { if (GC->IsCurve3D()) { // if (!C.IsNull()) { //xpu031198, degenerate edge // xpu151298 : parameters can be set for null curves // see lbo & flo, to determine whether range is defined // compare first and last parameters with default values. GC->Range(f, l); } if (GC->IsCurveOnSurface(S, L)) { // remove existing curve on surface // cr is used to keep a reference on the curve representation // this avoid deleting it as its content may be referenced by C or S cr = itcr.Value(); lcr.Remove(itcr); } else { itcr.Next(); } } else { itcr.Next(); } } if (!C.IsNull()) { occ::handle COS = new BRep_CurveOnSurface(C, S, L); double aFCur = 0.0, aLCur = 0.0; COS->Range(aFCur, aLCur); if (!Precision::IsInfinite(f)) { aFCur = f; } if (!Precision::IsInfinite(l)) { aLCur = l; } COS->SetRange(aFCur, aLCur); COS->SetUVPoints(Pf, Pl); lcr.Append(COS); } } //================================================================================================= // function : UpdateCurves // purpose : Insert two pcurves on surface with location // in a list of curve representations // Remove the pcurves on from if or is null //================================================================================================= static void UpdateCurves(NCollection_List>& lcr, const occ::handle& C1, const occ::handle& C2, const occ::handle& S, const TopLoc_Location& L) { NCollection_List>::Iterator itcr(lcr); occ::handle cr; occ::handle GC; double f = -Precision::Infinite(), l = Precision::Infinite(); while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull()) { if (GC->IsCurve3D()) { GC->Range(f, l); } bool iscos = GC->IsCurveOnSurface(S, L); if (iscos) { break; } } itcr.Next(); } if (itcr.More()) { // cr is used to keep a reference on the curve representation // this avoid deleting it as its content may be referenced by C or S cr = itcr.Value(); lcr.Remove(itcr); } if (!C1.IsNull() && !C2.IsNull()) { occ::handle COS = new BRep_CurveOnClosedSurface(C1, C2, S, L, GeomAbs_C0); double aFCur = 0.0, aLCur = 0.0; COS->Range(aFCur, aLCur); if (!Precision::IsInfinite(f)) { aFCur = f; } if (!Precision::IsInfinite(l)) { aLCur = l; } COS->SetRange(aFCur, aLCur); lcr.Append(COS); } } //================================================================================================= // function : UpdateCurves // purpose : Insert two pcurves on surface with location // in a list of curve representations // Remove the pcurves on from if or is null //================================================================================================= static void UpdateCurves(NCollection_List>& lcr, const occ::handle& C1, const occ::handle& C2, const occ::handle& S, const TopLoc_Location& L, const gp_Pnt2d& Pf, const gp_Pnt2d& Pl) { NCollection_List>::Iterator itcr(lcr); occ::handle cr; occ::handle GC; double f = -Precision::Infinite(), l = Precision::Infinite(); while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull()) { if (GC->IsCurve3D()) { GC->Range(f, l); } bool iscos = GC->IsCurveOnSurface(S, L); if (iscos) { break; } } itcr.Next(); } if (itcr.More()) { // cr is used to keep a reference on the curve representation // this avoid deleting it as its content may be referenced by C or S cr = itcr.Value(); lcr.Remove(itcr); } if (!C1.IsNull() && !C2.IsNull()) { occ::handle COS = new BRep_CurveOnClosedSurface(C1, C2, S, L, GeomAbs_C0); double aFCur = 0.0, aLCur = 0.0; COS->Range(aFCur, aLCur); if (!Precision::IsInfinite(f)) { aFCur = f; } if (!Precision::IsInfinite(l)) { aLCur = l; } COS->SetRange(aFCur, aLCur); COS->SetUVPoints2(Pf, Pl); lcr.Append(COS); } } static void UpdateCurves(NCollection_List>& lcr, const occ::handle& S1, const occ::handle& S2, const TopLoc_Location& L1, const TopLoc_Location& L2, const GeomAbs_Shape C) { NCollection_List>::Iterator itcr(lcr); while (itcr.More()) { const occ::handle& cr = itcr.Value(); bool isregu = cr->IsRegularity(S1, S2, L1, L2); if (isregu) { break; } itcr.Next(); } if (itcr.More()) { occ::handle cr = itcr.Value(); cr->Continuity(C); } else { occ::handle COS = new BRep_CurveOn2Surfaces(S1, S2, L1, L2, C); lcr.Append(COS); } } static void UpdatePoints(NCollection_List>& lpr, double p, const occ::handle& C, const TopLoc_Location& L) { NCollection_List>::Iterator itpr(lpr); while (itpr.More()) { const occ::handle& pr = itpr.Value(); bool isponc = pr->IsPointOnCurve(C, L); if (isponc) { break; } itpr.Next(); } if (itpr.More()) { occ::handle pr = itpr.Value(); pr->Parameter(p); } else { occ::handle POC = new BRep_PointOnCurve(p, C, L); lpr.Append(POC); } } static void UpdatePoints(NCollection_List>& lpr, double p, const occ::handle& PC, const occ::handle& S, const TopLoc_Location& L) { NCollection_List>::Iterator itpr(lpr); while (itpr.More()) { const occ::handle& pr = itpr.Value(); bool isponcons = pr->IsPointOnCurveOnSurface(PC, S, L); if (isponcons) { break; } itpr.Next(); } if (itpr.More()) { occ::handle pr = itpr.Value(); pr->Parameter(p); } else { occ::handle POCS = new BRep_PointOnCurveOnSurface(p, PC, S, L); lpr.Append(POCS); } } static void UpdatePoints(NCollection_List>& lpr, double p1, double p2, const occ::handle& S, const TopLoc_Location& L) { NCollection_List>::Iterator itpr(lpr); while (itpr.More()) { const occ::handle& pr = itpr.Value(); bool ispons = pr->IsPointOnSurface(S, L); if (ispons) { break; } itpr.Next(); } if (itpr.More()) { occ::handle pr = itpr.Value(); pr->Parameter(p1); // pr->Parameter(p2); // skv pr->Parameter2(p2); // skv } else { occ::handle POS = new BRep_PointOnSurface(p1, p2, S, L); lpr.Append(POS); } } //================================================================================================= void BRep_Builder::MakeFace(TopoDS_Face& F, const occ::handle& S, const double Tol) const { occ::handle TF = new BRep_TFace(); if (!F.IsNull() && F.Locked()) { throw TopoDS_LockedShape("BRep_Builder::MakeFace"); } TF->Surface(S); TF->Tolerance(Tol); MakeShape(F, TF); } //================================================================================================= void BRep_Builder::MakeFace(TopoDS_Face& theFace, const occ::handle& theTriangulation) const { occ::handle aTFace = new BRep_TFace(); if (!theFace.IsNull() && theFace.Locked()) { throw TopoDS_LockedShape("BRep_Builder::MakeFace"); } aTFace->Triangulation(theTriangulation); MakeShape(theFace, aTFace); } //================================================================================================= void BRep_Builder::MakeFace( TopoDS_Face& theFace, const NCollection_List>& theTriangulations, const occ::handle& theActiveTriangulation) const { occ::handle aTFace = new BRep_TFace(); if (!theFace.IsNull() && theFace.Locked()) { throw TopoDS_LockedShape("BRep_Builder::MakeFace"); } aTFace->Triangulations(theTriangulations, theActiveTriangulation); MakeShape(theFace, aTFace); } //================================================================================================= void BRep_Builder::MakeFace(TopoDS_Face& F, const occ::handle& S, const TopLoc_Location& L, const double Tol) const { occ::handle TF = new BRep_TFace(); if (!F.IsNull() && F.Locked()) { throw TopoDS_LockedShape("BRep_Builder::MakeFace"); } TF->Surface(S); TF->Tolerance(Tol); TF->Location(L); MakeShape(F, TF); } //================================================================================================= void BRep_Builder::UpdateFace(const TopoDS_Face& F, const occ::handle& S, const TopLoc_Location& L, const double Tol) const { const occ::handle& TF = *((occ::handle*)&F.TShape()); if (TF->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateFace"); } TF->Surface(S); TF->Tolerance(Tol); TF->Location(L.Predivided(F.Location())); F.TShape()->Modified(true); } //================================================================================================= void BRep_Builder::UpdateFace(const TopoDS_Face& theFace, const occ::handle& theTriangulation, const bool theToReset) const { const occ::handle& aTFace = *((occ::handle*)&theFace.TShape()); if (aTFace->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateFace"); } aTFace->Triangulation(theTriangulation, theToReset); theFace.TShape()->Modified(true); } //================================================================================================= void BRep_Builder::UpdateFace(const TopoDS_Face& F, const double Tol) const { const occ::handle& TF = *((occ::handle*)&F.TShape()); if (TF->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateFace"); } TF->Tolerance(Tol); F.TShape()->Modified(true); } //================================================================================================= void BRep_Builder::NaturalRestriction(const TopoDS_Face& F, const bool N) const { const occ::handle& TF = (*((occ::handle*)&F.TShape())); if (TF->Locked()) { throw TopoDS_LockedShape("BRep_Builder::NaturalRestriction"); } TF->NaturalRestriction(N); F.TShape()->Modified(true); } //================================================================================================= void BRep_Builder::MakeEdge(TopoDS_Edge& E) const { occ::handle TE = new BRep_TEdge(); if (!E.IsNull() && E.Locked()) { throw TopoDS_LockedShape("BRep_Builder::MakeEdge"); } MakeShape(E, TE); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& C, const TopLoc_Location& L, const double Tol) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } const TopLoc_Location l = L.Predivided(E.Location()); UpdateCurves(TE->ChangeCurves(), C, l); TE->UpdateTolerance(Tol); TE->Modified(true); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& C, const occ::handle& S, const TopLoc_Location& L, const double Tol) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } const TopLoc_Location l = L.Predivided(E.Location()); UpdateCurves(TE->ChangeCurves(), C, S, l); TE->UpdateTolerance(Tol); TE->Modified(true); } //================================================================================================= // function : UpdateEdge // purpose : for the second format (for XML Persistence) //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& C, const occ::handle& S, const TopLoc_Location& L, const double Tol, const gp_Pnt2d& Pf, const gp_Pnt2d& Pl) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } const TopLoc_Location l = L.Predivided(E.Location()); UpdateCurves(TE->ChangeCurves(), C, S, l, Pf, Pl); TE->UpdateTolerance(Tol); TE->Modified(true); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& C1, const occ::handle& C2, const occ::handle& S, const TopLoc_Location& L, const double Tol) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } const TopLoc_Location l = L.Predivided(E.Location()); UpdateCurves(TE->ChangeCurves(), C1, C2, S, l); TE->UpdateTolerance(Tol); TE->Modified(true); } //================================================================================================= // function : UpdateEdge // purpose : for the second format (for XML Persistence) //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& C1, const occ::handle& C2, const occ::handle& S, const TopLoc_Location& L, const double Tol, const gp_Pnt2d& Pf, const gp_Pnt2d& Pl) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } const TopLoc_Location l = L.Predivided(E.Location()); UpdateCurves(TE->ChangeCurves(), C1, C2, S, l, Pf, Pl); TE->UpdateTolerance(Tol); TE->Modified(true); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& P, const TopLoc_Location& L) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } NCollection_List>& lcr = TE->ChangeCurves(); NCollection_List>::Iterator itcr(lcr); while (itcr.More()) { if (itcr.Value()->IsPolygon3D()) { if (P.IsNull()) { lcr.Remove(itcr); } else { itcr.Value()->Polygon3D(P); } TE->Modified(true); return; } itcr.Next(); } const TopLoc_Location l = L.Predivided(E.Location()); occ::handle P3d = new BRep_Polygon3D(P, l); lcr.Append(P3d); TE->Modified(true); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& P, const occ::handle& T, const TopLoc_Location& L) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } const TopLoc_Location l = L.Predivided(E.Location()); bool isModified = false; NCollection_List>& lcr = TE->ChangeCurves(); NCollection_List>::Iterator itcr(lcr); occ::handle cr; while (itcr.More()) { if (itcr.Value()->IsPolygonOnTriangulation(T, l)) { // cr is used to keep a reference on the curve representation // this avoid deleting it as its content may be referenced by T cr = itcr.Value(); lcr.Remove(itcr); isModified = true; break; } itcr.Next(); } if (!P.IsNull()) { occ::handle PT = new BRep_PolygonOnTriangulation(P, T, l); lcr.Append(PT); isModified = true; } if (isModified) { TE->Modified(true); } } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& P1, const occ::handle& P2, const occ::handle& T, const TopLoc_Location& L) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } const TopLoc_Location l = L.Predivided(E.Location()); bool isModified = false; NCollection_List>& lcr = TE->ChangeCurves(); NCollection_List>::Iterator itcr(lcr); occ::handle cr; while (itcr.More()) { if (itcr.Value()->IsPolygonOnTriangulation(T, l)) // szv:was L { // cr is used to keep a reference on the curve representation // this avoid deleting it as its content may be referenced by T cr = itcr.Value(); lcr.Remove(itcr); isModified = true; break; } itcr.Next(); } if (!P1.IsNull() && !P2.IsNull()) { occ::handle PT = new BRep_PolygonOnClosedTriangulation(P1, P2, T, l); lcr.Append(PT); isModified = true; } if (isModified) { TE->Modified(true); } } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& P, const TopoDS_Face& F) const { TopLoc_Location l; const occ::handle& S = BRep_Tool::Surface(F, l); UpdateEdge(E, P, S, l); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& P, const occ::handle& S, const TopLoc_Location& L) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } TopLoc_Location l = L.Predivided(E.Location()); NCollection_List>& lcr = TE->ChangeCurves(); occ::handle cr; NCollection_List>::Iterator itcr(lcr); while (itcr.More()) { if (itcr.Value()->IsPolygonOnSurface(S, l)) { break; } itcr.Next(); } if (itcr.More()) { // cr is used to keep a reference on the curve representation // this avoid deleting it as its content may be referenced by T cr = itcr.Value(); lcr.Remove(itcr); } if (!P.IsNull()) { occ::handle PS = new BRep_PolygonOnSurface(P, S, l); lcr.Append(PS); } TE->Modified(true); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& P1, const occ::handle& P2, const TopoDS_Face& F) const { TopLoc_Location l; const occ::handle& S = BRep_Tool::Surface(F, l); UpdateEdge(E, P1, P2, S, l); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const occ::handle& P1, const occ::handle& P2, const occ::handle& S, const TopLoc_Location& L) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } TopLoc_Location l = L.Predivided(E.Location()); NCollection_List>& lcr = TE->ChangeCurves(); occ::handle cr; NCollection_List>::Iterator itcr(lcr); while (itcr.More()) { if (itcr.Value()->IsPolygonOnSurface(S, l)) { break; } itcr.Next(); } if (itcr.More()) { // cr is used to keep a reference on the curve representation // this avoid deleting it as its content may be referenced by T cr = itcr.Value(); lcr.Remove(itcr); } if (!P1.IsNull() && !P2.IsNull()) { occ::handle PS = new BRep_PolygonOnClosedSurface(P1, P2, S, TopLoc_Location()); lcr.Append(PS); } TE->Modified(true); } //================================================================================================= void BRep_Builder::UpdateEdge(const TopoDS_Edge& E, const double Tol) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateEdge"); } TE->UpdateTolerance(Tol); TE->Modified(true); } //================================================================================================= void BRep_Builder::Continuity(const TopoDS_Edge& E, const TopoDS_Face& F1, const TopoDS_Face& F2, const GeomAbs_Shape C) const { TopLoc_Location l1, l2; const occ::handle& S1 = BRep_Tool::Surface(F1, l1); const occ::handle& S2 = BRep_Tool::Surface(F2, l2); Continuity(E, S1, S2, l1, l2, C); } //================================================================================================= void BRep_Builder::Continuity(const TopoDS_Edge& E, const occ::handle& S1, const occ::handle& S2, const TopLoc_Location& L1, const TopLoc_Location& L2, const GeomAbs_Shape C) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::Continuity"); } const TopLoc_Location l1 = L1.Predivided(E.Location()); const TopLoc_Location l2 = L2.Predivided(E.Location()); UpdateCurves(TE->ChangeCurves(), S1, S2, l1, l2, C); TE->Modified(true); } //================================================================================================= void BRep_Builder::SameParameter(const TopoDS_Edge& E, const bool S) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::SameParameter"); } TE->SameParameter(S); TE->Modified(true); } //================================================================================================= void BRep_Builder::SameRange(const TopoDS_Edge& E, const bool S) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::SameRange"); } TE->SameRange(S); TE->Modified(true); } //================================================================================================= void BRep_Builder::Degenerated(const TopoDS_Edge& E, const bool D) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::Degenerated"); } TE->Degenerated(D); if (D) { // set a null 3d curve UpdateCurves(TE->ChangeCurves(), occ::handle(), E.Location()); } TE->Modified(true); } //================================================================================================= void BRep_Builder::Range(const TopoDS_Edge& E, const double First, const double Last, const bool Only3d) const { // set the range to all the representations if Only3d=FALSE const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::Range"); } NCollection_List>& lcr = TE->ChangeCurves(); NCollection_List>::Iterator itcr(lcr); occ::handle GC; while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull() && (!Only3d || GC->IsCurve3D())) { GC->SetRange(First, Last); } itcr.Next(); } TE->Modified(true); } //================================================================================================= void BRep_Builder::Range(const TopoDS_Edge& E, const occ::handle& S, const TopLoc_Location& L, const double First, const double Last) const { const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::Range"); } const TopLoc_Location l = L.Predivided(E.Location()); NCollection_List>& lcr = TE->ChangeCurves(); NCollection_List>::Iterator itcr(lcr); occ::handle GC; while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull() && GC->IsCurveOnSurface(S, l)) { GC->SetRange(First, Last); break; } itcr.Next(); } if (!itcr.More()) { throw Standard_DomainError("BRep_Builder::Range, no pcurve"); } TE->Modified(true); } //================================================================================================= void BRep_Builder::Transfert(const TopoDS_Edge& Ein, const TopoDS_Edge& Eout) const { const occ::handle& TE = *((occ::handle*)&Ein.TShape()); const double tol = TE->Tolerance(); const NCollection_List>& lcr = TE->Curves(); NCollection_List>::Iterator itcr(lcr); while (itcr.More()) { const occ::handle& CR = itcr.Value(); if (CR->IsCurveOnSurface()) { UpdateEdge(Eout, CR->PCurve(), CR->Surface(), Ein.Location() * CR->Location(), tol); } else if (CR->IsCurveOnClosedSurface()) { UpdateEdge(Eout, CR->PCurve(), CR->PCurve2(), CR->Surface(), Ein.Location() * CR->Location(), tol); } if (CR->IsRegularity()) { Continuity(Eout, CR->Surface(), CR->Surface2(), Ein.Location() * CR->Location(), Ein.Location() * CR->Location2(), CR->Continuity()); } itcr.Next(); } } //================================================================================================= void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V, const gp_Pnt& P, const double Tol) const { const occ::handle& TV = *((occ::handle*)&V.TShape()); if (TV->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateVertex"); } TV->Pnt(P.Transformed(V.Location().Inverted().Transformation())); TV->UpdateTolerance(Tol); TV->Modified(true); } //================================================================================================= // function : UpdateVertex // purpose : update vertex with parameter on edge //================================================================================================= void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V, const double Par, const TopoDS_Edge& E, const double Tol) const { if (Precision::IsPositiveInfinite(Par) || Precision::IsNegativeInfinite(Par)) { throw Standard_DomainError("BRep_Builder::Infinite parameter"); } const occ::handle& TV = *((occ::handle*)&V.TShape()); const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TV->Locked() || TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateVertex"); } TopLoc_Location L = E.Location().Predivided(V.Location()); // Search the vertex in the edge TopAbs_Orientation ori = TopAbs_INTERNAL; TopoDS_Iterator itv(E.Oriented(TopAbs_FORWARD)); // if the edge has no vertices // and is degenerated use the vertex orientation // RLE, june 94 if (!itv.More() && TE->Degenerated()) { ori = V.Orientation(); } while (itv.More()) { const TopoDS_Shape& Vcur = itv.Value(); if (V.IsSame(Vcur)) { ori = Vcur.Orientation(); if (ori == V.Orientation()) { break; } } itv.Next(); } NCollection_List>& lcr = TE->ChangeCurves(); NCollection_List>::Iterator itcr(lcr); occ::handle GC; while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull()) { if (ori == TopAbs_FORWARD) { GC->First(Par); } else if (ori == TopAbs_REVERSED) { GC->Last(Par); } else { NCollection_List>& lpr = TV->ChangePoints(); const TopLoc_Location& GCloc = GC->Location(); TopLoc_Location LGCloc = L * GCloc; if (GC->IsCurve3D()) { const occ::handle& GC3d = GC->Curve3D(); UpdatePoints(lpr, Par, GC3d, LGCloc); } else if (GC->IsCurveOnSurface()) { const occ::handle& GCpc = GC->PCurve(); const occ::handle& GCsu = GC->Surface(); UpdatePoints(lpr, Par, GCpc, GCsu, LGCloc); } } } itcr.Next(); } if ((ori != TopAbs_FORWARD) && (ori != TopAbs_REVERSED)) { TV->Modified(true); } TV->UpdateTolerance(Tol); TE->Modified(true); } //================================================================================================= // function : UpdateVertex // purpose : update vertex with parameter on edge on face //================================================================================================= void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V, const double Par, const TopoDS_Edge& E, const occ::handle& S, const TopLoc_Location& L, const double Tol) const { if (Precision::IsPositiveInfinite(Par) || Precision::IsNegativeInfinite(Par)) { throw Standard_DomainError("BRep_Builder::Infinite parameter"); } // Find the curve representation TopLoc_Location l = L.Predivided(V.Location()); const occ::handle& TV = *((occ::handle*)&V.TShape()); const occ::handle& TE = *((occ::handle*)&E.TShape()); if (TV->Locked() || TE->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateVertex"); } // Search the vertex in the edge TopAbs_Orientation ori = TopAbs_INTERNAL; TopoDS_Iterator itv(E.Oriented(TopAbs_FORWARD)); // if the edge has no vertices // and is degenerated use the vertex orientation // RLE, june 94 if (!itv.More() && TE->Degenerated()) { ori = V.Orientation(); } while (itv.More()) { const TopoDS_Shape& Vcur = itv.Value(); if (V.IsSame(Vcur)) { ori = Vcur.Orientation(); if (ori == V.Orientation()) { break; } } itv.Next(); } NCollection_List>& lcr = TE->ChangeCurves(); NCollection_List>::Iterator itcr(lcr); occ::handle GC; while (itcr.More()) { GC = occ::down_cast(itcr.Value()); if (!GC.IsNull()) { // if (GC->IsCurveOnSurface(S,l)) { if (GC->IsCurveOnSurface(S, L)) { // xpu020198 : BUC60407 if (ori == TopAbs_FORWARD) { GC->First(Par); } else if (ori == TopAbs_REVERSED) { GC->Last(Par); } else { NCollection_List>& lpr = TV->ChangePoints(); const occ::handle& GCpc = GC->PCurve(); UpdatePoints(lpr, Par, GCpc, S, l); TV->Modified(true); } break; } } itcr.Next(); } if (!itcr.More()) { throw Standard_DomainError("BRep_Builder:: no pcurve"); } TV->UpdateTolerance(Tol); TE->Modified(true); } //================================================================================================= // function : UpdateVertex // purpose : update vertex with parameters on face //================================================================================================= void BRep_Builder::UpdateVertex(const TopoDS_Vertex& Ve, const double U, const double V, const TopoDS_Face& F, const double Tol) const { const occ::handle& TV = *((occ::handle*)&Ve.TShape()); if (TV->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateVertex"); } TopLoc_Location L; const occ::handle& S = BRep_Tool::Surface(F, L); L = L.Predivided(Ve.Location()); NCollection_List>& lpr = TV->ChangePoints(); UpdatePoints(lpr, U, V, S, L); TV->UpdateTolerance(Tol); TV->Modified(true); } //================================================================================================= void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V, const double Tol) const { const occ::handle& TV = *((occ::handle*)&V.TShape()); if (TV->Locked()) { throw TopoDS_LockedShape("BRep_Builder::UpdateVertex"); } TV->UpdateTolerance(Tol); TV->Modified(true); } //================================================================================================= void BRep_Builder::Transfert(const TopoDS_Edge& Ein, const TopoDS_Edge& Eout, const TopoDS_Vertex& Vin, const TopoDS_Vertex& Vout) const { const double tol = BRep_Tool::Tolerance(Vin); const double parin = BRep_Tool::Parameter(Vin, Ein); UpdateVertex(Vout, parin, Eout, tol); }