0026458: BRepBuilderAPI_Copy does not copy mesh structure
authorazv <azv@opencascade.com>
Mon, 20 Jul 2015 11:23:56 +0000 (14:23 +0300)
committerbugmaster <bugmaster@opencascade.com>
Wed, 29 Jul 2015 12:15:30 +0000 (15:15 +0300)
* The possibility to copy mesh is implemented. It may be enabled by copyMesh flag, by default it is disabled.
* Poly_Triangulation::Copy() method is added.
* The mesh is copied if and only if copyMesh flag is true.

src/BRepBuilderAPI/BRepBuilderAPI_Copy.cxx
src/BRepBuilderAPI/BRepBuilderAPI_Copy.hxx
src/BRepTest/BRepTest_BasicCommands.cxx
src/BRepTools/BRepTools_Modification.cxx
src/BRepTools/BRepTools_Modification.hxx
src/BRepTools/BRepTools_Modifier.cxx
src/Poly/Poly_Triangulation.cxx
src/Poly/Poly_Triangulation.hxx

index 7d63f85..b84d53c 100644 (file)
 #include <gp_Pnt.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Vertex.hxx>
+#include <Poly_Triangulation.hxx>
 
 //! Tool class implementing necessary functionality for copying geometry
 class BRepBuilderAPI_Copy_Modification : public BRepTools_Modification 
 {
 public:
-  BRepBuilderAPI_Copy_Modification (const Standard_Boolean copyGeom)
-    : myCopyGeom(copyGeom)
+  BRepBuilderAPI_Copy_Modification (const Standard_Boolean copyGeom,
+                                    const Standard_Boolean copyMesh = Standard_False)
+    : myCopyGeom(copyGeom),
+      myCopyMesh(copyMesh)
   {
   }
 
@@ -50,6 +53,23 @@ public:
     return Standard_True;
   }
 
+  //! Returns true to indicate the need to copy triangulation;
+  //! copies it if required
+  Standard_Boolean NewTriangulation(const TopoDS_Face& F, Handle(Poly_Triangulation)& T)
+  {
+    if (!myCopyMesh)
+      return Standard_False;
+
+    TopLoc_Location L;
+    T = BRep_Tool::Triangulation(F, L);
+
+    if (T.IsNull())
+      return Standard_False;
+
+    T = T->Copy();
+    return Standard_True;
+  }
+
   //! Returns true to indicate the need to copy edge;
   //! copies curves if requested
   Standard_Boolean NewCurve (const TopoDS_Edge& E, Handle(Geom_Curve)& C,
@@ -118,6 +138,7 @@ public:
 
 private: 
   Standard_Boolean myCopyGeom;
+  Standard_Boolean myCopyMesh;
 };
 
 DEFINE_STANDARD_HANDLE(BRepBuilderAPI_Copy_Modification, BRepTools_Modification)
@@ -139,9 +160,9 @@ BRepBuilderAPI_Copy::BRepBuilderAPI_Copy ()
 //purpose  : 
 //=======================================================================
 
-BRepBuilderAPI_Copy::BRepBuilderAPI_Copy(const TopoDS_Shape& S, const Standard_Boolean copyGeom)
+BRepBuilderAPI_Copy::BRepBuilderAPI_Copy(const TopoDS_Shape& S, const Standard_Boolean copyGeom, const Standard_Boolean copyMesh)
 {
-  myModification = new BRepBuilderAPI_Copy_Modification(copyGeom);
+  myModification = new BRepBuilderAPI_Copy_Modification(copyGeom, copyMesh);
   DoModif(S);
 }
 
