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:
Lukas Matena 2019-04-15 21:58:13 +02:00
parent a177a7e1da
commit f33e9bf609
8 changed files with 18 additions and 9 deletions

View File

@ -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);

View File

@ -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();

View File

@ -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();

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -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 {

View File

@ -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);