0024876: Add protection of shapes against modification of geometry
[occt.git] / src / BRep / BRep_Builder.cxx
index 26997ea..c556d6a 100644 (file)
@@ -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);
 }