1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-19 13:40:49 +03:00

0026458: BRepBuilderAPI_Copy does not copy mesh structure

* 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
This commit is contained in:
azv
2015-07-21 09:51:19 +03:00
committed by ssv
parent 8acdc1a772
commit b055c88f4b
11 changed files with 140 additions and 18 deletions

View File

@@ -37,7 +37,7 @@ is
returns Copy from BRepBuilderAPI; 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. ---Purpose: Constructs a copy framework and copies the shape S.
-- Use the function Shape to access the result. -- Use the function Shape to access the result.
-- If copyGeom is False, only topological objects will be copied, while -- If copyGeom is False, only topological objects will be copied, while
@@ -47,7 +47,7 @@ is
returns Copy from BRepBuilderAPI; 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. ---Purpose: Copies the shape S.
-- Use the function Shape to access the result. -- Use the function Shape to access the result.
-- If copyGeom is False, only topological objects will be copied, while -- If copyGeom is False, only topological objects will be copied, while

View File

@@ -23,13 +23,16 @@
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <TopoDS_Vertex.hxx> #include <TopoDS_Vertex.hxx>
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <Poly_Triangulation.hxx>
//! Tool class implementing necessary functionality for copying geometry //! Tool class implementing necessary functionality for copying geometry
class BRepBuilderAPI_Copy_Modification : public BRepTools_Modification class BRepBuilderAPI_Copy_Modification : public BRepTools_Modification
{ {
public: public:
BRepBuilderAPI_Copy_Modification (const Standard_Boolean copyGeom) BRepBuilderAPI_Copy_Modification (const Standard_Boolean copyGeom,
: myCopyGeom(copyGeom) const Standard_Boolean copyMesh = Standard_False)
: myCopyGeom(copyGeom),
myCopyMesh(copyMesh)
{ {
} }
@@ -49,6 +52,22 @@ public:
return Standard_True; 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; //! Returns true to indicate the need to copy edge;
//! copies curves if requested //! copies curves if requested
Standard_Boolean NewCurve (const TopoDS_Edge& E, Handle(Geom_Curve)& C, Standard_Boolean NewCurve (const TopoDS_Edge& E, Handle(Geom_Curve)& C,
@@ -117,6 +136,7 @@ public:
private: private:
Standard_Boolean myCopyGeom; Standard_Boolean myCopyGeom;
Standard_Boolean myCopyMesh;
}; };
DEFINE_STANDARD_HANDLE(BRepBuilderAPI_Copy_Modification, BRepTools_Modification) DEFINE_STANDARD_HANDLE(BRepBuilderAPI_Copy_Modification, BRepTools_Modification)
@@ -140,9 +160,9 @@ BRepBuilderAPI_Copy::BRepBuilderAPI_Copy ()
//purpose : //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); DoModif(S);
} }
@@ -152,9 +172,9 @@ BRepBuilderAPI_Copy::BRepBuilderAPI_Copy(const TopoDS_Shape& S, const Standard_B
//purpose : //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 NotDone(); // on force la copie si on vient deja d`en faire une
DoModif(S); DoModif(S);
} }

View 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) static Standard_Integer tcopy(Draw_Interpretor& di,Standard_Integer n,const char** a)
{ {
Standard_Boolean copyGeom = Standard_True; Standard_Boolean copyGeom = Standard_True;
Standard_Boolean copyMesh = Standard_False;
Standard_Integer iFirst = 1; // index of first shape argument 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; for (Standard_Integer i = 1; i <= 2; i++)
iFirst = 2; {
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) { if (n < 3 || (n - iFirst) % 2) {
cout << "Use: " << a[0] << " [-n(ogeom)] shape1 copy1 [shape2 copy2 [...]]" << 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 -n forbids copying of geometry (it will be shared)" << endl;
cout << "Option -m forces copying of mesh (disabled by default)" << endl;
return 1; return 1;
} }
BRepBuilderAPI_Copy cop; BRepBuilderAPI_Copy cop;
Standard_Integer nbPairs = (n - iFirst) / 2; Standard_Integer nbPairs = (n - iFirst) / 2;
for (Standard_Integer i=0; i < nbPairs; i++) { 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()); DBRep::Set(a[i+iFirst+1],cop.Shape());
di << a[i+iFirst+1] << " "; di << a[i+iFirst+1] << " ";
} }
@@ -869,7 +884,7 @@ void BRepTest::BasicCommands(Draw_Interpretor& theCommands)
transform,g); transform,g);
theCommands.Add("tcopy", theCommands.Add("tcopy",
"tcopy [-n(ogeom)] name1 result1 [name2 result2 ...]", "tcopy [-n(ogeom)] [-m(esh)] name1 result1 [name2 result2 ...]",
__FILE__, __FILE__,
tcopy,g); tcopy,g);

View File

@@ -70,7 +70,8 @@ uses
TColStd, TColStd,
TCollection, TCollection,
MMgt, MMgt,
Message Message,
Poly
is is

View File

@@ -31,7 +31,9 @@ uses Face from TopoDS,
Surface from Geom, Surface from Geom,
Curve from Geom, Curve from Geom,
Curve from Geom2d, Curve from Geom2d,
Pnt from gp Pnt from gp,
Triangulation from Poly
is is
@@ -61,6 +63,16 @@ is
is deferred; 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; NewCurve(me: mutable; E : Edge from TopoDS;
C : out Curve from Geom; C : out Curve from Geom;
L : out Location from TopLoc; L : out Location from TopLoc;

View File

@@ -16,4 +16,7 @@
#include <BRepTools_Modification.ixx> #include <BRepTools_Modification.ixx>
Standard_Boolean BRepTools_Modification::NewTriangulation(const TopoDS_Face&, Handle(Poly_Triangulation)&)
{
return Standard_False;
}

View File

@@ -283,6 +283,20 @@ Standard_Boolean BRepTools_Modifier::Rebuild
B.NaturalRestriction(TopoDS::Face(result), B.NaturalRestriction(TopoDS::Face(result),
BRep_Tool::NaturalRestriction(TopoDS::Face(S))); 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; break;

View File

@@ -47,6 +47,39 @@ Poly_Mesh::Poly_Mesh (const Handle(Poly_Triangulation)& theTriangulation)
} }
} }
//=======================================================================
//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 //function : AddElement
//purpose : //purpose :

View File

@@ -36,6 +36,9 @@ public:
//! @param theTriangulation source triangulation. //! @param theTriangulation source triangulation.
Standard_EXPORT Poly_Mesh (const Handle(Poly_Triangulation)& theTriangulation); 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. //! Adds element to the mesh.
//! @param theN1 index of the first node. //! @param theN1 index of the first node.
//! @param theN2 index of the second node. //! @param theN2 index of the second node.

View File

@@ -99,6 +99,23 @@ Poly_Triangulation::Poly_Triangulation (const TColgp_Array1OfPnt& theNodes,
} }
} }
//=======================================================================
//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 //function : Poly_Triangulation
//purpose : //purpose :

View File

@@ -35,6 +35,7 @@ class TColgp_Array1OfPnt;
class Poly_Array1OfTriangle; class Poly_Array1OfTriangle;
class TColgp_Array1OfPnt2d; class TColgp_Array1OfPnt2d;
class TShort_Array1OfShortReal; class TShort_Array1OfShortReal;
class Handle_Poly_Triangulation;
//! Provides a triangulation for a surface, a set of surfaces, or more generally a shape. //! 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. //! A triangulation consists of an approximate representation of the actual shape, using a collection of points and triangles.
@@ -75,6 +76,9 @@ public:
const TColgp_Array1OfPnt2d& theUVNodes, const TColgp_Array1OfPnt2d& theUVNodes,
const Poly_Array1OfTriangle& theTriangles); const Poly_Array1OfTriangle& theTriangles);
//! Creates full copy of current triangulation
Standard_EXPORT virtual Handle(Poly_Triangulation) Copy() const;
//! Copy constructor for triangulation. //! Copy constructor for triangulation.
Standard_EXPORT Poly_Triangulation (const Handle(Poly_Triangulation)& theTriangulation); Standard_EXPORT Poly_Triangulation (const Handle(Poly_Triangulation)& theTriangulation);