diff --git a/qmake.build/c/c.pro b/qmake.build/c/c.pro deleted file mode 100644 index 2d988ec..0000000 --- a/qmake.build/c/c.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS += libstl diff --git a/qmake.build/c/libstl/libstl.pro b/qmake.build/c/libstl/libstl.pro deleted file mode 100644 index 7d10a53..0000000 --- a/qmake.build/c/libstl/libstl.pro +++ /dev/null @@ -1,73 +0,0 @@ -isEmpty(PREFIX_DIR) { - PREFIX_DIR = ../../.. -} - -include(../../config.pri) - -message($$PREFIX_DIR) - -TEMPLATE = lib -TARGET = fougdatax-c$$TARGET_SUFFIX -DESTDIR = $$PREFIX_DIR/lib - -DATAX *= stl - -dll:DEFINES *= FOUG_LIB_DLL \ - FOUG_LIB_MAKE_DLL - -#*g++*:QMAKE_CXXFLAGS_RELEASE -= -O2 -#*g++*:QMAKE_CXXFLAGS_RELEASE += -O3 - -INCLUDEPATH += ../../../src - -HEADERS += \ - ../../../src/c/endian.h \ - ../../../src/c/error.h \ - ../../../src/c/global.h \ - ../../../src/c/memory.h \ - ../../../src/c/stream.h \ - ../../../src/c/task_control.h \ - ../../../src/c/transfer.h \ - -SOURCES += \ - ../../../src/c/endian.c \ - ../../../src/c/error.c \ - ../../../src/c/stream.c \ - ../../../src/c/task_control.c - -*-g++*:QMAKE_CFLAGS += -ansi -pedantic-errors -*-msvc*:QMAKE_CFLAGS += -TC - -global_inc.path = $$PREFIX_DIR/include/datax -global_inc.files = ../../../src/*.h -c_global_inc.path = $$PREFIX_DIR/include/datax/c -c_global_inc.files = ../../../src/c/*.h -INSTALLS += global_inc c_global_inc - -contains(DATAX, stl) { - dll:DEFINES *= FOUG_DATAX_LIBSTL_DLL \ - FOUG_DATAX_LIBSTL_MAKE_DLL - - HEADERS += \ - ../../../src/c/libstl/stl_global.h \ - ../../../src/c/libstl/stla_read.h \ - ../../../src/c/libstl/stla_write.h \ - ../../../src/c/libstl/stlb_read.h \ - ../../../src/c/libstl/stlb_write.h \ - ../../../src/c/libstl/stl_triangle.h \ - ../../../src/c/libstl/stlb_triangle.h - - SOURCES += \ - ../../../src/c/libstl/stla_read.c \ - ../../../src/c/libstl/stla_write.c \ - ../../../src/c/libstl/stlb_read.c \ - ../../../src/c/libstl/stlb_write.c - - c_libstl_inc.path = $$PREFIX_DIR/include/datax/c/libstl - c_libstl_inc.files = ../../../src/c/libstl/*.h - INSTALLS += c_libstl_inc -} # contains(DATAX, stl) - -#VER_MAJ = 0 -#VER_MIN = 1 -#VER_PAT = 0 diff --git a/qmake.build/foug_datax.pro b/qmake.build/foug_datax.pro index fdb370b..644ddcc 100644 --- a/qmake.build/foug_datax.pro +++ b/qmake.build/foug_datax.pro @@ -1,4 +1,115 @@ -TEMPLATE = subdirs -CONFIG *= ordered +isEmpty(PREFIX_DIR) { + PREFIX_DIR = .. +} -SUBDIRS += c c++ +include(config.pri) + +message($$PREFIX_DIR) + +TEMPLATE = lib +TARGET = fougdatax-c$$TARGET_SUFFIX +DESTDIR = $$PREFIX_DIR/lib + +QT = + +DATAX *= stl qt4_support occ_support + +dll:DEFINES *= FOUG_LIB_DLL \ + FOUG_LIB_MAKE_DLL + +#*g++*:QMAKE_CXXFLAGS_RELEASE -= -O2 +#*g++*:QMAKE_CXXFLAGS_RELEASE += -O3 + +INCLUDEPATH += ../src + +HEADERS += \ + ../src/c/endian.h \ + ../src/c/error.h \ + ../src/c/global.h \ + ../src/c/memory.h \ + ../src/c/stream.h \ + ../src/c/task_control.h \ + ../src/c/transfer.h \ + +SOURCES += \ + ../src/c/endian.c \ + ../src/c/error.c \ + ../src/c/stream.c \ + ../src/c/task_control.c + +*-g++*:QMAKE_CFLAGS += -ansi -pedantic-errors +*-msvc*:QMAKE_CFLAGS += -TC + +global_inc.path = $$PREFIX_DIR/include/datax +global_inc.files = ../src/*.h +c_global_inc.path = $$PREFIX_DIR/include/datax/c +c_global_inc.files = ../src/c/*.h +INSTALLS += global_inc c_global_inc + +# libSTL +contains(DATAX, stl) { + dll:DEFINES *= FOUG_DATAX_LIBSTL_DLL \ + FOUG_DATAX_LIBSTL_MAKE_DLL + + HEADERS += \ + ../src/c/libstl/stl_global.h \ + ../src/c/libstl/stla_read.h \ + ../src/c/libstl/stla_write.h \ + ../src/c/libstl/stlb_read.h \ + ../src/c/libstl/stlb_write.h \ + ../src/c/libstl/stl_triangle.h \ + ../src/c/libstl/stlb_triangle.h + + SOURCES += \ + ../src/c/libstl/stla_read.c \ + ../src/c/libstl/stla_write.c \ + ../src/c/libstl/stlb_read.c \ + ../src/c/libstl/stlb_write.c + + c_libstl_inc.path = $$PREFIX_DIR/include/datax/c/libstl + c_libstl_inc.files = ../src/c/libstl/*.h + INSTALLS += c_libstl_inc +} # contains(DATAX, stl) + +# libSupport +HAS_SUPPORT = $$find(DATAX, support) +!isEmpty(HAS_SUPPORT) { + dll:DEFINES *= FOUG_LIBSUPPORT_DLL \ + FOUG_LIBSUPPORT_MAKE_DLL + support_inc.path = $$PREFIX_DIR/include/datax/c/support + support_inc.files = ../src/c/support/support_global.h + INSTALLS += support_inc +} # !isEmpty(HAS_SUPPORT) + +# qt4_support +contains(DATAX, qt4_support) { + HEADERS += ../src/c/support/qt4_stream.h + SOURCES += ../src/c/support/qt4_stream.cpp + + qt4_support_inc.path = $$PREFIX_DIR/include/datax/c/support + qt4_support_inc.files = ../src/c/support/qt4_stream.h + INSTALLS += qt4_support_inc +} # contains(DATAX, qt4_support) + +# occ_support +contains(DATAX, occ_support) { + isEmpty(CASCADE_ROOT):error(Variable CASCADE_ROOT is not defined) + + INCLUDEPATH += $$CASCADE_ROOT/inc + + !win32:DEFINES *= HAVE_CONFIG_H \ + HAVE_FSTREAM \ + HAVE_IOSTREAM \ + HAVE_LIMITS_H + + HEADERS += ../src/c/support/occ_libstl.h + SOURCES += ../src/c/support/occ_libstl.cpp + + occ_support_inc.path = $$PREFIX_DIR/include/datax/c/support + occ_support_inc.files = ../src/c/support/occ_libstl.h + INSTALLS += occ_support_inc +} # contains(DATAX, occ_support) + +#VER_MAJ = 0 +#VER_MIN = 1 +#VER_PAT = 0 diff --git a/src/c/support/occ_libstl.cpp b/src/c/support/occ_libstl.cpp new file mode 100644 index 0000000..0b55d9a --- /dev/null +++ b/src/c/support/occ_libstl.cpp @@ -0,0 +1,124 @@ +#include "occ_libstl.h" + +#include +#include +#include +#include +#include + +/* ASCII STL */ + +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); +} + +static void occ_mesh_stla_igeom_begin_solid(foug_stla_geom_input_t* geom, const char* /*name*/) +{ + Handle_StlMesh_Mesh* mesh = static_cast(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(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(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(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(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(geom->cookie); + + const StlMesh_SequenceOfMeshTriangle& meshTriangles = (*mesh)->Triangles(1); + const Handle_StlMesh_MeshTriangle tri = meshTriangles.Value(index + 1); + 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); + facet->data.normal.x = xN; + facet->data.normal.y = yN; + facet->data.normal.z = zN; + + 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); + facet->data.v1.x = coordsV1.X(); + facet->data.v2.x = coordsV2.X(); + facet->data.v3.x = coordsV3.X(); + + facet->data.v1.y = coordsV1.Y(); + facet->data.v2.y = coordsV2.Y(); + facet->data.v3.y = coordsV3.Y(); + + facet->data.v1.z = coordsV1.Z(); + facet->data.v2.z = coordsV2.Z(); + facet->data.v3.z = coordsV3.Z(); + + 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; +} diff --git a/src/c/support/occ_libstl.h b/src/c/support/occ_libstl.h new file mode 100644 index 0000000..1ccc4b3 --- /dev/null +++ b/src/c/support/occ_libstl.h @@ -0,0 +1,30 @@ +#ifndef FOUG_SUPPORT_OCC_LIBSTL_H +#define FOUG_SUPPORT_OCC_LIBSTL_H + +extern "C" { +#include "support_global.h" +#include "../libstl/stla_read.h" +#include "../libstl/stla_write.h" +#include "../libstl/stlb_read.h" +#include "../libstl/stlb_write.h" +} + +#include + +/* ASCII STL */ + +FOUG_LIBSUPPORT_EXPORT +void foug_stla_geom_input_set_occmesh(foug_stla_geom_input_t* input, Handle_StlMesh_Mesh* mesh); + +FOUG_LIBSUPPORT_EXPORT +void foug_stla_geom_output_set_occmesh(foug_stla_geom_output_t* output, Handle_StlMesh_Mesh* mesh); + +/* Binary STL */ + +FOUG_LIBSUPPORT_EXPORT +void foug_stlb_geom_input_set_occmesh(foug_stlb_geom_input_t* input, Handle_StlMesh_Mesh* mesh); + +FOUG_LIBSUPPORT_EXPORT +void foug_stlb_geom_output_set_occmesh(foug_stlb_geom_output_t* output, Handle_StlMesh_Mesh* mesh); + +#endif /* FOUG_SUPPORT_OCC_LIBSTL_H */ diff --git a/src/c/support/qt4_stream.cpp b/src/c/support/qt4_stream.cpp new file mode 100644 index 0000000..8885085 --- /dev/null +++ b/src/c/support/qt4_stream.cpp @@ -0,0 +1,52 @@ +#include "qt4_stream.h" + +#include +#include + +static foug_bool_t foug_stream_qiodevice_at_end(foug_stream_t* stream) +{ + return static_cast(stream->cookie)->atEnd(); +} + +static int32_t foug_stream_qiodevice_error(foug_stream_t* stream) +{ + const QIODevice* device = static_cast(stream->cookie); + const QFile* file = dynamic_cast(device); + if (file != NULL) { + return file->error(); + } + else { + const QString err_str = static_cast(stream->cookie)->errorString(); + return !err_str.isEmpty() ? 1 : 0; + } + return 0; +} + +static size_t foug_stream_qiodevice_read(foug_stream_t* stream, + void* ptr, + size_t item_size, + size_t item_count) +{ + QIODevice* device = static_cast(stream->cookie); + const qint64 c = device->read(static_cast(ptr), item_size * item_count); + return c / item_size; +} + +static size_t foug_stream_qiodevice_write(foug_stream_t* stream, + const void* ptr, + size_t item_size, + size_t item_count) +{ + QIODevice* device = static_cast(stream->cookie); + const qint64 c = device->write(static_cast(ptr), item_size * item_count); + return c / item_size; +} + +void foug_stream_set_qiodevice(foug_stream_t* stream, QIODevice* device) +{ + stream->cookie = device; + stream->at_end_func = foug_stream_qiodevice_at_end; + stream->error_func = foug_stream_qiodevice_error; + stream->read_func = foug_stream_qiodevice_read; + stream->write_func = foug_stream_qiodevice_write; +} diff --git a/src/c/support/qt4_stream.h b/src/c/support/qt4_stream.h new file mode 100644 index 0000000..6b22f42 --- /dev/null +++ b/src/c/support/qt4_stream.h @@ -0,0 +1,13 @@ +#ifndef FOUG_SUPPORT_QT4_STREAM_H +#define FOUG_SUPPORT_QT4_STREAM_H + +extern "C" { +#include "support_global.h" +#include "../stream.h" +} +class QIODevice; + +FOUG_LIBSUPPORT_EXPORT +void foug_stream_set_qiodevice(foug_stream_t* stream, QIODevice* device); + +#endif /* FOUG_SUPPORT_QT4_STREAM_H */ diff --git a/src/c/support/support_global.h b/src/c/support/support_global.h new file mode 100644 index 0000000..c180bb3 --- /dev/null +++ b/src/c/support/support_global.h @@ -0,0 +1,16 @@ +#ifndef FOUG_C_SUPPORT_GLOBAL_H +#define FOUG_C_SUPPORT_GLOBAL_H + +#include "../global.h" + +#ifdef FOUG_LIBSUPPORT_DLL +# ifdef FOUG_LIBSUPPORT_MAKE_DLL +# define FOUG_LIBSUPPORT_EXPORT FOUG_DECL_EXPORT +# else +# define FOUG_LIBSUPPORT_EXPORT FOUG_DECL_IMPORT +# endif /* FOUG_LIBSUPPORT_MAKE_DLL */ +#else +# define FOUG_LIBSUPPORT_EXPORT +#endif /* FOUG_LIBSUPPORT_DLL */ + +#endif /* FOUG_C_SUPPORT_GLOBAL_H */