* 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.
#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)
{
}
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,
private:
Standard_Boolean myCopyGeom;
+ Standard_Boolean myCopyMesh;
};
DEFINE_STANDARD_HANDLE(BRepBuilderAPI_Copy_Modification, BRepTools_Modification)
//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);
}
//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);
}
//! 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);
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] << " ";
}
transform,g);
theCommands.Add("tcopy",
- "tcopy [-n(ogeom)] name1 result1 [name2 result2 ...]",
+ "tcopy [-n(ogeom)] [-m(esh)] name1 result1 [name2 result2 ...]",
__FILE__,
tcopy,g);
#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;
+}
class TopoDS_Vertex;
class gp_Pnt;
class Geom2d_Curve;
+class Poly_Triangulation;
class BRepTools_Modification;
//! 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,
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;
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 :
//! 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;