2013-03-07 00:02:19 +08:00
|
|
|
#include "occ_libstl.h"
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
#include <StlMesh_Mesh.hxx>
|
|
|
|
#include <StlMesh_MeshTriangle.hxx>
|
|
|
|
#include <StlMesh_SequenceOfMeshTriangle.hxx>
|
|
|
|
#include <TColgp_SequenceOfXYZ.hxx>
|
|
|
|
|
2013-04-27 06:20:12 +08:00
|
|
|
/* Common */
|
2013-03-07 00:02:19 +08:00
|
|
|
|
|
|
|
static void occ_mesh_stl_add_triangle(Handle_StlMesh_Mesh* mesh, const foug_stl_triangle_t* tri)
|
|
|
|
{
|
|
|
|
const int uId = (*mesh)->AddOnlyNewVertex(tri->v1.x, tri->v1.y, tri->v1.z);
|
|
|
|
const int vId = (*mesh)->AddOnlyNewVertex(tri->v2.x, tri->v2.y, tri->v2.z);
|
|
|
|
const int wId = (*mesh)->AddOnlyNewVertex(tri->v3.x, tri->v3.y, tri->v3.z);
|
|
|
|
(*mesh)->AddTriangle(uId, vId, wId, tri->normal.x, tri->normal.y, tri->normal.z);
|
|
|
|
}
|
|
|
|
|
2013-04-27 06:20:12 +08:00
|
|
|
/* ASCII STL */
|
|
|
|
|
2013-03-07 00:02:19 +08:00
|
|
|
static void occ_mesh_stla_igeom_begin_solid(foug_stla_geom_input_t* geom, const char* /*name*/)
|
|
|
|
{
|
|
|
|
Handle_StlMesh_Mesh* mesh = static_cast<Handle_StlMesh_Mesh*>(geom->cookie);
|
|
|
|
if (mesh->IsNull())
|
|
|
|
*mesh = new StlMesh_Mesh;
|
|
|
|
(*mesh)->AddDomain();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void occ_mesh_stla_igeom_process_next_triangle(foug_stla_geom_input_t* geom,
|
|
|
|
const foug_stl_triangle_t* tri)
|
|
|
|
{
|
|
|
|
Handle_StlMesh_Mesh* mesh = static_cast<Handle_StlMesh_Mesh*>(geom->cookie);
|
|
|
|
occ_mesh_stl_add_triangle(mesh, tri);
|
|
|
|
}
|
|
|
|
|
|
|
|
void foug_stla_geom_input_set_occmesh(foug_stla_geom_input_t* input, Handle_StlMesh_Mesh* mesh)
|
|
|
|
{
|
|
|
|
input->cookie = mesh;
|
|
|
|
input->begin_solid_func = occ_mesh_stla_igeom_begin_solid;
|
|
|
|
input->process_next_triangle_func = occ_mesh_stla_igeom_process_next_triangle;
|
|
|
|
input->end_solid_func = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Binary STL */
|
|
|
|
|
|
|
|
static void occ_mesh_stlb_igeom_begin_triangles(foug_stlb_geom_input_t* geom, uint32_t /*count*/)
|
|
|
|
{
|
|
|
|
Handle_StlMesh_Mesh* mesh = static_cast<Handle_StlMesh_Mesh*>(geom->cookie);
|
|
|
|
*mesh = new StlMesh_Mesh;
|
|
|
|
(*mesh)->AddDomain();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void occ_mesh_stlb_igeom_process_next_triangle(foug_stlb_geom_input_t* geom,
|
|
|
|
const foug_stlb_triangle_t* face)
|
|
|
|
{
|
|
|
|
Handle_StlMesh_Mesh* mesh = static_cast<Handle_StlMesh_Mesh*>(geom->cookie);
|
|
|
|
occ_mesh_stl_add_triangle(mesh, &(face->data));
|
|
|
|
}
|
|
|
|
|
|
|
|
void foug_stlb_geom_input_set_occmesh(foug_stlb_geom_input_t* input, Handle_StlMesh_Mesh* mesh)
|
|
|
|
{
|
|
|
|
input->cookie = mesh;
|
|
|
|
input->process_header_func = NULL;
|
|
|
|
input->begin_triangles_func = occ_mesh_stlb_igeom_begin_triangles;
|
|
|
|
input->process_next_triangle_func = occ_mesh_stlb_igeom_process_next_triangle;
|
|
|
|
input->end_triangles_func = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void occ_mesh_stlb_ogeom_get_header(const foug_stlb_geom_output_t* /*geom*/, uint8_t* header)
|
|
|
|
{
|
|
|
|
std::memcpy(header, "Generated by libfougdatax-c", FOUG_STLB_HEADER_SIZE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static uint32_t occ_mesh_stlb_ogeom_get_triangle_count(const foug_stlb_geom_output_t* geom)
|
|
|
|
{
|
|
|
|
Handle_StlMesh_Mesh* mesh = static_cast<Handle_StlMesh_Mesh*>(geom->cookie);
|
|
|
|
if ((*mesh)->NbDomains() >= 1)
|
|
|
|
return (*mesh)->NbTriangles(1);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void occ_mesh_stlb_ogeom_get_triangle(const foug_stlb_geom_output_t* geom,
|
|
|
|
uint32_t index,
|
|
|
|
foug_stlb_triangle_t* facet)
|
|
|
|
{
|
|
|
|
Handle_StlMesh_Mesh* mesh = static_cast<Handle_StlMesh_Mesh*>(geom->cookie);
|
|
|
|
|
|
|
|
const StlMesh_SequenceOfMeshTriangle& meshTriangles = (*mesh)->Triangles(1);
|
2014-01-21 17:52:53 +08:00
|
|
|
const Handle_StlMesh_MeshTriangle& tri = meshTriangles.Value(index + 1);
|
2013-03-07 00:02:19 +08:00
|
|
|
Standard_Integer v1;
|
|
|
|
Standard_Integer v2;
|
|
|
|
Standard_Integer v3;
|
|
|
|
Standard_Real xN;
|
|
|
|
Standard_Real yN;
|
|
|
|
Standard_Real zN;
|
|
|
|
tri->GetVertexAndOrientation(v1, v2, v3, xN, yN, zN);
|
2013-04-29 21:47:44 +08:00
|
|
|
facet->data.normal.x = static_cast<foug_real32_t>(xN);
|
|
|
|
facet->data.normal.y = static_cast<foug_real32_t>(yN);
|
|
|
|
facet->data.normal.z = static_cast<foug_real32_t>(zN);
|
2013-03-07 00:02:19 +08:00
|
|
|
|
|
|
|
const TColgp_SequenceOfXYZ& vertices = (*mesh)->Vertices(1);
|
|
|
|
const gp_XYZ& coordsV1 = vertices.Value(v1);
|
|
|
|
const gp_XYZ& coordsV2 = vertices.Value(v2);
|
|
|
|
const gp_XYZ& coordsV3 = vertices.Value(v3);
|
2013-04-29 21:47:44 +08:00
|
|
|
facet->data.v1.x = static_cast<foug_real32_t>(coordsV1.X());
|
|
|
|
facet->data.v2.x = static_cast<foug_real32_t>(coordsV2.X());
|
|
|
|
facet->data.v3.x = static_cast<foug_real32_t>(coordsV3.X());
|
2013-03-07 00:02:19 +08:00
|
|
|
|
2013-04-29 21:47:44 +08:00
|
|
|
facet->data.v1.y = static_cast<foug_real32_t>(coordsV1.Y());
|
|
|
|
facet->data.v2.y = static_cast<foug_real32_t>(coordsV2.Y());
|
|
|
|
facet->data.v3.y = static_cast<foug_real32_t>(coordsV3.Y());
|
2013-03-07 00:02:19 +08:00
|
|
|
|
2013-04-29 21:47:44 +08:00
|
|
|
facet->data.v1.z = static_cast<foug_real32_t>(coordsV1.Z());
|
|
|
|
facet->data.v2.z = static_cast<foug_real32_t>(coordsV2.Z());
|
|
|
|
facet->data.v3.z = static_cast<foug_real32_t>(coordsV3.Z());
|
2013-03-07 00:02:19 +08:00
|
|
|
|
|
|
|
facet->attribute_byte_count = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void foug_stlb_geom_output_set_occmesh(foug_stlb_geom_output_t* output, Handle_StlMesh_Mesh* mesh)
|
|
|
|
{
|
|
|
|
output->cookie = mesh;
|
|
|
|
output->get_header_func = occ_mesh_stlb_ogeom_get_header;
|
|
|
|
output->get_triangle_count_func = occ_mesh_stlb_ogeom_get_triangle_count;
|
|
|
|
output->get_triangle_func = occ_mesh_stlb_ogeom_get_triangle;
|
|
|
|
}
|