@@ -151,9 +172,9 @@ BRepBuilderAPI_Copy::BRepBuilderAPI_Copy(const TopoDS_Shape& S, const Standard_B
 //purpose  : 
 //=======================================================================
 
-void BRepBuilderAPI_Copy::Perform(const TopoDS_Shape& S, const Standard_Boolean copyGeom)
+void BRepBuilderAPI_Copy::Perform(const TopoDS_Shape& S, const Standard_Boolean copyGeom, const Standard_Boolean copyMesh)
 {
-  myModification = new BRepBuilderAPI_Copy_Modification(copyGeom);
+  myModification = new BRepBuilderAPI_Copy_Modification(copyGeom, copyMesh);
   NotDone(); // on force la copie si on vient deja d`en faire une
   DoModif(S);
 }
index e966a0e..9c5ada6 100644 (file)
@@ -48,13 +48,13 @@ public:
   //! geometry will be shared with original shape.
   //! Note: the constructed framework can be reused to copy
   //! other shapes: just specify them with the function Perform.
-  Standard_EXPORT BRepBuilderAPI_Copy(const TopoDS_Shape& S, const Standard_Boolean copyGeom = Standard_True);
+  Standard_EXPORT BRepBuilderAPI_Copy(const TopoDS_Shape& S, const Standard_Boolean copyGeom = Standard_True, const Standard_Boolean copyMesh = Standard_False);
   
   //! Copies the shape S.
   //! Use the function Shape to access the result.
   //! If copyGeom is False, only topological objects will be copied, while
   //! geometry will be shared with original shape.
-  Standard_EXPORT void Perform (const TopoDS_Shape& S, const Standard_Boolean copyGeom = Standard_True);
+  Standard_EXPORT void Perform (const TopoDS_Shape& S, const Standard_Boolean copyGeom = Standard_True, const Standard_Boolean copyMesh = Standard_False);
 
 
 
index 420a190..6feb10d 100644 (file)
@@ -211,24 +211,39 @@ static Standard_Integer deform(Draw_Interpretor& di,Standard_Integer n,const cha
 static Standard_Integer tcopy(Draw_Interpretor& di,Standard_Integer n,const char** a)
 {
   Standard_Boolean copyGeom = Standard_True;
+  Standard_Boolean copyMesh = Standard_False;
   Standard_Integer iFirst = 1; // index of first shape argument
 
-  if (n > 1 && a[1][0] == '-' && a[1][1] == 'n' )
+  if (n > 1)
   {
-    copyGeom = Standard_False;
-    iFirst = 2;
+    for (Standard_Integer i = 1; i <= 2; i++)
+    {
+      if (a[i][0] != '-')
+        break;
+      if (a[i][1] == 'n')
+      {
+        copyGeom = Standard_False;
+        iFirst++;
+      }
+      else if (a[i][1] == 'm')
+      {
+        copyMesh = Standard_True;
+        iFirst++;
+      }
+    }
   }
 
   if (n < 3 || (n - iFirst) % 2) {
-    cout << "Use: " << a[0] << " [-n(ogeom)] shape1 copy1 [shape2 copy2 [...]]" << endl;
-    cout << "Option -n forbids copying of geometry (it will be shared)" << endl; 
+    cout << "Use: " << a[0] << " [-n(ogeom)] [-m(esh)] shape1 copy1 [shape2 copy2 [...]]" << endl;
+    cout << "Option -n forbids copying of geometry (it will be shared)" << endl;
+    cout << "Option -m forces copying of mesh (disabled by default)" << endl;
     return 1;
   }
 
   BRepBuilderAPI_Copy cop;
   Standard_Integer nbPairs = (n - iFirst) / 2;
   for (Standard_Integer i=0; i < nbPairs; i++) {
-    cop.Perform(DBRep::Get(a[i+iFirst]), copyGeom);
+    cop.Perform(DBRep::Get(a[i+iFirst]), copyGeom, copyMesh);
     DBRep::Set(a[i+iFirst+1],cop.Shape());
     di << a[i+iFirst+1] << " ";
   }
@@ -870,7 +885,7 @@ void  BRepTest::BasicCommands(Draw_Interpretor& theCommands)
                  transform,g);
 
   theCommands.Add("tcopy",
-                 "tcopy [-n(ogeom)] name1 result1 [name2 result2 ...]",
+                 "tcopy [-n(ogeom)] [-m(esh)] name1 result1 [name2 result2 ...]",
                  __FILE__,
                  tcopy,g);
 
index 07226e1..50e4b71 100644 (file)
@@ -25,3 +25,9 @@
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Vertex.hxx>
+#include <Poly_Triangulation.hxx>
+
+Standard_Boolean BRepTools_Modification::NewTriangulation(const TopoDS_Face&, Handle(Poly_Triangulation)&)
+{
+  return Standard_False;
+}
index a1006f5..be93ba7 100644 (file)
@@ -32,6 +32,7 @@ class Geom_Curve;
 class TopoDS_Vertex;
 class gp_Pnt;
 class Geom2d_Curve;
+class Poly_Triangulation;
 
 
 class BRepTools_Modification;
@@ -59,7 +60,12 @@ public:
   //! false, and the values of S, L, Tol, RevWires and
   //! RevFace are not significant.
   Standard_EXPORT virtual Standard_Boolean NewSurface (const TopoDS_Face& F, Handle(Geom_Surface)& S, TopLoc_Location& L, Standard_Real& Tol, Standard_Boolean& RevWires, Standard_Boolean& RevFace) = 0;
-  
+
+  //! Returns true if the face has been modified according to changed triangulation.
+  //! If the face has been modified:
+  //! - T is a new triangulation on the face
+  Standard_EXPORT virtual Standard_Boolean NewTriangulation(const TopoDS_Face& F, Handle(Poly_Triangulation)& T);
+
   //! Returns true if the edge, E, has been modified.
   //! If the edge has been modified:
   //! - C is the new geometry associated with the edge,
index 0dcad88..4dc0ed5 100644 (file)
@@ -286,6 +286,20 @@ Standard_Boolean BRepTools_Modifier::Rebuild
        B.NaturalRestriction(TopoDS::Face(result),
                             BRep_Tool::NaturalRestriction(TopoDS::Face(S)));
       }
+
+      // update triangulation on the copied face
+      Handle(Poly_Triangulation) aTriangulation;
+      if (M->NewTriangulation(TopoDS::Face(S), aTriangulation))
+      {
+        if (rebuild) // the copied face already exists => update it
+          B.UpdateFace(TopoDS::Face(result), aTriangulation);
+        else
+        { // create new face with bare triangulation
+          B.MakeFace(TopoDS::Face(result), aTriangulation);
+          result.Location(S.Location());
+        }
+        rebuild = Standard_True;
+      }
     }
     break;
 
