star-stl

Load STereo Lithography (StL) file format
git clone git://git.meso-star.fr/star-stl.git
Log | Files | Refs | README | LICENSE

commit d47b34f20a96540fa15594a873a0531df5d661be
parent 121b413758f57dfa131a39d8a690c28c45c3edc9
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 11 Apr 2025 11:09:26 +0200

Add the filename member variable to the desc structure

This stores the name of the file from which the data has been loaded.

Update the load tests to check that the variable is defined correctly.

Diffstat:
Msrc/sstl.c | 10++++++++++
Msrc/sstl.h | 1+
Msrc/sstl_c.h | 3++-
Msrc/test_sstl_load_ascii.c | 21+++++++++++++++------
Msrc/test_sstl_load_binary.c | 8++++++++
5 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/sstl.c b/src/sstl.c @@ -18,6 +18,7 @@ #include "sstl.h" #include "sstl_c.h" +#include <rsys/cstr.h> #include <rsys/rsys.h> #include <rsys/float3.h> #include <rsys/stretchy_array.h> @@ -123,6 +124,12 @@ load_stream if(res != RES_OK) goto error; } + if((res = str_set(&sstl->filename, name)) != RES_OK) { + ERROR(sstl, "Error copying file name '%s' -- %s\n", + name, res_to_cstr(res)); + goto error; + } + switch(type) { case SSTL_ASCII: res = load_stream_ascii(sstl, fp, name); break; case SSTL_BINARY: res = load_stream_binary(sstl, fp, name); break; @@ -169,6 +176,7 @@ sstl_release(ref_T* ref) struct sstl* sstl; ASSERT(ref); sstl = CONTAINER_OF(ref, struct sstl, ref); + str_release(&sstl->filename); str_release(&sstl->name); htable_vertex_release(&sstl->vertex2id); sa_release(sstl->vertices); @@ -252,6 +260,7 @@ sstl_create sstl->logger = logger; sstl->verbose = verbose; htable_vertex_init(allocator, &sstl->vertex2id); + str_init(allocator, &sstl->filename); str_init(allocator, &sstl->name); exit: @@ -326,6 +335,7 @@ sstl_get_desc(struct sstl* sstl, struct sstl_desc* desc) ASSERT(sa_size(sstl->normals) % 3 == 0); ASSERT(sa_size(sstl->indices) % 3 == 0); + desc->filename = str_cget(&sstl->filename); desc->solid_name = str_len(&sstl->name) ? str_cget(&sstl->name) : NULL; desc->vertices_count = sa_size(sstl->vertices) / 3/*#coords*/; desc->triangles_count = sa_size(sstl->indices) / 3/*#ids*/; diff --git a/src/sstl.h b/src/sstl.h @@ -45,6 +45,7 @@ enum sstl_read_type { /* Descriptor of a loaded STL */ struct sstl_desc { + const char* filename; const char* solid_name; /* May be NULL <=> no name */ enum sstl_read_type read_type; /* The type of the file */ diff --git a/src/sstl_c.h b/src/sstl_c.h @@ -57,7 +57,7 @@ struct logger; struct mem_allocator; struct sstl { - int verbose; + struct str filename; struct str name; enum sstl_read_type read_type; @@ -70,6 +70,7 @@ struct sstl { struct logger* logger; struct mem_allocator* allocator; + int verbose; ref_T ref; }; diff --git a/src/test_sstl_load_ascii.c b/src/test_sstl_load_ascii.c @@ -38,6 +38,7 @@ check_api(struct sstl* sstl) #define CHECK_EMPTY_FILE { \ CHK(sstl_get_desc(sstl, &desc) == RES_OK); \ + CHK(!strcmp(desc.filename, filename)); \ CHK(desc.read_type == SSTL_ASCII); \ CHK(desc.solid_name == NULL); \ CHK(desc.vertices_count == 0); \ @@ -95,6 +96,7 @@ check_no_triangle(struct sstl* sstl) CHK(sstl_load_stream(sstl, fp, filename) == RES_OK); CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_ASCII); + CHK(!strcmp(desc.filename, filename)); CHK(!strcmp(desc.solid_name, "my_solid")); CHK(desc.vertices_count == 0); CHK(desc.triangles_count == 0); @@ -130,6 +132,7 @@ check_1_triangle(struct sstl* sstl) CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_ASCII); + CHK(!strcmp(desc.filename, filename)); CHK(desc.solid_name == NULL); CHK(desc.vertices_count == 3); CHK(desc.triangles_count == 1); @@ -171,7 +174,8 @@ check_1_triangle_with_noise(struct sstl* sstl) CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_ASCII); - CHK(strcmp(desc.solid_name, "My Solid") == 0); + CHK(!strcmp(desc.filename, filename)); + CHK(!strcmp(desc.solid_name, "My Solid")); CHK(desc.vertices_count == 3); CHK(desc.triangles_count == 1); CHK(desc.indices[0] == 0); @@ -209,6 +213,7 @@ check_1_triangle_no_normal(struct sstl* sstl) CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_ASCII); + CHK(!strcmp(desc.filename, filename)); CHK(desc.solid_name == NULL); CHK(desc.vertices_count == 3); CHK(desc.triangles_count == 1); @@ -352,6 +357,7 @@ check_tetrahedron(struct sstl* sstl) "endsolid\n" }; FILE* fp = NULL; + const char* filename = "Tetrahedron"; const size_t nlines = sizeof(tetrahedron)/sizeof(const char*); struct sstl_desc desc = SSTL_DESC_NULL; float v[3]; @@ -366,11 +372,12 @@ check_tetrahedron(struct sstl* sstl) } rewind(fp); - CHK(sstl_load_stream_ascii(sstl, fp, "Tetrahedron") == RES_OK); + CHK(sstl_load_stream_ascii(sstl, fp, filename) == RES_OK); CHK(fclose(fp) == 0); CHK(sstl_get_desc(sstl, &desc) == RES_OK); - CHK(strcmp(desc.solid_name, "cube corner") == 0); + CHK(!strcmp(desc.filename, filename)); + CHK(!strcmp(desc.solid_name, "cube corner")); CHK(desc.read_type == SSTL_ASCII); CHK(desc.vertices_count == 4); CHK(desc.triangles_count == 4); @@ -424,16 +431,18 @@ check_no_seekable_file(struct sstl* sstl) struct sstl_desc desc = SSTL_DESC_NULL; float v[3]; FILE* fp = NULL; + const char* filename = "Piped StL"; CHK(close(fd[1]) == 0); /* Clse the unused output stream */ CHK(fp = fdopen(fd[0], "r")); - CHK(sstl_load_stream(sstl, fp, "Piped StL") == RES_BAD_ARG); - CHK(sstl_load_stream_ascii(sstl, fp, "Piped StL") == RES_OK); + CHK(sstl_load_stream(sstl, fp, filename) == RES_BAD_ARG); + CHK(sstl_load_stream_ascii(sstl, fp, filename) == RES_OK); CHK(fclose(fp) == 0); CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_ASCII); - CHK(strcmp(desc.solid_name, "Triangle") == 0); + CHK(!strcmp(desc.filename, filename)); + CHK(!strcmp(desc.solid_name, "Triangle")); CHK(desc.vertices_count == 3); CHK(desc.triangles_count == 1); CHK(desc.indices[0] == 0); diff --git a/src/test_sstl_load_binary.c b/src/test_sstl_load_binary.c @@ -20,6 +20,7 @@ #include <rsys/float3.h> #include <rsys/mem_allocator.h> +#include <string.h> #include <unistd.h> /* fork, pipe */ /******************************************************************************* @@ -57,6 +58,7 @@ check_api(struct sstl* sstl) CHK(sstl_load_binary(sstl, filename) == RES_OK); CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_BINARY); + CHK(!strcmp(desc.filename, filename)); CHK(desc.solid_name == NULL); CHK(desc.vertices_count == 0); CHK(desc.triangles_count == 0); @@ -64,6 +66,7 @@ check_api(struct sstl* sstl) CHK(sstl_load_stream_binary(sstl, fp, filename) == RES_OK); CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_BINARY); + CHK(!strcmp(desc.filename, filename)); CHK(desc.solid_name == NULL); CHK(desc.vertices_count == 0); CHK(desc.triangles_count == 0); @@ -102,6 +105,7 @@ check_1_triangle(struct sstl* sstl) CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_BINARY); + CHK(!strcmp(desc.filename, filename)); CHK(desc.solid_name == NULL); CHK(desc.vertices_count == 3); CHK(desc.triangles_count == 1); @@ -143,6 +147,7 @@ check_1_triangle_no_normal(struct sstl* sstl) CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_BINARY); + CHK(!strcmp(desc.filename, filename)); CHK(desc.solid_name == NULL); CHK(desc.vertices_count == 3); CHK(desc.triangles_count == 1); @@ -190,6 +195,7 @@ check_invalid_file(struct sstl* sstl) CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_BINARY); + CHK(!strcmp(desc.filename, "Valid StL")); CHK(desc.vertices_count == 3); CHK(desc.triangles_count == 1); CHK(desc.indices[0] == 0); @@ -301,6 +307,7 @@ check_tetrahedron(struct sstl* sstl) CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_BINARY); + CHK(!strcmp(desc.filename, "Tetrahedron")); CHK(desc.solid_name == NULL); CHK(desc.vertices_count == 4); CHK(desc.triangles_count == 4); @@ -366,6 +373,7 @@ check_no_seekable_file(struct sstl* sstl) CHK(sstl_get_desc(sstl, &desc) == RES_OK); CHK(desc.read_type == SSTL_BINARY); + CHK(!strcmp(desc.filename, "Piped StL")); CHK(desc.solid_name == NULL); CHK(desc.vertices_count == 3); CHK(desc.triangles_count == 1);