mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-10-08 11:26:32 +08:00
95 lines
3.4 KiB
C++
95 lines
3.4 KiB
C++
#include "Config.hpp"
|
|
#include "Model.hpp"
|
|
#include "IO.hpp"
|
|
#include "TriangleMesh.hpp"
|
|
#include "libslic3r.h"
|
|
|
|
using namespace Slic3r;
|
|
|
|
void confess_at(const char *file, int line, const char *func, const char *pat, ...){}
|
|
|
|
int
|
|
main(const int argc, const char **argv)
|
|
{
|
|
// read config
|
|
ConfigDef config_def;
|
|
{
|
|
ConfigOptionDef* def;
|
|
|
|
def = config_def.add("offset", coFloat);
|
|
def->label = "Offset from the lowest point (min thickness)";
|
|
def->cli = "offset";
|
|
def->default_value = new ConfigOptionFloat(1);
|
|
|
|
def = config_def.add("output", coString);
|
|
def->label = "Output File";
|
|
def->tooltip = "The file where the output will be written (if not specified, it will be based on the input file).";
|
|
def->cli = "output";
|
|
def->default_value = new ConfigOptionString("");
|
|
}
|
|
DynamicConfig config(&config_def);
|
|
t_config_option_keys input_files;
|
|
config.read_cli(argc, argv, &input_files);
|
|
|
|
for (t_config_option_keys::const_iterator it = input_files.begin(); it != input_files.end(); ++it) {
|
|
TriangleMesh mesh;
|
|
Slic3r::IO::STL::read(*it, &mesh);
|
|
calculate_normals(&mesh.stl);
|
|
|
|
if (mesh.facets_count() == 0) {
|
|
printf("Error: file is empty: %s\n", it->c_str());
|
|
continue;
|
|
}
|
|
|
|
float z = mesh.stl.stats.min.z - config.option("offset", true)->getFloat();
|
|
printf("min.z = %f, z = %f\n", mesh.stl.stats.min.z, z);
|
|
TriangleMesh mesh2 = mesh;
|
|
|
|
for (int i = 0; i < mesh.stl.stats.number_of_facets; ++i) {
|
|
const stl_facet &facet = mesh.stl.facet_start[i];
|
|
|
|
if (facet.normal.z < 0) {
|
|
printf("Invalid 2.5D mesh / TIN (one facet points downwards = %f)\n", facet.normal.z);
|
|
exit(1);
|
|
}
|
|
|
|
for (int j = 0; j < 3; ++j) {
|
|
if (mesh.stl.neighbors_start[i].neighbor[j] == -1) {
|
|
stl_facet new_facet;
|
|
float normal[3];
|
|
|
|
// first triangle
|
|
new_facet.vertex[0] = new_facet.vertex[2] = facet.vertex[(j+1)%3];
|
|
new_facet.vertex[1] = facet.vertex[j];
|
|
new_facet.vertex[2].z = z;
|
|
stl_calculate_normal(normal, &new_facet);
|
|
stl_normalize_vector(normal);
|
|
new_facet.normal.x = normal[0];
|
|
new_facet.normal.y = normal[1];
|
|
new_facet.normal.z = normal[2];
|
|
stl_add_facet(&mesh2.stl, &new_facet);
|
|
|
|
// second triangle
|
|
new_facet.vertex[0] = new_facet.vertex[1] = facet.vertex[j];
|
|
new_facet.vertex[2] = facet.vertex[(j+1)%3];
|
|
new_facet.vertex[1].z = new_facet.vertex[2].z = z;
|
|
new_facet.normal.x = normal[0];
|
|
new_facet.normal.y = normal[1];
|
|
new_facet.normal.z = normal[2];
|
|
stl_add_facet(&mesh2.stl, &new_facet);
|
|
}
|
|
}
|
|
}
|
|
|
|
mesh2.repair();
|
|
|
|
std::string outfile = config.option("output", true)->getString();
|
|
if (outfile.empty()) outfile = *it + "_extruded.stl";
|
|
|
|
Slic3r::IO::STL::write(mesh2, outfile);
|
|
printf("Extuded mesh written to %s\n", outfile.c_str());
|
|
}
|
|
|
|
return 0;
|
|
}
|