diff --git a/src/gmio_core/internal/helper_stream.h b/src/gmio_core/internal/helper_stream.h index ed3c833..615d1b0 100644 --- a/src/gmio_core/internal/helper_stream.h +++ b/src/gmio_core/internal/helper_stream.h @@ -28,10 +28,16 @@ GMIO_INLINE int gmio_stream_error(struct gmio_stream* stream); GMIO_INLINE size_t gmio_stream_read( struct gmio_stream* stream, void *ptr, size_t size, size_t count); +GMIO_INLINE size_t gmio_stream_read_bytes( + struct gmio_stream* stream, void *ptr, size_t count); + /*! Safe and convenient function for gmio_stream::func_write() */ GMIO_INLINE size_t gmio_stream_write( struct gmio_stream* stream, const void *ptr, size_t size, size_t count); +GMIO_INLINE size_t gmio_stream_write_bytes( + struct gmio_stream* stream, const void *ptr, size_t count); + /*! Safe and convenient function for gmio_stream::func_size() */ GMIO_INLINE gmio_streamsize_t gmio_stream_size(struct gmio_stream* stream); @@ -75,6 +81,14 @@ size_t gmio_stream_read( return 0; } +size_t gmio_stream_read_bytes( + struct gmio_stream* stream, void *ptr, size_t count) +{ + if (stream != NULL && stream->func_read != NULL) + return stream->func_read(stream->cookie, ptr, 1, count); + return 0; +} + size_t gmio_stream_write( struct gmio_stream* stream, const void *ptr, size_t size, size_t count) { @@ -83,6 +97,14 @@ size_t gmio_stream_write( return 0; } +size_t gmio_stream_write_bytes( + struct gmio_stream* stream, const void *ptr, size_t count) +{ + if (stream != NULL && stream->func_write != NULL) + return stream->func_write(stream->cookie, ptr, 1, count); + return 0; +} + gmio_streamsize_t gmio_stream_size(struct gmio_stream* stream) { if (stream != NULL && stream->func_size != NULL) diff --git a/src/gmio_core/internal/stringstream.c b/src/gmio_core/internal/stringstream.c index e1da743..804df17 100644 --- a/src/gmio_core/internal/stringstream.c +++ b/src/gmio_core/internal/stringstream.c @@ -23,6 +23,7 @@ struct gmio_stringstream gmio_stringstream( struct gmio_stringstream sstream = {0}; sstream.stream = stream; sstream.strbuff = strbuff; + sstream.func_stream_read = gmio_stringstream_default_func_read; gmio_stringstream_init_pos(&sstream); return sstream; } diff --git a/src/gmio_core/internal/stringstream.h b/src/gmio_core/internal/stringstream.h index f39c00b..29e9a15 100644 --- a/src/gmio_core/internal/stringstream.h +++ b/src/gmio_core/internal/stringstream.h @@ -41,12 +41,12 @@ struct gmio_stringstream /*! Position indicator in strbuff */ const char* strbuff_at; - /*! User data to be passed to callback func_stream_read_hook */ + /*! Data to be passed to callback func_stream_read */ void* cookie; - /*! Pointer on user function called each time next contents is read */ - void (*func_stream_read_hook)( - void* cookie, const struct gmio_string* strbuff); + /*! Pointer on a function called each time next contents has to be read */ + size_t (*func_stream_read)( + void* cookie, struct gmio_stream* stream, char* ptr, size_t len); }; /*! Returns an initialized gmio_stringstream object */ @@ -57,6 +57,10 @@ struct gmio_stringstream gmio_stringstream( /*! Initializes position indicator */ void gmio_stringstream_init_pos(struct gmio_stringstream* sstream); +/*! Default function for gmio_stringstream::func_stream_read */ +GMIO_INLINE size_t gmio_stringstream_default_func_read( + void* cookie, struct gmio_stream* stream, char* ptr, size_t len); + /*! Returns the char where the iterator is currently pointing at */ GMIO_INLINE const char* gmio_stringstream_current_char( const struct gmio_stringstream* sstream); @@ -142,6 +146,13 @@ const char* gmio_stringstream_current_char( NULL; } +size_t gmio_stringstream_default_func_read( + void* cookie, struct gmio_stream* stream, char* ptr, size_t len) +{ + GMIO_UNUSED(cookie); + return gmio_stream_read(stream, ptr, 1, len); +} + const char *gmio_stringstream_next_char(struct gmio_stringstream *sstream) { ++(sstream->strbuff_at); @@ -151,15 +162,13 @@ const char *gmio_stringstream_next_char(struct gmio_stringstream *sstream) /* Read next chunk of data */ sstream->strbuff_at = sstream->strbuff.ptr; sstream->strbuff.len = - gmio_stream_read( - &sstream->stream, sstream->strbuff.ptr, 1, sstream->strbuff.max_len); + sstream->func_stream_read( + sstream->cookie, + &sstream->stream, + sstream->strbuff.ptr, + sstream->strbuff.max_len); sstream->strbuff_end = sstream->strbuff.ptr + sstream->strbuff.len; - if (sstream->strbuff.len > 0) { - if (sstream->func_stream_read_hook != NULL) - sstream->func_stream_read_hook(sstream->cookie, &sstream->strbuff); - return sstream->strbuff.ptr; - } - return NULL; + return sstream->strbuff.len > 0 ? sstream->strbuff.ptr : NULL; } struct gmio_stringstream* gmio_stringstream_move_next_char( diff --git a/src/gmio_stl/internal/stla_infos_get.c b/src/gmio_stl/internal/stla_infos_get.c index f011306..bfc7114 100644 --- a/src/gmio_stl/internal/stla_infos_get.c +++ b/src/gmio_stl/internal/stla_infos_get.c @@ -50,12 +50,14 @@ static bool gmio_stringstream_icase_eat( } /* Callback invoked by gmio_stringstream */ -static void gmio_stringstream_update_streamsize( - void* cookie, const struct gmio_string* strbuff) +static size_t gmio_stringstream_read( + void* cookie, struct gmio_stream* stream, char* ptr, size_t len) { gmio_streamsize_t* ptr_size = (gmio_streamsize_t*)(cookie); + const size_t len_read = gmio_stream_read_bytes(stream, ptr, len); if (ptr_size != NULL) - *ptr_size += strbuff->len; + *ptr_size += len_read; + return len_read; } int gmio_stla_infos_get( @@ -88,7 +90,7 @@ int gmio_stla_infos_get( if (flag_size) { infos->size = 0; sstream.cookie = &infos->size; - sstream.func_stream_read_hook = gmio_stringstream_update_streamsize; + sstream.func_stream_read = gmio_stringstream_read; } gmio_stringstream_init_pos(&sstream); diff --git a/src/gmio_stl/internal/stlb_infos_get.c b/src/gmio_stl/internal/stlb_infos_get.c index b769bf1..f96495f 100644 --- a/src/gmio_stl/internal/stlb_infos_get.c +++ b/src/gmio_stl/internal/stlb_infos_get.c @@ -57,13 +57,16 @@ int gmio_stlb_infos_get( memcpy(infos->stlb_header.data, buff, GMIO_STLB_HEADER_SIZE); if (flags & GMIO_STL_INFO_FLAG_FACET_COUNT) infos->facet_count = facet_count; - if (flags & GMIO_STL_INFO_FLAG_SIZE) { - infos->size = - GMIO_STLB_HEADER_SIZE - + sizeof(uint32_t) - + facet_count * GMIO_STLB_TRIANGLE_RAWSIZE; - } + if (flags & GMIO_STL_INFO_FLAG_SIZE) + infos->size = gmio_stlb_infos_size(facet_count); } return GMIO_ERROR_OK; } + +gmio_streamsize_t gmio_stlb_infos_size(uint32_t facet_count) +{ + return GMIO_STLB_HEADER_SIZE + + sizeof(uint32_t) + + facet_count * GMIO_STLB_TRIANGLE_RAWSIZE; +} diff --git a/src/gmio_stl/internal/stlb_infos_get.h b/src/gmio_stl/internal/stlb_infos_get.h index 3a721b3..cbf7af1 100644 --- a/src/gmio_stl/internal/stlb_infos_get.h +++ b/src/gmio_stl/internal/stlb_infos_get.h @@ -19,11 +19,15 @@ #include "../stl_infos.h" #include "../../gmio_core/endian.h" -/*! Find infos from a STL binary stream */ +/*! Finds infos from a STL binary stream */ int gmio_stlb_infos_get( struct gmio_stl_infos* infos, struct gmio_stream stream, unsigned flags, const struct gmio_stl_infos_get_options* opts); +/*! Returns the size(in bytes) of the whole STL binary data given some facet + * count */ +gmio_streamsize_t gmio_stlb_infos_size(uint32_t facet_count); + #endif /* GMIO_INTERNAL_STLB_INFOS_GET_H */ diff --git a/src/gmio_stl/stl_infos.c b/src/gmio_stl/stl_infos.c index fbf3c8f..651114f 100644 --- a/src/gmio_stl/stl_infos.c +++ b/src/gmio_stl/stl_infos.c @@ -73,3 +73,14 @@ label_end: gmio_memblock_helper_release(&mblock_helper); return error; } + +gmio_streamsize_t gmio_stla_infos_get_streamsize( + struct gmio_stream *stream, struct gmio_memblock *stream_memblock) +{ + struct gmio_stl_infos infos = {0}; + struct gmio_stl_infos_get_options options = {0}; + options.stream_memblock = *stream_memblock; + options.format_hint = GMIO_STL_FORMAT_ASCII; + gmio_stl_infos_get(&infos, *stream, GMIO_STL_INFO_FLAG_SIZE, &options); + return infos.size; +} diff --git a/src/gmio_stl/stl_infos.h b/src/gmio_stl/stl_infos.h index 006cbb2..a00c92f 100644 --- a/src/gmio_stl/stl_infos.h +++ b/src/gmio_stl/stl_infos.h @@ -117,6 +117,15 @@ int gmio_stl_infos_get( unsigned flags, /*!< Bitor combination of gmio_stl_info_flag values */ const struct gmio_stl_infos_get_options* options); +/*! Returns the size(in bytes) of next STL ascii solid in \p stream + * + * It is a facade over gmio_stl_infos_get() for gmio_stl_infos::size only + */ +GMIO_LIBSTL_EXPORT +gmio_streamsize_t gmio_stla_infos_get_streamsize( + struct gmio_stream* stream, + struct gmio_memblock* stream_memblock); + GMIO_C_LINKAGE_END #endif /* GMIO_STL_INFOS_H */ diff --git a/src/gmio_stl/stla_read.c b/src/gmio_stl/stla_read.c index 6745296..b23b2c9 100644 --- a/src/gmio_stl/stla_read.c +++ b/src/gmio_stl/stla_read.c @@ -82,19 +82,24 @@ */ -/* Callback used for gmio_stringstream::func_stream_read_hook */ -static void gmio_stringstream_stla_read_hook( - void* cookie, const struct gmio_string* strbuff) +/* Callback used for gmio_stringstream::func_stream_read */ +static size_t gmio_stringstream_stla_read( + void* cookie, struct gmio_stream* stream, char* ptr, size_t len) { - struct gmio_stringstream_stla_cookie* tcookie = + struct gmio_stringstream_stla_cookie* stlac = (struct gmio_stringstream_stla_cookie*)(cookie); - if (tcookie != NULL) { - const struct gmio_task_iface* task = tcookie->task; - tcookie->stream_offset += strbuff->len; - tcookie->is_stop_requested = gmio_task_iface_is_stop_requested(task); + if (stlac != NULL) { + const struct gmio_task_iface* task = stlac->task; + const size_t to_read = + GMIO_MIN(len, stlac->stream_size - stlac->stream_offset + 1); + const size_t len_read = gmio_stream_read_bytes(stream, ptr, to_read); + stlac->stream_offset += len_read; + stlac->is_stop_requested = gmio_task_iface_is_stop_requested(task); gmio_task_iface_handle_progress( - task, tcookie->stream_offset, tcookie->stream_size); + task, stlac->stream_offset, stlac->stream_size); + return len_read; } + return 0; } /* Root function, parses a whole solid */ @@ -127,7 +132,7 @@ int gmio_stla_read( parse_data.strstream.strbuff.ptr = mblock->ptr; parse_data.strstream.strbuff.max_len = mblock->size; parse_data.strstream.cookie = &parse_data.strstream_cookie; - parse_data.strstream.func_stream_read_hook = gmio_stringstream_stla_read_hook; + parse_data.strstream.func_stream_read = gmio_stringstream_stla_read; gmio_stringstream_init_pos(&parse_data.strstream); parse_data.token_str = gmio_string(fixed_buffer, 0, sizeof(fixed_buffer)); @@ -532,8 +537,11 @@ int gmio_stla_parse_solidname_beg(struct gmio_stla_parse_data* data) int parse_solidname_end(struct gmio_stla_parse_data* data) { - GMIO_UNUSED(data); - /* TODO: parse according to retrieved solid name */ + struct gmio_stringstream* sstream = &data->strstream; + /* Eat whole line after "endsolid" */ + const char* c = gmio_stringstream_current_char(sstream); + while (c != NULL && *c != '\n' && *c != '\r') + c = gmio_stringstream_next_char(sstream); return 0; } diff --git a/src/gmio_stl/stlb_read.c b/src/gmio_stl/stlb_read.c index d2ed88c..1f3725f 100644 --- a/src/gmio_stl/stlb_read.c +++ b/src/gmio_stl/stlb_read.c @@ -28,6 +28,7 @@ #include "../gmio_core/internal/helper_memblock.h" #include "../gmio_core/internal/helper_stream.h" #include "../gmio_core/internal/helper_task_iface.h" +#include "../gmio_core/internal/min_max.h" #include "../gmio_core/internal/safe_cast.h" #include @@ -98,19 +99,18 @@ int gmio_stlb_read( struct gmio_memblock_helper mblock_helper = gmio_memblock_helper(opts != NULL ? &opts->stream_memblock : NULL); struct gmio_memblock* mblock = &mblock_helper.memblock; - void* mblock_ptr = mblock->ptr; const struct gmio_task_iface* task = opts != NULL ? &opts->task_iface : NULL; struct gmio_stlb_header header; uint32_t i_facet = 0; /* Facet counter */ uint32_t total_facet_count = 0; /* Facet count, as declared in the stream */ - int error = GMIO_ERROR_OK; /* Helper to store function result error code */ + int error = GMIO_ERROR_OK; /* Function result(error code) */ /* Constants */ const func_gmio_stlb_decode_facets_t func_decode_facets = byte_order != GMIO_ENDIANNESS_HOST ? gmio_stlb_decode_facets_byteswap : gmio_stlb_decode_facets; const uint32_t max_facet_count_per_read = - gmio_size_to_uint32(mblock->size / GMIO_STLB_TRIANGLE_RAWSIZE); + gmio_size_to_uint32(mblock->size / GMIO_STLB_TRIANGLE_RAWSIZE); /* Check validity of input parameters */ if (!gmio_check_memblock_size(&error, mblock, GMIO_STLB_MIN_CONTENTS_SIZE)) @@ -119,22 +119,17 @@ int gmio_stlb_read( goto label_end; /* Read header */ - if (gmio_stream_read(&stream, &header, GMIO_STLB_HEADER_SIZE, 1) - != 1) - { + if (gmio_stream_read(&stream, &header, GMIO_STLB_HEADER_SIZE, 1) != 1) { error = GMIO_STL_ERROR_HEADER_WRONG_SIZE; goto label_end; } /* Read facet count */ - if (gmio_stream_read(&stream, mblock_ptr, sizeof(uint32_t), 1) - != 1) - { + if (gmio_stream_read(&stream, mblock->ptr, sizeof(uint32_t), 1) != 1) { error = GMIO_STL_ERROR_FACET_COUNT; goto label_end; } - - memcpy(&total_facet_count, mblock_ptr, sizeof(uint32_t)); + memcpy(&total_facet_count, mblock->ptr, sizeof(uint32_t)); if (byte_order != GMIO_ENDIANNESS_HOST) total_facet_count = gmio_uint32_bswap(total_facet_count); @@ -153,13 +148,16 @@ int gmio_stlb_read( /* Read triangles */ gmio_task_iface_handle_progress(task, 0, total_facet_count); while (gmio_no_error(error) && i_facet < total_facet_count) { + const uint32_t facet_count_to_read = + GMIO_MIN(max_facet_count_per_read, + total_facet_count - i_facet); const uint32_t read_facet_count = gmio_size_to_uint32( gmio_stream_read( &stream, - mblock_ptr, + mblock->ptr, GMIO_STLB_TRIANGLE_RAWSIZE, - max_facet_count_per_read)); + facet_count_to_read)); if (gmio_stream_error(&stream) != 0) error = GMIO_ERROR_STREAM; @@ -170,7 +168,7 @@ int gmio_stlb_read( if (gmio_no_error(error)) { func_decode_facets( - &mesh_creator, mblock_ptr, read_facet_count, i_facet); + &mesh_creator, mblock->ptr, read_facet_count, i_facet); i_facet += read_facet_count; if (gmio_task_iface_is_stop_requested(task)) error = GMIO_ERROR_TRANSFER_STOPPED; diff --git a/tests/main_test_stl.c b/tests/main_test_stl.c index 2e08dd1..8cb43a6 100644 --- a/tests/main_test_stl.c +++ b/tests/main_test_stl.c @@ -15,6 +15,8 @@ #include "utest_lib.h" +#include "../src/gmio_core/memblock.h" + const char* test_stl_coords_packing(); const char* test_stl_triangle_packing(); const char* test_stl_triangle_compute_normal(); @@ -24,6 +26,7 @@ const char* test_stl_internal__rw_common(); const char* test_stl_infos(); const char* test_stl_read(); +const char* test_stl_read_multi_solid(); const char* test_stla_write(); const char* test_stlb_write_header(); const char* test_stlb_write(); @@ -31,10 +34,21 @@ const char* test_stlb_write(); const char* test_stlb_header_str(); const char* test_stlb_header_to_printable_str(); +void generate_stlb_tests_models(); + +/* Static memblock */ +struct gmio_memblock gmio_memblock_for_tests() +{ + static uint8_t buff[1024]; /* 1KB */ + return gmio_memblock(buff, sizeof(buff), NULL); +} + const char* all_tests() { UTEST_SUITE_START(); + gmio_memblock_set_default_constructor(gmio_memblock_for_tests); + UTEST_RUN(test_stl_coords_packing); UTEST_RUN(test_stl_triangle_packing); UTEST_RUN(test_stl_triangle_compute_normal); @@ -44,6 +58,7 @@ const char* all_tests() UTEST_RUN(test_stl_infos); UTEST_RUN(test_stl_read); + UTEST_RUN(test_stl_read_multi_solid); UTEST_RUN(test_stla_write); UTEST_RUN(test_stlb_write_header); UTEST_RUN(test_stlb_write); @@ -51,6 +66,10 @@ const char* all_tests() UTEST_RUN(test_stlb_header_str); UTEST_RUN(test_stlb_header_to_printable_str); +#if 0 + generate_stlb_tests_models(); +#endif + return NULL; } UTEST_MAIN(all_tests) diff --git a/tests/models/solid_4meshs.le_stlb b/tests/models/solid_4meshs.le_stlb new file mode 100644 index 0000000..dfcb845 Binary files /dev/null and b/tests/models/solid_4meshs.le_stlb differ diff --git a/tests/models/solid_4meshs.stla b/tests/models/solid_4meshs.stla new file mode 100644 index 0000000..fb7dff8 --- /dev/null +++ b/tests/models/solid_4meshs.stla @@ -0,0 +1,1607 @@ +solid mesh1 +facet normal 0.146978E+00 0.437754E-01 -0.988171E+00 + outer loop + vertex 0.600648E+02 0.582387E+02 0.589680E+01 + vertex 0.610294E+02 0.550000E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal 0.101186E+00 0.115379E+00 -0.988154E+00 + outer loop + vertex 0.575270E+02 0.604644E+02 0.589680E+01 + vertex 0.600649E+02 0.582387E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal 0.208742E-01 0.152508E+00 -0.988082E+00 + outer loop + vertex 0.541319E+02 0.609291E+02 0.589680E+01 + vertex 0.575270E+02 0.604644E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal -0.629667E-01 0.140237E+00 -0.988114E+00 + outer loop + vertex 0.510406E+02 0.595411E+02 0.589680E+01 + vertex 0.541319E+02 0.609291E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal -0.129415E+00 0.823123E-01 -0.988168E+00 + outer loop + vertex 0.492226E+02 0.566827E+02 0.589680E+01 + vertex 0.510407E+02 0.595412E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal -0.153390E+00 0.452030E-05 -0.988166E+00 + outer loop + vertex 0.492226E+02 0.533171E+02 0.589680E+01 + vertex 0.492227E+02 0.566827E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal -0.129419E+00 -0.823026E-01 -0.988169E+00 + outer loop + vertex 0.510406E+02 0.504586E+02 0.589680E+01 + vertex 0.492227E+02 0.533172E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal -0.171880E+00 0.171880E+00 0.970007E+00 + outer loop + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + vertex 0.549999E+02 0.549999E+02 0.500000E+01 + vertex 0.541319E+02 0.490708E+02 0.589680E+01 + endloop +endfacet +facet normal -0.629632E-01 -0.140235E+00 -0.988114E+00 + outer loop + vertex 0.541319E+02 0.490708E+02 0.589680E+01 + vertex 0.510407E+02 0.504587E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal 0.110832E+00 -0.110832E+00 -0.987640E+00 + outer loop + vertex 0.549999E+02 0.549999E+02 0.500000E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + vertex 0.575270E+02 0.495355E+02 0.589680E+01 + endloop +endfacet +facet normal 0.208696E-01 -0.152507E+00 -0.988082E+00 + outer loop + vertex 0.575270E+02 0.495354E+02 0.589680E+01 + vertex 0.541319E+02 0.490708E+02 0.589680E+01 + vertex 0.549999E+02 0.549999E+02 0.500000E+01 + endloop +endfacet +facet normal -0.106762E+00 0.106762E+00 0.988536E+00 + outer loop + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + vertex 0.549999E+02 0.549999E+02 0.500000E+01 + vertex 0.600649E+02 0.517612E+02 0.589680E+01 + endloop +endfacet +facet normal 0.101184E+00 -0.115378E+00 -0.988155E+00 + outer loop + vertex 0.600648E+02 0.517611E+02 0.589680E+01 + vertex 0.575270E+02 0.495355E+02 0.589680E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + endloop +endfacet +facet normal 0.145553E+00 -0.145553E+00 -0.978585E+00 + outer loop + vertex 0.549999E+02 0.549999E+02 0.500000E+01 + vertex 0.550000E+02 0.550000E+02 0.500000E+01 + vertex 0.610294E+02 0.550000E+02 0.589680E+01 + endloop +endfacet +facet normal 0.146979E+00 -0.437652E-01 -0.988171E+00 + outer loop + vertex 0.610293E+02 0.550000E+02 0.589680E+01 + vertex 0.600649E+02 0.517612E+02 0.589680E+01 + vertex 0.549999E+02 0.549999E+02 0.500000E+01 + endloop +endfacet +facet normal 0.425304E+00 0.126658E+00 -0.896144E+00 + outer loop + vertex 0.610294E+02 0.550000E+02 0.589680E+01 + vertex 0.600649E+02 0.582387E+02 0.589680E+01 + vertex 0.644555E+02 0.610713E+02 0.838090E+01 + endloop +endfacet +facet normal 0.424957E+00 0.126907E+00 -0.896274E+00 + outer loop + vertex 0.644554E+02 0.610713E+02 0.838090E+01 + vertex 0.662685E+02 0.550000E+02 0.838090E+01 + vertex 0.610293E+02 0.550000E+02 0.589680E+01 + endloop +endfacet +facet normal 0.291905E+00 0.332850E+00 -0.896662E+00 + outer loop + vertex 0.600649E+02 0.582387E+02 0.589680E+01 + vertex 0.575270E+02 0.604644E+02 0.589680E+01 + vertex 0.597081E+02 0.652435E+02 0.838090E+01 + endloop +endfacet +facet normal 0.292483E+00 0.332821E+00 -0.896484E+00 + outer loop + vertex 0.597080E+02 0.652434E+02 0.838090E+01 + vertex 0.644555E+02 0.610713E+02 0.838090E+01 + vertex 0.600648E+02 0.582387E+02 0.589680E+01 + endloop +endfacet +facet normal 0.599893E-01 0.438283E+00 -0.896833E+00 + outer loop + vertex 0.575270E+02 0.604644E+02 0.589680E+01 + vertex 0.541319E+02 0.609291E+02 0.589680E+01 + vertex 0.533835E+02 0.661146E+02 0.838090E+01 + endloop +endfacet +facet normal 0.603975E-01 0.438521E+00 -0.896689E+00 + outer loop + vertex 0.533834E+02 0.661146E+02 0.838090E+01 + vertex 0.597081E+02 0.652435E+02 0.838090E+01 + vertex 0.575270E+02 0.604644E+02 0.589680E+01 + endloop +endfacet +facet normal -0.181487E+00 0.404217E+00 -0.896477E+00 + outer loop + vertex 0.541319E+02 0.609291E+02 0.589680E+01 + vertex 0.510407E+02 0.595412E+02 0.589680E+01 + vertex 0.476164E+02 0.635130E+02 0.838090E+01 + endloop +endfacet +facet normal -0.181951E+00 0.403339E+00 -0.896778E+00 + outer loop + vertex 0.476164E+02 0.635130E+02 0.838090E+01 + vertex 0.533835E+02 0.661146E+02 0.838090E+01 + vertex 0.541319E+02 0.609291E+02 0.589680E+01 + endloop +endfacet +facet normal -0.374072E+00 0.237909E+00 -0.896365E+00 + outer loop + vertex 0.510407E+02 0.595412E+02 0.589680E+01 + vertex 0.492227E+02 0.566827E+02 0.589680E+01 + vertex 0.442062E+02 0.581544E+02 0.838090E+01 + endloop +endfacet +facet normal -0.374086E+00 0.238070E+00 -0.896316E+00 + outer loop + vertex 0.442061E+02 0.581543E+02 0.838090E+01 + vertex 0.476164E+02 0.635130E+02 0.838090E+01 + vertex 0.510406E+02 0.595411E+02 0.589680E+01 + endloop +endfacet +facet normal -0.443759E+00 0.000000E+00 -0.896146E+00 + outer loop + vertex 0.492227E+02 0.566827E+02 0.589680E+01 + vertex 0.492227E+02 0.533172E+02 0.589680E+01 + vertex 0.442062E+02 0.518455E+02 0.838090E+01 + endloop +endfacet +facet normal -0.443765E+00 0.697642E-05 -0.896143E+00 + outer loop + vertex 0.442061E+02 0.518455E+02 0.838090E+01 + vertex 0.442062E+02 0.581544E+02 0.838090E+01 + vertex 0.492226E+02 0.566827E+02 0.589680E+01 + endloop +endfacet +facet normal -0.374180E+00 -0.237978E+00 -0.896301E+00 + outer loop + vertex 0.492227E+02 0.533172E+02 0.589680E+01 + vertex 0.510407E+02 0.504587E+02 0.589680E+01 + vertex 0.476164E+02 0.464869E+02 0.838090E+01 + endloop +endfacet +facet normal -0.374037E+00 -0.238036E+00 -0.896345E+00 + outer loop + vertex 0.476164E+02 0.464869E+02 0.838090E+01 + vertex 0.442062E+02 0.518455E+02 0.838090E+01 + vertex 0.492226E+02 0.533171E+02 0.589680E+01 + endloop +endfacet +facet normal -0.181163E+00 -0.403496E+00 -0.896868E+00 + outer loop + vertex 0.510407E+02 0.504587E+02 0.589680E+01 + vertex 0.541319E+02 0.490708E+02 0.589680E+01 + vertex 0.533835E+02 0.438853E+02 0.838090E+01 + endloop +endfacet +facet normal -0.182136E+00 -0.403728E+00 -0.896565E+00 + outer loop + vertex 0.533834E+02 0.438852E+02 0.838090E+01 + vertex 0.476164E+02 0.464869E+02 0.838090E+01 + vertex 0.510406E+02 0.504586E+02 0.589680E+01 + endloop +endfacet +facet normal 0.600409E-01 -0.438660E+00 -0.896645E+00 + outer loop + vertex 0.541319E+02 0.490708E+02 0.589680E+01 + vertex 0.575270E+02 0.495355E+02 0.589680E+01 + vertex 0.597081E+02 0.447564E+02 0.838090E+01 + endloop +endfacet +facet normal 0.603715E-01 -0.438318E+00 -0.896790E+00 + outer loop + vertex 0.597080E+02 0.447564E+02 0.838090E+01 + vertex 0.533835E+02 0.438853E+02 0.838090E+01 + vertex 0.541319E+02 0.490708E+02 0.589680E+01 + endloop +endfacet +facet normal 0.292214E+00 -0.333203E+00 -0.896430E+00 + outer loop + vertex 0.575270E+02 0.495355E+02 0.589680E+01 + vertex 0.600649E+02 0.517612E+02 0.589680E+01 + vertex 0.644555E+02 0.489286E+02 0.838090E+01 + endloop +endfacet +facet normal 0.292335E+00 -0.332631E+00 -0.896603E+00 + outer loop + vertex 0.644554E+02 0.489286E+02 0.838090E+01 + vertex 0.597081E+02 0.447564E+02 0.838090E+01 + vertex 0.575270E+02 0.495354E+02 0.589680E+01 + endloop +endfacet +facet normal 0.424982E+00 -0.126558E+00 -0.896311E+00 + outer loop + vertex 0.600649E+02 0.517612E+02 0.589680E+01 + vertex 0.610294E+02 0.550000E+02 0.589680E+01 + vertex 0.662685E+02 0.550000E+02 0.838090E+01 + endloop +endfacet +facet normal 0.425132E+00 -0.126950E+00 -0.896184E+00 + outer loop + vertex 0.662685E+02 0.550000E+02 0.838090E+01 + vertex 0.644555E+02 0.489286E+02 0.838090E+01 + vertex 0.600648E+02 0.517611E+02 0.589680E+01 + endloop +endfacet +facet normal 0.654949E+00 0.195580E+00 -0.729925E+00 + outer loop + vertex 0.662685E+02 0.550000E+02 0.838090E+01 + vertex 0.644555E+02 0.610713E+02 0.838090E+01 + vertex 0.679673E+02 0.633517E+02 0.121430E+02 + endloop +endfacet +facet normal 0.654472E+00 0.195833E+00 -0.730285E+00 + outer loop + vertex 0.679673E+02 0.633516E+02 0.121429E+02 + vertex 0.704664E+02 0.550000E+02 0.121430E+02 + vertex 0.662685E+02 0.550000E+02 0.838090E+01 + endloop +endfacet +facet normal 0.449997E+00 0.512036E+00 -0.731657E+00 + outer loop + vertex 0.644555E+02 0.610713E+02 0.838090E+01 + vertex 0.597081E+02 0.652435E+02 0.838090E+01 + vertex 0.614469E+02 0.690911E+02 0.121430E+02 + endloop +endfacet +facet normal 0.450747E+00 0.512078E+00 -0.731166E+00 + outer loop + vertex 0.614468E+02 0.690911E+02 0.121429E+02 + vertex 0.679673E+02 0.633517E+02 0.121430E+02 + vertex 0.644554E+02 0.610713E+02 0.838090E+01 + endloop +endfacet +facet normal 0.928077E-01 0.673827E+00 -0.733037E+00 + outer loop + vertex 0.597081E+02 0.652435E+02 0.838090E+01 + vertex 0.533835E+02 0.661146E+02 0.838090E+01 + vertex 0.527873E+02 0.702894E+02 0.121430E+02 + endloop +endfacet +facet normal 0.932928E-01 0.674185E+00 -0.732647E+00 + outer loop + vertex 0.527873E+02 0.702893E+02 0.121429E+02 + vertex 0.614469E+02 0.690911E+02 0.121430E+02 + vertex 0.597080E+02 0.652434E+02 0.838090E+01 + endloop +endfacet +facet normal -0.280266E+00 0.621279E+00 -0.731754E+00 + outer loop + vertex 0.533835E+02 0.661146E+02 0.838090E+01 + vertex 0.476164E+02 0.635130E+02 0.838090E+01 + vertex 0.448821E+02 0.667106E+02 0.121430E+02 + endloop +endfacet +facet normal -0.280711E+00 0.620090E+00 -0.732591E+00 + outer loop + vertex 0.448820E+02 0.667106E+02 0.121429E+02 + vertex 0.527873E+02 0.702894E+02 0.121430E+02 + vertex 0.533834E+02 0.661146E+02 0.838090E+01 + endloop +endfacet +facet normal -0.576052E+00 0.366598E+00 -0.730596E+00 + outer loop + vertex 0.476164E+02 0.635130E+02 0.838090E+01 + vertex 0.442062E+02 0.581544E+02 0.838090E+01 + vertex 0.401888E+02 0.593392E+02 0.121430E+02 + endloop +endfacet +facet normal -0.576092E+00 0.366797E+00 -0.730464E+00 + outer loop + vertex 0.401888E+02 0.593391E+02 0.121429E+02 + vertex 0.448821E+02 0.667106E+02 0.121430E+02 + vertex 0.476164E+02 0.635130E+02 0.838090E+01 + endloop +endfacet +facet normal -0.683534E+00 0.000000E+00 -0.729919E+00 + outer loop + vertex 0.442062E+02 0.581544E+02 0.838090E+01 + vertex 0.442062E+02 0.518455E+02 0.838090E+01 + vertex 0.401888E+02 0.506606E+02 0.121430E+02 + endloop +endfacet +facet normal -0.683541E+00 0.834160E-05 -0.729912E+00 + outer loop + vertex 0.401888E+02 0.506605E+02 0.121429E+02 + vertex 0.401888E+02 0.593392E+02 0.121430E+02 + vertex 0.442061E+02 0.581543E+02 0.838090E+01 + endloop +endfacet +facet normal -0.576190E+00 -0.366686E+00 -0.730442E+00 + outer loop + vertex 0.442062E+02 0.518455E+02 0.838090E+01 + vertex 0.476164E+02 0.464869E+02 0.838090E+01 + vertex 0.448821E+02 0.432893E+02 0.121430E+02 + endloop +endfacet +facet normal -0.576002E+00 -0.366717E+00 -0.730575E+00 + outer loop + vertex 0.448820E+02 0.432892E+02 0.121429E+02 + vertex 0.401888E+02 0.506606E+02 0.121430E+02 + vertex 0.442061E+02 0.518455E+02 0.838090E+01 + endloop +endfacet +facet normal -0.279837E+00 -0.620328E+00 -0.732724E+00 + outer loop + vertex 0.476164E+02 0.464869E+02 0.838090E+01 + vertex 0.533835E+02 0.438853E+02 0.838090E+01 + vertex 0.527873E+02 0.397105E+02 0.121430E+02 + endloop +endfacet +facet normal -0.281047E+00 -0.620767E+00 -0.731888E+00 + outer loop + vertex 0.527873E+02 0.397104E+02 0.121429E+02 + vertex 0.448821E+02 0.432893E+02 0.121430E+02 + vertex 0.476164E+02 0.464869E+02 0.838090E+01 + endloop +endfacet +facet normal 0.928759E-01 -0.674322E+00 -0.732574E+00 + outer loop + vertex 0.533835E+02 0.438853E+02 0.838090E+01 + vertex 0.597081E+02 0.447564E+02 0.838090E+01 + vertex 0.614469E+02 0.409088E+02 0.121430E+02 + endloop +endfacet +facet normal 0.932298E-01 -0.673841E+00 -0.732971E+00 + outer loop + vertex 0.614468E+02 0.409087E+02 0.121429E+02 + vertex 0.527873E+02 0.397105E+02 0.121430E+02 + vertex 0.533834E+02 0.438852E+02 0.838090E+01 + endloop +endfacet +facet normal 0.450402E+00 -0.512496E+00 -0.731086E+00 + outer loop + vertex 0.597081E+02 0.447564E+02 0.838090E+01 + vertex 0.644555E+02 0.489286E+02 0.838090E+01 + vertex 0.679673E+02 0.466482E+02 0.121430E+02 + endloop +endfacet +facet normal 0.450443E+00 -0.511750E+00 -0.731583E+00 + outer loop + vertex 0.679673E+02 0.466482E+02 0.121429E+02 + vertex 0.614469E+02 0.409088E+02 0.121430E+02 + vertex 0.597080E+02 0.447564E+02 0.838090E+01 + endloop +endfacet +facet normal 0.654523E+00 -0.195449E+00 -0.730342E+00 + outer loop + vertex 0.644555E+02 0.489286E+02 0.838090E+01 + vertex 0.662685E+02 0.550000E+02 0.838090E+01 + vertex 0.704664E+02 0.550000E+02 0.121430E+02 + endloop +endfacet +facet normal 0.654770E+00 -0.195935E+00 -0.729990E+00 + outer loop + vertex 0.704664E+02 0.550000E+02 0.121429E+02 + vertex 0.679673E+02 0.466482E+02 0.121430E+02 + vertex 0.644554E+02 0.489286E+02 0.838090E+01 + endloop +endfacet +facet normal 0.825831E+00 0.247116E+00 -0.506889E+00 + outer loop + vertex 0.704664E+02 0.550000E+02 0.121430E+02 + vertex 0.679673E+02 0.633517E+02 0.121430E+02 + vertex 0.703968E+02 0.649351E+02 0.168731E+02 + endloop +endfacet +facet normal 0.825501E+00 0.247334E+00 -0.507321E+00 + outer loop + vertex 0.703967E+02 0.649350E+02 0.168731E+02 + vertex 0.733734E+02 0.550000E+02 0.168731E+02 + vertex 0.704664E+02 0.550000E+02 0.121429E+02 + endloop +endfacet +facet normal 0.568642E+00 0.646021E+00 -0.509219E+00 + outer loop + vertex 0.679673E+02 0.633517E+02 0.121430E+02 + vertex 0.614469E+02 0.690911E+02 0.121430E+02 + vertex 0.626478E+02 0.717625E+02 0.168731E+02 + endloop +endfacet +facet normal 0.569184E+00 0.646025E+00 -0.508606E+00 + outer loop + vertex 0.626478E+02 0.717624E+02 0.168731E+02 + vertex 0.703968E+02 0.649351E+02 0.168731E+02 + vertex 0.679673E+02 0.633516E+02 0.121429E+02 + endloop +endfacet +facet normal 0.117792E+00 0.851238E+00 -0.511389E+00 + outer loop + vertex 0.614469E+02 0.690911E+02 0.121430E+02 + vertex 0.527873E+02 0.702894E+02 0.121430E+02 + vertex 0.523757E+02 0.731880E+02 0.168731E+02 + endloop +endfacet +facet normal 0.118165E+00 0.851490E+00 -0.510884E+00 + outer loop + vertex 0.523757E+02 0.731880E+02 0.168731E+02 + vertex 0.626478E+02 0.717625E+02 0.168731E+02 + vertex 0.614468E+02 0.690911E+02 0.121429E+02 + endloop +endfacet +facet normal -0.354837E+00 0.783800E+00 -0.509655E+00 + outer loop + vertex 0.527873E+02 0.702894E+02 0.121430E+02 + vertex 0.448821E+02 0.667106E+02 0.121430E+02 + vertex 0.429922E+02 0.689307E+02 0.168731E+02 + endloop +endfacet +facet normal -0.355218E+00 0.782944E+00 -0.510704E+00 + outer loop + vertex 0.429921E+02 0.689307E+02 0.168731E+02 + vertex 0.523757E+02 0.731880E+02 0.168731E+02 + vertex 0.527873E+02 0.702893E+02 0.121429E+02 + endloop +endfacet +facet normal -0.726699E+00 0.462682E+00 -0.507773E+00 + outer loop + vertex 0.448821E+02 0.667106E+02 0.121430E+02 + vertex 0.401888E+02 0.593392E+02 0.121430E+02 + vertex 0.374075E+02 0.601619E+02 0.168731E+02 + endloop +endfacet +facet normal -0.726736E+00 0.462840E+00 -0.507576E+00 + outer loop + vertex 0.374075E+02 0.601618E+02 0.168731E+02 + vertex 0.429922E+02 0.689307E+02 0.168731E+02 + vertex 0.448820E+02 0.667106E+02 0.121429E+02 + endloop +endfacet +facet normal -0.862023E+00 0.000000E+00 -0.506869E+00 + outer loop + vertex 0.401888E+02 0.593392E+02 0.121430E+02 + vertex 0.401888E+02 0.506606E+02 0.121430E+02 + vertex 0.374075E+02 0.498380E+02 0.168731E+02 + endloop +endfacet +facet normal -0.862027E+00 0.000000E+00 -0.506862E+00 + outer loop + vertex 0.374075E+02 0.498380E+02 0.168731E+02 + vertex 0.374075E+02 0.601619E+02 0.168731E+02 + vertex 0.401888E+02 0.593391E+02 0.121429E+02 + endloop +endfacet +facet normal -0.726788E+00 -0.462745E+00 -0.507588E+00 + outer loop + vertex 0.401888E+02 0.506606E+02 0.121430E+02 + vertex 0.448821E+02 0.432893E+02 0.121430E+02 + vertex 0.429922E+02 0.410691E+02 0.168731E+02 + endloop +endfacet +endsolid mesh1 + +solid mesh2 +facet normal -0.726662E+00 -0.462780E+00 -0.507738E+00 + outer loop + vertex 0.429921E+02 0.410690E+02 0.168731E+02 + vertex 0.374075E+02 0.498380E+02 0.168731E+02 + vertex 0.401888E+02 0.506605E+02 0.121429E+02 + endloop +endfacet +facet normal -0.354560E+00 -0.783187E+00 -0.510789E+00 + outer loop + vertex 0.448821E+02 0.432893E+02 0.121430E+02 + vertex 0.527873E+02 0.397105E+02 0.121430E+02 + vertex 0.523757E+02 0.368119E+02 0.168731E+02 + endloop +endfacet +facet normal -0.355453E+00 -0.783472E+00 -0.509730E+00 + outer loop + vertex 0.523757E+02 0.368119E+02 0.168731E+02 + vertex 0.429922E+02 0.410691E+02 0.168731E+02 + vertex 0.448820E+02 0.432892E+02 0.121429E+02 + endloop +endfacet +facet normal 0.117837E+00 -0.851557E+00 -0.510847E+00 + outer loop + vertex 0.527873E+02 0.397105E+02 0.121430E+02 + vertex 0.614469E+02 0.409088E+02 0.121430E+02 + vertex 0.626478E+02 0.382374E+02 0.168731E+02 + endloop +endfacet +facet normal 0.118129E+00 -0.851230E+00 -0.511325E+00 + outer loop + vertex 0.626478E+02 0.382374E+02 0.168731E+02 + vertex 0.523757E+02 0.368119E+02 0.168731E+02 + vertex 0.527873E+02 0.397104E+02 0.121429E+02 + endloop +endfacet +facet normal 0.568901E+00 -0.646315E+00 -0.508555E+00 + outer loop + vertex 0.614469E+02 0.409088E+02 0.121430E+02 + vertex 0.679673E+02 0.466482E+02 0.121430E+02 + vertex 0.703968E+02 0.450648E+02 0.168731E+02 + endloop +endfacet +facet normal 0.568979E+00 -0.645775E+00 -0.509154E+00 + outer loop + vertex 0.703967E+02 0.450648E+02 0.168731E+02 + vertex 0.626478E+02 0.382374E+02 0.168731E+02 + vertex 0.614468E+02 0.409087E+02 0.121429E+02 + endloop +endfacet +facet normal 0.825562E+00 -0.247032E+00 -0.507369E+00 + outer loop + vertex 0.679673E+02 0.466482E+02 0.121430E+02 + vertex 0.704664E+02 0.550000E+02 0.121430E+02 + vertex 0.733734E+02 0.550000E+02 0.168731E+02 + endloop +endfacet +facet normal 0.825734E+00 -0.247383E+00 -0.506918E+00 + outer loop + vertex 0.733733E+02 0.550000E+02 0.168731E+02 + vertex 0.703968E+02 0.450648E+02 0.168731E+02 + vertex 0.679673E+02 0.466482E+02 0.121429E+02 + endloop +endfacet +facet normal 0.926849E+00 0.277688E+00 -0.252668E+00 + outer loop + vertex 0.733734E+02 0.550000E+02 0.168731E+02 + vertex 0.703968E+02 0.649351E+02 0.168731E+02 + vertex 0.716166E+02 0.657304E+02 0.222217E+02 + endloop +endfacet +facet normal 0.926743E+00 0.277796E+00 -0.252937E+00 + outer loop + vertex 0.716166E+02 0.657304E+02 0.222217E+02 + vertex 0.748331E+02 0.550000E+02 0.222217E+02 + vertex 0.733733E+02 0.550000E+02 0.168731E+02 + endloop +endfacet +facet normal 0.639382E+00 0.725688E+00 -0.254101E+00 + outer loop + vertex 0.703968E+02 0.649351E+02 0.168731E+02 + vertex 0.626478E+02 0.717625E+02 0.168731E+02 + vertex 0.632505E+02 0.731043E+02 0.222217E+02 + endloop +endfacet +facet normal 0.639569E+00 0.725635E+00 -0.253783E+00 + outer loop + vertex 0.632504E+02 0.731043E+02 0.222217E+02 + vertex 0.716166E+02 0.657304E+02 0.222217E+02 + vertex 0.703967E+02 0.649350E+02 0.168731E+02 + endloop +endfacet +facet normal 0.132894E+00 0.957623E+00 -0.255533E+00 + outer loop + vertex 0.626478E+02 0.717625E+02 0.168731E+02 + vertex 0.523757E+02 0.731880E+02 0.168731E+02 + vertex 0.521691E+02 0.746439E+02 0.222217E+02 + endloop +endfacet +facet normal 0.133046E+00 0.957674E+00 -0.255262E+00 + outer loop + vertex 0.521691E+02 0.746438E+02 0.222217E+02 + vertex 0.632505E+02 0.731043E+02 0.222217E+02 + vertex 0.626478E+02 0.717624E+02 0.168731E+02 + endloop +endfacet +facet normal -0.399561E+00 0.880670E+00 -0.254501E+00 + outer loop + vertex 0.523757E+02 0.731880E+02 0.168731E+02 + vertex 0.429922E+02 0.689307E+02 0.168731E+02 + vertex 0.420434E+02 0.700459E+02 0.222217E+02 + endloop +endfacet +facet normal -0.399786E+00 0.880398E+00 -0.255088E+00 + outer loop + vertex 0.420433E+02 0.700458E+02 0.222217E+02 + vertex 0.521691E+02 0.746439E+02 0.222217E+02 + vertex 0.523757E+02 0.731880E+02 0.168731E+02 + endloop +endfacet +facet normal -0.815979E+00 0.519683E+00 -0.253197E+00 + outer loop + vertex 0.429922E+02 0.689307E+02 0.168731E+02 + vertex 0.374075E+02 0.601619E+02 0.168731E+02 + vertex 0.360110E+02 0.605751E+02 0.222217E+02 + endloop +endfacet +facet normal -0.815979E+00 0.519730E+00 -0.253098E+00 + outer loop + vertex 0.360110E+02 0.605750E+02 0.222217E+02 + vertex 0.420434E+02 0.700459E+02 0.222217E+02 + vertex 0.429921E+02 0.689307E+02 0.168731E+02 + endloop +endfacet +facet normal -0.967564E+00 0.000000E+00 -0.252627E+00 + outer loop + vertex 0.374075E+02 0.601619E+02 0.168731E+02 + vertex 0.374075E+02 0.498380E+02 0.168731E+02 + vertex 0.360110E+02 0.494248E+02 0.222217E+02 + endloop +endfacet +facet normal -0.967564E+00 0.000000E+00 -0.252627E+00 + outer loop + vertex 0.360110E+02 0.494248E+02 0.222217E+02 + vertex 0.360110E+02 0.605751E+02 0.222217E+02 + vertex 0.374075E+02 0.601618E+02 0.168731E+02 + endloop +endfacet +facet normal -0.816003E+00 -0.519692E+00 -0.253100E+00 + outer loop + vertex 0.374075E+02 0.498380E+02 0.168731E+02 + vertex 0.429922E+02 0.410691E+02 0.168731E+02 + vertex 0.420434E+02 0.399540E+02 0.222217E+02 + endloop +endfacet +facet normal -0.815962E+00 -0.519710E+00 -0.253194E+00 + outer loop + vertex 0.420433E+02 0.399539E+02 0.222217E+02 + vertex 0.360110E+02 0.494248E+02 0.222217E+02 + vertex 0.374075E+02 0.498380E+02 0.168731E+02 + endloop +endfacet +facet normal -0.399486E+00 -0.880527E+00 -0.255113E+00 + outer loop + vertex 0.429922E+02 0.410691E+02 0.168731E+02 + vertex 0.523757E+02 0.368119E+02 0.168731E+02 + vertex 0.521691E+02 0.353560E+02 0.222217E+02 + endloop +endfacet +facet normal -0.399855E+00 -0.880541E+00 -0.254487E+00 + outer loop + vertex 0.521691E+02 0.353559E+02 0.222217E+02 + vertex 0.420434E+02 0.399540E+02 0.222217E+02 + vertex 0.429921E+02 0.410690E+02 0.168731E+02 + endloop +endfacet +facet normal 0.132904E+00 -0.957701E+00 -0.255234E+00 + outer loop + vertex 0.523757E+02 0.368119E+02 0.168731E+02 + vertex 0.626478E+02 0.382374E+02 0.168731E+02 + vertex 0.632505E+02 0.368956E+02 0.222217E+02 + endloop +endfacet +facet normal 0.133038E+00 -0.957606E+00 -0.255524E+00 + outer loop + vertex 0.632504E+02 0.368955E+02 0.222217E+02 + vertex 0.521691E+02 0.353560E+02 0.222217E+02 + vertex 0.523757E+02 0.368119E+02 0.168731E+02 + endloop +endfacet +facet normal 0.639443E+00 -0.725758E+00 -0.253747E+00 + outer loop + vertex 0.626478E+02 0.382374E+02 0.168731E+02 + vertex 0.703968E+02 0.450648E+02 0.168731E+02 + vertex 0.716166E+02 0.442695E+02 0.222217E+02 + endloop +endfacet +facet normal 0.639520E+00 -0.725571E+00 -0.254087E+00 + outer loop + vertex 0.716166E+02 0.442695E+02 0.222217E+02 + vertex 0.632505E+02 0.368956E+02 0.222217E+02 + vertex 0.626478E+02 0.382374E+02 0.168731E+02 + endloop +endfacet +facet normal 0.926784E+00 -0.277666E+00 -0.252931E+00 + outer loop + vertex 0.703968E+02 0.450648E+02 0.168731E+02 + vertex 0.733734E+02 0.550000E+02 0.168731E+02 + vertex 0.748331E+02 0.550000E+02 0.222217E+02 + endloop +endfacet +facet normal 0.926807E+00 -0.277805E+00 -0.252693E+00 + outer loop + vertex 0.748330E+02 0.550000E+02 0.222217E+02 + vertex 0.716166E+02 0.442695E+02 0.222217E+02 + vertex 0.703967E+02 0.450648E+02 0.168731E+02 + endloop +endfacet +facet normal 0.957891E+00 0.287133E+00 0.000000E+00 + outer loop + vertex 0.748331E+02 0.550000E+02 0.222217E+02 + vertex 0.716166E+02 0.657304E+02 0.222217E+02 + vertex 0.716166E+02 0.657304E+02 0.277782E+02 + endloop +endfacet +facet normal 0.957891E+00 0.287131E+00 -0.119729E-04 + outer loop + vertex 0.716166E+02 0.657304E+02 0.277782E+02 + vertex 0.748331E+02 0.549999E+02 0.277782E+02 + vertex 0.748330E+02 0.550000E+02 0.222217E+02 + endloop +endfacet +facet normal 0.661221E+00 0.750192E+00 0.000000E+00 + outer loop + vertex 0.716166E+02 0.657304E+02 0.222217E+02 + vertex 0.632505E+02 0.731043E+02 0.222217E+02 + vertex 0.632505E+02 0.731043E+02 0.277782E+02 + endloop +endfacet +facet normal 0.661216E+00 0.750195E+00 0.000000E+00 + outer loop + vertex 0.632504E+02 0.731043E+02 0.277782E+02 + vertex 0.716166E+02 0.657304E+02 0.277782E+02 + vertex 0.716166E+02 0.657304E+02 0.222217E+02 + endloop +endfacet +facet normal 0.137613E+00 0.990486E+00 0.000000E+00 + outer loop + vertex 0.632505E+02 0.731043E+02 0.222217E+02 + vertex 0.521691E+02 0.746439E+02 0.222217E+02 + vertex 0.521691E+02 0.746439E+02 0.277782E+02 + endloop +endfacet +facet normal 0.137605E+00 0.990487E+00 -0.245621E-05 + outer loop + vertex 0.521691E+02 0.746438E+02 0.277782E+02 + vertex 0.632505E+02 0.731043E+02 0.277782E+02 + vertex 0.632504E+02 0.731043E+02 0.222217E+02 + endloop +endfacet +facet normal -0.413461E+00 0.910522E+00 0.000000E+00 + outer loop + vertex 0.521691E+02 0.746439E+02 0.222217E+02 + vertex 0.420434E+02 0.700459E+02 0.222217E+02 + vertex 0.420434E+02 0.700459E+02 0.277782E+02 + endloop +endfacet +facet normal -0.413465E+00 0.910520E+00 -0.162526E-04 + outer loop + vertex 0.420433E+02 0.700458E+02 0.277782E+02 + vertex 0.521691E+02 0.746439E+02 0.277782E+02 + vertex 0.521691E+02 0.746438E+02 0.222217E+02 + endloop +endfacet +facet normal -0.843439E+00 0.537226E+00 0.000000E+00 + outer loop + vertex 0.420434E+02 0.700459E+02 0.222217E+02 + vertex 0.360110E+02 0.605751E+02 0.222217E+02 + vertex 0.360110E+02 0.605751E+02 0.277782E+02 + endloop +endfacet +facet normal -0.843441E+00 0.537222E+00 0.546594E-05 + outer loop + vertex 0.360110E+02 0.605750E+02 0.277782E+02 + vertex 0.420434E+02 0.700459E+02 0.277782E+02 + vertex 0.420433E+02 0.700458E+02 0.222217E+02 + endloop +endfacet +facet normal -0.100000E+01 0.000000E+00 0.000000E+00 + outer loop + vertex 0.360110E+02 0.605751E+02 0.222217E+02 + vertex 0.360110E+02 0.494248E+02 0.222217E+02 + vertex 0.360110E+02 0.494248E+02 0.277782E+02 + endloop +endfacet +facet normal -0.100000E+01 0.000000E+00 0.000000E+00 + outer loop + vertex 0.360110E+02 0.494248E+02 0.277782E+02 + vertex 0.360110E+02 0.605751E+02 0.277782E+02 + vertex 0.360110E+02 0.605750E+02 0.222217E+02 + endloop +endfacet +facet normal -0.843439E+00 -0.537226E+00 0.000000E+00 + outer loop + vertex 0.360110E+02 0.494248E+02 0.222217E+02 + vertex 0.420434E+02 0.399540E+02 0.222217E+02 + vertex 0.420434E+02 0.399540E+02 0.277782E+02 + endloop +endfacet +facet normal -0.843445E+00 -0.537215E+00 0.000000E+00 + outer loop + vertex 0.420433E+02 0.399539E+02 0.277782E+02 + vertex 0.360110E+02 0.494248E+02 0.277782E+02 + vertex 0.360110E+02 0.494248E+02 0.222217E+02 + endloop +endfacet +facet normal -0.413461E+00 -0.910522E+00 0.000000E+00 + outer loop + vertex 0.420434E+02 0.399540E+02 0.222217E+02 + vertex 0.521691E+02 0.353560E+02 0.222217E+02 + vertex 0.521691E+02 0.353560E+02 0.277782E+02 + endloop +endfacet +facet normal -0.413468E+00 -0.910519E+00 0.236328E-04 + outer loop + vertex 0.521691E+02 0.353559E+02 0.277782E+02 + vertex 0.420434E+02 0.399540E+02 0.277782E+02 + vertex 0.420433E+02 0.399539E+02 0.222217E+02 + endloop +endfacet +facet normal 0.137614E+00 -0.990486E+00 0.000000E+00 + outer loop + vertex 0.521691E+02 0.353560E+02 0.222217E+02 + vertex 0.632505E+02 0.368956E+02 0.222217E+02 + vertex 0.632505E+02 0.368956E+02 0.277782E+02 + endloop +endfacet +facet normal 0.137606E+00 -0.990487E+00 0.176799E-04 + outer loop + vertex 0.632504E+02 0.368955E+02 0.277782E+02 + vertex 0.521691E+02 0.353560E+02 0.277782E+02 + vertex 0.521691E+02 0.353559E+02 0.222217E+02 + endloop +endfacet +facet normal 0.661221E+00 -0.750192E+00 0.000000E+00 + outer loop + vertex 0.632505E+02 0.368956E+02 0.222217E+02 + vertex 0.716166E+02 0.442695E+02 0.222217E+02 + vertex 0.716166E+02 0.442695E+02 0.277782E+02 + endloop +endfacet +facet normal 0.661221E+00 -0.750192E+00 0.158811E-05 + outer loop + vertex 0.716166E+02 0.442695E+02 0.277782E+02 + vertex 0.632505E+02 0.368956E+02 0.277782E+02 + vertex 0.632504E+02 0.368955E+02 0.222217E+02 + endloop +endfacet +facet normal 0.957891E+00 -0.287131E+00 -0.512521E-05 + outer loop + vertex 0.716166E+02 0.442695E+02 0.222217E+02 + vertex 0.748331E+02 0.550000E+02 0.222217E+02 + vertex 0.748331E+02 0.549999E+02 0.277782E+02 + endloop +endfacet +facet normal 0.957893E+00 -0.287125E+00 0.000000E+00 + outer loop + vertex 0.748330E+02 0.549999E+02 0.277782E+02 + vertex 0.716166E+02 0.442695E+02 0.277782E+02 + vertex 0.716166E+02 0.442695E+02 0.222217E+02 + endloop +endfacet +facet normal 0.926808E+00 0.277814E+00 0.252677E+00 + outer loop + vertex 0.748331E+02 0.549999E+02 0.277782E+02 + vertex 0.716166E+02 0.657304E+02 0.277782E+02 + vertex 0.703968E+02 0.649351E+02 0.331268E+02 + endloop +endfacet +facet normal 0.926784E+00 0.277678E+00 0.252914E+00 + outer loop + vertex 0.703967E+02 0.649350E+02 0.331268E+02 + vertex 0.733734E+02 0.549999E+02 0.331268E+02 + vertex 0.748330E+02 0.549999E+02 0.277782E+02 + endloop +endfacet +facet normal 0.639518E+00 0.725569E+00 0.254099E+00 + outer loop + vertex 0.716166E+02 0.657304E+02 0.277782E+02 + vertex 0.632505E+02 0.731043E+02 0.277782E+02 + vertex 0.626477E+02 0.717625E+02 0.331268E+02 + endloop +endfacet +facet normal 0.639433E+00 0.725767E+00 0.253746E+00 + outer loop + vertex 0.626477E+02 0.717624E+02 0.331268E+02 + vertex 0.703968E+02 0.649351E+02 0.331268E+02 + vertex 0.716166E+02 0.657304E+02 0.277782E+02 + endloop +endfacet +facet normal 0.133045E+00 0.957605E+00 0.255522E+00 + outer loop + vertex 0.632505E+02 0.731043E+02 0.277782E+02 + vertex 0.521691E+02 0.746439E+02 0.277782E+02 + vertex 0.523757E+02 0.731880E+02 0.331268E+02 + endloop +endfacet +facet normal 0.132906E+00 0.957701E+00 0.255235E+00 + outer loop + vertex 0.523757E+02 0.731880E+02 0.331268E+02 + vertex 0.626477E+02 0.717625E+02 0.331268E+02 + vertex 0.632504E+02 0.731043E+02 0.277782E+02 + endloop +endfacet +facet normal -0.399846E+00 0.880539E+00 0.254508E+00 + outer loop + vertex 0.521691E+02 0.746439E+02 0.277782E+02 + vertex 0.420434E+02 0.700459E+02 0.277782E+02 + vertex 0.429922E+02 0.689308E+02 0.331268E+02 + endloop +endfacet +facet normal -0.399485E+00 0.880533E+00 0.255096E+00 + outer loop + vertex 0.429921E+02 0.689308E+02 0.331268E+02 + vertex 0.523757E+02 0.731880E+02 0.331268E+02 + vertex 0.521691E+02 0.746438E+02 0.277782E+02 + endloop +endfacet +facet normal -0.815956E+00 0.519721E+00 0.253193E+00 + outer loop + vertex 0.420434E+02 0.700459E+02 0.277782E+02 + vertex 0.360110E+02 0.605751E+02 0.277782E+02 + vertex 0.374075E+02 0.601619E+02 0.331268E+02 + endloop +endfacet +facet normal -0.816004E+00 0.519687E+00 0.253105E+00 + outer loop + vertex 0.374075E+02 0.601618E+02 0.331268E+02 + vertex 0.429922E+02 0.689308E+02 0.331268E+02 + vertex 0.420433E+02 0.700458E+02 0.277782E+02 + endloop +endfacet +facet normal -0.967564E+00 0.000000E+00 0.252627E+00 + outer loop + vertex 0.360110E+02 0.605751E+02 0.277782E+02 + vertex 0.360110E+02 0.494248E+02 0.277782E+02 + vertex 0.374075E+02 0.498380E+02 0.331268E+02 + endloop +endfacet +facet normal -0.967564E+00 0.000000E+00 0.252627E+00 + outer loop + vertex 0.374075E+02 0.498380E+02 0.331268E+02 + vertex 0.374075E+02 0.601619E+02 0.331268E+02 + vertex 0.360110E+02 0.605750E+02 0.277782E+02 + endloop +endfacet +facet normal -0.815975E+00 -0.519733E+00 0.253104E+00 + outer loop + vertex 0.360110E+02 0.494248E+02 0.277782E+02 + vertex 0.420434E+02 0.399540E+02 0.277782E+02 + vertex 0.429922E+02 0.410691E+02 0.331268E+02 + endloop +endfacet +facet normal -0.815988E+00 -0.519668E+00 0.253198E+00 + outer loop + vertex 0.429921E+02 0.410690E+02 0.331268E+02 + vertex 0.374075E+02 0.498380E+02 0.331268E+02 + vertex 0.360110E+02 0.494248E+02 0.277782E+02 + endloop +endfacet +facet normal -0.399782E+00 -0.880400E+00 0.255089E+00 + outer loop + vertex 0.420434E+02 0.399540E+02 0.277782E+02 + vertex 0.521691E+02 0.353560E+02 0.277782E+02 + vertex 0.523757E+02 0.368119E+02 0.331268E+02 + endloop +endfacet +facet normal -0.399552E+00 -0.880673E+00 0.254508E+00 + outer loop + vertex 0.523757E+02 0.368119E+02 0.331268E+02 + vertex 0.429922E+02 0.410691E+02 0.331268E+02 + vertex 0.420433E+02 0.399539E+02 0.277782E+02 + endloop +endfacet +facet normal 0.133055E+00 -0.957677E+00 0.255248E+00 + outer loop + vertex 0.521691E+02 0.353560E+02 0.277782E+02 + vertex 0.632505E+02 0.368956E+02 0.277782E+02 + vertex 0.626477E+02 0.382374E+02 0.331268E+02 + endloop +endfacet +facet normal 0.132894E+00 -0.957618E+00 0.255551E+00 + outer loop + vertex 0.626477E+02 0.382374E+02 0.331268E+02 + vertex 0.523757E+02 0.368119E+02 0.331268E+02 + vertex 0.521691E+02 0.353559E+02 0.277782E+02 + endloop +endfacet +endsolid + +solid mesh3 +facet normal 0.639577E+00 -0.725636E+00 0.253759E+00 + outer loop + vertex 0.632505E+02 0.368956E+02 0.277782E+02 + vertex 0.716166E+02 0.442695E+02 0.277782E+02 + vertex 0.703968E+02 0.450648E+02 0.331268E+02 + endloop +endfacet +facet normal 0.639379E+00 -0.725686E+00 0.254113E+00 + outer loop + vertex 0.703967E+02 0.450648E+02 0.331268E+02 + vertex 0.626477E+02 0.382374E+02 0.331268E+02 + vertex 0.632504E+02 0.368955E+02 0.277782E+02 + endloop +endfacet +facet normal 0.926747E+00 -0.277798E+00 0.252921E+00 + outer loop + vertex 0.716166E+02 0.442695E+02 0.277782E+02 + vertex 0.748331E+02 0.549999E+02 0.277782E+02 + vertex 0.733734E+02 0.549999E+02 0.331268E+02 + endloop +endfacet +facet normal 0.926851E+00 -0.277680E+00 0.252667E+00 + outer loop + vertex 0.733733E+02 0.549999E+02 0.331268E+02 + vertex 0.703968E+02 0.450648E+02 0.331268E+02 + vertex 0.716166E+02 0.442695E+02 0.277782E+02 + endloop +endfacet +facet normal 0.825726E+00 0.247389E+00 0.506927E+00 + outer loop + vertex 0.733734E+02 0.549999E+02 0.331268E+02 + vertex 0.703968E+02 0.649351E+02 0.331268E+02 + vertex 0.679673E+02 0.633517E+02 0.378569E+02 + endloop +endfacet +facet normal 0.825567E+00 0.247042E+00 0.507355E+00 + outer loop + vertex 0.679673E+02 0.633516E+02 0.378568E+02 + vertex 0.704664E+02 0.549999E+02 0.378569E+02 + vertex 0.733733E+02 0.549999E+02 0.331268E+02 + endloop +endfacet +facet normal 0.568970E+00 0.645781E+00 0.509156E+00 + outer loop + vertex 0.703968E+02 0.649351E+02 0.331268E+02 + vertex 0.626477E+02 0.717625E+02 0.331268E+02 + vertex 0.614469E+02 0.690911E+02 0.378569E+02 + endloop +endfacet +facet normal 0.568900E+00 0.646332E+00 0.508535E+00 + outer loop + vertex 0.614468E+02 0.690911E+02 0.378568E+02 + vertex 0.679673E+02 0.633517E+02 0.378569E+02 + vertex 0.703967E+02 0.649350E+02 0.331268E+02 + endloop +endfacet +facet normal 0.118128E+00 0.851217E+00 0.511347E+00 + outer loop + vertex 0.626477E+02 0.717625E+02 0.331268E+02 + vertex 0.523757E+02 0.731880E+02 0.331268E+02 + vertex 0.527873E+02 0.702894E+02 0.378569E+02 + endloop +endfacet +facet normal 0.117823E+00 0.851570E+00 0.510830E+00 + outer loop + vertex 0.527873E+02 0.702893E+02 0.378568E+02 + vertex 0.614469E+02 0.690911E+02 0.378569E+02 + vertex 0.626477E+02 0.717624E+02 0.331268E+02 + endloop +endfacet +facet normal -0.355447E+00 0.783458E+00 0.509755E+00 + outer loop + vertex 0.523757E+02 0.731880E+02 0.331268E+02 + vertex 0.429922E+02 0.689308E+02 0.331268E+02 + vertex 0.448821E+02 0.667106E+02 0.378569E+02 + endloop +endfacet +facet normal -0.354561E+00 0.783186E+00 0.510789E+00 + outer loop + vertex 0.448820E+02 0.667106E+02 0.378568E+02 + vertex 0.527873E+02 0.702894E+02 0.378569E+02 + vertex 0.523757E+02 0.731880E+02 0.331268E+02 + endloop +endfacet +facet normal -0.726645E+00 0.462782E+00 0.507759E+00 + outer loop + vertex 0.429922E+02 0.689308E+02 0.331268E+02 + vertex 0.374075E+02 0.601619E+02 0.331268E+02 + vertex 0.401888E+02 0.593392E+02 0.378569E+02 + endloop +endfacet +facet normal -0.726792E+00 0.462728E+00 0.507598E+00 + outer loop + vertex 0.401888E+02 0.593391E+02 0.378568E+02 + vertex 0.448821E+02 0.667106E+02 0.378569E+02 + vertex 0.429921E+02 0.689308E+02 0.331268E+02 + endloop +endfacet +facet normal -0.862023E+00 0.000000E+00 0.506870E+00 + outer loop + vertex 0.374075E+02 0.601619E+02 0.331268E+02 + vertex 0.374075E+02 0.498380E+02 0.331268E+02 + vertex 0.401888E+02 0.506607E+02 0.378569E+02 + endloop +endfacet +facet normal -0.862023E+00 -0.579275E-05 0.506869E+00 + outer loop + vertex 0.401888E+02 0.506607E+02 0.378568E+02 + vertex 0.401888E+02 0.593392E+02 0.378569E+02 + vertex 0.374075E+02 0.601618E+02 0.331268E+02 + endloop +endfacet +facet normal -0.726723E+00 -0.462832E+00 0.507603E+00 + outer loop + vertex 0.374075E+02 0.498380E+02 0.331268E+02 + vertex 0.429922E+02 0.410691E+02 0.331268E+02 + vertex 0.448821E+02 0.432893E+02 0.378569E+02 + endloop +endfacet +facet normal -0.726703E+00 -0.462675E+00 0.507774E+00 + outer loop + vertex 0.448820E+02 0.432892E+02 0.378568E+02 + vertex 0.401888E+02 0.506607E+02 0.378569E+02 + vertex 0.374075E+02 0.498380E+02 0.331268E+02 + endloop +endfacet +facet normal -0.355216E+00 -0.782948E+00 0.510699E+00 + outer loop + vertex 0.429922E+02 0.410691E+02 0.331268E+02 + vertex 0.523757E+02 0.368119E+02 0.331268E+02 + vertex 0.527873E+02 0.397105E+02 0.378569E+02 + endloop +endfacet +facet normal -0.354833E+00 -0.783782E+00 0.509686E+00 + outer loop + vertex 0.527873E+02 0.397104E+02 0.378568E+02 + vertex 0.448821E+02 0.432893E+02 0.378569E+02 + vertex 0.429921E+02 0.410690E+02 0.331268E+02 + endloop +endfacet +facet normal 0.118165E+00 -0.851487E+00 0.510889E+00 + outer loop + vertex 0.523757E+02 0.368119E+02 0.331268E+02 + vertex 0.626477E+02 0.382374E+02 0.331268E+02 + vertex 0.614469E+02 0.409088E+02 0.378569E+02 + endloop +endfacet +facet normal 0.117790E+00 -0.851239E+00 0.511388E+00 + outer loop + vertex 0.614468E+02 0.409087E+02 0.378568E+02 + vertex 0.527873E+02 0.397105E+02 0.378569E+02 + vertex 0.523757E+02 0.368119E+02 0.331268E+02 + endloop +endfacet +facet normal 0.569186E+00 -0.646025E+00 0.508605E+00 + outer loop + vertex 0.626477E+02 0.382374E+02 0.331268E+02 + vertex 0.703968E+02 0.450648E+02 0.331268E+02 + vertex 0.679673E+02 0.466482E+02 0.378569E+02 + endloop +endfacet +facet normal 0.568650E+00 -0.646021E+00 0.509210E+00 + outer loop + vertex 0.679673E+02 0.466482E+02 0.378568E+02 + vertex 0.614469E+02 0.409088E+02 0.378569E+02 + vertex 0.626477E+02 0.382374E+02 0.331268E+02 + endloop +endfacet +facet normal 0.825498E+00 -0.247323E+00 0.507330E+00 + outer loop + vertex 0.703968E+02 0.450648E+02 0.331268E+02 + vertex 0.733734E+02 0.549999E+02 0.331268E+02 + vertex 0.704664E+02 0.549999E+02 0.378569E+02 + endloop +endfacet +facet normal 0.825840E+00 -0.247112E+00 0.506876E+00 + outer loop + vertex 0.704664E+02 0.549999E+02 0.378568E+02 + vertex 0.679673E+02 0.466482E+02 0.378569E+02 + vertex 0.703967E+02 0.450648E+02 0.331268E+02 + endloop +endfacet +facet normal 0.654782E+00 0.195930E+00 0.729981E+00 + outer loop + vertex 0.704664E+02 0.549999E+02 0.378569E+02 + vertex 0.679673E+02 0.633517E+02 0.378569E+02 + vertex 0.644555E+02 0.610713E+02 0.416190E+02 + endloop +endfacet +facet normal 0.654529E+00 0.195474E+00 0.730330E+00 + outer loop + vertex 0.644554E+02 0.610713E+02 0.416189E+02 + vertex 0.662685E+02 0.549999E+02 0.416190E+02 + vertex 0.704664E+02 0.549999E+02 0.378568E+02 + endloop +endfacet +facet normal 0.450454E+00 0.511750E+00 0.731576E+00 + outer loop + vertex 0.679673E+02 0.633517E+02 0.378569E+02 + vertex 0.614469E+02 0.690911E+02 0.378569E+02 + vertex 0.597081E+02 0.652435E+02 0.416190E+02 + endloop +endfacet +facet normal 0.450395E+00 0.512529E+00 0.731067E+00 + outer loop + vertex 0.597080E+02 0.652434E+02 0.416189E+02 + vertex 0.644555E+02 0.610713E+02 0.416190E+02 + vertex 0.679673E+02 0.633516E+02 0.378568E+02 + endloop +endfacet +facet normal 0.932436E-01 0.673834E+00 0.732976E+00 + outer loop + vertex 0.614469E+02 0.690911E+02 0.378569E+02 + vertex 0.527873E+02 0.702894E+02 0.378569E+02 + vertex 0.533835E+02 0.661146E+02 0.416190E+02 + endloop +endfacet +facet normal 0.928649E-01 0.674336E+00 0.732562E+00 + outer loop + vertex 0.533834E+02 0.661146E+02 0.416189E+02 + vertex 0.597081E+02 0.652435E+02 0.416190E+02 + vertex 0.614468E+02 0.690911E+02 0.378568E+02 + endloop +endfacet +facet normal -0.281034E+00 0.620776E+00 0.731886E+00 + outer loop + vertex 0.527873E+02 0.702894E+02 0.378569E+02 + vertex 0.448821E+02 0.667106E+02 0.378569E+02 + vertex 0.476164E+02 0.635130E+02 0.416190E+02 + endloop +endfacet +facet normal -0.279855E+00 0.620341E+00 0.732706E+00 + outer loop + vertex 0.476164E+02 0.635130E+02 0.416189E+02 + vertex 0.533835E+02 0.661146E+02 0.416190E+02 + vertex 0.527873E+02 0.702893E+02 0.378568E+02 + endloop +endfacet +facet normal -0.575994E+00 0.366730E+00 0.730575E+00 + outer loop + vertex 0.448821E+02 0.667106E+02 0.378569E+02 + vertex 0.401888E+02 0.593392E+02 0.378569E+02 + vertex 0.442062E+02 0.581544E+02 0.416190E+02 + endloop +endfacet +facet normal -0.576198E+00 0.366681E+00 0.730439E+00 + outer loop + vertex 0.442061E+02 0.581543E+02 0.416189E+02 + vertex 0.476164E+02 0.635130E+02 0.416190E+02 + vertex 0.448820E+02 0.667106E+02 0.378568E+02 + endloop +endfacet +facet normal -0.683534E+00 0.000000E+00 0.729919E+00 + outer loop + vertex 0.401888E+02 0.593392E+02 0.378569E+02 + vertex 0.401888E+02 0.506607E+02 0.378569E+02 + vertex 0.442062E+02 0.518455E+02 0.416190E+02 + endloop +endfacet +facet normal -0.683544E+00 -0.728923E-06 0.729910E+00 + outer loop + vertex 0.442061E+02 0.518455E+02 0.416189E+02 + vertex 0.442062E+02 0.581544E+02 0.416190E+02 + vertex 0.401888E+02 0.593391E+02 0.378568E+02 + endloop +endfacet +facet normal -0.576095E+00 -0.366794E+00 0.730464E+00 + outer loop + vertex 0.401888E+02 0.506607E+02 0.378569E+02 + vertex 0.448821E+02 0.432893E+02 0.378569E+02 + vertex 0.476164E+02 0.464869E+02 0.416190E+02 + endloop +endfacet +facet normal -0.576055E+00 -0.366614E+00 0.730585E+00 + outer loop + vertex 0.476164E+02 0.464869E+02 0.416189E+02 + vertex 0.442062E+02 0.518455E+02 0.416190E+02 + vertex 0.401888E+02 0.506607E+02 0.378568E+02 + endloop +endfacet +facet normal -0.280721E+00 -0.620083E+00 0.732593E+00 + outer loop + vertex 0.448821E+02 0.432893E+02 0.378569E+02 + vertex 0.527873E+02 0.397105E+02 0.378569E+02 + vertex 0.533835E+02 0.438853E+02 0.416190E+02 + endloop +endfacet +facet normal -0.280267E+00 -0.621275E+00 0.731757E+00 + outer loop + vertex 0.533834E+02 0.438852E+02 0.416189E+02 + vertex 0.476164E+02 0.464869E+02 0.416190E+02 + vertex 0.448820E+02 0.432892E+02 0.378568E+02 + endloop +endfacet +facet normal 0.932939E-01 -0.674195E+00 0.732637E+00 + outer loop + vertex 0.527873E+02 0.397105E+02 0.378569E+02 + vertex 0.614469E+02 0.409088E+02 0.378569E+02 + vertex 0.597081E+02 0.447564E+02 0.416190E+02 + endloop +endfacet +facet normal 0.928208E-01 -0.673828E+00 0.733035E+00 + outer loop + vertex 0.597080E+02 0.447564E+02 0.416189E+02 + vertex 0.533835E+02 0.438853E+02 0.416190E+02 + vertex 0.527873E+02 0.397104E+02 0.378568E+02 + endloop +endfacet +facet normal 0.450748E+00 -0.512085E+00 0.731160E+00 + outer loop + vertex 0.614469E+02 0.409088E+02 0.378569E+02 + vertex 0.679673E+02 0.466482E+02 0.378569E+02 + vertex 0.644555E+02 0.489286E+02 0.416190E+02 + endloop +endfacet +facet normal 0.450019E+00 -0.512033E+00 0.731646E+00 + outer loop + vertex 0.644554E+02 0.489286E+02 0.416189E+02 + vertex 0.597081E+02 0.447564E+02 0.416190E+02 + vertex 0.614468E+02 0.409087E+02 0.378568E+02 + endloop +endfacet +facet normal 0.654471E+00 -0.195839E+00 0.730284E+00 + outer loop + vertex 0.679673E+02 0.466482E+02 0.378569E+02 + vertex 0.704664E+02 0.549999E+02 0.378569E+02 + vertex 0.662685E+02 0.549999E+02 0.416190E+02 + endloop +endfacet +facet normal 0.654963E+00 -0.195572E+00 0.729914E+00 + outer loop + vertex 0.662685E+02 0.549999E+02 0.416189E+02 + vertex 0.644555E+02 0.489286E+02 0.416190E+02 + vertex 0.679673E+02 0.466482E+02 0.378568E+02 + endloop +endfacet +facet normal 0.425136E+00 0.126952E+00 0.896182E+00 + outer loop + vertex 0.662685E+02 0.549999E+02 0.416190E+02 + vertex 0.644555E+02 0.610713E+02 0.416190E+02 + vertex 0.600649E+02 0.582387E+02 0.441031E+02 + endloop +endfacet +facet normal 0.424996E+00 0.126606E+00 0.896298E+00 + outer loop + vertex 0.600648E+02 0.582387E+02 0.441030E+02 + vertex 0.610294E+02 0.550000E+02 0.441031E+02 + vertex 0.662685E+02 0.549999E+02 0.416189E+02 + endloop +endfacet +facet normal 0.292327E+00 0.332629E+00 0.896606E+00 + outer loop + vertex 0.644555E+02 0.610713E+02 0.416190E+02 + vertex 0.597081E+02 0.652435E+02 0.416190E+02 + vertex 0.575270E+02 0.604644E+02 0.441031E+02 + endloop +endfacet +facet normal 0.292210E+00 0.333239E+00 0.896418E+00 + outer loop + vertex 0.575270E+02 0.604644E+02 0.441030E+02 + vertex 0.600649E+02 0.582387E+02 0.441031E+02 + vertex 0.644554E+02 0.610713E+02 0.416189E+02 + endloop +endfacet +facet normal 0.603705E-01 0.438318E+00 0.896790E+00 + outer loop + vertex 0.597081E+02 0.652435E+02 0.416190E+02 + vertex 0.533835E+02 0.661146E+02 0.416190E+02 + vertex 0.541319E+02 0.609291E+02 0.441031E+02 + endloop +endfacet +facet normal 0.600191E-01 0.438692E+00 0.896631E+00 + outer loop + vertex 0.541319E+02 0.609291E+02 0.441030E+02 + vertex 0.575270E+02 0.604644E+02 0.441031E+02 + vertex 0.597080E+02 0.652434E+02 0.416189E+02 + endloop +endfacet +facet normal -0.182131E+00 0.403738E+00 0.896562E+00 + outer loop + vertex 0.533835E+02 0.661146E+02 0.416190E+02 + vertex 0.476164E+02 0.635130E+02 0.416190E+02 + vertex 0.510407E+02 0.595412E+02 0.441032E+02 + endloop +endfacet +facet normal -0.181174E+00 0.403504E+00 0.896861E+00 + outer loop + vertex 0.510406E+02 0.595411E+02 0.441031E+02 + vertex 0.541319E+02 0.609291E+02 0.441031E+02 + vertex 0.533834E+02 0.661146E+02 0.416189E+02 + endloop +endfacet +facet normal -0.374029E+00 0.238031E+00 0.896350E+00 + outer loop + vertex 0.476164E+02 0.635130E+02 0.416190E+02 + vertex 0.442062E+02 0.581544E+02 0.416190E+02 + vertex 0.492227E+02 0.566827E+02 0.441031E+02 + endloop +endfacet +facet normal -0.374234E+00 0.237963E+00 0.896282E+00 + outer loop + vertex 0.492226E+02 0.566827E+02 0.441030E+02 + vertex 0.510407E+02 0.595412E+02 0.441032E+02 + vertex 0.476164E+02 0.635130E+02 0.416189E+02 + endloop +endfacet +facet normal -0.443759E+00 0.000000E+00 0.896146E+00 + outer loop + vertex 0.442062E+02 0.581544E+02 0.416190E+02 + vertex 0.442062E+02 0.518455E+02 0.416190E+02 + vertex 0.492227E+02 0.533172E+02 0.441031E+02 + endloop +endfacet +facet normal -0.443769E+00 -0.133311E-04 0.896141E+00 + outer loop + vertex 0.492226E+02 0.533171E+02 0.441030E+02 + vertex 0.492227E+02 0.566827E+02 0.441031E+02 + vertex 0.442061E+02 0.581543E+02 0.416189E+02 + endloop +endfacet +facet normal -0.374086E+00 -0.238068E+00 0.896316E+00 + outer loop + vertex 0.442062E+02 0.518455E+02 0.416190E+02 + vertex 0.476164E+02 0.464869E+02 0.416190E+02 + vertex 0.510407E+02 0.504587E+02 0.441031E+02 + endloop +endfacet +facet normal -0.374076E+00 -0.237921E+00 0.896360E+00 + outer loop + vertex 0.510406E+02 0.504586E+02 0.441030E+02 + vertex 0.492227E+02 0.533172E+02 0.441031E+02 + vertex 0.442061E+02 0.518455E+02 0.416189E+02 + endloop +endfacet +facet normal -0.181951E+00 -0.403339E+00 0.896778E+00 + outer loop + vertex 0.476164E+02 0.464869E+02 0.416190E+02 + vertex 0.533835E+02 0.438853E+02 0.416190E+02 + vertex 0.541319E+02 0.490708E+02 0.441031E+02 + endloop +endfacet +facet normal -0.181472E+00 -0.404247E+00 0.896466E+00 + outer loop + vertex 0.541319E+02 0.490708E+02 0.441030E+02 + vertex 0.510407E+02 0.504587E+02 0.441031E+02 + vertex 0.476164E+02 0.464869E+02 0.416189E+02 + endloop +endfacet +facet normal 0.603984E-01 -0.438520E+00 0.896689E+00 + outer loop + vertex 0.533835E+02 0.438853E+02 0.416190E+02 + vertex 0.597081E+02 0.447564E+02 0.416190E+02 + vertex 0.575270E+02 0.495355E+02 0.441031E+02 + endloop +endfacet +facet normal 0.600040E-01 -0.438293E+00 0.896827E+00 + outer loop + vertex 0.575270E+02 0.495354E+02 0.441030E+02 + vertex 0.541319E+02 0.490708E+02 0.441031E+02 + vertex 0.533834E+02 0.438852E+02 0.416189E+02 + endloop +endfacet +facet normal 0.292492E+00 -0.332817E+00 0.896483E+00 + outer loop + vertex 0.597081E+02 0.447564E+02 0.416190E+02 + vertex 0.644555E+02 0.489286E+02 0.416190E+02 + vertex 0.600649E+02 0.517612E+02 0.441031E+02 + endloop +endfacet +facet normal 0.291940E+00 -0.332852E+00 0.896649E+00 + outer loop + vertex 0.600648E+02 0.517611E+02 0.441030E+02 + vertex 0.575270E+02 0.495355E+02 0.441031E+02 + vertex 0.597080E+02 0.447564E+02 0.416189E+02 + endloop +endfacet +facet normal 0.424962E+00 -0.126901E+00 0.896272E+00 + outer loop + vertex 0.644555E+02 0.489286E+02 0.416190E+02 + vertex 0.662685E+02 0.549999E+02 0.416190E+02 + vertex 0.610294E+02 0.550000E+02 0.441031E+02 + endloop +endfacet +facet normal 0.425346E+00 -0.126626E+00 0.896129E+00 + outer loop + vertex 0.610293E+02 0.550000E+02 0.441030E+02 + vertex 0.600649E+02 0.517612E+02 0.441031E+02 + vertex 0.644554E+02 0.489286E+02 0.416189E+02 + endloop +endfacet +facet normal 0.146979E+00 0.437709E-01 0.988171E+00 + outer loop + vertex 0.610294E+02 0.550000E+02 0.441031E+02 + vertex 0.600649E+02 0.582387E+02 0.441031E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +endsolid mesh3 + +solid mesh4 +facet normal 0.101186E+00 0.115380E+00 0.988154E+00 + outer loop + vertex 0.600649E+02 0.582387E+02 0.441031E+02 + vertex 0.575270E+02 0.604644E+02 0.441031E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +facet normal 0.208743E-01 0.152508E+00 0.988082E+00 + outer loop + vertex 0.575270E+02 0.604644E+02 0.441031E+02 + vertex 0.541319E+02 0.609291E+02 0.441031E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +facet normal -0.629348E-01 0.140242E+00 0.988115E+00 + outer loop + vertex 0.541319E+02 0.609291E+02 0.441031E+02 + vertex 0.510407E+02 0.595412E+02 0.441032E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +facet normal -0.129427E+00 0.822809E-01 0.988169E+00 + outer loop + vertex 0.510407E+02 0.595412E+02 0.441032E+02 + vertex 0.492227E+02 0.566827E+02 0.441031E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +facet normal -0.153391E+00 0.000000E+00 0.988166E+00 + outer loop + vertex 0.492227E+02 0.566827E+02 0.441031E+02 + vertex 0.492227E+02 0.533172E+02 0.441031E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +facet normal -0.129417E+00 -0.823089E-01 0.988168E+00 + outer loop + vertex 0.492227E+02 0.533172E+02 0.441031E+02 + vertex 0.510407E+02 0.504587E+02 0.441031E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +facet normal -0.629647E-01 -0.140238E+00 0.988114E+00 + outer loop + vertex 0.510407E+02 0.504587E+02 0.441031E+02 + vertex 0.541319E+02 0.490708E+02 0.441031E+02 + vertex 0.549999E+02 0.549999E+02 0.449999E+02 + endloop +endfacet +facet normal -0.642682E+00 0.642682E+00 -0.417038E+00 + outer loop + vertex 0.549999E+02 0.549999E+02 0.449999E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + vertex 0.510406E+02 0.504586E+02 0.441030E+02 + endloop +endfacet +facet normal 0.208739E-01 -0.152505E+00 0.988082E+00 + outer loop + vertex 0.541319E+02 0.490708E+02 0.441031E+02 + vertex 0.575270E+02 0.495355E+02 0.441031E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +facet normal 0.171898E+00 -0.171898E+00 0.970001E+00 + outer loop + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + vertex 0.549999E+02 0.549999E+02 0.449999E+02 + vertex 0.541319E+02 0.490708E+02 0.441030E+02 + endloop +endfacet +facet normal 0.101185E+00 -0.115378E+00 0.988155E+00 + outer loop + vertex 0.575270E+02 0.495355E+02 0.441031E+02 + vertex 0.600649E+02 0.517612E+02 0.441031E+02 + vertex 0.549999E+02 0.549999E+02 0.449999E+02 + endloop +endfacet +facet normal -0.110843E+00 0.110843E+00 -0.987637E+00 + outer loop + vertex 0.549999E+02 0.549999E+02 0.449999E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + vertex 0.575270E+02 0.495354E+02 0.441030E+02 + endloop +endfacet +facet normal 0.146979E+00 -0.437696E-01 0.988171E+00 + outer loop + vertex 0.600649E+02 0.517612E+02 0.441031E+02 + vertex 0.610294E+02 0.550000E+02 0.441031E+02 + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + endloop +endfacet +facet normal 0.106774E+00 -0.106774E+00 0.988534E+00 + outer loop + vertex 0.550000E+02 0.550000E+02 0.449999E+02 + vertex 0.549999E+02 0.549999E+02 0.449999E+02 + vertex 0.600648E+02 0.517611E+02 0.441030E+02 + endloop +endfacet +endsolid mesh4 diff --git a/tests/stl_utils.c b/tests/stl_utils.c index e0ebc9e..c3b78dd 100644 --- a/tests/stl_utils.c +++ b/tests/stl_utils.c @@ -44,6 +44,16 @@ struct gmio_stl_triangle_array gmio_stl_triangle_array_malloc(size_t tri_count) return array; } +void gmio_stl_triangle_array_free(struct gmio_stl_triangle_array *array) +{ + if (array != NULL) { + free(array->ptr); + array->ptr = NULL; + array->count = 0; + array->capacity = 0; + } +} + static void gmio_stl_data__begin_solid( void* cookie, const struct gmio_stl_mesh_creator_infos* infos) { diff --git a/tests/stl_utils.h b/tests/stl_utils.h index 87990ba..f289f59 100644 --- a/tests/stl_utils.h +++ b/tests/stl_utils.h @@ -65,6 +65,8 @@ struct gmio_stl_triangle_array */ struct gmio_stl_triangle_array gmio_stl_triangle_array_malloc(size_t tri_count); +void gmio_stl_triangle_array_free(struct gmio_stl_triangle_array* array); + /*! Holds complete STL data (usable for both binary and ascii formats) */ struct gmio_stl_data { diff --git a/tests/test_stl_io.c b/tests/test_stl_io.c index 926d1d8..5803b2d 100644 --- a/tests/test_stl_io.c +++ b/tests/test_stl_io.c @@ -21,6 +21,7 @@ #include "../src/gmio_core/error.h" #include "../src/gmio_core/internal/min_max.h" #include "../src/gmio_stl/stl_error.h" +#include "../src/gmio_stl/stl_infos.h" #include "../src/gmio_stl/stl_io.h" #include "../src/gmio_stl/stl_io_options.h" @@ -319,7 +320,7 @@ const char* test_stla_write() { const char* model_filepath = stl_grabcad_arm11_filepath; const char* model_filepath_out = "temp/solid.stla"; - struct gmio_stl_data data = {0}; + struct gmio_stl_data data = {0}; /* TODO: fix memory leak on error */ char header_str[GMIO_STLB_HEADER_SIZE + 1] = {0}; int error = GMIO_ERROR_OK; @@ -370,6 +371,42 @@ const char* test_stla_write() return NULL; } +const char* generic_test_stl_read_multi_solid( + const char* filepath, unsigned expected_solid_count) +{ + FILE* infile = fopen(filepath, "rb"); + if (infile != NULL) { + unsigned solid_count = 0; + int error = GMIO_ERROR_OK; + struct gmio_stl_read_options roptions = {0}; + roptions.func_stla_get_streamsize = gmio_stla_infos_get_streamsize; + while (gmio_no_error(error)) { + const struct gmio_stl_mesh_creator null_creator = {0}; + error = gmio_stl_read( + gmio_stream_stdio(infile), null_creator, &roptions); + if (gmio_no_error(error)) + ++solid_count; + } + fclose(infile); + UTEST_COMPARE_UINT(expected_solid_count, solid_count); + } + else { + perror(NULL); + UTEST_FAIL(""); + } + return NULL; +} + +const char* test_stl_read_multi_solid() +{ + const char* res = NULL; + res = generic_test_stl_read_multi_solid("models/solid_4meshs.stla", 4); + if (res != NULL) + return res; + res = generic_test_stl_read_multi_solid("models/solid_4meshs.le_stlb", 4); + return res; +} + void generate_stlb_tests_models() { { @@ -403,4 +440,29 @@ void generate_stlb_tests_models() gmio_stl_data_mesh(&data), NULL); } + + { + FILE* infile = fopen("models/solid_4meshs.stla", "rb"); + FILE* outfile = fopen("models/solid_4meshs.le_stlb", "wb"); + int read_error = GMIO_ERROR_OK; + struct gmio_stl_read_options roptions = {0}; + roptions.func_stla_get_streamsize = gmio_stla_infos_get_streamsize; + while (gmio_no_error(read_error)) { + struct gmio_stl_data data = {0}; + struct gmio_stl_write_options woptions = {0}; + read_error = gmio_stla_read( + gmio_stream_stdio(infile), + gmio_stl_data_mesh_creator(&data), + &roptions); + woptions.stlb_header = gmio_stlb_header_str(data.solid_name); + gmio_stl_write( + GMIO_STL_FORMAT_BINARY_LE, + gmio_stream_stdio(outfile), + gmio_stl_data_mesh(&data), + &woptions); + gmio_stl_triangle_array_free(&data.tri_array); + } + fclose(infile); + fclose(outfile); + } }