mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-14 13:30:48 +03:00
0024876: Add protection of shapes against modification of geometry
Added flag "locked" for protection of geometric data in the shapes (including tolerances). Modification test case to avoid regression.
This commit is contained in:
@@ -30,6 +30,7 @@
|
||||
|
||||
#include <TopoDS.hxx>
|
||||
#include <TopoDS_Iterator.hxx>
|
||||
#include <TopoDS_LockedShape.hxx>
|
||||
|
||||
#include <Precision.hxx>
|
||||
|
||||
@@ -424,6 +425,10 @@ void BRep_Builder::MakeFace(TopoDS_Face& F,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
Handle(BRep_TFace) TF = new BRep_TFace();
|
||||
if(!F.IsNull() && F.Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::MakeFace");
|
||||
}
|
||||
TF->Surface(S);
|
||||
TF->Tolerance(Tol);
|
||||
MakeShape(F,TF);
|
||||
@@ -439,6 +444,10 @@ void BRep_Builder::MakeFace(TopoDS_Face& F,
|
||||
const Handle(Poly_Triangulation)& T) const
|
||||
{
|
||||
Handle(BRep_TFace) TF = new BRep_TFace();
|
||||
if(!F.IsNull() && F.Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::MakeFace");
|
||||
}
|
||||
TF->Triangulation(T);
|
||||
MakeShape(F, TF);
|
||||
}
|
||||
@@ -455,6 +464,10 @@ void BRep_Builder::MakeFace(TopoDS_Face& F,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
Handle(BRep_TFace) TF = new BRep_TFace();
|
||||
if(!F.IsNull() && F.Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::MakeFace");
|
||||
}
|
||||
TF->Surface(S);
|
||||
TF->Tolerance(Tol);
|
||||
TF->Location(L);
|
||||
@@ -473,6 +486,10 @@ void BRep_Builder::UpdateFace(const TopoDS_Face& F,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
const Handle(BRep_TFace)& TF = *((Handle(BRep_TFace)*) &F.TShape());
|
||||
if(TF->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateFace");
|
||||
}
|
||||
TF->Surface(S);
|
||||
TF->Tolerance(Tol);
|
||||
TF->Location(L.Predivided(F.Location()));
|
||||
@@ -488,7 +505,12 @@ void BRep_Builder::UpdateFace(const TopoDS_Face& F,
|
||||
void BRep_Builder::UpdateFace(const TopoDS_Face& F,
|
||||
const Handle(Poly_Triangulation)& T) const
|
||||
{
|
||||
(*((Handle(BRep_TFace)*) &F.TShape()))->Triangulation(T);
|
||||
const Handle(BRep_TFace)& TF = *((Handle(BRep_TFace)*) &F.TShape());
|
||||
if(TF->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateFace");
|
||||
}
|
||||
TF->Triangulation(T);
|
||||
F.TShape()->Modified(Standard_True);
|
||||
}
|
||||
|
||||
@@ -501,7 +523,12 @@ void BRep_Builder::UpdateFace(const TopoDS_Face& F,
|
||||
void BRep_Builder::UpdateFace(const TopoDS_Face& F,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
(*((Handle(BRep_TFace)*) &F.TShape()))->Tolerance(Tol);
|
||||
const Handle(BRep_TFace)& TF = *((Handle(BRep_TFace)*) &F.TShape());
|
||||
if(TF->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateFace");
|
||||
}
|
||||
TF->Tolerance(Tol);
|
||||
F.TShape()->Modified(Standard_True);
|
||||
}
|
||||
|
||||
@@ -514,7 +541,12 @@ void BRep_Builder::UpdateFace(const TopoDS_Face& F,
|
||||
void BRep_Builder::NaturalRestriction(const TopoDS_Face& F,
|
||||
const Standard_Boolean N) const
|
||||
{
|
||||
(*((Handle(BRep_TFace)*) &F.TShape()))->NaturalRestriction(N);
|
||||
const Handle(BRep_TFace)& TF = (*((Handle(BRep_TFace)*) &F.TShape()));
|
||||
if(TF->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::NaturalRestriction");
|
||||
}
|
||||
TF->NaturalRestriction(N);
|
||||
F.TShape()->Modified(Standard_True);
|
||||
}
|
||||
|
||||
@@ -527,6 +559,10 @@ void BRep_Builder::NaturalRestriction(const TopoDS_Face& F,
|
||||
void BRep_Builder::MakeEdge(TopoDS_Edge& E) const
|
||||
{
|
||||
Handle(BRep_TEdge) TE = new BRep_TEdge();
|
||||
if(!E.IsNull() && E.Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::MakeEdge");
|
||||
}
|
||||
TE->Closed(Standard_False);
|
||||
MakeShape(E,TE);
|
||||
}
|
||||
@@ -543,6 +579,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
const TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
UpdateCurves(TE->ChangeCurves(),C,l);
|
||||
@@ -565,6 +605,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
const TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
UpdateCurves(TE->ChangeCurves(),C,S,l);
|
||||
@@ -588,6 +632,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const gp_Pnt2d& Pl) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
const TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
UpdateCurves(TE->ChangeCurves(),C,S,l,Pf,Pl);
|
||||
@@ -610,6 +658,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
const TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
UpdateCurves(TE->ChangeCurves(),C1,C2,S,l);
|
||||
@@ -636,6 +688,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const gp_Pnt2d& Pl) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
const TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
UpdateCurves(TE->ChangeCurves(),C1,C2,S,l,Pf,Pl);
|
||||
@@ -657,7 +713,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const TopLoc_Location& L) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
|
||||
BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
|
||||
|
||||
@@ -694,6 +753,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const TopLoc_Location& L) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
const TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
Standard_Boolean isModified = Standard_False;
|
||||
@@ -741,6 +804,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const TopLoc_Location& L) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
const TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
Standard_Boolean isModified = Standard_False;
|
||||
@@ -800,6 +867,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const TopLoc_Location& L) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
|
||||
@@ -854,6 +925,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const TopLoc_Location& L) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
|
||||
@@ -890,6 +965,10 @@ void BRep_Builder::UpdateEdge(const TopoDS_Edge& E,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateEdge");
|
||||
}
|
||||
TE->UpdateTolerance(Tol);
|
||||
TE->Modified(Standard_True);
|
||||
}
|
||||
@@ -924,7 +1003,10 @@ void BRep_Builder::Continuity(const TopoDS_Edge& E,
|
||||
const GeomAbs_Shape C)const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::Continuity");
|
||||
}
|
||||
const TopLoc_Location l1 = L1.Predivided(E.Location());
|
||||
const TopLoc_Location l2 = L2.Predivided(E.Location());
|
||||
|
||||
@@ -942,6 +1024,10 @@ void BRep_Builder::SameParameter(const TopoDS_Edge& E,
|
||||
const Standard_Boolean S) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::SameParameter");
|
||||
}
|
||||
TE->SameParameter(S);
|
||||
TE->Modified(Standard_True);
|
||||
}
|
||||
@@ -955,6 +1041,10 @@ void BRep_Builder::SameRange(const TopoDS_Edge& E,
|
||||
const Standard_Boolean S) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::SameRange");
|
||||
}
|
||||
TE->SameRange(S);
|
||||
TE->Modified(Standard_True);
|
||||
}
|
||||
@@ -968,6 +1058,10 @@ void BRep_Builder::Degenerated(const TopoDS_Edge& E,
|
||||
const Standard_Boolean D) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::Degenerated");
|
||||
}
|
||||
TE->Degenerated(D);
|
||||
if (D) {
|
||||
// set a null 3d curve
|
||||
@@ -989,7 +1083,10 @@ void BRep_Builder::Range(const TopoDS_Edge& E,
|
||||
{
|
||||
// set the range to all the representations if Only3d=FALSE
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::Range");
|
||||
}
|
||||
BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
|
||||
BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
|
||||
Handle(BRep_GCurve) GC;
|
||||
@@ -1032,6 +1129,10 @@ void BRep_Builder::Range(const TopoDS_Edge& E,
|
||||
const Standard_Real Last) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::Range");
|
||||
}
|
||||
const TopLoc_Location l = L.Predivided(E.Location());
|
||||
|
||||
BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
|
||||
@@ -1074,9 +1175,12 @@ void BRep_Builder::Transfert(const TopoDS_Edge& Ein,
|
||||
const TopoDS_Edge& Eout) const
|
||||
{
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &Ein.TShape());
|
||||
|
||||
if(TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::Transfert");
|
||||
}
|
||||
const Standard_Real tol = TE->Tolerance();
|
||||
|
||||
|
||||
BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves();
|
||||
BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr);
|
||||
|
||||
@@ -1123,7 +1227,10 @@ void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
|
||||
|
||||
if(TV->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
|
||||
}
|
||||
TV->Pnt(P.Transformed(V.Location().Inverted().Transformation()));
|
||||
TV->UpdateTolerance(Tol);
|
||||
TV->Modified(Standard_True);
|
||||
@@ -1147,6 +1254,11 @@ void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V,
|
||||
const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
|
||||
if(TV->Locked() || TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
|
||||
}
|
||||
|
||||
TopLoc_Location L = E.Location().Predivided(V.Location());
|
||||
|
||||
// Search the vertex in the edge
|
||||
@@ -1228,6 +1340,10 @@ void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V,
|
||||
const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
|
||||
const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &E.TShape());
|
||||
|
||||
if(TV->Locked() || TE->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
|
||||
}
|
||||
|
||||
// Search the vertex in the edge
|
||||
TopAbs_Orientation ori = TopAbs_INTERNAL;
|
||||
@@ -1295,6 +1411,11 @@ void BRep_Builder::UpdateVertex(const TopoDS_Vertex& Ve,
|
||||
{
|
||||
const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &Ve.TShape());
|
||||
|
||||
if(TV->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
|
||||
}
|
||||
|
||||
TopLoc_Location L;
|
||||
const Handle(Geom_Surface)& S = BRep_Tool::Surface(F,L);
|
||||
L = L.Predivided(Ve.Location());
|
||||
@@ -1314,6 +1435,12 @@ void BRep_Builder::UpdateVertex(const TopoDS_Vertex& V,
|
||||
const Standard_Real Tol) const
|
||||
{
|
||||
const Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
|
||||
|
||||
if(TV->Locked())
|
||||
{
|
||||
TopoDS_LockedShape::Raise("BRep_Builder::UpdateVertex");
|
||||
}
|
||||
|
||||
TV->UpdateTolerance(Tol);
|
||||
TV->Modified(Standard_True);
|
||||
}
|
||||
|
Reference in New Issue
Block a user