diff --git a/src/BRepBuilderAPI/BRepBuilderAPI_Copy.cxx b/src/BRepBuilderAPI/BRepBuilderAPI_Copy.cxx index 7d63f85907..b84d53ca2c 100644 --- a/src/BRepBuilderAPI/BRepBuilderAPI_Copy.cxx +++ b/src/BRepBuilderAPI/BRepBuilderAPI_Copy.cxx @@ -24,13 +24,16 @@ #include #include #include +#include //! 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); } diff --git a/src/BRepBuilderAPI/BRepBuilderAPI_Copy.hxx b/src/BRepBuilderAPI/BRepBuilderAPI_Copy.hxx index e966a0e8ec..9c5ada6261 100644 --- a/src/BRepBuilderAPI/BRepBuilderAPI_Copy.hxx +++ b/src/BRepBuilderAPI/BRepBuilderAPI_Copy.hxx @@ -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); diff --git a/src/BRepTest/BRepTest_BasicCommands.cxx b/src/BRepTest/BRepTest_BasicCommands.cxx index 420a190554..6feb10d035 100644 --- a/src/BRepTest/BRepTest_BasicCommands.cxx +++ b/src/BRepTest/BRepTest_BasicCommands.cxx @@ -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); diff --git a/src/BRepTools/BRepTools_Modification.cxx b/src/BRepTools/BRepTools_Modification.cxx index 07226e1dd6..50e4b71330 100644 --- a/src/BRepTools/BRepTools_Modification.cxx +++ b/src/BRepTools/BRepTools_Modification.cxx @@ -25,3 +25,9 @@ #include #include #include +#include + +Standard_Boolean BRepTools_Modification::NewTriangulation(const TopoDS_Face&, Handle(Poly_Triangulation)&) +{ + return Standard_False; +} diff --git a/src/BRepTools/BRepTools_Modification.hxx b/src/BRepTools/BRepTools_Modification.hxx index a1006f54fc..be93ba765c 100644 --- a/src/BRepTools/BRepTools_Modification.hxx +++ b/src/BRepTools/BRepTools_Modification.hxx @@ -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, diff --git a/src/BRepTools/BRepTools_Modifier.cxx b/src/BRepTools/BRepTools_Modifier.cxx index 0dcad88ea9..4dc0ed56d5 100644 --- a/src/BRepTools/BRepTools_Modifier.cxx +++ b/src/BRepTools/BRepTools_Modifier.cxx @@ -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; diff --git a/src/Poly/Poly_Triangulation.cxx b/src/Poly/Poly_Triangulation.cxx index 05649312fb..f86ec96ecf 100644 --- a/src/Poly/Poly_Triangulation.cxx +++ b/src/Poly/Poly_Triangulation.cxx @@ -77,6 +77,25 @@ Poly_Triangulation::Poly_Triangulation(const TColgp_Array1OfPnt& Nodes, myUVNodes->ChangeArray1() = UVNodes; } +//======================================================================= +//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 : diff --git a/src/Poly/Poly_Triangulation.hxx b/src/Poly/Poly_Triangulation.hxx index f7522682c5..cb241bc5e3 100644 --- a/src/Poly/Poly_Triangulation.hxx +++ b/src/Poly/Poly_Triangulation.hxx @@ -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;