OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp>

Inheritance diagram for Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper:
Collaboration diagram for Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper:

Public Member Functions

 ObjectClipper (CommonGizmosDataPool *cgdp)
CommonGizmosDataID get_dependencies () const override
double get_position () const
void set_position_to_init_layer ()
const ClippingPlane * get_clipping_plane (bool ignore_hide_clipped=false) const
void render_cut (const std::vector< size_t > *ignore_idxs=nullptr) const
void set_position_by_ratio (double pos, const Vec3d &normal)
void set_range_and_pos (const Vec3d &cpl_normal, double cpl_offset, double pos)
void set_behavior (bool hide_clipped, bool fill_cut, double contour_width)
int get_number_of_contours () const
std::vector< Vec3d > point_per_contour () const
int is_projection_inside_cut (const Vec3d &point_in) const
bool has_valid_contour () const
void update ()
void release ()
bool is_valid () const

Protected Member Functions

void on_update () override
void on_release () override
CommonGizmosDataPool * get_pool () const

Private Attributes

std::vector< const TriangleMesh * > m_old_meshes
std::vector< std::pair< std::unique_ptr< MeshClipper >, Geometry::Transformation > > m_clippers
std::unique_ptr< ClippingPlane > m_clp
double m_clp_ratio = 0.
double m_active_inst_bb_radius = 0.
bool m_hide_clipped = true
bool m_is_valid = false
CommonGizmosDataPool * m_common = nullptr

Detailed Description

Constructor & Destructor Documentation

◆ ObjectClipper()

Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::ObjectClipper ( CommonGizmosDataPool * cgdp)
inlineexplicit
234 : CommonGizmosDataBase(cgdp) {}
CommonGizmosDataBase(CommonGizmosDataPool *cgdp)
Definition GLGizmosCommon.hpp:124

References Slic3r::GUI::CommonGizmosDataBase::CommonGizmosDataBase().

Here is the call graph for this function:

Member Function Documentation

◆ get_clipping_plane()

const ClippingPlane * Slic3r::GUI::ObjectClipper::get_clipping_plane ( bool ignore_hide_clipped = false) const
427{
428 static const ClippingPlane no_clip = ClippingPlane::ClipsNothing();
429 return (ignore_hide_clipped || m_hide_clipped) ? m_clp.get() : &no_clip;
430}
static ClippingPlane ClipsNothing()
Definition MeshUtils.hpp:73
std::unique_ptr< ClippingPlane > m_clp
Definition GLGizmosCommon.hpp:260
bool m_hide_clipped
Definition GLGizmosCommon.hpp:263

References Slic3r::GUI::ClippingPlane::ClipsNothing(), m_clp, and m_hide_clipped.

Referenced by Slic3r::GUI::CommonGizmosDataObjects::InstancesHider::render_cut().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_dependencies()

CommonGizmosDataID Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::get_dependencies ( ) const
inlineoverridevirtual

Reimplemented from Slic3r::GUI::CommonGizmosDataBase.

@ SelectionInfo
Definition GLGizmosCommon.hpp:74

References Slic3r::GUI::SelectionInfo.

◆ get_number_of_contours()

int Slic3r::GUI::ObjectClipper::get_number_of_contours ( ) const
344{
345 int sum = 0;
346 for (const auto& [clipper, trafo] : m_clippers)
347 sum += clipper->get_number_of_contours();
348 return sum;
349}
std::vector< std::pair< std::unique_ptr< MeshClipper >, Geometry::Transformation > > m_clippers
Definition GLGizmosCommon.hpp:259

References m_clippers.

◆ get_pool()

◆ get_position()

double Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::get_position ( ) const
inline
238{ return m_clp_ratio; }
double m_clp_ratio
Definition GLGizmosCommon.hpp:261

References m_clp_ratio.

Referenced by Slic3r::GUI::CommonGizmosDataObjects::InstancesHider::render_cut().

Here is the caller graph for this function:

◆ has_valid_contour()

bool Slic3r::GUI::ObjectClipper::has_valid_contour ( ) const
365{
366 return m_clp_ratio != 0. && std::any_of(m_clippers.begin(), m_clippers.end(), [](const auto& cl) { return cl.first->has_valid_contour(); });
367}

References m_clippers, and m_clp_ratio.

◆ is_projection_inside_cut()

