mirror of https://github.com/lammps/lammps.git
add simple STL binary to ASCII converter (based on Wikipedia specs)
This commit is contained in:
parent
559dc68197
commit
6722d3fb00
|
@ -3,6 +3,9 @@ if(BUILD_TOOLS)
|
||||||
target_compile_definitions(binary2txt PRIVATE -DLAMMPS_${LAMMPS_SIZES})
|
target_compile_definitions(binary2txt PRIVATE -DLAMMPS_${LAMMPS_SIZES})
|
||||||
install(TARGETS binary2txt DESTINATION ${CMAKE_INSTALL_BINDIR})
|
install(TARGETS binary2txt DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
|
||||||
|
add_executable(stl_bin2txt ${LAMMPS_TOOLS_DIR}/stl_bin2txt.cpp)
|
||||||
|
install(TARGETS stl_bin2txt DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
|
||||||
include(CheckGeneratorSupport)
|
include(CheckGeneratorSupport)
|
||||||
if(CMAKE_GENERATOR_SUPPORT_FORTRAN)
|
if(CMAKE_GENERATOR_SUPPORT_FORTRAN)
|
||||||
include(CheckLanguage)
|
include(CheckLanguage)
|
||||||
|
|
|
@ -56,6 +56,7 @@ Pre-processing tools
|
||||||
* :ref:`moltemplate <moltemplate>`
|
* :ref:`moltemplate <moltemplate>`
|
||||||
* :ref:`msi2lmp <msi>`
|
* :ref:`msi2lmp <msi>`
|
||||||
* :ref:`polybond <polybond>`
|
* :ref:`polybond <polybond>`
|
||||||
|
* :ref:`stl_bin2txt <stlconvert>`
|
||||||
|
|
||||||
|
|
||||||
Post-processing tools
|
Post-processing tools
|
||||||
|
@ -1017,6 +1018,27 @@ For more details please see the README.md file in that folder.
|
||||||
|
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
.. _stlconvert:
|
||||||
|
|
||||||
|
stl_bin2txt tool
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The file stl_bin2txt.cpp converts binary STL files - like they are frequently
|
||||||
|
offered for download on the web - into ASCII format STL files that LAMMPS
|
||||||
|
can read with the :doc:`create_atoms mesh <create_atoms>` or the
|
||||||
|
:doc:`fix smd/wall_surface` commands. The syntax for running the tool is
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
stl_bin2txt infile.stl outfile.stl
|
||||||
|
|
||||||
|
which creates outfile.stl from infile.stl. This tool must be compiled
|
||||||
|
on a platform compatible with the byteordering that was used to create
|
||||||
|
the binary file. This usually is a so-called little endian hardware
|
||||||
|
(like x86).
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
.. _swig:
|
.. _swig:
|
||||||
|
|
||||||
SWIG interface
|
SWIG interface
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(MAKE) binary2txt chain micelle2d
|
$(MAKE) binary2txt chain micelle2d stl_bin2txt
|
||||||
|
|
||||||
binary2txt: binary2txt.o
|
binary2txt: binary2txt.o
|
||||||
g++ -g binary2txt.o -o binary2txt
|
g++ -g binary2txt.o -o binary2txt
|
||||||
|
@ -19,6 +19,9 @@ micelle2d: micelle2d.o
|
||||||
thermo_extract: thermo_extract.o
|
thermo_extract: thermo_extract.o
|
||||||
gcc -g thermo_extract.o -o thermo_extract
|
gcc -g thermo_extract.o -o thermo_extract
|
||||||
|
|
||||||
|
stl_bin2txt: stl_bin2txt.o
|
||||||
|
g++ -g stl_bin2txt.o -o stl_bin2txt
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm binary2txt chain micelle2d
|
rm binary2txt chain micelle2d
|
||||||
rm thermo_extract
|
rm thermo_extract
|
||||||
|
|
|
@ -46,6 +46,7 @@ replica tool to reorder LAMMPS replica trajectories according to
|
||||||
singularity Singularity container descriptions suitable for LAMMPS development
|
singularity Singularity container descriptions suitable for LAMMPS development
|
||||||
smd convert Smooth Mach Dynamics triangles to VTK
|
smd convert Smooth Mach Dynamics triangles to VTK
|
||||||
spin perform a cubic polynomial interpolation of a GNEB MEP
|
spin perform a cubic polynomial interpolation of a GNEB MEP
|
||||||
|
stl_bin2txt convert binary STL files to ASCII
|
||||||
swig Interface file and demo scripts for SWIG wrappers for the LAMMPS C library interface
|
swig Interface file and demo scripts for SWIG wrappers for the LAMMPS C library interface
|
||||||
valgrind suppression files for use with valgrind's memcheck tool
|
valgrind suppression files for use with valgrind's memcheck tool
|
||||||
vim add-ons to VIM editor for editing LAMMPS input scripts
|
vim add-ons to VIM editor for editing LAMMPS input scripts
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
/* -----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/
|
||||||
|
Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories
|
||||||
|
|
||||||
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||||
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||||
|
certain rights in this software. This software is distributed under
|
||||||
|
the GNU General Public License.
|
||||||
|
|
||||||
|
See the README file in the top-level LAMMPS directory.
|
||||||
|
------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
// Convert a binary STL file to ASCII format
|
||||||
|
// Contributing author: Axel Kohlmeyer, Temple U, akohlmey at gmail.com
|
||||||
|
//
|
||||||
|
// Specs of the format taken from: https://en.wikipedia.org/wiki/STL_(file_format)
|
||||||
|
|
||||||
|
#include <cerrno>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *in, *out;
|
||||||
|
char title[80];
|
||||||
|
float normal[3], vert1[3], vert2[3], vert3[3];
|
||||||
|
uint32_t ntriangles;
|
||||||
|
size_t count;
|
||||||
|
uint16_t attributes;
|
||||||
|
|
||||||
|
if (argc != 3) {
|
||||||
|
printf("Usage: %s <input file> <output file>\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
in = fopen(argv[1], "rb");
|
||||||
|
if (!in) {
|
||||||
|
printf("Error opening input file %s: %s\n", argv[1], strerror(errno));
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
out = fopen(argv[2], "w");
|
||||||
|
if (!out) {
|
||||||
|
printf("Error opening output file %s: %s\n", argv[1], strerror(errno));
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read header */
|
||||||
|
count = fread(title, sizeof(char), sizeof(title), in);
|
||||||
|
if (count != sizeof(title)) {
|
||||||
|
printf("Error reading binary STL header: %s\n", strerror(errno));
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
count = strlen(title);
|
||||||
|
if (count == 0) snprintf(title, 80, "STL object from file %s", argv[1]);
|
||||||
|
|
||||||
|
/* read triangle count */
|
||||||
|
count = fread(&ntriangles, sizeof(uint32_t), 1, in);
|
||||||
|
if (count != 1) {
|
||||||
|
printf("Error reading binary STL triangle count: %s\n", strerror(errno));
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write header */
|
||||||
|
printf("Converting: %s with %u triangles\n", title, ntriangles);
|
||||||
|
fprintf(out, "solid %s\n", title);
|
||||||
|
|
||||||
|
/* loop over triangles */
|
||||||
|
for (uint32_t i = 0; i < ntriangles; ++i) {
|
||||||
|
count = fread(normal, sizeof(float), 3, in);
|
||||||
|
count += fread(vert1, sizeof(float), 3, in);
|
||||||
|
count += fread(vert2, sizeof(float), 3, in);
|
||||||
|
count += fread(vert3, sizeof(float), 3, in);
|
||||||
|
if (count != 12) {
|
||||||
|
printf("Error reading binary STL vertices: %s\n", strerror(errno));
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
count = fread(&attributes, sizeof(uint16_t), 1, in);
|
||||||
|
if (count != 1) {
|
||||||
|
printf("Error reading binary STL facet attributes: %s\n", strerror(errno));
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
fprintf(out, " facet normal %e %e %e\n", normal[0], normal[1], normal[2]);
|
||||||
|
fputs(" outer loop\n", out);
|
||||||
|
fprintf(out, " vertex %e %e %e\n", vert1[0], vert1[1], vert1[2]);
|
||||||
|
fprintf(out, " vertex %e %e %e\n", vert2[0], vert2[1], vert2[2]);
|
||||||
|
fprintf(out, " vertex %e %e %e\n", vert3[0], vert3[1], vert3[2]);
|
||||||
|
fputs(" endloop\n endfacet\n", out);
|
||||||
|
if (ferror(out)) {
|
||||||
|
printf("Error writing text STL facet: %s\n", strerror(errno));
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(out, "endsolid %s\n", title);
|
||||||
|
fclose(in);
|
||||||
|
fclose(out);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue