mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-04 22:31:02 +00:00
* Ignore Clipper, libpng, mcut and Boost.Polygon Internals in clang-tidy Each only works through a wrapper or umbrella header: libslic3r/clipper.hpp or clipper_z.hpp configure Clipper before including it, png.h pulls in libpng's config headers, and Boost.Polygon's headers only compile through polygon.hpp or voronoi.hpp. * Ignore minilzo's Config Headers in clang-tidy lzoconf.h and lzodefs.h are internal to minilzo.h, which is what the code includes. * Add Missing Includes Across the Remaining Sources and Tests Covers src/slic3r/Utils, src/slic3r/plugin, src/slic3r/Config, src/libvgcode, src/dev-utils, src/OrcaSlicer.cpp and tests/, the directories left after src/slic3r/GUI and src/libslic3r. Generated with clang-tidy misc-include-cleaner. libvgcode's own headers are included by relative path as in the rest of that library, and Catch2 and pybind11 with angle brackets as elsewhere in the repo. * Make the GUI and Test Headers Compile on Their Own Each now includes, or forward-declares, what it uses instead of relying on what its includers happened to include first. Headers that only compile on one platform, or that nothing built includes, are left alone. * Keep Windows and nanosvg Setup Ahead of the Added Includes OrcaSlicer.cpp and several tests set _WIN32_WINNT, WIN32_LEAN_AND_MEAN or NOMINMAX before including Windows.h, and the profile validator defines NANOSVG_IMPLEMENTATION before any libslic3r header. The added includes had landed above those blocks, which broke the Windows build. * Add the GUI Includes the First Pass Missed Covers headers that only became editable once they compiled on their own, and wx symbols whose suggested header changed as the clang-tidy ignore list grew after the src/slic3r/GUI pass. * Keep the Added Test Includes Below the NOMINMAX Guard test_marchingsquares.cpp and test_texture_displacement.cpp had includes inside #ifndef NOMINMAX, which the tests inherit as defined on Windows from libslic3r, so those were skipped there. .clang-tidy also ignores the MSVC STL and UCRT internals, Boost.Multiprecision's fwd.hpp and CPython's Windows include directory, as in #16068.
155 lines
4.8 KiB
C++
155 lines
4.8 KiB
C++
#include <algorithm>
|
|
#include <catch2/catch_all.hpp>
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include "test_utils.hpp"
|
|
|
|
#include <cstddef>
|
|
#include <iterator>
|
|
#include <libslic3r/ExPolygon.hpp>
|
|
#include <libslic3r/BoundingBox.hpp>
|
|
#include "libslic3r/TriangleMesh.hpp"
|
|
#include "libslic3r/libslic3r.h"
|
|
#include "libslic3r/SLA/SupportPoint.hpp"
|
|
#include "libslic3r/Point.hpp"
|
|
#include "libslic3r/SLA/SpatIndex.hpp"
|
|
#include <limits>
|
|
#include "libslic3r/SLA/SupportPointGenerator.hpp"
|
|
#include "libslic3r/Line.hpp"
|
|
#include "libslic3r/SLA/Hollowing.hpp"
|
|
|
|
#include "sla_test_utils.hpp"
|
|
|
|
namespace Slic3r { namespace sla {
|
|
|
|
TEST_CASE("Overhanging point should be supported", "[SupGen]") {
|
|
|
|
// Pyramid with 45 deg slope
|
|
TriangleMesh mesh = make_pyramid(10.f, 10.f);
|
|
mesh.rotate_y(float(PI));
|
|
write_debug_obj("sla_supptgen/Pyramid.obj", mesh);
|
|
|
|
sla::SupportPoints pts = calc_support_pts(mesh);
|
|
|
|
// The overhang, which is the upside-down pyramid's edge
|
|
Vec3f overh{0., 0., -10.};
|
|
|
|
REQUIRE(!pts.empty());
|
|
|
|
float dist = (overh - pts.front().pos).norm();
|
|
|
|
for (const auto &pt : pts)
|
|
dist = std::min(dist, (overh - pt.pos).norm());
|
|
|
|
// Should require exactly one support point at the overhang
|
|
REQUIRE(pts.size() > 0);
|
|
REQUIRE(dist < 1.f);
|
|
}
|
|
|
|
double min_point_distance(const sla::SupportPoints &pts)
|
|
{
|
|
sla::PointIndex index;
|
|
|
|
for (size_t i = 0; i < pts.size(); ++i)
|
|
index.insert(pts[i].pos.cast<double>(), i);
|
|
|
|
auto d = std::numeric_limits<double>::max();
|
|
index.foreach([&d, &index](const sla::PointIndexEl &el) {
|
|
auto res = index.nearest(el.first, 2);
|
|
for (const sla::PointIndexEl &r : res)
|
|
if (r.second != el.second)
|
|
d = std::min(d, (el.first - r.first).norm());
|
|
});
|
|
|
|
return d;
|
|
}
|
|
|
|
TEST_CASE("Overhanging horizontal surface should be supported", "[SupGen]") {
|
|
double width = 10., depth = 10., height = 1.;
|
|
|
|
TriangleMesh mesh = make_cube(width, depth, height);
|
|
mesh.translate(0., 0., 5.); // lift up
|
|
write_debug_obj("sla_supptgen/Cuboid.obj", mesh);
|
|
|
|
sla::SupportPointGenerator::Config cfg;
|
|
sla::SupportPoints pts = calc_support_pts(mesh, cfg);
|
|
|
|
double mm2 = width * depth;
|
|
|
|
REQUIRE(!pts.empty());
|
|
REQUIRE(pts.size() * cfg.support_force() > mm2 * cfg.tear_pressure());
|
|
REQUIRE(min_point_distance(pts) >= cfg.minimal_distance);
|
|
}
|
|
|
|
template<class M> auto&& center_around_bb(M &&mesh)
|
|
{
|
|
auto bb = mesh.bounding_box();
|
|
mesh.translate(-bb.center().template cast<float>());
|
|
|
|
return std::forward<M>(mesh);
|
|
}
|
|
|
|
TEST_CASE("Overhanging edge should be supported", "[SupGen]") {
|
|
float width = 10.f, depth = 10.f, height = 5.f;
|
|
|
|
TriangleMesh mesh = make_prism(width, depth, height);
|
|
mesh.rotate_y(float(PI)); // rotate on its back
|
|
mesh.translate(0., 0., height);
|
|
write_debug_obj("sla_supptgen/Prism.obj", mesh);
|
|
|
|
sla::SupportPointGenerator::Config cfg;
|
|
sla::SupportPoints pts = calc_support_pts(mesh, cfg);
|
|
|
|
Linef3 overh{ {0.f, -depth / 2.f, 0.f}, {0.f, depth / 2.f, 0.f}};
|
|
|
|
// Get all the points closer that 1 mm to the overhanging edge:
|
|
sla::SupportPoints overh_pts; overh_pts.reserve(pts.size());
|
|
|
|
std::copy_if(pts.begin(), pts.end(), std::back_inserter(overh_pts),
|
|
[&overh](const sla::SupportPoint &pt){
|
|
return line_alg::distance_to(overh, Vec3d{pt.pos.cast<double>()}) < 1.;
|
|
});
|
|
|
|
REQUIRE(overh_pts.size() * cfg.support_force() > overh.length() * cfg.tear_pressure());
|
|
double ddiff = min_point_distance(pts) - cfg.minimal_distance;
|
|
REQUIRE(ddiff > - 0.1 * cfg.minimal_distance);
|
|
}
|
|
|
|
TEST_CASE("Hollowed cube should be supported from the inside", "[SupGen][Hollowed]") {
|
|
TriangleMesh mesh = make_cube(20., 20., 20.);
|
|
|
|
hollow_mesh(mesh, HollowingConfig{});
|
|
|
|
write_debug_obj("sla_supptgen/cube_hollowed.obj", mesh);
|
|
|
|
auto bb = mesh.bounding_box();
|
|
auto h = float(bb.max.z() - bb.min.z());
|
|
Vec3f mv = bb.center().cast<float>() - Vec3f{0.f, 0.f, 0.5f * h};
|
|
mesh.translate(-mv);
|
|
|
|
sla::SupportPointGenerator::Config cfg;
|
|
sla::SupportPoints pts = calc_support_pts(mesh, cfg);
|
|
sla::remove_bottom_points(pts, mesh.bounding_box().min.z() + EPSILON);
|
|
|
|
REQUIRE(!pts.empty());
|
|
}
|
|
|
|
TEST_CASE("Two parallel plates should be supported", "[SupGen][Hollowed]")
|
|
{
|
|
double width = 20., depth = 20., height = 1.;
|
|
|
|
TriangleMesh mesh = center_around_bb(make_cube(width + 5., depth + 5., height));
|
|
TriangleMesh mesh_high = center_around_bb(make_cube(width, depth, height));
|
|
mesh_high.translate(0., 0., 10.); // lift up
|
|
mesh.merge(mesh_high);
|
|
|
|
write_debug_obj("sla_supptgen/parallel_plates.obj", mesh);
|
|
|
|
sla::SupportPointGenerator::Config cfg;
|
|
sla::SupportPoints pts = calc_support_pts(mesh, cfg);
|
|
sla::remove_bottom_points(pts, mesh.bounding_box().min.z() + EPSILON);
|
|
|
|
REQUIRE(!pts.empty());
|
|
}
|
|
|
|
}} // namespace Slic3r::sla
|