mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 09:06:02 +08:00
Fix crash when exporting to stl
This commit is contained in:
parent
3ab20de3c0
commit
c5b22163c5
@ -1,8 +1,10 @@
|
|||||||
#ifndef CSGMESH_HPP
|
#ifndef CSGMESH_HPP
|
||||||
#define CSGMESH_HPP
|
#define CSGMESH_HPP
|
||||||
|
|
||||||
|
#include "libslic3r/Point.hpp"
|
||||||
|
|
||||||
#include <libslic3r/AnyPtr.hpp>
|
#include <libslic3r/AnyPtr.hpp>
|
||||||
#include <admesh/stl.h>
|
#include <libslic3r/TriangleMesh.hpp>
|
||||||
|
|
||||||
namespace Slic3r { namespace csg {
|
namespace Slic3r { namespace csg {
|
||||||
|
|
||||||
@ -81,6 +83,35 @@ struct CSGPart {
|
|||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class Cont> bool is_all_positive(const Cont &csgmesh)
|
||||||
|
{
|
||||||
|
bool is_all_pos =
|
||||||
|
std::all_of(csgmesh.begin(),
|
||||||
|
csgmesh.end(),
|
||||||
|
[](auto &part) {
|
||||||
|
return csg::get_operation(part) == csg::CSGType::Union;
|
||||||
|
});
|
||||||
|
|
||||||
|
return is_all_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Cont>
|
||||||
|
indexed_triangle_set csgmesh_merge_positive_parts(const Cont &csgmesh)
|
||||||
|
{
|
||||||
|
indexed_triangle_set m;
|
||||||
|
for (auto &csgpart : csgmesh) {
|
||||||
|
auto op = csg::get_operation(csgpart);
|
||||||
|
const indexed_triangle_set * pmesh = csg::get_mesh(csgpart);
|
||||||
|
if (pmesh && op == csg::CSGType::Union) {
|
||||||
|
indexed_triangle_set mcpy = *pmesh;
|
||||||
|
its_transform(mcpy, csg::get_transform(csgpart), true);
|
||||||
|
its_merge(m, mcpy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
}} // namespace Slic3r::csg
|
}} // namespace Slic3r::csg
|
||||||
|
|
||||||
#endif // CSGMESH_HPP
|
#endif // CSGMESH_HPP
|
||||||
|
@ -127,35 +127,6 @@ void SLAPrint::Steps::apply_printer_corrections(SLAPrintObject &po, SliceOrigin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Cont> bool is_all_positive(const Cont &csgmesh)
|
|
||||||
{
|
|
||||||
bool is_all_pos =
|
|
||||||
std::all_of(csgmesh.begin(),
|
|
||||||
csgmesh.end(),
|
|
||||||
[](auto &part) {
|
|
||||||
return csg::get_operation(part) == csg::CSGType::Union;
|
|
||||||
});
|
|
||||||
|
|
||||||
return is_all_pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class Cont>
|
|
||||||
static indexed_triangle_set csgmesh_merge_positive_parts(const Cont &csgmesh)
|
|
||||||
{
|
|
||||||
indexed_triangle_set m;
|
|
||||||
for (auto &csgpart : csgmesh) {
|
|
||||||
auto op = csg::get_operation(csgpart);
|
|
||||||
const indexed_triangle_set * pmesh = csg::get_mesh(csgpart);
|
|
||||||
if (pmesh && op == csg::CSGType::Union) {
|
|
||||||
indexed_triangle_set mcpy = *pmesh;
|
|
||||||
its_transform(mcpy, csg::get_transform(csgpart), true);
|
|
||||||
its_merge(m, mcpy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
indexed_triangle_set SLAPrint::Steps::generate_preview_vdb(
|
indexed_triangle_set SLAPrint::Steps::generate_preview_vdb(
|
||||||
SLAPrintObject &po, SLAPrintObjectStep step)
|
SLAPrintObject &po, SLAPrintObjectStep step)
|
||||||
{
|
{
|
||||||
|
@ -6471,9 +6471,12 @@ void Plater::export_stl_obj(bool extended, bool selection_only)
|
|||||||
csg::model_to_csgmesh(mo, Transform3d::Identity(), std::back_inserter(csgmesh),
|
csg::model_to_csgmesh(mo, Transform3d::Identity(), std::back_inserter(csgmesh),
|
||||||
csg::mpartsPositive | csg::mpartsNegative | csg::mpartsDoSplits);
|
csg::mpartsPositive | csg::mpartsNegative | csg::mpartsDoSplits);
|
||||||
|
|
||||||
if (csg::check_csgmesh_booleans(range(csgmesh)) == csgmesh.end()) {
|
auto csgrange = range(csgmesh);
|
||||||
|
if (csg::is_all_positive(csgrange)) {
|
||||||
|
mesh = TriangleMesh{csg::csgmesh_merge_positive_parts(csgrange)};
|
||||||
|
} else if (csg::check_csgmesh_booleans(csgrange) == csgrange.end()) {
|
||||||
try {
|
try {
|
||||||
auto cgalm = csg::perform_csgmesh_booleans(range(csgmesh));
|
auto cgalm = csg::perform_csgmesh_booleans(csgrange);
|
||||||
mesh = MeshBoolean::cgal::cgal_to_triangle_mesh(*cgalm);
|
mesh = MeshBoolean::cgal::cgal_to_triangle_mesh(*cgalm);
|
||||||
} catch (...) {}
|
} catch (...) {}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user