* The possibility to copy mesh is implemented. It may be enabled by copyMesh key, by default it is disabled.
* Poly_Triangulation::Copy() method is added
* Poly_Mesh::Copy() method is added
Conflicts:
src/Poly/Poly_Triangulation.cxx
src/Poly/Poly_Triangulation.hxx
returns Copy from BRepBuilderAPI;
- Create(S: Shape from TopoDS; copyGeom: Boolean = Standard_True)
+ Create(S: Shape from TopoDS; copyGeom: Boolean = Standard_True; copyMesh: Boolean = Standard_False)
---Purpose: Constructs a copy framework and copies the shape S.
-- Use the function Shape to access the result.
-- If copyGeom is False, only topological objects will be copied, while
returns Copy from BRepBuilderAPI;
- Perform(me: in out; S: Shape from TopoDS; copyGeom: Boolean = Standard_True)
+ Perform(me: in out; S: Shape from TopoDS; copyGeom: Boolean = Standard_True; copyMesh: Boolean = Standard_False)
---Purpose: Copies the shape S.
-- Use the function Shape to access the result.
-- If copyGeom is False, only topological objects will be copied, while
#include <BRep_Tool.hxx>
#include <TopoDS_Vertex.hxx>
#include <gp_Pnt.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)
+ {
+ TopLoc_Location L;
+ T = BRep_Tool::Triangulation(F, L);
+
+ if (!T.IsNull() && myCopyMesh)
+ {
+ T = T->Copy();
+ return Standard_True;
+ }
+
+ return Standard_False;
+ }
+
//! 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);
}
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);
TColStd,
TCollection,
MMgt,
- Message
+ Message,
+ Poly
is
Surface from Geom,
Curve from Geom,
Curve from Geom2d,
- Pnt from gp
+ Pnt from gp,
+
+ Triangulation from Poly
is
returns Boolean from Standard
is deferred;
+
+ NewTriangulation(me: mutable; F : Face from TopoDS;
+ T : out Triangulation from Poly)
+ ---Purpose: 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
+ returns Boolean from Standard
+ is virtual;
+
+
NewCurve(me: mutable; E : Edge from TopoDS;
C : out Curve from Geom;
#include <BRepTools_Modification.ixx>
-
+Standard_Boolean BRepTools_Modification::NewTriangulation(const TopoDS_Face&, Handle(Poly_Triangulation)&)
+{
+ return Standard_False;
+}
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;
}
}
+//=======================================================================
+//function : Copy
+//purpose :
+//=======================================================================
+
+Handle(Poly_Triangulation) Poly_Mesh::Copy() const
+{
+ const Standard_Boolean hasUV = HasUVNodes();
+ Handle(Poly_Mesh) aCopy = new Poly_Mesh(hasUV);
+ // Copy nodes
+ Standard_Integer aNbNodes = NbNodes();
+ for ( Standard_Integer i = 1; i <= aNbNodes; ++i )
+ {
+ aCopy->AddNode(Node(i));
+ if ( hasUV )
+ aCopy->ChangeUVNode(i) = UVNode(i);
+ }
+ // Copy triangles
+ Standard_Integer aNbTriangles = NbTriangles();
+ const Standard_Boolean hasNormals = HasNormals();
+ for ( Standard_Integer i = 1; i <= aNbTriangles; ++i )
+ {
+ aCopy->AddTriangle(Triangle(i));
+ // Pass normal vector (if any)
+ if ( hasNormals )
+ aCopy->SetNormal(i, Normal(i));
+ }
+ // Copy quads
+ aCopy->myNbQuads = myNbQuads;
+ aCopy->myElements = myElements;
+ return aCopy;
+}
+
//=======================================================================
//function : AddElement
//purpose :
//! @param theTriangulation source triangulation.
Standard_EXPORT Poly_Mesh (const Handle(Poly_Triangulation)& theTriangulation);
+ //! Creates full copy of current mesh
+ Standard_EXPORT virtual Handle(Poly_Triangulation) Copy() const;
+
//! Adds element to the mesh.
//! @param theN1 index of the first node.
//! @param theN2 index of the second node.
}
}
+//=======================================================================
+//function : Copy
+//purpose :
+//=======================================================================
+
+Handle(Poly_Triangulation) Poly_Triangulation::Copy() const
+{
+ Handle(Poly_Triangulation) aCopy = new Poly_Triangulation(NbNodes(), NbTriangles(), HasUVNodes());
+ aCopy->myNodes = myNodes;
+ aCopy->myTriangles = myTriangles;
+ aCopy->myUVNodes = myUVNodes;
+ aCopy->myDeflection = myDeflection;
+ aCopy->myNormals = myNormals;
+ return aCopy;
+}
+
+//=======================================================================
//=======================================================================
//function : Poly_Triangulation
//purpose :
class Poly_Array1OfTriangle;
class TColgp_Array1OfPnt2d;
class TShort_Array1OfShortReal;
+class Handle_Poly_Triangulation;
//! Provides a triangulation for a surface, a set of surfaces, or more generally a shape.
//! A triangulation consists of an approximate representation of the actual shape, using a collection of points and triangles.
const TColgp_Array1OfPnt2d& theUVNodes,
const Poly_Array1OfTriangle& theTriangles);
+ //! Creates full copy of current triangulation
+ Standard_EXPORT virtual Handle(Poly_Triangulation) Copy() const;
+
//! Copy constructor for triangulation.
Standard_EXPORT Poly_Triangulation (const Handle(Poly_Triangulation)& theTriangulation);