2015-03-05 00:41:07 +08:00
|
|
|
/****************************************************************************
|
2015-05-28 15:40:24 +08:00
|
|
|
** gmio
|
2015-05-06 15:39:37 +08:00
|
|
|
** Copyright Fougue (2 Mar. 2015)
|
2015-07-13 17:42:03 +08:00
|
|
|
** contact@fougue.pro
|
2015-03-05 00:41:07 +08:00
|
|
|
**
|
|
|
|
** This software is a reusable library whose purpose is to provide complete
|
|
|
|
** I/O support for various CAD file formats (eg. STL)
|
|
|
|
**
|
|
|
|
** This software is governed by the CeCILL-B license under French law and
|
|
|
|
** abiding by the rules of distribution of free software. You can use,
|
|
|
|
** modify and/ or redistribute the software under the terms of the CeCILL-B
|
|
|
|
** license as circulated by CEA, CNRS and INRIA at the following URL
|
2015-03-30 15:05:25 +08:00
|
|
|
** "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html".
|
2015-03-05 00:41:07 +08:00
|
|
|
****************************************************************************/
|
|
|
|
|
2016-04-15 18:37:05 +08:00
|
|
|
#include <gmio_support/stl_occ_mesh.h>
|
|
|
|
|
|
|
|
#include "stl_occ_utils.h"
|
2014-03-14 00:49:39 +08:00
|
|
|
|
2013-03-07 00:02:19 +08:00
|
|
|
#include <cstring>
|
|
|
|
#include <StlMesh_Mesh.hxx>
|
|
|
|
#include <StlMesh_MeshTriangle.hxx>
|
|
|
|
#include <StlMesh_SequenceOfMeshTriangle.hxx>
|
|
|
|
#include <TColgp_SequenceOfXYZ.hxx>
|
|
|
|
|
2014-01-27 22:03:50 +08:00
|
|
|
namespace internal {
|
|
|
|
|
2013-04-27 06:20:12 +08:00
|
|
|
/* Common */
|
2013-03-07 00:02:19 +08:00
|
|
|
|
2014-01-27 22:03:50 +08:00
|
|
|
static StlMesh_Mesh* occMeshPtr(const Handle_StlMesh_Mesh& mesh)
|
2013-03-07 00:02:19 +08:00
|
|
|
{
|
2015-03-20 00:31:08 +08:00
|
|
|
return mesh.operator->();
|
2013-03-07 00:02:19 +08:00
|
|
|
}
|
|
|
|
|
2015-10-14 18:06:47 +08:00
|
|
|
static void occmesh_add_triangle(
|
2016-02-19 01:20:23 +08:00
|
|
|
void* cookie, uint32_t tri_id, const gmio_stl_triangle* tri)
|
2013-03-07 00:02:19 +08:00
|
|
|
{
|
2015-03-20 00:31:08 +08:00
|
|
|
StlMesh_Mesh* mesh = static_cast<StlMesh_Mesh*>(cookie);
|
|
|
|
if (tri_id == 0)
|
|
|
|
mesh->AddDomain();
|
2016-03-14 23:31:48 +08:00
|
|
|
const gmio_vec3f& v1 = tri->v1;
|
|
|
|
const gmio_vec3f& v2 = tri->v2;
|
|
|
|
const gmio_vec3f& v3 = tri->v3;
|
|
|
|
const gmio_vec3f& n = tri->n;
|
2015-10-14 18:06:47 +08:00
|
|
|
mesh->AddTriangle(mesh->AddOnlyNewVertex(v1.x, v1.y, v1.z),
|
|
|
|
mesh->AddOnlyNewVertex(v2.x, v2.y, v2.z),
|
|
|
|
mesh->AddOnlyNewVertex(v3.x, v3.y, v3.z),
|
|
|
|
n.x, n.y, n.z);
|
2013-03-07 00:02:19 +08:00
|
|
|
}
|
|
|
|
|
2014-01-29 23:59:19 +08:00
|
|
|
} // namespace internal
|
|
|
|
|
2016-02-19 01:20:23 +08:00
|
|
|
gmio_stl_mesh gmio_stl_occmesh(const gmio_stl_occmesh_iterator& it)
|
2015-03-19 23:34:53 +08:00
|
|
|
{
|
2016-02-19 01:20:23 +08:00
|
|
|
gmio_stl_mesh mesh = {};
|
|
|
|
mesh.cookie = ⁢
|
2016-04-06 17:29:40 +08:00
|
|
|
const int domain_count = it.mesh() != NULL ? it.mesh()->NbDomains() : 0;
|
2016-02-19 01:20:23 +08:00
|
|
|
for (int dom_id = 1; dom_id <= domain_count; ++dom_id)
|
|
|
|
mesh.triangle_count += it.mesh()->NbTriangles(dom_id);
|
2016-04-26 00:16:31 +08:00
|
|
|
mesh.func_get_triangle = gmio_stl_occmesh_iterator::get_triangle;
|
2015-09-01 23:32:57 +08:00
|
|
|
return mesh;
|
2014-01-29 23:59:19 +08:00
|
|
|
}
|
2014-01-27 22:03:50 +08:00
|
|
|
|
2016-02-19 01:20:23 +08:00
|
|
|
gmio_stl_mesh_creator gmio_stl_occmesh_creator(StlMesh_Mesh* mesh)
|
2015-03-19 23:34:53 +08:00
|
|
|
{
|
2016-02-19 01:20:23 +08:00
|
|
|
gmio_stl_mesh_creator creator = {};
|
2015-09-09 16:54:45 +08:00
|
|
|
creator.cookie = mesh;
|
2015-09-01 23:32:57 +08:00
|
|
|
creator.func_add_triangle = internal::occmesh_add_triangle;
|
|
|
|
return creator;
|
2015-03-19 23:34:53 +08:00
|
|
|
}
|
|
|
|
|
2016-02-19 01:20:23 +08:00
|
|
|
gmio_stl_mesh_creator gmio_stl_occmesh_creator(const Handle_StlMesh_Mesh &hnd)
|
2013-03-07 00:02:19 +08:00
|
|
|
{
|
2015-09-09 16:54:45 +08:00
|
|
|
return gmio_stl_occmesh_creator(internal::occMeshPtr(hnd));
|
2013-03-07 00:02:19 +08:00
|
|
|
}
|
|
|
|
|
2016-02-19 01:20:23 +08:00
|
|
|
gmio_stl_occmesh_iterator::gmio_stl_occmesh_iterator()
|
|
|
|
{
|
|
|
|
this->init(NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
gmio_stl_occmesh_iterator::gmio_stl_occmesh_iterator(const StlMesh_Mesh *mesh)
|
2013-03-07 00:02:19 +08:00
|
|
|
{
|
2016-02-19 01:20:23 +08:00
|
|
|
this->init(mesh);
|
2013-03-07 00:02:19 +08:00
|
|
|
}
|
|
|
|
|
2016-02-19 01:20:23 +08:00
|
|
|
gmio_stl_occmesh_iterator::gmio_stl_occmesh_iterator(const Handle_StlMesh_Mesh &hnd)
|
2013-03-07 00:02:19 +08:00
|
|
|
{
|
2016-02-19 01:20:23 +08:00
|
|
|
this->init(internal::occMeshPtr(hnd));
|
2013-03-07 00:02:19 +08:00
|
|
|
}
|
|
|
|
|
2016-04-26 00:16:31 +08:00
|
|
|
void gmio_stl_occmesh_iterator::get_triangle(
|
|
|
|
const void *cookie, uint32_t tri_id, gmio_stl_triangle *tri)
|
|
|
|
{
|
|
|
|
void* wcookie = const_cast<void*>(cookie);
|
|
|
|
gmio_stl_occmesh_iterator* it =
|
|
|
|
static_cast<gmio_stl_occmesh_iterator*>(wcookie);
|
|
|
|
|
|
|
|
if (it->move_to_next_tri(tri_id)) {
|
|
|
|
const int dom_tri_id = tri_id - it->m_domain_first_tri_id + 1;
|
|
|
|
const Handle_StlMesh_MeshTriangle& occTri =
|
|
|
|
it->m_domain_triangles->Value(dom_tri_id);
|
|
|
|
|
|
|
|
int iv1, iv2, iv3;
|
|
|
|
double nx, ny, nz;
|
|
|
|
occTri->GetVertexAndOrientation(iv1, iv2, iv3, nx, ny, nz);
|
|
|
|
gmio_stl_occ_copy_xyz(&tri->n, nx, ny, nz);
|
|
|
|
|
|
|
|
const TColgp_SequenceOfXYZ* vertices = it->m_domain_vertices;
|
|
|
|
gmio_stl_occ_copy_xyz(&tri->v1, vertices->Value(iv1));
|
|
|
|
gmio_stl_occ_copy_xyz(&tri->v2, vertices->Value(iv2));
|
|
|
|
gmio_stl_occ_copy_xyz(&tri->v3, vertices->Value(iv3));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-19 01:20:23 +08:00
|
|
|
void gmio_stl_occmesh_iterator::init(const StlMesh_Mesh* mesh)
|
2013-03-07 00:02:19 +08:00
|
|
|
{
|
2016-02-19 01:20:23 +08:00
|
|
|
m_mesh = mesh;
|
|
|
|
m_domain_id = 0;
|
|
|
|
m_domain_count = m_mesh != NULL ? m_mesh->NbDomains() : 0;
|
|
|
|
m_domain_triangles = NULL;
|
|
|
|
m_domain_vertices = NULL;
|
|
|
|
m_domain_first_tri_id = 0;
|
|
|
|
m_domain_last_tri_id = 0;
|
|
|
|
if (m_domain_count > 0)
|
|
|
|
this->cache_domain(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void gmio_stl_occmesh_iterator::cache_domain(int dom_id)
|
|
|
|
{
|
|
|
|
m_domain_id = dom_id;
|
|
|
|
m_domain_triangles = &m_mesh->Triangles(dom_id);
|
|
|
|
m_domain_vertices = &m_mesh->Vertices(dom_id);
|
|
|
|
const int dom_tricnt = m_domain_triangles->Length();
|
|
|
|
m_domain_first_tri_id =
|
|
|
|
dom_tricnt > 0 ? m_domain_last_tri_id : m_domain_first_tri_id;
|
|
|
|
m_domain_last_tri_id +=
|
|
|
|
dom_tricnt > 0 ? dom_tricnt - 1 : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool gmio_stl_occmesh_iterator::move_to_next_tri(uint32_t tri_id)
|
|
|
|
{
|
|
|
|
if (tri_id > m_domain_last_tri_id) {
|
|
|
|
if (m_domain_id < m_domain_count) {
|
|
|
|
++m_domain_id;
|
|
|
|
this->cache_domain(m_domain_id);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
2013-03-07 00:02:19 +08:00
|
|
|
}
|