int Slic3r::GUI::ObjectClipper::is_projection_inside_cut ( const Vec3d & point_in) const
352{
353 if (m_clp_ratio == 0.)
354 return -1;
355 int idx_offset = 0;
356 for (const auto& [clipper, trafo] : m_clippers) {
357 if (int idx = clipper->is_projection_inside_cut(point); idx != -1)
358 return idx_offset + idx;
359 idx_offset += clipper->get_number_of_contours();
360 }
361 return -1;
362}

References m_clippers, and m_clp_ratio.

◆ is_valid()

bool Slic3r::GUI::CommonGizmosDataBase::is_valid ( ) const
inlineinherited
135{ return m_is_valid; }
bool m_is_valid
Definition GLGizmosCommon.hpp:150

References m_is_valid.

Referenced by Slic3r::GUI::CommonGizmosDataPool::instances_hider(), Slic3r::GUI::CommonGizmosDataPool::object_clipper(), Slic3r::GUI::CommonGizmosDataPool::raycaster(), Slic3r::GUI::CommonGizmosDataObjects::InstancesHider::render_cut(), and Slic3r::GUI::CommonGizmosDataPool::selection_info().

Here is the caller graph for this function:

◆ on_release()

void Slic3r::GUI::ObjectClipper::on_release ( )
overrideprotectedvirtual

Implements Slic3r::GUI::CommonGizmosDataBase.

301{
302 m_clippers.clear();
303 m_old_meshes.clear();
304 m_clp.reset();
305 m_clp_ratio = 0.;
306
307}
std::vector< const TriangleMesh * > m_old_meshes
Definition GLGizmosCommon.hpp:258

References m_clippers, m_clp, m_clp_ratio, and m_old_meshes.

◆ on_update()

void Slic3r::GUI::ObjectClipper::on_update ( )
overrideprotectedvirtual

Implements Slic3r::GUI::CommonGizmosDataBase.

273{
274 const ModelObject* mo = get_pool()->selection_info()->model_object();
275 if (! mo)
276 return;
277
278 // which mesh should be cut?
279 std::vector<const TriangleMesh*> meshes;
280 std::vector<Geometry::Transformation> trafos;
281 for (const ModelVolume* mv : mo->volumes) {
282 meshes.emplace_back(&mv->mesh());
283 trafos.emplace_back(mv->get_transformation());
284 }
285
286 if (meshes != m_old_meshes) {
287 m_clippers.clear();
288 for (size_t i = 0; i < meshes.size(); ++i) {
289 m_clippers.emplace_back(new MeshClipper, trafos[i]);
290 m_clippers.back().first->set_mesh(meshes[i]->its);
291 }
292 m_old_meshes = std::move(meshes);
293
295 mo->instance_bounding_box(get_pool()->selection_info()->get_active_instance()).radius();
296 }
297}
CommonGizmosDataPool * get_pool() const
Definition GLGizmosCommon.hpp:147
double m_active_inst_bb_radius
Definition GLGizmosCommon.hpp:262
ModelObject * model_object() const
Definition GLGizmosCommon.hpp:167
CommonGizmosDataObjects::SelectionInfo * selection_info() const
Definition GLGizmosCommon.cpp:57

References Slic3r::GUI::CommonGizmosDataBase::get_pool(), Slic3r::ModelVolume::get_transformation(), Slic3r::ModelObject::instance_bounding_box(), m_active_inst_bb_radius, m_clippers, m_old_meshes, Slic3r::ModelVolume::mesh(), Slic3r::GUI::CommonGizmosDataObjects::SelectionInfo::model_object(), Slic3r::BoundingBox3Base< PointType >::radius(), Slic3r::GUI::CommonGizmosDataPool::selection_info(), and Slic3r::ModelObject::volumes.

Here is the call graph for this function:

◆ point_per_contour()

std::vector< Vec3d > Slic3r::GUI::ObjectClipper::point_per_contour ( ) const
370{
371 std::vector<Vec3d> pts;
372
373 for (const auto& clipper : m_clippers) {
374 const std::vector<Vec3d> pts_clipper = clipper.first->point_per_contour();
375 pts.insert(pts.end(), pts_clipper.begin(), pts_clipper.end());;
376 }
377 return pts;
378}

References m_clippers.

Referenced by Slic3r::GUI::GLGizmoCut3D::PartSelection::PartSelection().

Here is the caller graph for this function:

◆ release()

void Slic3r::GUI::CommonGizmosDataBase::release ( )
inlineinherited
132{ on_release(); m_is_valid = false; }

References m_is_valid, and on_release().

Here is the call graph for this function:

