TriangleMeshSlicer is now initialized by const-pointer to the mesh, responsibility for calling require_shared_vertices is left to the caller
This commit is contained in:
parent
a177a7e1da
commit
f33e9bf609
@ -1189,6 +1189,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b
|
|||||||
volume->mesh.transform(instance_matrix * volume_matrix, true);
|
volume->mesh.transform(instance_matrix * volume_matrix, true);
|
||||||
|
|
||||||
// Perform cut
|
// Perform cut
|
||||||
|
volume->mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
TriangleMeshSlicer tms(&volume->mesh);
|
TriangleMeshSlicer tms(&volume->mesh);
|
||||||
tms.cut(float(z), &upper_mesh, &lower_mesh);
|
tms.cut(float(z), &upper_mesh, &lower_mesh);
|
||||||
|
|
||||||
|
@ -1813,6 +1813,7 @@ std::vector<ExPolygons> PrintObject::_slice_volumes(const std::vector<float> &z,
|
|||||||
TriangleMeshSlicer mslicer;
|
TriangleMeshSlicer mslicer;
|
||||||
const Print *print = this->print();
|
const Print *print = this->print();
|
||||||
auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();});
|
auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();});
|
||||||
|
mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
mslicer.init(&mesh, callback);
|
mslicer.init(&mesh, callback);
|
||||||
mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback);
|
mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback);
|
||||||
m_print->throw_if_canceled();
|
m_print->throw_if_canceled();
|
||||||
@ -1840,6 +1841,7 @@ std::vector<ExPolygons> PrintObject::_slice_volume(const std::vector<float> &z,
|
|||||||
TriangleMeshSlicer mslicer;
|
TriangleMeshSlicer mslicer;
|
||||||
const Print *print = this->print();
|
const Print *print = this->print();
|
||||||
auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();});
|
auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();});
|
||||||
|
mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
mslicer.init(&mesh, callback);
|
mslicer.init(&mesh, callback);
|
||||||
mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback);
|
mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback);
|
||||||
m_print->throw_if_canceled();
|
m_print->throw_if_canceled();
|
||||||
|
@ -552,6 +552,7 @@ void base_plate(const TriangleMesh &mesh, ExPolygons &output, float h,
|
|||||||
float layerh, ThrowOnCancel thrfn)
|
float layerh, ThrowOnCancel thrfn)
|
||||||
{
|
{
|
||||||
TriangleMesh m = mesh;
|
TriangleMesh m = mesh;
|
||||||
|
m.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
TriangleMeshSlicer slicer(&m);
|
TriangleMeshSlicer slicer(&m);
|
||||||
|
|
||||||
auto bb = mesh.bounding_box();
|
auto bb = mesh.bounding_box();
|
||||||
|
@ -2231,6 +2231,7 @@ SlicedSupports SLASupportTree::slice(float layerh, float init_layerh) const
|
|||||||
|
|
||||||
TriangleMesh fullmesh = m_impl->merged_mesh();
|
TriangleMesh fullmesh = m_impl->merged_mesh();
|
||||||
fullmesh.merge(get_pad());
|
fullmesh.merge(get_pad());
|
||||||
|
fullmesh.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
TriangleMeshSlicer slicer(&fullmesh);
|
TriangleMeshSlicer slicer(&fullmesh);
|
||||||
SlicedSupports ret;
|
SlicedSupports ret;
|
||||||
slicer.slice(heights, 0.f, &ret, get().ctl().cancelfn);
|
slicer.slice(heights, 0.f, &ret, get().ctl().cancelfn);
|
||||||
@ -2243,6 +2244,7 @@ SlicedSupports SLASupportTree::slice(const std::vector<float> &heights,
|
|||||||
{
|
{
|
||||||
TriangleMesh fullmesh = m_impl->merged_mesh();
|
TriangleMesh fullmesh = m_impl->merged_mesh();
|
||||||
fullmesh.merge(get_pad());
|
fullmesh.merge(get_pad());
|
||||||
|
fullmesh.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
TriangleMeshSlicer slicer(&fullmesh);
|
TriangleMeshSlicer slicer(&fullmesh);
|
||||||
SlicedSupports ret;
|
SlicedSupports ret;
|
||||||
slicer.slice(heights, cr, &ret, get().ctl().cancelfn);
|
slicer.slice(heights, cr, &ret, get().ctl().cancelfn);
|
||||||
|
@ -706,6 +706,7 @@ void SLAPrint::process()
|
|||||||
po.m_model_height_levels.emplace_back(it->slice_level());
|
po.m_model_height_levels.emplace_back(it->slice_level());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
TriangleMeshSlicer slicer(&mesh);
|
TriangleMeshSlicer slicer(&mesh);
|
||||||
|
|
||||||
po.m_model_slices.clear();
|
po.m_model_slices.clear();
|
||||||
|
@ -607,10 +607,12 @@ void TriangleMesh::require_shared_vertices()
|
|||||||
BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::require_shared_vertices - end";
|
BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::require_shared_vertices - end";
|
||||||
}
|
}
|
||||||
|
|
||||||
void TriangleMeshSlicer::init(TriangleMesh *_mesh, throw_on_cancel_callback_type throw_on_cancel)
|
void TriangleMeshSlicer::init(const TriangleMesh *_mesh, throw_on_cancel_callback_type throw_on_cancel)
|
||||||
{
|
{
|
||||||
mesh = _mesh;
|
mesh = _mesh;
|
||||||
_mesh->require_shared_vertices();
|
if (! mesh->has_shared_vertices())
|
||||||
|
throw std::invalid_argument("TriangleMeshSlicer was passed a mesh without shared vertices.");
|
||||||
|
|
||||||
throw_on_cancel();
|
throw_on_cancel();
|
||||||
facets_edges.assign(_mesh->stl.stats.number_of_facets * 3, -1);
|
facets_edges.assign(_mesh->stl.stats.number_of_facets * 3, -1);
|
||||||
v_scaled_shared.assign(_mesh->stl.v_shared, _mesh->stl.v_shared + _mesh->stl.stats.shared_vertices);
|
v_scaled_shared.assign(_mesh->stl.v_shared, _mesh->stl.v_shared + _mesh->stl.stats.shared_vertices);
|
||||||
|
@ -67,18 +67,17 @@ public:
|
|||||||
TriangleMesh convex_hull_3d() const;
|
TriangleMesh convex_hull_3d() const;
|
||||||
void reset_repair_stats();
|
void reset_repair_stats();
|
||||||
bool needed_repair() const;
|
bool needed_repair() const;
|
||||||
|
void require_shared_vertices();
|
||||||
|
bool has_shared_vertices() const { return stl.v_shared != NULL; }
|
||||||
size_t facets_count() const { return this->stl.stats.number_of_facets; }
|
size_t facets_count() const { return this->stl.stats.number_of_facets; }
|
||||||
bool empty() const { return this->facets_count() == 0; }
|
bool empty() const { return this->facets_count() == 0; }
|
||||||
|
|
||||||
bool is_splittable() const;
|
bool is_splittable() const;
|
||||||
|
|
||||||
stl_file stl;
|
stl_file stl;
|
||||||
bool repaired;
|
bool repaired;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void require_shared_vertices();
|
|
||||||
std::deque<uint32_t> find_unvisited_neighbors(std::vector<unsigned char> &facet_visited) const;
|
std::deque<uint32_t> find_unvisited_neighbors(std::vector<unsigned char> &facet_visited) const;
|
||||||
friend class TriangleMeshSlicer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FacetEdgeType {
|
enum FacetEdgeType {
|
||||||
@ -159,9 +158,8 @@ class TriangleMeshSlicer
|
|||||||
public:
|
public:
|
||||||
typedef std::function<void()> throw_on_cancel_callback_type;
|
typedef std::function<void()> throw_on_cancel_callback_type;
|
||||||
TriangleMeshSlicer() : mesh(nullptr) {}
|
TriangleMeshSlicer() : mesh(nullptr) {}
|
||||||
// Not quite nice, but the constructor and init() methods require non-const mesh pointer to be able to call mesh->require_shared_vertices()
|
TriangleMeshSlicer(const TriangleMesh* mesh) { this->init(mesh, [](){}); }
|
||||||
TriangleMeshSlicer(TriangleMesh* mesh) { this->init(mesh, [](){}); }
|
void init(const TriangleMesh *mesh, throw_on_cancel_callback_type throw_on_cancel);
|
||||||
void init(TriangleMesh *mesh, throw_on_cancel_callback_type throw_on_cancel);
|
|
||||||
void slice(const std::vector<float> &z, std::vector<Polygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const;
|
void slice(const std::vector<float> &z, std::vector<Polygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const;
|
||||||
void slice(const std::vector<float> &z, const float closing_radius, std::vector<ExPolygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const;
|
void slice(const std::vector<float> &z, const float closing_radius, std::vector<ExPolygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const;
|
||||||
enum FacetSliceType {
|
enum FacetSliceType {
|
||||||
|
@ -178,6 +178,7 @@ void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection, const
|
|||||||
// The timestamp has changed - stash the mesh and initialize the TMS.
|
// The timestamp has changed - stash the mesh and initialize the TMS.
|
||||||
m_supports_mesh = print_object->support_mesh();
|
m_supports_mesh = print_object->support_mesh();
|
||||||
m_supports_tms.reset(new TriangleMeshSlicer);
|
m_supports_tms.reset(new TriangleMeshSlicer);
|
||||||
|
m_supports_mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
m_supports_tms->init(const_cast<TriangleMesh*>(&m_supports_mesh), [](){});
|
m_supports_tms->init(const_cast<TriangleMesh*>(&m_supports_mesh), [](){});
|
||||||
m_old_timestamp = timestamp;
|
m_old_timestamp = timestamp;
|
||||||
}
|
}
|
||||||
@ -411,6 +412,7 @@ void GLGizmoSlaSupports::update_mesh()
|
|||||||
Eigen::MatrixXi& F = m_F;
|
Eigen::MatrixXi& F = m_F;
|
||||||
// This mesh does not account for the possible Z up SLA offset.
|
// This mesh does not account for the possible Z up SLA offset.
|
||||||
m_mesh = m_model_object->raw_mesh();
|
m_mesh = m_model_object->raw_mesh();
|
||||||
|
m_mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
|
||||||
const stl_file& stl = m_mesh.stl;
|
const stl_file& stl = m_mesh.stl;
|
||||||
V.resize(3 * stl.stats.number_of_facets, 3);
|
V.resize(3 * stl.stats.number_of_facets, 3);
|
||||||
F.resize(stl.stats.number_of_facets, 3);
|
F.resize(stl.stats.number_of_facets, 3);
|
||||||
|
Loading…
Reference in New Issue
Block a user