gmio_stl: add option stla_float32_format

This commit is contained in:
Hugues Delorme 2015-04-15 17:11:15 +02:00
parent dd7b24e023
commit d3fb4132fb
5 changed files with 85 additions and 7 deletions

View File

@ -0,0 +1,43 @@
/****************************************************************************
** GeomIO Library
** Copyright FougSys (2 Mar. 2015)
** contact@fougsys.fr
**
** This software is a reusable library whose purpose is to provide complete
** I/O support for various CAD file formats (eg. STL)
**
** This software is governed by the CeCILL-B license under French law and
** abiding by the rules of distribution of free software. You can use,
** modify and/ or redistribute the software under the terms of the CeCILL-B
** license as circulated by CEA, CNRS and INRIA at the following URL
** "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html".
****************************************************************************/
/*! \file text_format.h
* Formats for textual representation
*/
#ifndef GMIO_TEXT_FORMAT_H
#define GMIO_TEXT_FORMAT_H
#include "global.h"
/*! This enum defines the various formats to textually represent a float */
enum gmio_float_text_format
{
/*! Decimal floating point, lowercase (ex: 392.65) */
GMIO_FLOAT_TEXT_FORMAT_DECIMAL_LOWERCASE = 0,
/*! Decimal floating point, uppercase (ex: 392.65) */
GMIO_FLOAT_TEXT_FORMAT_DECIMAL_UPPERCASE,
/*! Scientific notation, lowercase (ex: 3.9265e+2) */
GMIO_FLOAT_TEXT_FORMAT_SCIENTIFIC_LOWERCASE,
/*! Scientific notation, uppercase (ex: 3.9265E+2) */
GMIO_FLOAT_TEXT_FORMAT_SCIENTIFIC_UPPERCASE,
/*! Use the shortest representation: decimal or scientific lowercase */
GMIO_FLOAT_TEXT_FORMAT_SHORTEST_LOWERCASE,
/*! Use the shortest representation: decimal or scientific uppercase */
GMIO_FLOAT_TEXT_FORMAT_SHORTEST_UPPERCASE
};
typedef enum gmio_float_text_format gmio_float_text_format_t;
#endif /* GMIO_TEXT_FORMAT_H */

View File

@ -83,14 +83,30 @@ GMIO_INLINE char* gmio_write_nspaces(char* buffer, int n)
return buffer + offset;
}
GMIO_INLINE char* gmio_write_stdio_format(char* buffer, uint8_t prec)
GMIO_INLINE char gmio_float_text_format_to_specifier(
gmio_float_text_format_t format)
{
switch (format) {
case GMIO_FLOAT_TEXT_FORMAT_DECIMAL_LOWERCASE: return 'f';
case GMIO_FLOAT_TEXT_FORMAT_DECIMAL_UPPERCASE: return 'F';
case GMIO_FLOAT_TEXT_FORMAT_SCIENTIFIC_LOWERCASE: return 'e';
case GMIO_FLOAT_TEXT_FORMAT_SCIENTIFIC_UPPERCASE: return 'E';
case GMIO_FLOAT_TEXT_FORMAT_SHORTEST_LOWERCASE: return 'g';
case GMIO_FLOAT_TEXT_FORMAT_SHORTEST_UPPERCASE: return 'G';
}
/* Default, should not be here */
return GMIO_FLOAT_TEXT_FORMAT_DECIMAL_LOWERCASE;
}
GMIO_INLINE char* gmio_write_stdio_format(
char* buffer, char format_specifier, uint8_t prec)
{
int prec_len = 0;
buffer[0] = '%';
buffer[1] = '.';
prec_len = sprintf(buffer + 2, "%u", prec);
buffer[2 + prec_len] = 'E';
buffer[2 + prec_len] = format_specifier;
return buffer + 3 + prec_len;
}
@ -115,6 +131,7 @@ int gmio_stla_write(
const gmio_stl_mesh_t* mesh,
/* Options */
const char* solid_name,
gmio_float_text_format_t float32_format,
uint8_t float32_prec)
{
/* Constants */
@ -141,12 +158,14 @@ int gmio_stla_write(
return GMIO_ERROR_INVALID_BUFFER_SIZE;
{ /* Create XYZ coords format string (for normal and vertex coords) */
const char float32_specifier =
gmio_float_text_format_to_specifier(float32_format);
char* it = coords_format;
it = gmio_write_stdio_format(it, float32_prec);
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
it = gmio_write_nspaces(it, 2);
it = gmio_write_stdio_format(it, float32_prec);
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
it = gmio_write_nspaces(it, 2);
it = gmio_write_stdio_format(it, float32_prec);
it = gmio_write_stdio_format(it, float32_specifier, float32_prec);
*it = 0; /* Write terminating null byte */
/* TODO: check the "format" string can contain the given precision */
}

View File

@ -17,6 +17,7 @@
#define GMIO_INTERNAL_STLA_WRITE_H
#include "../stl_mesh.h"
#include "../../gmio_core/text_format.h"
#include "../../gmio_core/transfer.h"
/*! Writes geometry in the STL ascii format
@ -30,6 +31,7 @@ int gmio_stla_write(
const gmio_stl_mesh_t* mesh,
/* Options */
const char* solid_name,
gmio_float_text_format_t float32_format,
uint8_t float32_prec);
#endif /* GMIO_INTERNAL_STLA_WRITE_H */

View File

@ -127,9 +127,13 @@ int gmio_stl_write(
case GMIO_STL_FORMAT_ASCII: {
const char* solid_name =
options != NULL ? options->stla_solid_name : NULL;
const uint8_t float32_prec =
const gmio_float_text_format_t float_fmt =
options != NULL ? options->stla_float32_format :
GMIO_FLOAT_TEXT_FORMAT_DECIMAL_LOWERCASE;
const uint8_t float_prec =
options != NULL ? options->stla_float32_prec : 9;
error = gmio_stla_write(trsf, mesh, solid_name, float32_prec);
error = gmio_stla_write(
trsf, mesh, solid_name, float_fmt, float_prec);
break;
}
case GMIO_STL_FORMAT_BINARY_BE: {

View File

@ -22,6 +22,7 @@
#include "stl_global.h"
#include "../gmio_core/endian.h"
#include "../gmio_core/text_format.h"
/*! Options for gmio_stl_write() */
struct gmio_stl_write_options
@ -36,6 +37,15 @@ struct gmio_stl_write_options
*/
const char* stla_solid_name;
/*! The format used when writting float values as strings
*
* Option useful only with STL ascii format (GMIO_STL_FORMAT_ASCII).
*
* Defaulted to \c GMIO_FLOAT_TEXT_FORMAT_DECIMAL_LOWERCASE when calling
* gmio_stl_write() with \c options==NULL
*/
gmio_float_text_format_t stla_float32_format;
/*! The maximum number of significant digits when writting float values
*
* Option useful only with STL ascii format (GMIO_STL_FORMAT_ASCII).