◆ render_cut()

void Slic3r::GUI::ObjectClipper::render_cut ( const std::vector< size_t > * ignore_idxs = nullptr) const
310{
311 if (m_clp_ratio == 0.)
312 return;
313 const SelectionInfo* sel_info = get_pool()->selection_info();
314 const Geometry::Transformation inst_trafo = sel_info->model_object()->instances[sel_info->get_active_instance()]->get_transformation();
315
316 std::vector<size_t> ignore_idxs_local = ignore_idxs ? *ignore_idxs : std::vector<size_t>();
317
318 for (auto& clipper : m_clippers) {
319 Geometry::Transformation trafo = inst_trafo * clipper.second;
320 trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift()));
321 clipper.first->set_plane(*m_clp);
322 clipper.first->set_transformation(trafo);
323 clipper.first->set_limiting_plane(ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD));
324 // BBS
325 clipper.first->render_cut({ 0.25f, 0.25f, 0.25f, 1.0f }, &ignore_idxs_local);
326 clipper.first->render_contour({ 1.f, 1.f, 1.f, 1.f }, &ignore_idxs_local);
327
328 // Now update the ignore idxs. Find the first element belonging to the next clipper,
329 // and remove everything before it and decrement everything by current number of contours.
330 const int num_of_contours = clipper.first->get_number_of_contours();
331 ignore_idxs_local.erase(ignore_idxs_local.begin(), std::find_if(ignore_idxs_local.begin(), ignore_idxs_local.end(), [num_of_contours](size_t idx) { return idx >= size_t(num_of_contours); } ));
332 for (size_t& idx : ignore_idxs_local)
333 idx -= num_of_contours;
334 }
335}
ModelInstancePtrs instances
Definition Model.hpp:390
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vec3d
Definition Point.hpp:68
static const float SINKING_Z_THRESHOLD
Definition Model.hpp:1967

References Slic3r::GUI::CommonGizmosDataObjects::SelectionInfo::get_active_instance(), Slic3r::Geometry::Transformation::get_offset(), Slic3r::GUI::CommonGizmosDataBase::get_pool(), Slic3r::GUI::CommonGizmosDataObjects::SelectionInfo::get_sla_shift(), Slic3r::ModelObject::instances, m_clippers, m_clp, m_clp_ratio, Slic3r::GUI::CommonGizmosDataObjects::SelectionInfo::model_object(), Slic3r::GUI::CommonGizmosDataPool::selection_info(), Slic3r::Geometry::Transformation::set_offset(), and Slic3r::SINKING_Z_THRESHOLD.

Here is the call graph for this function:

◆ set_behavior()

void Slic3r::GUI::ObjectClipper::set_behavior ( bool hide_clipped,
bool fill_cut,
double contour_width )
433{
434 m_hide_clipped = hide_clipped;
435 for (auto& clipper : m_clippers)
436 clipper.first->set_behaviour(fill_cut, contour_width);
437}

References m_clippers, and m_hide_clipped.

◆ set_position_by_ratio()

void Slic3r::GUI::ObjectClipper::set_position_by_ratio ( double pos,
const Vec3d & normal )
382{
383 const ModelObject* mo = get_pool()->selection_info()->model_object();
384 int active_inst = get_pool()->selection_info()->get_active_instance();
385 double z_shift = get_pool()->selection_info()->get_sla_shift();
386 if (pos == 0. || mo == nullptr || active_inst < 0) {
387 // No plane, so the raycasts are not clipped.
388 m_clp_ratio = 0.;
389 m_clp.reset();
391 return;
392 }
393
395
396 if (get_pool()->get_canvas()->get_canvas_type() == GLCanvas3D::CanvasAssembleView) {
397 const SelectionInfo* sel_info = get_pool()->selection_info();
398 auto trafo = mo->instances[sel_info->get_active_instance()]->get_assemble_transformation();
399 auto offset_to_assembly = mo->instances[0]->get_offset_to_assembly();
400 center = trafo.get_offset() + offset_to_assembly * (GLVolume::explosion_ratio - 1.0);
401 }
402 else {
403 center = mo->instances[active_inst]->get_offset() + Vec3d(0., 0., z_shift);
404 }
405
406 float dist = normal.dot(center);
407
409
410 m_clp.reset(new ClippingPlane(normal, (dist - (-m_active_inst_bb_radius) - m_clp_ratio * 2 * m_active_inst_bb_radius)));
411
413}
static float explosion_ratio
Definition 3DScene.hpp:117
float get_sla_shift() const
Definition GLGizmosCommon.hpp:169
int get_active_instance() const
Definition GLGizmosCommon.cpp:136
GLCanvas3D * get_canvas() const
Definition GLGizmosCommon.hpp:103
void set_as_dirty()
Definition GLCanvas3D.hpp:984
@ CanvasAssembleView
Definition GLCanvas3D.hpp:628
T dist(const boost::polygon::point_data< T > &p1, const boost::polygon::point_data< T > &p2)
Definition Geometry.cpp:298
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16
void center(ExPolygonsWithIds &e)
Definition Emboss.cpp:1382
Point normal(Point pt, double scale)
Definition TreeSupport.cpp:112