index 0564931..f86ec96 100644 (file)
@@ -78,6 +78,25 @@ Poly_Triangulation::Poly_Triangulation(const TColgp_Array1OfPnt&    Nodes,
 }
 
 //=======================================================================
+//function : Copy
+//purpose  : 
+//=======================================================================
+
+Handle(Poly_Triangulation) Poly_Triangulation::Copy()
+{
+  Handle(Poly_Triangulation) aCopy;
+  if (HasUVNodes())
+    aCopy = new Poly_Triangulation(Nodes(), UVNodes(), Triangles());
+  else
+    aCopy = new Poly_Triangulation(Nodes(), Triangles());
+  aCopy->Deflection(myDeflection);
+  if (HasNormals())
+    aCopy->myNormals = new TShort_HArray1OfShortReal(myNormals->Array1());
+
+  return aCopy;
+}
+
+//=======================================================================
 //function : Deflection
 //purpose  : 
 //=======================================================================
index f752268..cb241bc 100644 (file)
@@ -90,6 +90,9 @@ public:
   //! constructed triangulation.
   Standard_EXPORT Poly_Triangulation(const TColgp_Array1OfPnt& Nodes, const TColgp_Array1OfPnt2d& UVNodes, const Poly_Array1OfTriangle& Triangles);
   
+  //! Creates full copy of current triangulation
+  Standard_EXPORT virtual Handle(Poly_Triangulation) Copy();
+  
   //! Returns the deflection of this triangulation.
   Standard_EXPORT Standard_Real Deflection() const;