mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-14 13:30:48 +03:00
Compare commits
1 Commits
V7_8_1
...
CR25936CAF
Author | SHA1 | Date | |
---|---|---|---|
|
7786f8f8cb |
@@ -55,6 +55,7 @@
|
||||
#include <TopoDS.hxx>
|
||||
#include <TopoDS_Shape.hxx>
|
||||
#include <TopoDS_Vertex.hxx>
|
||||
#include <Poly_Mesh.hxx>
|
||||
|
||||
#ifdef MacOS
|
||||
#define strcasecmp(p,q) strcmp(p,q)
|
||||
@@ -1635,3 +1636,182 @@ void BRepTools_ShapeSet::ReadTriangulation(Standard_IStream& IS)
|
||||
myTriangulations.Add(T);
|
||||
}
|
||||
}
|
||||
|
||||
// Writes meshes (Poly_Mesh).
|
||||
void BRepTools_ShapeSet::WriteMeshes(Standard_OStream& OS,
|
||||
const TColStd_IndexedMapOfTransient& Meshes,
|
||||
const Standard_Boolean Compact)
|
||||
{
|
||||
// Progress indicator.
|
||||
const Standard_Integer nbMeshes = Meshes.Extent();
|
||||
//Message_ProgressSentry indicator(GetProgress(), "Meshes", 0, nbMeshes, 1);
|
||||
|
||||
if (Compact)
|
||||
OS << "Meshes " << nbMeshes << "\n";
|
||||
else {
|
||||
OS << " -------\n";
|
||||
OS <<"Dump of " << nbMeshes << " meshes\n";
|
||||
OS << " -------\n";
|
||||
}
|
||||
|
||||
Standard_Integer i = 1;
|
||||
for (; i <= nbMeshes /*&& indicator.More()*/; i++/*, indicator.Next()*/)
|
||||
{
|
||||
const Handle(Poly_Mesh) M = Handle(Poly_Mesh)::DownCast(Meshes(i));
|
||||
const Standard_Integer nbNodes = M->NbNodes();
|
||||
const Standard_Integer nbElements = M->NbElements();
|
||||
const Standard_Boolean hasUVNodes = M->HasUVNodes();
|
||||
|
||||
if (Compact)
|
||||
{
|
||||
OS << nbNodes << " " << nbElements << " ";
|
||||
OS << (hasUVNodes ? "1" : "0") << " ";
|
||||
}
|
||||
else
|
||||
{
|
||||
OS << " "<< i << " : Mesh with " << nbNodes << " Nodes, " << nbElements <<" Triangles and Quadrangles\n";
|
||||
OS << " "<<(hasUVNodes ? "with" : "without") << " UV nodes\n";
|
||||
}
|
||||
|
||||
// write the deflection
|
||||
if (!Compact)
|
||||
OS << " Deflection : ";
|
||||
OS <<M->Deflection() << "\n";
|
||||
|
||||
// write the 3d nodes
|
||||
if (!Compact)
|
||||
OS << "\n3D Nodes :\n";
|
||||
|
||||
Standard_Integer j;
|
||||
for (j = 1; j <= nbNodes; j++)
|
||||
{
|
||||
if (!Compact) OS << setw(10) << j << " : ";
|
||||
if (!Compact) OS << setw(17);
|
||||
OS << M->Node(j).X() << " ";
|
||||
if (!Compact) OS << setw(17);
|
||||
OS << M->Node(j).Y() << " ";
|
||||
if (!Compact) OS << setw(17);
|
||||
OS << M->Node(j).Z();
|
||||
if (!Compact) OS << "\n";
|
||||
else OS << " ";
|
||||
}
|
||||
|
||||
// write 2d nodes
|
||||
if (hasUVNodes)
|
||||
{
|
||||
if (!Compact) OS << "\nUV Nodes :\n";
|
||||
for (j = 1; j <= nbNodes; j++)
|
||||
{
|
||||
if (!Compact) OS << setw(10) << j << " : ";
|
||||
if (!Compact) OS << setw(17);
|
||||
OS << M->UVNode(j).X() << " ";
|
||||
if (!Compact) OS << setw(17);
|
||||
OS << M->UVNode(j).Y();
|
||||
if (!Compact) OS << "\n";
|
||||
else OS << " ";
|
||||
}
|
||||
}
|
||||
|
||||
// write triangles and quadrangles
|
||||
if (!Compact) OS << "\nElements :\n";
|
||||
Standard_Integer n, n1, n2, n3, n4;
|
||||
for (j = 1; j <= nbElements; j++)
|
||||
{
|
||||
if (!Compact) OS << setw(10) << j << " : ";
|
||||
M->Element(j, n1, n2, n3, n4);
|
||||
n = (n4 > 0) ? 4 : 3;
|
||||
if (!Compact) OS << setw(10);
|
||||
OS << n << " ";
|
||||
if (!Compact) OS << setw(10);
|
||||
OS << n1 << " ";
|
||||
if (!Compact) OS << setw(10);
|
||||
OS << n2 << " ";
|
||||
if (!Compact) OS << setw(10);
|
||||
OS << n3;
|
||||
if (n4 > 0)
|
||||
{
|
||||
OS << " ";
|
||||
if (!Compact) OS << setw(10);
|
||||
OS << n4;
|
||||
}
|
||||
if (!Compact) OS << "\n";
|
||||
else OS << " ";
|
||||
}
|
||||
OS << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Reads meshes (Poly_Mesh).
|
||||
void BRepTools_ShapeSet::ReadMeshes(Standard_IStream& IS,
|
||||
TColStd_IndexedMapOfTransient& Meshes)
|
||||
{
|
||||
char buffer[255];
|
||||
Standard_Integer i, j;
|
||||
Standard_Integer n, n1, n2, n3, n4;
|
||||
Standard_Real deflection, x, y, z;
|
||||
Standard_Integer nbMeshes(0), nbNodes(0), nbElements(0);
|
||||
Standard_Boolean hasUV(Standard_False);
|
||||
gp_Pnt p;
|
||||
|
||||
// Read the "Meshes" head-line.
|
||||
IS >> buffer;
|
||||
if (strstr(buffer,"Meshes") == NULL)
|
||||
return;
|
||||
|
||||
// Read number of meshes.
|
||||
IS >> nbMeshes;
|
||||
|
||||
//TODO: Uncomment these lines to activate the progress indicator
|
||||
//(when Poly_Mesh is included into BRep_TFace).
|
||||
//Handle(Message_ProgressIndicator) progress = GetProgress();
|
||||
//Message_ProgressSentry PS(progress, "Meshes", 0, nbMeshes, 1);
|
||||
for (i = 1; i <= nbMeshes /*&& PS.More()*/; i++/*, PS.Next()*/)
|
||||
{
|
||||
IS >> nbNodes >> nbElements >> hasUV;
|
||||
GeomTools::GetReal(IS, deflection);
|
||||
|
||||
// Allocate the mesh.
|
||||
Handle(Poly_Mesh) M = new Poly_Mesh(hasUV);
|
||||
M->Deflection(deflection);
|
||||
|
||||
// Read nodes.
|
||||
for (j = 1; j <= nbNodes; j++)
|
||||
{
|
||||
GeomTools::GetReal(IS, x);
|
||||
GeomTools::GetReal(IS, y);
|
||||
GeomTools::GetReal(IS, z);
|
||||
p.SetCoord(x, y, z);
|
||||
M->AddNode(p);
|
||||
}
|
||||
|
||||
// Reads 2d-nodes.
|
||||
if (hasUV)
|
||||
{
|
||||
for (j = 1; j <= nbNodes; j++)
|
||||
{
|
||||
GeomTools::GetReal(IS, x);
|
||||
GeomTools::GetReal(IS, y);
|
||||
M->ChangeUVNode(j).SetCoord(x,y);
|
||||
}
|
||||
}
|
||||
|
||||
// Reads the triangles and quadrangles.
|
||||
for (j = 1; j <= nbElements; j++)
|
||||
{
|
||||
// Read the element.
|
||||
IS >> n;
|
||||
if (n == 3)
|
||||
IS >> n1 >> n2 >> n3;
|
||||
else if (n == 4)
|
||||
IS >> n1 >> n2 >> n3 >> n4;
|
||||
|
||||
// Set the element to the mesh.
|
||||
if (n == 3)
|
||||
M->AddElement(n1, n2, n3);
|
||||
else if (n == 4)
|
||||
M->AddElement(n1, n2, n3, n4);
|
||||
}
|
||||
|
||||
Meshes.Add(M);
|
||||
}
|
||||
}
|
||||
|
@@ -127,7 +127,16 @@ public:
|
||||
//! on the stream <OS>.
|
||||
Standard_EXPORT void DumpPolygonOnTriangulation (Standard_OStream& OS) const;
|
||||
|
||||
//! Writes meshes (Poly_Mesh).
|
||||
//! TODO: Call this method when BRep_TFace refers to a list of meshes of type Poly_Mesh.
|
||||
Standard_EXPORT static void WriteMeshes(Standard_OStream& OS,
|
||||
const TColStd_IndexedMapOfTransient& Meshes,
|
||||
const Standard_Boolean Compact = Standard_True);
|
||||
|
||||
//! Reads meshes (Poly_Mesh).
|
||||
//! TODO: Call this method when BRep_TFace refers to a list of meshes of type Poly_Mesh.
|
||||
Standard_EXPORT static void ReadMeshes(Standard_IStream& IS,
|
||||
TColStd_IndexedMapOfTransient& Meshes);
|
||||
|
||||
|
||||
protected:
|
||||
|
@@ -41,6 +41,7 @@
|
||||
#include <BinMDataStd_TreeNodeDriver.hxx>
|
||||
#include <BinMDataStd_UAttributeDriver.hxx>
|
||||
#include <BinMDataStd_VariableDriver.hxx>
|
||||
#include <BinMDataStd_MeshDriver.hxx>
|
||||
#include <BinMDF_ADriverTable.hxx>
|
||||
#include <CDM_MessageDriver.hxx>
|
||||
|
||||
@@ -80,6 +81,7 @@ void BinMDataStd::AddDrivers (const Handle(BinMDF_ADriverTable)& theDriverTable,
|
||||
theDriverTable->AddDriver (new BinMDataStd_NamedDataDriver (theMsgDriver) );
|
||||
theDriverTable->AddDriver (new BinMDataStd_AsciiStringDriver (theMsgDriver) );
|
||||
theDriverTable->AddDriver (new BinMDataStd_IntPackedMapDriver (theMsgDriver) );
|
||||
theDriverTable->AddDriver (new BinMDataStd_MeshDriver (theMsgDriver) );
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
169
src/BinMDataStd/BinMDataStd_MeshDriver.cxx
Normal file
169
src/BinMDataStd/BinMDataStd_MeshDriver.cxx
Normal file
@@ -0,0 +1,169 @@
|
||||
// Created on: 2015-12-17
|
||||
// Created by: Vlad Romashko
|
||||
// Copyright (c) 2007-2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
||||
// by the Free Software Foundation, with special exception defined in the file
|
||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
||||
// distribution for complete text of the license and disclaimer of any warranty.
|
||||
//
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include <BinMDataStd_MeshDriver.hxx>
|
||||
#include <BinObjMgt_Persistent.hxx>
|
||||
#include <CDM_MessageDriver.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
#include <TDataStd_Mesh.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_MeshDriver,BinMDF_ADriver)
|
||||
|
||||
//=======================================================================
|
||||
//function : BinMDataStd_MeshDriver
|
||||
//purpose : Constructor
|
||||
//=======================================================================
|
||||
BinMDataStd_MeshDriver::BinMDataStd_MeshDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
|
||||
: BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataStd_Mesh)->Name())
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NewEmpty
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Handle(TDF_Attribute) BinMDataStd_MeshDriver::NewEmpty() const
|
||||
{
|
||||
return new TDataStd_Mesh();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose : persistent -> transient (retrieve)
|
||||
//=======================================================================
|
||||
Standard_Boolean BinMDataStd_MeshDriver::Paste(const BinObjMgt_Persistent& theSource,
|
||||
const Handle(TDF_Attribute)& theTarget,
|
||||
BinObjMgt_RRelocationTable& ) const
|
||||
{
|
||||
Handle(TDataStd_Mesh) mesh = Handle(TDataStd_Mesh)::DownCast(theTarget);
|
||||
|
||||
Standard_Integer i;
|
||||
Standard_Real d, x, y, z;
|
||||
Standard_Integer n, n1, n2, n3, n4;
|
||||
Standard_Integer nbNodes(0), nbElements(0);
|
||||
Standard_Boolean hasUV(Standard_False);
|
||||
gp_Pnt p;
|
||||
|
||||
theSource >> nbNodes;
|
||||
theSource >> nbElements;
|
||||
theSource >> hasUV;
|
||||
theSource >> d; //deflection
|
||||
|
||||
// allocate the mesh
|
||||
Handle(Poly_Mesh) M = new Poly_Mesh(hasUV);
|
||||
|
||||
// deflection
|
||||
M->Deflection(d);
|
||||
|
||||
// read nodes
|
||||
for (i = 1; i <= nbNodes; i++)
|
||||
{
|
||||
theSource >> x;
|
||||
theSource >> y;
|
||||
theSource >> z;
|
||||
p.SetCoord(x, y, z);
|
||||
M->AddNode(p);
|
||||
}
|
||||
|
||||
// read 2d nodes
|
||||
if (hasUV)
|
||||
{
|
||||
for (i = 1; i <= nbNodes; i++)
|
||||
{
|
||||
theSource >> x;
|
||||
theSource >> y;
|
||||
M->ChangeUVNode(i).SetCoord(x,y);
|
||||
}
|
||||
}
|
||||
|
||||
// read triangles and quadrangles
|
||||
for (i = 1; i <= nbElements; i++)
|
||||
{
|
||||
theSource >> n;
|
||||
theSource >> n1;
|
||||
theSource >> n2;
|
||||
theSource >> n3;
|
||||
if (n == 3)
|
||||
M->AddElement(n1, n2, n3);
|
||||
else if (n == 4)
|
||||
{
|
||||
theSource >> n4;
|
||||
M->AddElement(n1, n2, n3, n4);
|
||||
}
|
||||
}
|
||||
|
||||
// set mesh to Ocaf attribute
|
||||
mesh->Set(M);
|
||||
return !M.IsNull();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose : transient -> persistent (store)
|
||||
//=======================================================================
|
||||
void BinMDataStd_MeshDriver::Paste(const Handle(TDF_Attribute)& theSource,
|
||||
BinObjMgt_Persistent& theTarget,
|
||||
BinObjMgt_SRelocationTable& ) const
|
||||
{
|
||||
const Handle(TDataStd_Mesh) meshAttr = Handle(TDataStd_Mesh)::DownCast(theSource);
|
||||
const Handle(Poly_Mesh)& M = meshAttr->Get();
|
||||
if (!M.IsNull())
|
||||
{
|
||||
Standard_Integer nbNodes = M->NbNodes();
|
||||
Standard_Integer nbElements = M->NbElements();
|
||||
|
||||
// write number of elements
|
||||
theTarget << nbNodes;
|
||||
theTarget << nbElements;
|
||||
theTarget << (M->HasUVNodes() ? 1 : 0);
|
||||
// write the deflection
|
||||
theTarget << M->Deflection();
|
||||
|
||||
// write 3d nodes
|
||||
Standard_Integer i;
|
||||
for (i = 1; i <= nbNodes; i++)
|
||||
{
|
||||
theTarget << M->Node(i).X();
|
||||
theTarget << M->Node(i).Y();
|
||||
theTarget << M->Node(i).Z();
|
||||
}
|
||||
|
||||
// write 2d nodes
|
||||
if (M->HasUVNodes())
|
||||
{
|
||||
for (i = 1; i <= nbNodes; i++)
|
||||
{
|
||||
theTarget << M->UVNode(i).X();
|
||||
theTarget << M->UVNode(i).Y();
|
||||
}
|
||||
}
|
||||
|
||||
// write triangles and quadrangles
|
||||
Standard_Integer n, n1, n2, n3, n4;
|
||||
for (i = 1; i <= nbElements; i++)
|
||||
{
|
||||
M->Element(i, n1, n2, n3, n4);
|
||||
n = (n4 > 0) ? 4 : 3;
|
||||
theTarget << n;
|
||||
theTarget << n1;
|
||||
theTarget << n2;
|
||||
theTarget << n3;
|
||||
if (n4 > 0)
|
||||
theTarget << n4;
|
||||
}
|
||||
}
|
||||
}
|
49
src/BinMDataStd/BinMDataStd_MeshDriver.hxx
Normal file
49
src/BinMDataStd/BinMDataStd_MeshDriver.hxx
Normal file
@@ -0,0 +1,49 @@
|
||||
// Created on: 2015-12-17
|
||||
// Created by: Vlad Romashko
|
||||
// Copyright (c) 2007-2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
||||
// by the Free Software Foundation, with special exception defined in the file
|
||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
||||
// distribution for complete text of the license and disclaimer of any warranty.
|
||||
//
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#ifndef _BinMDataStd_MeshDriver_HeaderFile
|
||||
#define _BinMDataStd_MeshDriver_HeaderFile
|
||||
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
|
||||
#include <BinMDF_ADriver.hxx>
|
||||
#include <Standard_Boolean.hxx>
|
||||
#include <BinObjMgt_RRelocationTable.hxx>
|
||||
#include <BinObjMgt_SRelocationTable.hxx>
|
||||
class CDM_MessageDriver;
|
||||
class TDF_Attribute;
|
||||
class BinObjMgt_Persistent;
|
||||
|
||||
class BinMDataStd_MeshDriver;
|
||||
DEFINE_STANDARD_HANDLE(BinMDataStd_MeshDriver, BinMDF_ADriver)
|
||||
|
||||
class BinMDataStd_MeshDriver : public BinMDF_ADriver
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
Standard_EXPORT BinMDataStd_MeshDriver(const Handle(CDM_MessageDriver)& theMessageDriver);
|
||||
|
||||
Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE;
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(BinMDataStd_MeshDriver,BinMDF_ADriver)
|
||||
};
|
||||
|
||||
#endif // _BinMDataStd_MeshDriver_HeaderFile
|
@@ -52,6 +52,7 @@
|
||||
|
||||
// LES ATTRIBUTES
|
||||
#include <TDataStd.hxx>
|
||||
#include <TDataStd_Mesh.hxx>
|
||||
#include <TDataStd_Comment.hxx>
|
||||
#include <TDataStd_Name.hxx>
|
||||
#include <TDataStd_Integer.hxx>
|
||||
@@ -3733,6 +3734,103 @@ static Standard_Integer DDataStd_GetRefArrayValue (Draw_Interpretor& di,
|
||||
return 0;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : DDataStd_SetMesh
|
||||
//purpose : SetMesh (DF, entry, face)
|
||||
//=======================================================================
|
||||
|
||||
static Standard_Integer DDataStd_SetMesh (Draw_Interpretor& di,
|
||||
Standard_Integer nb,
|
||||
const char** arg)
|
||||
{
|
||||
if (nb == 4)
|
||||
{
|
||||
Handle(TDF_Data) DF;
|
||||
if (!DDF::GetDF(arg[1],DF))
|
||||
return 1;
|
||||
|
||||
TDF_Label L;
|
||||
if (!DDF::AddLabel(DF, arg[2], L))
|
||||
return 1;
|
||||
|
||||
// Get face.
|
||||
TopoDS_Shape face = DBRep::Get(arg[3]);
|
||||
if (face.IsNull() ||
|
||||
face.ShapeType() != TopAbs_FACE)
|
||||
{
|
||||
di << "The face is null or not a face.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Get triangulation of the face.
|
||||
TopLoc_Location loc; //TODO: apply the location to the triangulation
|
||||
Handle(Poly_Triangulation) tris = BRep_Tool::Triangulation(TopoDS::Face(face), loc);
|
||||
if (tris.IsNull())
|
||||
{
|
||||
di << "No triangulation in the face.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Convert the triangulation to tmp-triangulation
|
||||
// (temporary solution while Poly_Triangulation is not updated everywhjere in Open CASCADE).
|
||||
//TODO: remove the conversion when Poly_Triangulation is Ok.
|
||||
Handle(Poly_TmpTriangulation) tmpTris = new Poly_TmpTriangulation(tris->Nodes(), tris->Triangles());
|
||||
|
||||
// Make a mesh.
|
||||
Handle(Poly_Mesh) mesh = new Poly_Mesh(tmpTris);
|
||||
|
||||
// Set the attribute.
|
||||
TDataStd_Mesh::Set(L, mesh);
|
||||
return 0;
|
||||
}
|
||||
di << "DDataStd_SetMesh : Error\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : DDataStd_DumpMesh
|
||||
//purpose : DumpMesh (DF, entry)
|
||||
//=======================================================================
|
||||
|
||||
static Standard_Integer DDataStd_DumpMesh (Draw_Interpretor& di,
|
||||
Standard_Integer nb,
|
||||
const char** arg)
|
||||
{
|
||||
if (nb == 3)
|
||||
{
|
||||
Handle(TDF_Data) DF;
|
||||
if (!DDF::GetDF(arg[1],DF))
|
||||
return 1;
|
||||
|
||||
Handle(TDataStd_Mesh) M;
|
||||
if (!DDF::Find(DF,arg[2],TDataStd_Mesh::GetID(),M))
|
||||
{
|
||||
di << "The attribute mesh doesn't exist at the label.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Dump of the mesh.
|
||||
if (M->Get().IsNull())
|
||||
{
|
||||
di << "No mesh in the attribute.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
di << "Deflection " << M->Deflection() <<"\n";
|
||||
di << "Number of nodes " << M->NbNodes() << "\n";
|
||||
di << "Number of triangles " << M->NbTriangles() << "\n";
|
||||
di << "Number of quadrangles " << M->NbQuads() << "\n";
|
||||
if (M->HasUVNodes())
|
||||
di << "It has 2d-nodes\n";
|
||||
if (M->HasNormals())
|
||||
di << "It has normals\n";
|
||||
|
||||
return 0;
|
||||
}
|
||||
di << "DDataStd_DumpMesh : Error\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : BasicCommands
|
||||
//purpose :
|
||||
@@ -3850,6 +3948,12 @@ void DDataStd::BasicCommands (Draw_Interpretor& theCommands)
|
||||
"SetReferenceList (DF, entry, elmt1, elmt2, ... )",
|
||||
__FILE__, DDataStd_SetReferenceList, g);
|
||||
|
||||
theCommands.Add ("SetMesh",
|
||||
"SetMesh (DF, entry, face)",
|
||||
__FILE__, DDataStd_SetMesh, g);
|
||||
|
||||
// Insert before and after (for lists)
|
||||
|
||||
theCommands.Add ("InsertBeforeExtStringList",
|
||||
"InsertBeforeExtStringList (DF, entry, index, value )",
|
||||
__FILE__, DDataStd_InsertBeforeExtStringList, g);
|
||||
@@ -4156,6 +4260,9 @@ void DDataStd::BasicCommands (Draw_Interpretor& theCommands)
|
||||
|
||||
//=========================================================
|
||||
|
||||
theCommands.Add ("DumpMesh",
|
||||
"DumpMesh (DF, entry)",
|
||||
__FILE__, DDataStd_DumpMesh, g);
|
||||
|
||||
//======================================================================
|
||||
//======= for internal use
|
||||
|
436
src/TDataStd/TDataStd_Mesh.cxx
Normal file
436
src/TDataStd/TDataStd_Mesh.cxx
Normal file
@@ -0,0 +1,436 @@
|
||||
// Created on: 2015-12-10
|
||||
// Created by: Vlad Romashko
|
||||
// Copyright (c) 2007-2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
||||
// by the Free Software Foundation, with special exception defined in the file
|
||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
||||
// distribution for complete text of the license and disclaimer of any warranty.
|
||||
//
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include <Standard_GUID.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
#include <TDataStd_Mesh.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
#include <TDF_Label.hxx>
|
||||
#include <TDF_RelocationTable.hxx>
|
||||
|
||||
//=======================================================================
|
||||
//function : GetID
|
||||
//purpose : Returns the ID of the mesh attribute.
|
||||
//=======================================================================
|
||||
const Standard_GUID& TDataStd_Mesh::GetID()
|
||||
{
|
||||
static Standard_GUID TDataStd_MeshID ("D7E3F1CF-38A4-4DCA-94F4-51C31F3FCBA5");
|
||||
return TDataStd_MeshID;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Set
|
||||
//purpose : Finds or creates a mesh attribute.
|
||||
//=======================================================================
|
||||
Handle(TDataStd_Mesh) TDataStd_Mesh::Set(const TDF_Label& label)
|
||||
{
|
||||
Handle(TDataStd_Mesh) A;
|
||||
if (!label.FindAttribute (TDataStd_Mesh::GetID(), A))
|
||||
{
|
||||
A = new TDataStd_Mesh;
|
||||
label.AddAttribute(A);
|
||||
}
|
||||
return A;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Set
|
||||
//purpose : Finds or creates a mesh attribute.
|
||||
// Initializes the attribute by a mesh (Poly_Mesh) object.
|
||||
// If the mesh consists of only triangles,
|
||||
// you may put Poly_Triangulation object as a 2nd parameter of this method.
|
||||
//=======================================================================
|
||||
Handle(TDataStd_Mesh) TDataStd_Mesh::Set(const TDF_Label& label, const Handle(Poly_Mesh)& mesh)
|
||||
{
|
||||
Handle(TDataStd_Mesh) M = TDataStd_Mesh::Set(label);
|
||||
M->Set(mesh);
|
||||
return M;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : TDataStd_Mesh
|
||||
//purpose : A constructor.
|
||||
// Don't use it directly,
|
||||
// use please the static method Set(),
|
||||
// which returns the attribute attached to a label.
|
||||
//=======================================================================
|
||||
TDataStd_Mesh::TDataStd_Mesh()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : TDataStd_Mesh
|
||||
//purpose : Sets the mesh.
|
||||
// If the mesh consists of only triangles,
|
||||
// you may put Poly_Triangulation object.
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::Set(const Handle(Poly_Mesh)& mesh)
|
||||
{
|
||||
Backup();
|
||||
myMesh = mesh;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : TDataStd_Mesh
|
||||
//purpose : Returns the underlying mesh.
|
||||
//=======================================================================
|
||||
const Handle(Poly_Mesh)& TDataStd_Mesh::Get() const
|
||||
{
|
||||
return myMesh;
|
||||
}
|
||||
|
||||
// Poly_Mesh methods
|
||||
|
||||
// The methods are "covered" by this attribute to prevent direct modification of the mesh.
|
||||
// There is no performance problem to call Poly_Mesh method through this attribute.
|
||||
// The most of the methods are considered as "inline" by the compiler in release mode.
|
||||
|
||||
//=======================================================================
|
||||
//function : Deflection
|
||||
//purpose : Returns the deflection of this triangulation.
|
||||
//=======================================================================
|
||||
Standard_Real TDataStd_Mesh::Deflection() const
|
||||
{
|
||||
return myMesh->Deflection();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Deflection
|
||||
//purpose : Sets the deflection of this triangulation to theDeflection.
|
||||
// See more on deflection in Polygon2D
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::Deflection (const Standard_Real theDeflection)
|
||||
{
|
||||
Backup();
|
||||
myMesh->Deflection(theDeflection);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : RemoveUVNodes
|
||||
//purpose : Deallocates the UV nodes.
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::RemoveUVNodes()
|
||||
{
|
||||
Backup();
|
||||
myMesh->RemoveUVNodes();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NbNodes
|
||||
//purpose : @return the number of nodes for this triangulation.
|
||||
//=======================================================================
|
||||
Standard_Integer TDataStd_Mesh::NbNodes() const
|
||||
{
|
||||
return myMesh->NbNodes();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NbTriangles
|
||||
//purpose : @return the number of triangles for this triangulation.
|
||||
//=======================================================================
|
||||
Standard_Integer TDataStd_Mesh::NbTriangles() const
|
||||
{
|
||||
return myMesh->NbTriangles();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : HasUVNodes
|
||||
//purpose : @return Standard_True if 2D nodes are associated with 3D nodes for this triangulation.
|
||||
//=======================================================================
|
||||
Standard_Boolean TDataStd_Mesh::HasUVNodes() const
|
||||
{
|
||||
return myMesh->HasUVNodes();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : AddNode
|
||||
//purpose : Adds Node to the triangulation. If triangulation has UVNodes or Normals
|
||||
// they will be expanded and set to zero values to match the new number of nodes.
|
||||
// @return index of the added Node.
|
||||
//=======================================================================
|
||||
Standard_Integer TDataStd_Mesh::AddNode (const gp_Pnt& theNode)
|
||||
{
|
||||
Backup();
|
||||
return myMesh->AddNode(theNode);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Node
|
||||
//purpose : @return node at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
|
||||
//=======================================================================
|
||||
const gp_Pnt& TDataStd_Mesh::Node (const Standard_Integer theIndex) const
|
||||
{
|
||||
return myMesh->Node(theIndex);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetNode
|
||||
//purpose : The method differs from Poly_Mesh
|
||||
// Sets a node at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::SetNode (const Standard_Integer theIndex, const gp_Pnt& theNode)
|
||||
{
|
||||
Backup();
|
||||
myMesh->ChangeNode(theIndex) = theNode;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : UVNode
|
||||
//purpose : @return UVNode at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
|
||||
//=======================================================================
|
||||
const gp_Pnt2d& TDataStd_Mesh::UVNode (const Standard_Integer theIndex) const
|
||||
{
|
||||
return myMesh->UVNode(theIndex);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetUVNode
|
||||
//purpose : The method differs from Poly_Mesh
|
||||
// Sets a UVNode at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::SetUVNode (const Standard_Integer theIndex, const gp_Pnt2d& theUVNode)
|
||||
{
|
||||
Backup();
|
||||
myMesh->ChangeUVNode(theIndex) = theUVNode;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : AddTriangle
|
||||
//purpose : Adds triangle to the triangulation.
|
||||
// @return index of the added triangle.
|
||||
//=======================================================================
|
||||
Standard_Integer TDataStd_Mesh::AddTriangle (const Poly_Triangle& theTriangle)
|
||||
{
|
||||
Backup();
|
||||
return myMesh->AddTriangle(theTriangle);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Triangle
|
||||
//purpose : @return triangle at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
|
||||
//=======================================================================
|
||||
const Poly_Triangle& TDataStd_Mesh::Triangle (const Standard_Integer theIndex) const
|
||||
{
|
||||
return myMesh->Triangle(theIndex);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetTriangle
|
||||
//purpose : The method differs from Poly_Mesh
|
||||
// Sets a triangle at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::SetTriangle (const Standard_Integer theIndex, const Poly_Triangle& theTriangle)
|
||||
{
|
||||
Backup();
|
||||
myMesh->ChangeTriangle(theIndex) = theTriangle;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetNormals
|
||||
//purpose : Sets the table of node normals.
|
||||
// Raises exception if length of theNormals = 3 * NbNodes
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::SetNormals (const Handle(TShort_HArray1OfShortReal)& theNormals)
|
||||
{
|
||||
Backup();
|
||||
myMesh->SetNormals(theNormals);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetNormal
|
||||
//purpose : Changes normal at the given index.
|
||||
// Raises Standard_OutOfRange exception.
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::SetNormal (const Standard_Integer theIndex,
|
||||
const gp_Dir& theNormal)
|
||||
{
|
||||
Backup();
|
||||
myMesh->SetNormal(theIndex, theNormal);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : HasNormals
|
||||
//purpose : Returns Standard_True if nodal normals are defined.
|
||||
//=======================================================================
|
||||
Standard_Boolean TDataStd_Mesh::HasNormals() const
|
||||
{
|
||||
return myMesh->HasNormals();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Normal
|
||||
//purpose : @return normal at the given index.
|
||||
// Raises Standard_OutOfRange exception.
|
||||
//=======================================================================
|
||||
const gp_Dir TDataStd_Mesh::Normal (const Standard_Integer theIndex) const
|
||||
{
|
||||
return myMesh->Normal(theIndex);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : AddElement
|
||||
//purpose : Adds element to the mesh.
|
||||
// @param theN1 index of the first node.
|
||||
// @param theN2 index of the second node.
|
||||
// @param theN3 index of the third node.
|
||||
// @return index of the added element.
|
||||
//=======================================================================
|
||||
Standard_Integer TDataStd_Mesh::AddElement (const Standard_Integer theN1,
|
||||
const Standard_Integer theN2,
|
||||
const Standard_Integer theN3)
|
||||
{
|
||||
Backup();
|
||||
return myMesh->AddElement(theN1, theN2, theN3);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : AddElement
|
||||
//purpose : Adds element to the mesh.
|
||||
// @param theN1 index of the first node.
|
||||
// @param theN2 index of the second node.
|
||||
// @param theN3 index of the third node.
|
||||
// @param theN4 index of the fourth node.
|
||||
// @return index of the added element.
|
||||
//=======================================================================
|
||||
Standard_Integer TDataStd_Mesh::AddElement (const Standard_Integer theN1,
|
||||
const Standard_Integer theN2,
|
||||
const Standard_Integer theN3,
|
||||
const Standard_Integer theN4)
|
||||
{
|
||||
Backup();
|
||||
return myMesh->AddElement(theN1, theN2, theN3, theN4);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NbElements
|
||||
//purpose : @return the number of elements for this mesh.
|
||||
//=======================================================================
|
||||
Standard_Integer TDataStd_Mesh::NbElements() const
|
||||
{
|
||||
return myMesh->NbElements();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NbQuads
|
||||
//purpose : @return the number of quads for this mesh.
|
||||
//=======================================================================
|
||||
Standard_Integer TDataStd_Mesh::NbQuads() const
|
||||
{
|
||||
return myMesh->NbQuads();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Element
|
||||
//purpose : @return element at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
|
||||
//=======================================================================
|
||||
const Poly_Element& TDataStd_Mesh::Element (const Standard_Integer theIndex) const
|
||||
{
|
||||
return myMesh->Element(theIndex);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Element
|
||||
//purpose : @return nodes of the element at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::Element (const Standard_Integer theIndex,
|
||||
Standard_Integer& theN1,
|
||||
Standard_Integer& theN2,
|
||||
Standard_Integer& theN3,
|
||||
Standard_Integer& theN4) const
|
||||
{
|
||||
myMesh->Element(theIndex, theN1, theN2, theN3, theN4);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetElement
|
||||
//purpose : Sets an element at the given index.
|
||||
// Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::SetElement (const Standard_Integer theIndex, const Poly_Element& theElement)
|
||||
{
|
||||
Backup();
|
||||
myMesh->SetElement(theIndex, theElement);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
const Standard_GUID& TDataStd_Mesh::ID () const
|
||||
{
|
||||
return GetID();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NewEmpty
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Handle(TDF_Attribute) TDataStd_Mesh::NewEmpty () const
|
||||
{
|
||||
return new TDataStd_Mesh();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Restore
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::Restore(const Handle(TDF_Attribute)& With)
|
||||
{
|
||||
myMesh.Nullify();
|
||||
Handle(TDataStd_Mesh) M = Handle(TDataStd_Mesh)::DownCast(With);
|
||||
if (!M->myMesh.IsNull())
|
||||
{
|
||||
Handle(Poly_TmpTriangulation) T = M->myMesh->Copy();
|
||||
if (!T.IsNull())
|
||||
myMesh = Handle(Poly_Mesh)::DownCast(T);
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void TDataStd_Mesh::Paste (const Handle(TDF_Attribute)& Into,
|
||||
const Handle(TDF_RelocationTable)& ) const
|
||||
{
|
||||
Handle(TDataStd_Mesh) M = Handle(TDataStd_Mesh)::DownCast(Into);
|
||||
M->myMesh.Nullify();
|
||||
if (!myMesh.IsNull())
|
||||
{
|
||||
Handle(Poly_TmpTriangulation) T = myMesh->Copy();
|
||||
if (!T.IsNull())
|
||||
M->myMesh = Handle(Poly_Mesh)::DownCast(T);
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Dump
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_OStream& TDataStd_Mesh::Dump (Standard_OStream& anOS) const
|
||||
{
|
||||
anOS << "Mesh";
|
||||
//TODO: Make a good dump.
|
||||
return anOS;
|
||||
}
|
218
src/TDataStd/TDataStd_Mesh.hxx
Normal file
218
src/TDataStd/TDataStd_Mesh.hxx
Normal file
@@ -0,0 +1,218 @@
|
||||
// Created on: 2015-12-10
|
||||
// Created by: Vlad Romashko
|
||||
// Copyright (c) 2007-2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
||||
// by the Free Software Foundation, with special exception defined in the file
|
||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
||||
// distribution for complete text of the license and disclaimer of any warranty.
|
||||
//
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#ifndef _TDataStd_Mesh_HeaderFile
|
||||
#define _TDataStd_Mesh_HeaderFile
|
||||
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
|
||||
#include <Poly_Mesh.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
#include <Standard_Boolean.hxx>
|
||||
#include <Standard_Integer.hxx>
|
||||
#include <Standard_OStream.hxx>
|
||||
class Standard_GUID;
|
||||
class TDF_Label;
|
||||
class TDF_Attribute;
|
||||
class TDF_RelocationTable;
|
||||
|
||||
class TDataStd_Mesh;
|
||||
DEFINE_STANDARD_HANDLE(TDataStd_Mesh, TDF_Attribute)
|
||||
|
||||
//! An Ocaf attribute containing a mesh (Poly_Mesh).
|
||||
//! It duplicates all methods from Poly_Mesh (and Poly_Triangulation).
|
||||
//! It is highly recommended to modify the mesh through the methods of this attribute,
|
||||
//! but not directly via the underlying Poly_Mesh object.
|
||||
//! In this case Undo/Redo will work fine and robust.
|
||||
class TDataStd_Mesh : public TDF_Attribute
|
||||
{
|
||||
public:
|
||||
|
||||
//! Static methods
|
||||
// ==============
|
||||
|
||||
//! Returns the ID of the mesh attribute.
|
||||
Standard_EXPORT static const Standard_GUID& GetID();
|
||||
|
||||
//! Finds or creates a mesh attribute.
|
||||
Standard_EXPORT static Handle(TDataStd_Mesh) Set(const TDF_Label& label);
|
||||
|
||||
//! Finds or creates a mesh attribute.
|
||||
//! Initializes the attribute by a mesh (Poly_Mesh) object.
|
||||
//! If the mesh consists of only triangles,
|
||||
//! you may put Poly_Triangulation object as a 2nd parameter of this method.
|
||||
Standard_EXPORT static Handle(TDataStd_Mesh) Set(const TDF_Label& label, const Handle(Poly_Mesh)& mesh);
|
||||
|
||||
//! Object methods
|
||||
// ==============
|
||||
|
||||
//! A constructor.
|
||||
//! Don't use it directly,
|
||||
//! use please the static method Set(),
|
||||
//! which returns the attribute attached to a label.
|
||||
Standard_EXPORT TDataStd_Mesh();
|
||||
|
||||
//! Sets the mesh.
|
||||
//! If the mesh consists of only triangles,
|
||||
//! you may put Poly_Triangulation object.
|
||||
Standard_EXPORT void Set(const Handle(Poly_Mesh)& mesh);
|
||||
|
||||
//! Returns the underlying mesh.
|
||||
Standard_EXPORT const Handle(Poly_Mesh)& Get() const;
|
||||
|
||||
|
||||
//! Poly_Mesh methods
|
||||
// =================
|
||||
|
||||
//! The methods are "covered" by this attribute to prevent direct modification of the mesh.
|
||||
//! There is no performance problem to call Poly_Mesh method through this attribute.
|
||||
//! The most of the methods are considered as "inline" by the compiler in release mode.
|
||||
|
||||
//! Returns the deflection of this triangulation.
|
||||
Standard_EXPORT Standard_Real Deflection() const;
|
||||
|
||||
//! Sets the deflection of this triangulation to theDeflection.
|
||||
//! See more on deflection in Polygon2D
|
||||
Standard_EXPORT void Deflection (const Standard_Real theDeflection);
|
||||
|
||||
//! Deallocates the UV nodes.
|
||||
Standard_EXPORT void RemoveUVNodes();
|
||||
|
||||
//! @return the number of nodes for this triangulation.
|
||||
Standard_EXPORT Standard_Integer NbNodes() const;
|
||||
|
||||
//! @return the number of triangles for this triangulation.
|
||||
Standard_EXPORT Standard_Integer NbTriangles() const;
|
||||
|
||||
//! @return Standard_True if 2D nodes are associated with 3D nodes for this triangulation.
|
||||
Standard_EXPORT Standard_Boolean HasUVNodes() const;
|
||||
|
||||
//! Adds Node to the triangulation. If triangulation has UVNodes or Normals
|
||||
//! they will be expanded and set to zero values to match the new number of nodes.
|
||||
//! @return index of the added Node.
|
||||
Standard_EXPORT Standard_Integer AddNode (const gp_Pnt& theNode);
|
||||
|
||||
//! @return node at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
|
||||
Standard_EXPORT const gp_Pnt& Node (const Standard_Integer theIndex) const;
|
||||
|
||||
//! The method differs from Poly_Mesh!
|
||||
//! Sets a node at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
|
||||
Standard_EXPORT void SetNode (const Standard_Integer theIndex, const gp_Pnt& theNode);
|
||||
|
||||
//! @return UVNode at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
|
||||
Standard_EXPORT const gp_Pnt2d& UVNode (const Standard_Integer theIndex) const;
|
||||
|
||||
//! The method differs from Poly_Mesh!
|
||||
//! Sets a UVNode at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
|
||||
Standard_EXPORT void SetUVNode (const Standard_Integer theIndex, const gp_Pnt2d& theUVNode);
|
||||
|
||||
//! Adds triangle to the triangulation.
|
||||
//! @return index of the added triangle.
|
||||
Standard_EXPORT Standard_Integer AddTriangle (const Poly_Triangle& theTriangle);
|
||||
|
||||
//! @return triangle at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
|
||||
Standard_EXPORT const Poly_Triangle& Triangle (const Standard_Integer theIndex) const;
|
||||
|
||||
//! The method differs from Poly_Mesh!
|
||||
//! Sets a triangle at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
|
||||
Standard_EXPORT void SetTriangle (const Standard_Integer theIndex, const Poly_Triangle& theTriangle);
|
||||
|
||||
//! Sets the table of node normals.
|
||||
//! Raises exception if length of theNormals != 3 * NbNodes
|
||||
Standard_EXPORT void SetNormals (const Handle(TShort_HArray1OfShortReal)& theNormals);
|
||||
|
||||
//! Changes normal at the given index.
|
||||
//! Raises Standard_OutOfRange exception.
|
||||
Standard_EXPORT void SetNormal (const Standard_Integer theIndex,
|
||||
const gp_Dir& theNormal);
|
||||
|
||||
//! Returns Standard_True if nodal normals are defined.
|
||||
Standard_EXPORT Standard_Boolean HasNormals() const;
|
||||
|
||||
//! @return normal at the given index.
|
||||
//! Raises Standard_OutOfRange exception.
|
||||
Standard_EXPORT const gp_Dir Normal (const Standard_Integer theIndex) const;
|
||||
|
||||
//! Adds element to the mesh.
|
||||
//! @param theN1 index of the first node.
|
||||
//! @param theN2 index of the second node.
|
||||
//! @param theN3 index of the third node.
|
||||
//! @return index of the added element.
|
||||
Standard_EXPORT Standard_Integer AddElement (const Standard_Integer theN1,
|
||||
const Standard_Integer theN2,
|
||||
const Standard_Integer theN3);
|
||||
|
||||
//! Adds element to the mesh.
|
||||
//! @param theN1 index of the first node.
|
||||
//! @param theN2 index of the second node.
|
||||
//! @param theN3 index of the third node.
|
||||
//! @param theN4 index of the fourth node.
|
||||
//! @return index of the added element.
|
||||
Standard_EXPORT Standard_Integer AddElement (const Standard_Integer theN1,
|
||||
const Standard_Integer theN2,
|
||||
const Standard_Integer theN3,
|
||||
const Standard_Integer theN4);
|
||||
|
||||
//! @return the number of elements for this mesh.
|
||||
Standard_EXPORT Standard_Integer NbElements() const;
|
||||
|
||||
//! @return the number of quads for this mesh.
|
||||
Standard_EXPORT Standard_Integer NbQuads() const;
|
||||
|
||||
//! @return element at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
|
||||
Standard_EXPORT const Poly_Element& Element (const Standard_Integer theIndex) const;
|
||||
|
||||
//! @return nodes of the element at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
|
||||
Standard_EXPORT void Element (const Standard_Integer theIndex,
|
||||
Standard_Integer& theN1,
|
||||
Standard_Integer& theN2,
|
||||
Standard_Integer& theN3,
|
||||
Standard_Integer& theN4) const;
|
||||
|
||||
//! Sets an element at the given index.
|
||||
//! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
|
||||
Standard_EXPORT void SetElement (const Standard_Integer theIndex, const Poly_Element& theElement);
|
||||
|
||||
|
||||
//! Inherited attribute methods
|
||||
// ===========================
|
||||
|
||||
Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Restore (const Handle(TDF_Attribute)& With) Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Into, const Handle(TDF_RelocationTable)& RT) const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT virtual Standard_OStream& Dump (Standard_OStream& anOS) const Standard_OVERRIDE;
|
||||
|
||||
DEFINE_STANDARD_RTTI_INLINE(TDataStd_Mesh,TDF_Attribute)
|
||||
|
||||
private:
|
||||
|
||||
Handle(Poly_Mesh) myMesh;
|
||||
};
|
||||
|
||||
#endif // _TDataStd_Mesh_HeaderFile
|
@@ -43,6 +43,7 @@
|
||||
#include <XmlMDataStd_TreeNodeDriver.hxx>
|
||||
#include <XmlMDataStd_UAttributeDriver.hxx>
|
||||
#include <XmlMDataStd_VariableDriver.hxx>
|
||||
#include <XmlMDataStd_MeshDriver.hxx>
|
||||
#include <XmlMDF_ADriverTable.hxx>
|
||||
|
||||
static Standard_Integer myDocumentVersion = -1;
|
||||
@@ -80,6 +81,7 @@ void XmlMDataStd::AddDrivers (const Handle(XmlMDF_ADriverTable)& aDriverTable,
|
||||
aDriverTable-> AddDriver (new XmlMDataStd_NamedDataDriver (anMsgDrv));
|
||||
aDriverTable-> AddDriver (new XmlMDataStd_AsciiStringDriver (anMsgDrv));
|
||||
aDriverTable-> AddDriver (new XmlMDataStd_IntPackedMapDriver (anMsgDrv));
|
||||
aDriverTable-> AddDriver (new XmlMDataStd_MeshDriver (anMsgDrv));
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
133
src/XmlMDataStd/XmlMDataStd_MeshDriver.cxx
Normal file
133
src/XmlMDataStd/XmlMDataStd_MeshDriver.cxx
Normal file
@@ -0,0 +1,133 @@
|
||||
// Created on: 2015-12-15
|
||||
// Created by: Vlad Romashko
|
||||
// Copyright (c) 2007-2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
||||
// by the Free Software Foundation, with special exception defined in the file
|
||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
||||
// distribution for complete text of the license and disclaimer of any warranty.
|
||||
//
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include <CDM_MessageDriver.hxx>
|
||||
#include <NCollection_LocalArray.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
#include <XmlMDataStd_MeshDriver.hxx>
|
||||
#include <XmlObjMgt.hxx>
|
||||
#include <XmlObjMgt_Persistent.hxx>
|
||||
#include <TDataStd_Mesh.hxx>
|
||||
#include <LDOM_OSStream.hxx>
|
||||
#include <BRepTools_ShapeSet.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(XmlMDataStd_MeshDriver,XmlMDF_ADriver)
|
||||
IMPLEMENT_DOMSTRING (MeshString, "mesh")
|
||||
IMPLEMENT_DOMSTRING (NullString, "null")
|
||||
IMPLEMENT_DOMSTRING (ExistString, "exists")
|
||||
|
||||
//=======================================================================
|
||||
//function : XmlMDataStd_MeshDriver
|
||||
//purpose : Constructor
|
||||
//=======================================================================
|
||||
XmlMDataStd_MeshDriver::XmlMDataStd_MeshDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
|
||||
: XmlMDF_ADriver (theMsgDriver, NULL)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NewEmpty
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Handle(TDF_Attribute) XmlMDataStd_MeshDriver::NewEmpty() const
|
||||
{
|
||||
return new TDataStd_Mesh();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose : persistent -> transient (retrieve)
|
||||
//=======================================================================
|
||||
Standard_Boolean XmlMDataStd_MeshDriver::Paste(const XmlObjMgt_Persistent& theSource,
|
||||
const Handle(TDF_Attribute)& theTarget,
|
||||
XmlObjMgt_RRelocationTable& ) const
|
||||
{
|
||||
const XmlObjMgt_Element& element = theSource;
|
||||
Handle(TDataStd_Mesh) mesh = Handle(TDataStd_Mesh)::DownCast(theTarget);
|
||||
|
||||
// Read the FirstIndex; if the attribute is absent initialize to 1
|
||||
XmlObjMgt_DOMString meshStatus = element.getAttribute(::MeshString());
|
||||
if (meshStatus == NULL ||
|
||||
meshStatus.Type() != LDOMBasicString::LDOM_AsciiDoc ||
|
||||
strcmp(meshStatus.GetString(), ::ExistString().GetString()))
|
||||
{
|
||||
// No mesh.
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
// Get mesh as a string.
|
||||
const XmlObjMgt_DOMString& data = XmlObjMgt::GetStringValue(element);
|
||||
std::stringstream stream(std::string(data.GetString()));
|
||||
|
||||
// Read the mesh.
|
||||
BRepTools_ShapeSet shapeSet;
|
||||
TColStd_IndexedMapOfTransient meshes;
|
||||
shapeSet.ReadMeshes(stream, meshes);
|
||||
|
||||
// Set mesh.
|
||||
if (!meshes.IsEmpty())
|
||||
{
|
||||
// We expect only one mesh.
|
||||
Handle(Poly_Mesh) M = Handle(Poly_Mesh)::DownCast(meshes(1));
|
||||
if (!M.IsNull())
|
||||
mesh->Set(M);
|
||||
}
|
||||
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose : transient -> persistent (store)
|
||||
//=======================================================================
|
||||
void XmlMDataStd_MeshDriver::Paste(const Handle(TDF_Attribute)& theSource,
|
||||
XmlObjMgt_Persistent& theTarget,
|
||||
XmlObjMgt_SRelocationTable& ) const
|
||||
{
|
||||
const Handle(TDataStd_Mesh) meshAttr = Handle(TDataStd_Mesh)::DownCast(theSource);
|
||||
if (meshAttr->Get().IsNull())
|
||||
theTarget.Element().setAttribute(::MeshString(), ::NullString());
|
||||
else
|
||||
{
|
||||
theTarget.Element().setAttribute(::MeshString(), ::ExistString());
|
||||
|
||||
// Analyse the size of the mesh
|
||||
// (to allocate properly the string array).
|
||||
const Handle(Poly_Mesh)& mesh = meshAttr->Get();
|
||||
Standard_Integer size = mesh->NbNodes();
|
||||
size *= 3; // 3 coordinates for a node
|
||||
size *= 8; // 8 characters are used to represent a coordinate (double) in XML
|
||||
size += 4 * 5 * mesh->NbElements(); // space for elements (triangles and quadrangles)
|
||||
size *= 2; // just in case :-)
|
||||
if (!size)
|
||||
size = 1;
|
||||
|
||||
// Allocate a string stream.
|
||||
LDOM_OSStream stream(size);
|
||||
|
||||
// Write the mesh.
|
||||
BRepTools_ShapeSet shapeSet;
|
||||
TColStd_IndexedMapOfTransient meshes;
|
||||
meshes.Add(mesh);
|
||||
shapeSet.WriteMeshes(stream, meshes, Standard_True/*compact*/);
|
||||
stream<<ends;
|
||||
|
||||
Standard_Character* dump = (Standard_Character*)stream.str(); // copying! Don't forget to delete it.
|
||||
XmlObjMgt::SetStringValue(theTarget, dump, Standard_True);
|
||||
delete[] dump;
|
||||
}
|
||||
}
|
49
src/XmlMDataStd/XmlMDataStd_MeshDriver.hxx
Normal file
49
src/XmlMDataStd/XmlMDataStd_MeshDriver.hxx
Normal file
@@ -0,0 +1,49 @@
|
||||
// Created on: 2015-12-15
|
||||
// Created by: Vlad Romashko
|
||||
// Copyright (c) 2007-2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
||||
// by the Free Software Foundation, with special exception defined in the file
|
||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
||||
// distribution for complete text of the license and disclaimer of any warranty.
|
||||
//
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#ifndef _XmlMDataStd_MeshDriver_HeaderFile
|
||||
#define _XmlMDataStd_MeshDriver_HeaderFile
|
||||
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
|
||||
#include <XmlMDF_ADriver.hxx>
|
||||
#include <Standard_Boolean.hxx>
|
||||
#include <XmlObjMgt_RRelocationTable.hxx>
|
||||
#include <XmlObjMgt_SRelocationTable.hxx>
|
||||
class CDM_MessageDriver;
|
||||
class TDF_Attribute;
|
||||
class XmlObjMgt_Persistent;
|
||||
|
||||
class XmlMDataStd_MeshDriver;
|
||||
DEFINE_STANDARD_HANDLE(XmlMDataStd_MeshDriver, XmlMDF_ADriver)
|
||||
|
||||
class XmlMDataStd_MeshDriver : public XmlMDF_ADriver
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
Standard_EXPORT XmlMDataStd_MeshDriver(const Handle(CDM_MessageDriver)& theMessageDriver);
|
||||
|
||||
Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT Standard_Boolean Paste (const XmlObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, XmlObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Source, XmlObjMgt_Persistent& Target, XmlObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE;
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(XmlMDataStd_MeshDriver,XmlMDF_ADriver)
|
||||
};
|
||||
|
||||
#endif // _XmlMDataStd_MeshDriver_HeaderFile
|
41
tests/caf/basic/N1
Normal file
41
tests/caf/basic/N1
Normal file
@@ -0,0 +1,41 @@
|
||||
#INTERFACE CAF
|
||||
# Basic attributes
|
||||
#
|
||||
# Testing attribute: TDataStd_Mesh
|
||||
#
|
||||
# Testing command: SetMesh
|
||||
# Testing command: DumpMesh
|
||||
#
|
||||
|
||||
puts "caf001-N1"
|
||||
|
||||
# Make a sphere and produce triangulation
|
||||
psphere s 100
|
||||
vdisplay s
|
||||
explode s f
|
||||
|
||||
# Create a XML document
|
||||
NewDocument D XmlXCAF
|
||||
|
||||
# Set mesh from the spherical face
|
||||
SetMesh D 0:1 s_1
|
||||
|
||||
# Print the mesh data
|
||||
set dump1 [DumpMesh D 0:1]
|
||||
|
||||
# Save document on disk.
|
||||
SaveAs D "test.xml"
|
||||
|
||||
# Close and open the document again.
|
||||
Close D
|
||||
Open test.xml DD
|
||||
|
||||
# Print mesh data
|
||||
set dump2 [DumpMesh DD 0:1]
|
||||
|
||||
# Check data
|
||||
if { ${dump1}!=${dump2} } {
|
||||
puts "TDataStd_Mesh(XML) attribute: Error"
|
||||
return
|
||||
}
|
||||
puts "TDataStd_Mesh(XML) attribute: OK"
|
42
tests/caf/basic/N2
Normal file
42
tests/caf/basic/N2
Normal file
@@ -0,0 +1,42 @@
|
||||
#INTERFACE CAF
|
||||
# Basic attributes
|
||||
#
|
||||
# Testing attribute: TDataStd_Mesh
|
||||
#
|
||||
# Testing command: SetMesh
|
||||
# Testing command: DumpMesh
|
||||
# Test : Binary file format
|
||||
#
|
||||
|
||||
puts "caf001-N2"
|
||||
|
||||
# Make a sphere and produce triangulation
|
||||
psphere s 100
|
||||
vdisplay s
|
||||
explode s f
|
||||
|
||||
# Create a binary document
|
||||
NewDocument D BinXCAF
|
||||
|
||||
# Set mesh from the spherical face
|
||||
SetMesh D 0:1 s_1
|
||||
|
||||
# Print the mesh data
|
||||
set dump1 [DumpMesh D 0:1]
|
||||
|
||||
# Save document on disk.
|
||||
SaveAs D "test.xbf"
|
||||
|
||||
# Close and open the document again.
|
||||
Close D
|
||||
Open test.xbf DD
|
||||
|
||||
# Print mesh data
|
||||
set dump2 [DumpMesh DD 0:1]
|
||||
|
||||
# Check data
|
||||
if { ${dump1}!=${dump2} } {
|
||||
puts "TDataStd_Mesh(BIN) attribute: Error"
|
||||
return
|
||||
}
|
||||
puts "TDataStd_Mesh(BIN) attribute: OK"
|
Reference in New Issue
Block a user