References Slic3r::GUI::GLCanvas3D::CanvasAssembleView, Slic3r::center(), Slic3r::Geometry::dist(), Slic3r::GLVolume::explosion_ratio, Slic3r::GUI::CommonGizmosDataObjects::SelectionInfo::get_active_instance(), Slic3r::GUI::CommonGizmosDataPool::get_canvas(), Slic3r::GUI::CommonGizmosDataBase::get_pool(), Slic3r::GUI::CommonGizmosDataObjects::SelectionInfo::get_sla_shift(), Slic3r::ModelObject::instances, m_active_inst_bb_radius, m_clp, m_clp_ratio, Slic3r::GUI::CommonGizmosDataObjects::SelectionInfo::model_object(), Slic3r::normal(), Slic3r::GUI::CommonGizmosDataPool::selection_info(), and Slic3r::GUI::GLCanvas3D::set_as_dirty().

Referenced by Slic3r::GUI::GLGizmosManager::update_section_view().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_position_to_init_layer()

void Slic3r::GUI::ObjectClipper::set_position_to_init_layer ( )
338{
339 m_clp.reset(new ClippingPlane({0, 0, 1}, 0.1));
341}

References Slic3r::GUI::CommonGizmosDataPool::get_canvas(), Slic3r::GUI::CommonGizmosDataBase::get_pool(), m_clp, and Slic3r::GUI::GLCanvas3D::set_as_dirty().

Here is the call graph for this function:

◆ set_range_and_pos()

void Slic3r::GUI::ObjectClipper::set_range_and_pos ( const Vec3d & cpl_normal,
double cpl_offset,
double pos )
416{
417 // Called every frame by GLGizmoCut3D::on_render(), usually with the plane already set.
418 if (m_clp && *m_clp == ClippingPlane(cpl_normal, cpl_offset) && m_clp_ratio == pos)
419 return;
420
421 m_clp.reset(new ClippingPlane(cpl_normal, cpl_offset));
424}

References Slic3r::GUI::CommonGizmosDataPool::get_canvas(), Slic3r::GUI::CommonGizmosDataBase::get_pool(), m_clp, m_clp_ratio, and Slic3r::GUI::GLCanvas3D::set_as_dirty().

Here is the call graph for this function:

◆ update()

void Slic3r::GUI::CommonGizmosDataBase::update ( )
inlineinherited
129{ on_update(); m_is_valid = true; }

References m_is_valid, and on_update().

Here is the call graph for this function:

Member Data Documentation

◆ m_active_inst_bb_radius

double Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::m_active_inst_bb_radius = 0.
private

Referenced by on_update(), and set_position_by_ratio().

◆ m_clippers

std::vector<std::pair<std::unique_ptr<MeshClipper>, Geometry::Transformation> > Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::m_clippers
private

◆ m_clp

std::unique_ptr<ClippingPlane> Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::m_clp
private

◆ m_clp_ratio

double Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::m_clp_ratio = 0.
private

◆ m_common

CommonGizmosDataPool* Slic3r::GUI::CommonGizmosDataBase::m_common = nullptr
privateinherited

Referenced by CommonGizmosDataBase(), and get_pool().

◆ m_hide_clipped

bool Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::m_hide_clipped = true
private

Referenced by get_clipping_plane(), and set_behavior().

◆ m_is_valid

bool Slic3r::GUI::CommonGizmosDataBase::m_is_valid = false
privateinherited

Referenced by is_valid(), release(), and update().

◆ m_old_meshes

std::vector<const TriangleMesh*> Slic3r::GUI::CommonGizmosDataObjects::ObjectClipper::m_old_meshes
private

Referenced by on_release(), and on_update().


The documentation for this class was generated from the following files: