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

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

Inheritance diagram for Slic3r::GUI::GLGizmoCut3D:
Collaboration diagram for Slic3r::GUI::GLGizmoCut3D:

Classes

struct  InvalidConnectorsStatistics
class  PartSelection

Public Types

enum class  EGrabberExtension {
  None = 0 , PosX = 1 << 0 , NegX = 1 << 1 , PosY = 1 << 2 ,
  NegY = 1 << 3 , PosZ = 1 << 4 , NegZ = 1 << 5
}
enum  EState { Off , On , Num_States }

Public Member Functions

 GLGizmoCut3D (GLCanvas3D &parent, const std::string &icon_filename, unsigned int sprite_id)
 –
std::string get_tooltip () const override
 Mouse tooltip text.
bool unproject_on_cut_plane (const Vec2d &mouse_pos, Vec3d &pos, Vec3d &pos_world, bool respect_contours=true)
bool gizmo_event (SLAGizmoEventType action, const Vec2d &mouse_position, bool shift_down, bool alt_down, bool control_down)
bool is_in_editing_mode () const override
bool is_selection_rectangle_dragging () const override
bool is_looking_forward () const
bool on_mouse (const wxMouseEvent &mouse_event) override
 Drag of plane.
void shift_cut (double delta)
void rotate_vec3d_around_plane_center (Vec3d &vec)
void put_connectors_on_cut_plane (const Vec3d &cp_normal, double cp_offset)
void update_clipper ()
void invalidate_cut_plane ()
BoundingBoxf3 bounding_box () const
BoundingBoxf3 transformed_bounding_box (const Vec3d &plane_center, const Transform3d &rotation_m=Transform3d::Identity()) const
bool init ()
void load (cereal::BinaryInputArchive &ar)
void save (cereal::BinaryOutputArchive &ar) const
std::string get_name (bool include_shortcut=true) const
EState get_state () const
void set_state (EState state)
std::optional< Shortcut > shortcut () const
const std::string & get_icon_filename () const
void set_icon_filename (const std::string &filename)
bool is_activable () const
bool is_selectable () const
CommonGizmosDataID get_requirements () const
virtual bool render_follows_cursor () const
void set_common_data_pool (CommonGizmosDataPool *ptr)
virtual bool apply_clipping_plane ()
unsigned int get_sprite_id () const
int get_hover_id () const
void set_hover_id (int id)
bool is_dragging () const
bool update_items_state ()
void render ()
void render_input_window (float x, float y, float bottom_limit)
virtual void on_change_color_mode (bool is_dark)
int get_count ()
std::string get_gizmo_name ()
void register_raycasters_for_picking ()
void unregister_raycasters_for_picking ()

Static Public Member Functions

static void update_render_colors ()
static void load_render_colors ()

Static Public Attributes

static const unsigned int BASE_ID = 255 * 255 * 254
static const unsigned int GRABBER_ELEMENTS_MAX_COUNT = 7
static float INV_ZOOM = 1.0f
static ColorRGBA DEFAULT_BASE_COLOR = { 0.625f, 0.625f, 0.625f, 1.0f }
static ColorRGBA DEFAULT_DRAG_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }
static ColorRGBA DEFAULT_HIGHLIGHT_COLOR = {1.0f, 0.38f, 0.0f, 1.0f}
static std::array< ColorRGBA, 3 > AXES_COLOR
static std::array< ColorRGBA, 3 > AXES_HOVER_COLOR
static ColorRGBA CONSTRAINED_COLOR = {0.5f, 0.5f, 0.5f, 1.0f}
static ColorRGBA FLATTEN_COLOR = {0.96f, 0.93f, 0.93f, 0.5f}
static ColorRGBA FLATTEN_HOVER_COLOR = {1.0f, 1.0f, 1.0f, 0.75f}
static ColorRGBA GRABBER_NORMAL_COL = {1.0f, 1.0f, 1.0f, 1.0f}
static ColorRGBA GRABBER_HOVER_COL = {0.863f, 0.125f, 0.063f, 1.0f}
static ColorRGBA GRABBER_UNIFORM_COL = {0, 1.0, 1.0, 1.0f}
static ColorRGBA GRABBER_UNIFORM_HOVER_COL = {0, 0.7, 0.7, 1.0f}

Protected Member Functions

bool on_init () override
void on_load (cereal::BinaryInputArchive &ar) override
void on_save (cereal::BinaryOutputArchive &ar) const override
std::string on_get_name () const override
void on_set_state () override
CommonGizmosDataID on_get_requirements () const override
void on_set_hover_id () override
bool on_is_activable () const override
bool on_is_selectable () const override
Vec3d mouse_position_in_local_plane (GrabberID axis, const Linef3 &mouse_ray) const
void dragging_grabber_move (const GLGizmoBase::UpdateData &data)
void dragging_grabber_rotation (const GLGizmoBase::UpdateData &data)
void dragging_connector (const GLGizmoBase::UpdateData &data)
void on_dragging (const UpdateData &data) override
void on_start_dragging () override
void on_stop_dragging () override
void on_render () override
void render_debug_input_window (float x)
void unselect_all_connectors ()
void select_all_connectors ()
void apply_selected_connectors (std::function< void(size_t idx)> apply_fn)
void render_connectors_input_window (CutConnectors &connectors, float x, float y, float bottom_limit)
void render_build_size ()
void reset_cut_plane ()
void set_connectors_editing (bool connectors_editing)
void flip_cut_plane ()
void process_contours ()
void reset_cut_by_contours ()
void render_flip_plane_button (bool disable_pred=false)
void add_vertical_scaled_interval (float interval)
void add_horizontal_scaled_interval (float interval)
void add_horizontal_shift (float shift)
void render_color_marker (float size, const ImU32 &color)
void render_groove_two_float_input (const std::string &label, float &in_val, const float &init_val, float &in_tolerance)
void render_groove_float_input (const std::string &label, float &in_val, const float &init_val, const bool disabled)
void render_groove_angle_input (const std::string &label, float &in_val, const float &init_val, float min_val, float max_val)
void render_groove_int_input (const std::string &label, int &in_val, const int &init_val, int min_val, int max_val)
bool render_angle_input (const std::string &label, float &in_val, const float &init_val, float min_val, float max_val)
void render_snap_specific_input (const std::string &label, const wxString &tooltip, float &in_val, const float &init_val, const float min_val, const float max_val)
void render_cut_plane_input_window (CutConnectors &connectors, float x, float y, float bottom_limit)
void init_input_window_data (CutConnectors &connectors)
void render_input_window_warning () const
bool add_connector (CutConnectors &connectors, const Vec2d &mouse_position)
bool delete_selected_connectors (CutConnectors &connectors)
void select_connector (int idx, bool select)
bool is_selection_changed (bool alt_down, bool shift_down)
void process_selection_rectangle (CutConnectors &connectors)
virtual void on_register_raycasters_for_picking () override
virtual void on_unregister_raycasters_for_picking () override
void update_raycasters_for_picking ()
void set_volumes_picking_state (bool state)
void update_raycasters_for_picking_transform ()
void update_plane_model ()
void on_render_input_window (float x, float y, float bottom_limit) override
void render_tooltip_button (float x, float y)
bool wants_enter_leave_snapshots () const override
std::string get_gizmo_entering_text () const override
std::string get_gizmo_leaving_text () const override
std::string get_action_snapshot_name () const override
void data_changed (bool is_serializing) override
 Is called when data (Selection) is changed.
Transform3d get_cut_matrix (const Selection &selection)
bool render_combo (const std::string &label, const std::vector< std::string > &lines, int &selection_idx, float label_width, float item_width)
void render_cross_mark (const Vec3f &target, bool is_single=false)
virtual void on_enable_grabber (unsigned int id)
virtual void on_disable_grabber (unsigned int id)
bool GizmoImguiBegin (const std::string &name, int flags)
void GizmoImguiEnd ()
void GizmoImguiSetNextWIndowPos (float &x, float y, int flag, float pivot_x=0.0f, float pivot_y=0.0f)
void GizmoImguiSetNextWIndowPos (float &x, float y, float w, float h, int flag, float pivot_x=0.0f, float pivot_y=0.0f)
void register_grabbers_for_picking ()
void unregister_grabbers_for_picking ()
void render_grabbers (const BoundingBoxf3 &box) const
void render_grabbers (float size) const
void render_grabbers (size_t first, size_t last, float size, bool force_hover) const
std::string format (float value, unsigned int decimals) const
void set_dirty ()
bool use_grabbers (const wxMouseEvent &mouse_event)
 function which Set up m_dragging and call functions on_start_dragging / on_dragging / on_stop_dragging
void do_stop_dragging (bool perform_mouse_cleanup)

Protected Attributes

GLCanvas3D & m_parent
int m_group_id
EState m_state
std::optional< Shortcut > m_shortcut
std::string m_icon_filename
unsigned int m_sprite_id
int m_hover_id { -1 }
bool m_dragging { false }
std::vector< Grabber > m_grabbers
ImGuiWrapper * m_imgui
bool m_first_input_window_render { true }
CommonGizmosDataPool * m_c { nullptr }
bool m_is_dark_mode = false
float last_input_window_width = 0

Private Types

enum  GrabberID {
  X = 0 , Y , Z , CutPlane ,
  CutPlaneZRotation , CutPlaneXMove , CutPlaneYMove , Count
}
enum class  CutMode { cutPlanar , cutTongueAndGroove }
enum class  CutConnectorMode { Auto , Manual }

Private Member Functions

void set_center (const Vec3d &center, bool update_tbb=false)
void switch_to_mode (size_t new_mode)
bool render_cut_mode_combo ()
bool render_double_input (const std::string &label, double &value_in)
bool render_slider_two_input (const std::string &label, float &value_in, float &tolerance_in, float min_val=-0.1f, float max_tolerance=-0.1f)
bool render_slider_input (const std::string &label, float &value_in, float min_val=-0.1f, float max_val=100.f)
void render_move_center_input (int axis)
void render_connect_mode_radio_button (CutConnectorMode mode)
bool render_reset_button (const std::string &label_id, const std::string &tooltip) const
bool render_connect_type_radio_button (CutConnectorType type)
bool is_outside_of_cut_contour (size_t idx, const CutConnectors &connectors, const Vec3d cur_pos)
bool is_conflict_for_connector (size_t idx, const CutConnectors &connectors, const Vec3d cur_pos)
void render_connectors ()
bool can_perform_cut () const
bool has_valid_groove () const
bool has_valid_contour () const
void apply_connectors_in_model (ModelObject *mo, int &dowels_count)
bool cut_line_processing () const
void discard_cut_line_processing ()
void apply_color_clip_plane_colors ()
void render_cut_plane ()
void render_line (GLModel &line_model, const ColorRGBA &color, Transform3d view_model_matrix, float width)
void render_rotation_snapping (GrabberID axis, const ColorRGBA &color)
void render_grabber_connection (const ColorRGBA &color, Transform3d view_matrix, double line_len_koef=1.0)
void render_cut_plane_grabbers ()
void render_cut_line ()
void perform_cut (const Selection &selection)
void set_center_pos (const Vec3d &center_pos, bool update_tbb=false)
void update_bb ()
void init_picking_models ()
void init_rendering_items ()
void render_clipper_cut ()
void clear_selection ()
void reset_connectors ()
void init_connector_shapes ()
void update_connector_shape ()
void validate_connector_settings ()
bool process_cut_line (SLAGizmoEventType action, const Vec2d &mouse_position)
void check_and_update_connectors_state ()
void toggle_model_objects_visibility ()
std::vector< Vec3i32 > offset_indices (const std::vector< Vec3i32 > &base_indices, size_t vo)
indexed_triangle_set its_make_groove_plane ()
indexed_triangle_set get_connector_mesh (CutConnectorAttributes connector_attributes)
void apply_cut_connectors (ModelObject *mo, const std::string &connector_name)

Static Private Member Functions

static void render_model (GLModel &model, const ColorRGBA &color, Transform3d view_model_matrix)

Private Attributes

Transform3d m_rotation_m { Transform3d::Identity() }
double m_snap_step { 1.0 }
int m_connectors_group_id
Vec3d m_ar_plane_center { Vec3d::Zero() }
Transform3d m_start_dragging_m { Transform3d::Identity() }
Vec3d m_plane_center { Vec3d::Zero() }
Vec3d m_min_pos { Vec3d::Zero() }
Vec3d m_max_pos { Vec3d::Zero() }
Vec3d m_bb_center { Vec3d::Zero() }
Vec3d m_center_offset { Vec3d::Zero() }
BoundingBoxf3 m_bounding_box
BoundingBoxf3 m_transformed_bounding_box
double m_radius { 0.0 }
double m_grabber_radius { 0.0 }
double m_grabber_connection_len { 0.0 }
Vec3d m_cut_plane_start_move_pos {Vec3d::Zero()}
double m_snap_coarse_in_radius { 0.0 }
double m_snap_coarse_out_radius { 0.0 }
double m_snap_fine_in_radius { 0.0 }
double m_snap_fine_out_radius { 0.0 }
double m_angle { 0.0 }
TriangleMesh m_connector_mesh
Vec3d m_clp_normal { Vec3d::Ones() }
Vec3d m_line_beg { Vec3d::Zero() }
Vec3d m_line_end { Vec3d::Zero() }
Vec2d m_ldown_mouse_position { Vec2d::Zero() }
GLModel m_grabber_connection
GLModel m_cut_line
PickingModel m_plane
PickingModel m_sphere
PickingModel m_cone
PickingModel m_cube
std::map< CutConnectorAttributes, PickingModel > m_shapes
std::vector< std::shared_ptr< SceneRaycasterItem > > m_raycasters
GLModel m_circle
GLModel m_scale
GLModel m_snap_radii
GLModel m_reference_radius
GLModel m_angle_arc
Vec3d m_cut_normal
struct Slic3r::GUI::GLGizmoCut3D::InvalidConnectorsStatistics m_info_stats
bool m_keep_upper { true }
bool m_keep_lower { true }
bool m_keep_as_parts { false }
bool m_place_on_cut_upper { true }
bool m_place_on_cut_lower { false }
bool m_rotate_upper { false }
bool m_rotate_lower { false }
Cut::Groove m_groove
bool m_groove_editing { false }
bool m_is_slider_editing_done { false }
int m_groove_count_init { 1 }
int m_groove_count { 1 }
float m_groove_gap { 10.f }
float m_groove_gap_init { 10.f }
float m_snap_bulge_proportion { 0.15f }
float m_snap_space_proportion { 0.3f }
bool m_hide_cut_plane { false }
bool m_connectors_editing { false }
bool m_cut_plane_as_circle { false }
float m_connector_depth_ratio { 3.f }
float m_connector_size { 2.5f }
float m_connector_angle { 0.f }
float m_connector_depth_ratio_tolerance { 0.1f }
float m_connector_size_tolerance { 0.f }
float m_label_width { 0.f }
float m_control_width { 200.f }
double m_editing_window_width
bool m_imperial_units { false }
float m_contour_width { 0.4f }
float m_cut_plane_radius_koef { 1.5f }
std::vector< bool > m_selected
int m_selected_count { 0 }
GLSelectionRectangle m_selection_rectangle
std::vector< size_t > m_invalid_connectors_idxs
bool m_was_cut_plane_dragged { false }
bool m_was_contour_selected { false }
std::vector< Vec3d > m_groove_vertices
PartSelection m_part_selection
std::vector< std::pair< wxString, wxString > > m_shortcuts_cut
std::vector< std::pair< wxString, wxString > > m_shortcuts_connector
std::vector< std::string > m_modes
size_t m_mode { size_t(CutMode::cutPlanar) }
std::vector< std::string > m_connector_modes
CutConnectorMode m_connector_mode { CutConnectorMode::Manual }
std::vector< std::string > m_connector_types
CutConnectorType m_connector_type
std::vector< std::string > m_connector_styles
int m_connector_style
std::vector< std::string > m_connector_shapes
int m_connector_shape_id
std::vector< std::string > m_axis_names
std::map< std::string, wxString > m_part_orientation_names
std::map< std::string, std::string > m_labels_map
bool m_dirty { false }
int count = 0

Detailed Description

Member Enumeration Documentation

◆ CutConnectorMode

Enumerator
Auto 
Manual 
234 {
235 Auto
236 , Manual
237 };

◆ CutMode

enum class Slic3r::GUI::GLGizmoCut3D::CutMode
strongprivate
Enumerator
cutPlanar 
cutTongueAndGroove 
226 {
229 //, cutGrig
230 //,cutRadial
231 //,cutModular
232 };
@ cutPlanar
Definition Model.hpp:258
@ cutTongueAndGroove
Definition Model.hpp:259

◆ EGrabberExtension

enum class Slic3r::GUI::GLGizmoBase::EGrabberExtension
stronginherited
Enumerator
None 
PosX 
NegX 
PosY 
NegY 
PosZ 
NegZ 
74 {
75 None = 0,
76 PosX = 1 << 0,
77 NegX = 1 << 1,
78 PosY = 1 << 2,
79 NegY = 1 << 3,
80 PosZ = 1 << 4,
81 NegZ = 1 << 5,
82 };
@ PosX
Definition PrintConfig.hpp:350
@ NegY
Definition PrintConfig.hpp:351
@ NegX
Definition PrintConfig.hpp:351
@ PosY
Definition PrintConfig.hpp:350
@ NegZ
Definition PrintConfig.hpp:351
@ PosZ
Definition PrintConfig.hpp:350
@ None
Definition SketchEngine.hpp:180

◆ EState

Enumerator
Off 
On 
Num_States 
126 {
127 Off,
128 On,
130 };
@ On
Definition GLGizmoBase.hpp:128
@ Num_States
Definition GLGizmoBase.hpp:129
@ Off
Definition GLGizmoBase.hpp:127

◆ GrabberID

Enumerator
X 
Y 
Z 
CutPlane 
CutPlaneZRotation 
CutPlaneXMove 
CutPlaneYMove 
Count 
42 {
43 X = 0,
44 Y,
45 Z,
50 Count,
51 };
@ CutPlaneYMove
Definition GLGizmoCut.hpp:49
@ Y
Definition GLGizmoCut.hpp:44
@ CutPlaneXMove
Definition GLGizmoCut.hpp:48
@ Count
Definition GLGizmoCut.hpp:50
@ CutPlaneZRotation
Definition GLGizmoCut.hpp:47
@ X
Definition GLGizmoCut.hpp:43
@ CutPlane
Definition GLGizmoCut.hpp:46
@ Z
Definition GLGizmoCut.hpp:45

Constructor & Destructor Documentation

◆ GLGizmoCut3D()

Slic3r::GUI::GLGizmoCut3D::GLGizmoCut3D ( GLCanvas3D & parent,
const std::string & icon_filename,
unsigned int sprite_id )

–

241 : GLGizmoBase(parent, icon_filename, sprite_id)
246{
247 m_modes = { _u8L("Planar"), _u8L("Dovetail")//, _u8L("Grid")
248// , _u8L("Radial"), _u8L("Modular")
249 };
250
251 m_connector_modes = { _u8L("Auto"), _u8L("Manual") };
252
253 m_connector_types = { _u8L("Plug"), _u8L("Dowel"), _u8L("Snap") };
254
255 m_connector_styles = { _u8L("Prism"), _u8L("Frustum")
256// , _u8L("Claw")
257 };
258
259 m_connector_shapes = { _u8L("Triangle"), _u8L("Square"), _u8L("Hexagon"), _u8L("Circle")
260// , _u8L("D-shape")
261 };
262
263 m_axis_names = { "X", "Y", "Z" };
264
266 {"none", _L("Keep orientation")},
267 {"on_cut", _L("Place on cut")},
268 {"flip", _L("Flip upside down")},
269 };
270
271 m_labels_map = {
272 {"Connectors" , _u8L("Connectors")},
273 {"Type" , _u8L("Type")},
274 {"Style" , _u8L("Style")},
275 {"Shape" , _u8L("Shape")},
276 {"Depth" , _u8L("Depth")},
277 {"Size" , _u8L("Size")},
278 {"Rotation" , _u8L("Rotation")},
279 {"Groove" , _u8L("Groove")},
280 {"Width" , _u8L("Width")},
281 {"Flap Angle" , _u8L("Flap Angle")},
282 {"Groove Angle" , _u8L("Groove Angle")},
283 {"Cut position" , _u8L("Cut position")}, // ORCA
284 {"Multiple" , _u8L("Multiple")}, // ORCA
285 {"Count" , _u8L("Count")}, // ORCA
286 {"Gap" , _u8L("Gap")}, // ORCA
287 {"Spacing" , _u8L("Spacing")} // ORCA
288 };
289
290// update_connector_shape();
291}
#define _L(s)
Definition OBJ.cpp:34
GLGizmoBase(GLCanvas3D &parent, const std::string &icon_filename, unsigned int sprite_id)
Definition GLGizmoBase.cpp:327
std::map< std::string, std::string > m_labels_map
Definition GLGizmoCut.hpp:258
std::vector< std::string > m_connector_modes
Definition GLGizmoCut.hpp:242
int m_connector_shape_id
Definition GLGizmoCut.hpp:252
std::vector< std::string > m_connector_styles
Definition GLGizmoCut.hpp:248
int m_connectors_group_id
Definition GLGizmoCut.hpp:55
std::vector< std::string > m_modes
Definition GLGizmoCut.hpp:239
std::vector< std::string > m_axis_names
Definition GLGizmoCut.hpp:254
CutConnectorType m_connector_type
Definition GLGizmoCut.hpp:246
std::vector< std::string > m_connector_shapes
Definition GLGizmoCut.hpp:251
std::map< std::string, wxString > m_part_orientation_names
Definition GLGizmoCut.hpp:256
std::vector< std::string > m_connector_types
Definition GLGizmoCut.hpp:245
int m_connector_style
Definition GLGizmoCut.hpp:249
@ Plug
Definition Model.hpp:263
@ Circle
Definition Model.hpp:280
@ Prism
Definition Model.hpp:270
#define _u8L(s)
Definition I18N.hpp:11

References Slic3r::GUI::GLGizmoBase::GLGizmoBase(), _L, _u8L, Count, m_axis_names, m_connector_modes, m_connector_shape_id, m_connector_shapes, m_connector_style, m_connector_styles, m_connector_type, m_connector_types, m_connectors_group_id, m_labels_map, m_modes, and m_part_orientation_names.

Here is the call graph for this function:

Member Function Documentation

◆ add_connector()

bool Slic3r::GUI::GLGizmoCut3D::add_connector ( CutConnectors & connectors,
const Vec2d & mouse_position )
protected
3881{
3883 return false;
3884
3885 Vec3d pos;
3886 Vec3d pos_world;
3887 if (unproject_on_cut_plane(mouse_position.cast<double>(), pos, pos_world)) {
3888 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Add connector"), UndoRedo::SnapshotType::GizmoAction);
3890
3891 connectors.emplace_back(pos, m_rotation_m,
3895 CutConnectorAttributes( CutConnectorType(m_connector_type),
3898 m_selected.push_back(true);
3899 m_selected_count = 1;
3900 assert(m_selected.size() == connectors.size());
3902 m_parent.set_as_dirty();
3904
3905 return true;
3906 }
3907 return false;
3908}
GLCanvas3D & m_parent
Definition GLGizmoBase.hpp:143
bool unproject_on_cut_plane(const Vec2d &mouse_pos, Vec3d &pos, Vec3d &pos_world, bool respect_contours=true)
Definition GLGizmoCut.cpp:3694
float m_connector_size
Definition GLGizmoCut.hpp:154
bool m_connectors_editing
Definition GLGizmoCut.hpp:150
void unselect_all_connectors()
Definition GLGizmoCut.cpp:2400
int m_selected_count
Definition GLGizmoCut.hpp:169
std::vector< bool > m_selected
Definition GLGizmoCut.hpp:168
void check_and_update_connectors_state()
Definition GLGizmoCut.cpp:3302
float m_connector_depth_ratio_tolerance
Definition GLGizmoCut.hpp:157
float m_connector_size_tolerance
Definition GLGizmoCut.hpp:158
float m_connector_depth_ratio
Definition GLGizmoCut.hpp:153
void update_raycasters_for_picking()
Definition GLGizmoCut.cpp:1541
Transform3d m_rotation_m
Definition GLGizmoCut.hpp:53
float m_connector_angle
Definition GLGizmoCut.hpp:155
static Plater * plater()
Definition GUI_Factories.cpp:400
@ GizmoAction
Definition UndoRedo.hpp:36
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vec3d
Definition Point.hpp:68
CutConnectorType
Definition Model.hpp:262
CutConnectorShape
Definition Model.hpp:276
CutConnectorStyle
Definition Model.hpp:269
Vec2d mouse_position(const wxMouseEvent &mouse_event)
Extract position of mouse from mouse event.
Definition SurfaceDrag.cpp:502

References _u8L, check_and_update_connectors_state(), Slic3r::UndoRedo::GizmoAction, m_connector_angle, m_connector_depth_ratio, m_connector_depth_ratio_tolerance, m_connector_shape_id, m_connector_size, m_connector_size_tolerance, m_connector_style, m_connector_type, m_connectors_editing, Slic3r::GUI::GLGizmoBase::m_parent, m_rotation_m, m_selected, m_selected_count, Slic3r::GUI::plater(), unproject_on_cut_plane(), unselect_all_connectors(), and update_raycasters_for_picking().

Referenced by gizmo_event().

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

◆ add_horizontal_scaled_interval()

void Slic3r::GUI::GLGizmoCut3D::add_horizontal_scaled_interval ( float interval)
protected
2651{
2652 ImGui::GetCurrentWindow()->DC.CursorPos.x += m_imgui->scaled(interval);
2653}
ImGuiWrapper * m_imgui
Definition GLGizmoBase.hpp:153

References Slic3r::GUI::GLGizmoBase::m_imgui.

◆ add_horizontal_shift()

void Slic3r::GUI::GLGizmoCut3D::add_horizontal_shift ( float shift)
protected
2656{
2657 ImGui::GetCurrentWindow()->DC.CursorPos.x += shift;
2658}

◆ add_vertical_scaled_interval()

void Slic3r::GUI::GLGizmoCut3D::add_vertical_scaled_interval ( float interval)
protected
2646{
2647 ImGui::GetCurrentWindow()->DC.CursorPos.y += m_imgui->scaled(interval);
2648}

References Slic3r::GUI::GLGizmoBase::m_imgui.

◆ apply_clipping_plane()

virtual bool Slic3r::GUI::GLGizmoBase::apply_clipping_plane ( )
inlinevirtualinherited
195{ return true; }

Referenced by Slic3r::GUI::GLCanvas3D::_render_objects(), and Slic3r::GUI::GLCanvas3D::get_raycaster_clipping_plane().

Here is the caller graph for this function:

◆ apply_color_clip_plane_colors()

void Slic3r::GUI::GLGizmoCut3D::apply_color_clip_plane_colors ( )
private
1447{
1449 m_parent.set_color_clip_plane_colors({ CUT_PLANE_DEF_COLOR , CUT_PLANE_DEF_COLOR });
1450 else
1451 m_parent.set_color_clip_plane_colors({ UPPER_PART_COLOR , LOWER_PART_COLOR });
1452}
size_t m_mode
Definition GLGizmoCut.hpp:240
CutMode
Definition GLGizmoCut.hpp:226
@ cutTongueAndGroove
Definition GLGizmoCut.hpp:228
static const ColorRGBA LOWER_PART_COLOR
Definition GLGizmoCut.cpp:82
static const ColorRGBA CUT_PLANE_DEF_COLOR
Definition GLGizmoCut.cpp:96
static const ColorRGBA UPPER_PART_COLOR
Definition GLGizmoCut.cpp:81

References Slic3r::GUI::CUT_PLANE_DEF_COLOR, cutTongueAndGroove, Slic3r::GUI::LOWER_PART_COLOR, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, and Slic3r::GUI::UPPER_PART_COLOR.

Referenced by switch_to_mode(), and update_bb().

Here is the caller graph for this function:

◆ apply_connectors_in_model()

void Slic3r::GUI::GLGizmoCut3D::apply_connectors_in_model ( ModelObject * mo,
int & dowels_count )
private
3480{
3482 return;
3485
3486 for (CutConnector&connector : mo->cut_connectors) {
3487 connector.rotation_m = m_rotation_m;
3488
3489 if (connector.attribs.type == CutConnectorType::Dowel) {
3490 if (connector.attribs.style == CutConnectorStyle::Prism)
3491 connector.height *= 2;
3492 dowels_count ++;
3493 }
3494 else {
3495 // calculate shift of the connector center regarding to the position on the cut plane
3496 connector.pos += m_cut_normal * 0.5 * double(connector.height);
3497 }
3498 }
3499 apply_cut_connectors(mo, _u8L("Connector"));
3500 }
3501}
void clear_selection()
Definition GLGizmoCut.cpp:3757
void apply_cut_connectors(ModelObject *mo, const std::string &connector_name)
Definition GLGizmoCut.cpp:4104
@ Manual
Definition GLGizmoCut.hpp:236
Vec3d m_cut_normal
Definition GLGizmoCut.hpp:110
CutConnectorMode m_connector_mode
Definition GLGizmoCut.hpp:243
@ Dowel
Definition Model.hpp:264

References _u8L, apply_cut_connectors(), Slic3r::CutConnector::attribs, clear_selection(), Slic3r::ModelObject::cut_connectors, cutTongueAndGroove, Slic3r::Dowel, Slic3r::CutConnector::height, m_connector_mode, m_cut_normal, m_mode, m_rotation_m, Manual, Slic3r::CutConnector::pos, Slic3r::Prism, Slic3r::CutConnector::rotation_m, Slic3r::CutConnectorAttributes::style, and Slic3r::CutConnectorAttributes::type.

Referenced by perform_cut().

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

◆ apply_cut_connectors()

void Slic3r::GUI::GLGizmoCut3D::apply_cut_connectors ( ModelObject * mo,
const std::string & connector_name )
private
4105{
4106 if (mo->cut_connectors.empty())
4107 return;
4108
4109 size_t connector_id = mo->cut_id.connectors_cnt();
4110 for (const CutConnector& connector : mo->cut_connectors) {
4111 TriangleMesh mesh = TriangleMesh(get_connector_mesh(connector.attribs));
4112 // Mesh will be centered when loading.
4113 ModelVolume* new_volume = mo->add_volume(std::move(mesh), ModelVolumeType::NEGATIVE_VOLUME);
4114
4115 // Transform the new modifier to be aligned inside the instance
4116 new_volume->set_transformation(translation_transform(connector.pos) * connector.rotation_m *
4117 rotation_transform(-connector.z_angle * Vec3d::UnitZ()) *
4118 scale_transform(Vec3f(connector.radius, connector.radius, connector.height).cast<double>()));
4119
4120 new_volume->cut_info = { connector.attribs.type, connector.radius_tolerance, connector.height_tolerance };
4121 new_volume->name = connector_name + "-" + std::to_string(++connector_id);
4122 }
4123 mo->cut_id.increase_connectors_cnt(mo->cut_connectors.size());
4124
4125 // delete all connectors
4126 mo->cut_connectors.clear();
4127}
indexed_triangle_set get_connector_mesh(CutConnectorAttributes connector_attributes)
Definition GLGizmoCut.cpp:4070
void translation_transform(Transform3d &transform, const Vec3d &translation)
Definition Geometry.cpp:346
void rotation_transform(Transform3d &transform, const Vec3d &rotation)
Definition Geometry.cpp:359
void scale_transform(Transform3d &transform, double scale)
Definition Geometry.cpp:372
@ NEGATIVE_VOLUME
Definition Model.hpp:358
Eigen::Matrix< float, 3, 1, Eigen::DontAlign > Vec3f
Definition Point.hpp:65

References Slic3r::ModelObject::add_volume(), Slic3r::CutConnector::attribs, Slic3r::CutObjectBase::connectors_cnt(), Slic3r::ModelObject::cut_connectors, Slic3r::ModelObject::cut_id, Slic3r::ModelVolume::cut_info, get_connector_mesh(), Slic3r::CutConnector::height, Slic3r::CutConnector::height_tolerance, Slic3r::CutObjectBase::increase_connectors_cnt(), Slic3r::ModelVolume::name, Slic3r::NEGATIVE_VOLUME, Slic3r::CutConnector::pos, Slic3r::CutConnector::radius, Slic3r::CutConnector::radius_tolerance, Slic3r::CutConnector::rotation_m, Slic3r::Geometry::rotation_transform(), Slic3r::Geometry::scale_transform(), Slic3r::ModelVolume::set_transformation(), Slic3r::Geometry::translation_transform(), Slic3r::CutConnectorAttributes::type, and Slic3r::CutConnector::z_angle.

Referenced by apply_connectors_in_model().

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

◆ apply_selected_connectors()

void Slic3r::GUI::GLGizmoCut3D::apply_selected_connectors ( std::function< void(size_t idx)> apply_fn)
protected
2414{
2415 for (size_t idx = 0; idx < m_selected.size(); idx++)
2416 if (m_selected[idx])
2417 apply_fn(idx);
2420}
void update_raycasters_for_picking_transform()
Definition GLGizmoCut.cpp:1562

References check_and_update_connectors_state(), m_selected, and update_raycasters_for_picking_transform().

Referenced by render_connectors_input_window().

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

◆ bounding_box()

BoundingBoxf3 Slic3r::GUI::GLGizmoCut3D::bounding_box ( ) const
1903{
1904 BoundingBoxf3 ret;
1905 const Selection& selection = m_parent.get_selection();
1906 const Selection::IndicesList& idxs = selection.get_volume_idxs();
1907 for (unsigned int i : idxs) {
1908 const GLVolume* volume = selection.get_volume(i);
1909 // respect just to the solid parts for FFF and ignore pad and supports for SLA
1910 if (!volume->is_modifier && !volume->is_sla_pad() && !volume->is_sla_support())
1911 ret.merge(volume->transformed_convex_hull_bounding_box());
1912 }
1913 return ret;
1914}
std::set< unsigned int > IndicesList
Definition Selection.hpp:49
@ Selection
Definition Shortcuts.hpp:72

References Slic3r::GUI::Selection::get_volume(), Slic3r::GUI::Selection::get_volume_idxs(), Slic3r::GLVolume::is_sla_pad(), Slic3r::GLVolume::is_sla_support(), Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::BoundingBox3Base< PointType >::merge(), and Slic3r::GLVolume::transformed_convex_hull_bounding_box().

Referenced by update_bb().

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

◆ can_perform_cut()

bool Slic3r::GUI::GLGizmoCut3D::can_perform_cut ( ) const
private
3423{
3425 return false;
3426
3428 return has_valid_groove();
3429
3430 if (m_part_selection.valid())
3431 return ! m_part_selection.is_one_object();
3432
3433 return true;
3434}
bool has_valid_groove() const
Definition GLGizmoCut.cpp:3436
bool m_keep_upper
Definition GLGizmoCut.hpp:125
std::vector< size_t > m_invalid_connectors_idxs
Definition GLGizmoCut.hpp:173
PartSelection m_part_selection
Definition GLGizmoCut.hpp:219
bool m_keep_lower
Definition GLGizmoCut.hpp:126

References cutTongueAndGroove, has_valid_groove(), m_connectors_editing, m_invalid_connectors_idxs, m_keep_lower, m_keep_upper, m_mode, and m_part_selection.

Referenced by perform_cut(), render_cut_plane(), and render_cut_plane_input_window().

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

◆ check_and_update_connectors_state()

void Slic3r::GUI::GLGizmoCut3D::check_and_update_connectors_state ( )
private
3303{
3304 m_info_stats.invalidate();
3307 return;
3308 const ModelObject* mo = m_c->selection_info()->model_object();
3309 auto inst_id = m_c->selection_info()->get_active_instance();
3310 if (inst_id < 0)
3311 return;
3312 const CutConnectors& connectors = mo->cut_connectors;
3313 const ModelInstance* mi = mo->instances[inst_id];
3314 const Vec3d& instance_offset = mi->get_offset();
3315 const double sla_shift = double(m_c->selection_info()->get_sla_shift());
3316
3317 for (size_t i = 0; i < connectors.size(); ++i) {
3318 const CutConnector& connector = connectors[i];
3319 Vec3d pos = connector.pos + instance_offset + sla_shift * Vec3d::UnitZ(); // recalculate connector position to world position
3320 if (is_conflict_for_connector(i, connectors, pos))
3321 m_invalid_connectors_idxs.emplace_back(i);
3322 }
3323}
CommonGizmosDataPool * m_c
Definition GLGizmoBase.hpp:155
bool is_conflict_for_connector(size_t idx, const CutConnectors &connectors, const Vec3d cur_pos)
Definition GLGizmoCut.cpp:3270
struct Slic3r::GUI::GLGizmoCut3D::InvalidConnectorsStatistics m_info_stats
@ cutPlanar
Definition GLGizmoCut.hpp:227
std::vector< CutConnector > CutConnectors
Definition Model.hpp:351

References Slic3r::ModelObject::cut_connectors, cutPlanar, Slic3r::ModelInstance::get_offset(), Slic3r::ModelObject::instances, is_conflict_for_connector(), Slic3r::GUI::GLGizmoBase::m_c, m_info_stats, m_invalid_connectors_idxs, m_mode, and Slic3r::CutConnector::pos.

Referenced by add_connector(), apply_selected_connectors(), delete_selected_connectors(), on_dragging(), on_mouse(), render_cut_mode_combo(), reset_connectors(), and set_center().

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

◆ clear_selection()

void Slic3r::GUI::GLGizmoCut3D::clear_selection ( )
private
3758{
3759 m_selected.clear();
3760 m_selected_count = 0;
3761}

References m_selected, and m_selected_count.

Referenced by apply_connectors_in_model(), render_connectors(), reset_connectors(), and update_bb().

Here is the caller graph for this function:

◆ cut_line_processing()

bool Slic3r::GUI::GLGizmoCut3D::cut_line_processing ( ) const
private
3807{
3808 return !m_line_beg.isApprox(Vec3d::Zero());
3809}
Vec3d m_line_beg
Definition GLGizmoCut.hpp:89

References m_line_beg.

Referenced by on_mouse(), on_register_raycasters_for_picking(), process_cut_line(), render_connectors(), render_cut_line(), render_cut_plane(), and update_raycasters_for_picking_transform().

Here is the caller graph for this function:

◆ data_changed()

void Slic3r::GUI::GLGizmoCut3D::data_changed ( bool is_serializing)
overrideprotectedvirtual

Is called when data (Selection) is changed.

Reimplemented from Slic3r::GUI::GLGizmoBase.

4061{
4062 update_bb();
4063 if (auto oc = m_c->object_clipper())
4064 oc->set_behavior(m_connectors_editing, m_connectors_editing, double(m_contour_width));
4065}
float m_contour_width
Definition GLGizmoCut.hpp:165
void update_bb()
Definition GLGizmoCut.cpp:1941

References Slic3r::GUI::GLGizmoBase::m_c, m_connectors_editing, m_contour_width, and update_bb().

Here is the call graph for this function:

◆ delete_selected_connectors()

bool Slic3r::GUI::GLGizmoCut3D::delete_selected_connectors ( CutConnectors & connectors)
protected
3911{
3912 if (connectors.empty())
3913 return false;
3914
3915 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Delete connector"), UndoRedo::SnapshotType::GizmoAction);
3916
3917 // remove connectors
3918 for (int i = int(connectors.size()) - 1; i >= 0; i--)
3919 if (m_selected[i])
3920 connectors.erase(connectors.begin() + i);
3921 // remove selections
3922 m_selected.erase(std::remove_if(m_selected.begin(), m_selected.end(), [](const auto& selected) {
3923 return selected; }), m_selected.end());
3924 m_selected_count = 0;
3925
3926 assert(m_selected.size() == connectors.size());
3928 m_parent.set_as_dirty();
3930 return true;
3931}

References _u8L, check_and_update_connectors_state(), Slic3r::UndoRedo::GizmoAction, Slic3r::GUI::GLGizmoBase::m_parent, m_selected, m_selected_count, Slic3r::GUI::plater(), and update_raycasters_for_picking().

Referenced by gizmo_event().

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

◆ discard_cut_line_processing()

void Slic3r::GUI::GLGizmoCut3D::discard_cut_line_processing ( )
private
3812{
3813 m_line_beg = m_line_end = Vec3d::Zero();
3814}
Vec3d m_line_end
Definition GLGizmoCut.hpp:90

References m_line_beg, and m_line_end.

Referenced by on_mouse(), and process_cut_line().

Here is the caller graph for this function:

◆ do_stop_dragging()

void Slic3r::GUI::GLGizmoBase::do_stop_dragging ( bool perform_mouse_cleanup)
protectedinherited
494{
495 for (auto& grabber : m_grabbers) grabber.dragging = false;
496 m_dragging = false;
497
498 // NOTE: This should be part of GLCanvas3D
499 // Reset hover_id when leave window
500 if (perform_mouse_cleanup) m_parent.mouse_up_cleanup();
501
503
504 // There is prediction that after draggign, data are changed
505 // Data are updated twice also by canvas3D::reload_scene.
506 // Should be fixed.
507 m_parent.get_gizmos_manager().update_data();
508
509 wxGetApp().obj_manipul()->set_dirty();
510
511 // Let the plater know that the dragging finished, so a delayed
512 // refresh of the scene with the background processing data should
513 // be performed.
514 m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED));
515 // updates camera target constraints
516 m_parent.refresh_camera_scene_box();
517}
bool m_dragging
Definition GLGizmoBase.hpp:151
std::vector< Grabber > m_grabbers
Definition GLGizmoBase.hpp:152
virtual void on_stop_dragging()
Definition GLGizmoBase.hpp:254

References m_dragging, m_grabbers, m_parent, and on_stop_dragging().

Referenced by use_grabbers().

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

◆ dragging_connector()

void Slic3r::GUI::GLGizmoCut3D::dragging_connector ( const GLGizmoBase::UpdateData & data)
protected
1817{
1818 CutConnectors& connectors = m_c->selection_info()->model_object()->cut_connectors;
1819 Vec3d pos;
1820 Vec3d pos_world;
1821
1822 if (unproject_on_cut_plane(data.mouse_pos.cast<double>(), pos, pos_world)) {
1823 connectors[m_hover_id - m_connectors_group_id].pos = pos;
1825 }
1826}
int m_hover_id
Definition GLGizmoBase.hpp:150

References Slic3r::GUI::GLGizmoBase::m_c, m_connectors_group_id, Slic3r::GUI::GLGizmoBase::m_hover_id, Slic3r::GUI::GLGizmoBase::UpdateData::mouse_pos, unproject_on_cut_plane(), and update_raycasters_for_picking_transform().

Referenced by on_dragging().

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

◆ dragging_grabber_move()

void Slic3r::GUI::GLGizmoCut3D::dragging_grabber_move ( const GLGizmoBase::UpdateData & data)
protected
1728{
1729 Vec3d starting_drag_position;
1730 if (m_hover_id == Z)
1731 starting_drag_position = translation_transform(m_plane_center) * m_rotation_m * (m_grabber_connection_len * Vec3d::UnitZ());
1732 else
1733 starting_drag_position = m_cut_plane_start_move_pos;
1734
1735 double projection = 0.0;
1736
1737 Vec3d starting_vec = m_rotation_m * (m_hover_id == CutPlaneXMove ? Vec3d::UnitX() : m_hover_id == CutPlaneYMove ? Vec3d::UnitY() : Vec3d::UnitZ());
1738 if (starting_vec.norm() != 0.0) {
1739 const Vec3d mouse_dir = data.mouse_ray.unit_vector();
1740 // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing through the starting position
1741 // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebraic form
1742 // in our case plane normal and ray direction are the same (orthogonal view)
1743 // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal
1744 const Vec3d inters = data.mouse_ray.a + (starting_drag_position - data.mouse_ray.a).dot(mouse_dir) * mouse_dir;
1745 // vector from the starting position to the found intersection
1746 const Vec3d inters_vec = inters - starting_drag_position;
1747
1748 starting_vec.normalize();
1749 // finds projection of the vector along the staring direction
1750 projection = inters_vec.dot(starting_vec);
1751 }
1752 if (wxGetKeyState(WXK_SHIFT))
1753 projection = m_snap_step * std::round(projection / m_snap_step);
1754
1755 const Vec3d shift = starting_vec * projection;
1756 if (shift != Vec3d::Zero())
1758
1759 // move cut plane center
1760 set_center(m_plane_center + shift, true);
1761
1763}
void reset_cut_by_contours()
Definition GLGizmoCut.cpp:2588
double m_grabber_connection_len
Definition GLGizmoCut.hpp:74
Vec3d m_cut_plane_start_move_pos
Definition GLGizmoCut.hpp:75
double m_snap_step
Definition GLGizmoCut.hpp:54
Vec3d m_plane_center
Definition GLGizmoCut.hpp:61
bool m_was_cut_plane_dragged
Definition GLGizmoCut.hpp:174
void set_center(const Vec3d &center, bool update_tbb=false)
Definition GLGizmoCut.cpp:545

References Slic3r::Linef3::a, CutPlaneXMove, CutPlaneYMove, Slic3r::dot(), m_cut_plane_start_move_pos, m_grabber_connection_len, Slic3r::GUI::GLGizmoBase::m_hover_id, m_plane_center, m_rotation_m, m_snap_step, m_was_cut_plane_dragged, Slic3r::GUI::GLGizmoBase::UpdateData::mouse_ray, reset_cut_by_contours(), set_center(), Slic3r::Geometry::translation_transform(), Slic3r::Linef3::unit_vector(), and Z.

Referenced by on_dragging().

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

◆ dragging_grabber_rotation()

void Slic3r::GUI::GLGizmoCut3D::dragging_grabber_rotation ( const GLGizmoBase::UpdateData & data)
protected
1766{
1767 const Vec2d mouse_pos = to_2d(mouse_position_in_local_plane((GrabberID)m_hover_id, data.mouse_ray));
1768
1769 const Vec2d orig_dir = Vec2d::UnitX();
1770 const Vec2d new_dir = mouse_pos.normalized();
1771
1772 const double two_pi = 2.0 * PI;
1773
1774 double theta = ::acos(std::clamp(new_dir.dot(orig_dir), -1.0, 1.0));
1775 if (cross2(orig_dir, new_dir) < 0.0)
1776 theta = two_pi - theta;
1777
1778 const double len = mouse_pos.norm();
1779 // snap to coarse snap region
1781 const double step = two_pi / double(SnapRegionsCount);
1782 theta = step * std::round(theta / step);
1783 }
1784 // snap to fine snap region (scale)
1785 else if (m_snap_fine_in_radius <= len && len <= m_snap_fine_out_radius) {
1786 const double step = two_pi / double(ScaleStepsCount);
1787 theta = step * std::round(theta / step);
1788 }
1789
1790 if (is_approx(theta, two_pi))
1791 theta = 0.0;
1792 if (m_hover_id != Y)
1793 theta += 0.5 * PI;
1794
1795 if (!is_approx(theta, 0.0))
1797
1798 Vec3d rotation = Vec3d::Zero();
1799 rotation[m_hover_id == CutPlaneZRotation ? Z : m_hover_id] = theta;
1800
1801 const Transform3d rotation_tmp = m_start_dragging_m * rotation_transform(rotation);
1802 const bool update_tbb = !m_rotation_m.rotation().isApprox(rotation_tmp.rotation());
1803 m_rotation_m = rotation_tmp;
1804 if (update_tbb)
1806
1807 m_angle = theta;
1808 while (m_angle > two_pi)
1809 m_angle -= two_pi;
1810 if (m_angle < 0.0)
1811 m_angle += two_pi;
1812
1814}
Transform3d m_start_dragging_m
Definition GLGizmoCut.hpp:59
Vec3d mouse_position_in_local_plane(GrabberID axis, const Linef3 &mouse_ray) const
Definition GLGizmoCut.cpp:1693
double m_angle
Definition GLGizmoCut.hpp:83
GrabberID
Definition GLGizmoCut.hpp:42
void update_clipper()
Definition GLGizmoCut.cpp:503
BoundingBoxf3 transformed_bounding_box(const Vec3d &plane_center, const Transform3d &rotation_m=Transform3d::Identity()) const
Definition GLGizmoCut.cpp:1916
double m_snap_fine_in_radius
Definition GLGizmoCut.hpp:79
double m_snap_fine_out_radius
Definition GLGizmoCut.hpp:80
double m_snap_coarse_in_radius
Definition GLGizmoCut.hpp:77
double m_snap_coarse_out_radius
Definition GLGizmoCut.hpp:78
BoundingBoxf3 m_transformed_bounding_box
Definition GLGizmoCut.hpp:69
static constexpr double PI
Definition libslic3r.h:81
const unsigned int SnapRegionsCount
Definition GLGizmoCut.cpp:104
const unsigned int ScaleStepsCount
Definition GLGizmoCut.cpp:100
Eigen::Transform< double, 3, Eigen::Affine, Eigen::DontAlign > Transform3d
Definition Point.hpp:96
int32_t cross2(const Eigen::MatrixBase< Eigen::Matrix< int32_t, 2, 1, Options > > &v1, const Eigen::MatrixBase< Eigen::Matrix< int32_t, 2, 1, Options > > &v2)=delete
Eigen::Matrix< typename Derived::Scalar, 2, 1, Eigen::DontAlign > to_2d(const Eigen::MatrixBase< Derived > &ptN)
Definition Point.hpp:147
constexpr bool is_approx(Number value, Number test_value, Number precision=EPSILON)
Definition libslic3r.h:320
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:67
void step(Coord &crd, const Dir d, const long n=1)
Definition MarchingSquares.hpp:213

References Slic3r::cross2(), CutPlaneZRotation, Slic3r::is_approx(), m_angle, Slic3r::GUI::GLGizmoBase::m_hover_id, m_plane_center, m_rotation_m, m_snap_coarse_in_radius, m_snap_coarse_out_radius, m_snap_fine_in_radius, m_snap_fine_out_radius, m_start_dragging_m, m_transformed_bounding_box, mouse_position_in_local_plane(), Slic3r::GUI::GLGizmoBase::UpdateData::mouse_ray, PI, reset_cut_by_contours(), Slic3r::Geometry::rotation_transform(), Slic3r::GUI::ScaleStepsCount, Slic3r::GUI::SnapRegionsCount, Slic3r::to_2d(), transformed_bounding_box(), update_clipper(), Y, and Z.

Referenced by on_dragging().

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

◆ flip_cut_plane()

void Slic3r::GUI::GLGizmoCut3D::flip_cut_plane ( )
protected
2574{
2575 m_rotation_m = m_rotation_m * rotation_transform(PI * Vec3d::UnitX());
2577
2578 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Flip cut plane"), UndoRedo::SnapshotType::GizmoAction);
2580
2582 m_part_selection.turn_over_selection();
2583
2586}

References _u8L, cutTongueAndGroove, Slic3r::UndoRedo::GizmoAction, m_mode, m_part_selection, m_plane_center, m_rotation_m, m_start_dragging_m, m_transformed_bounding_box, PI, Slic3r::GUI::plater(), reset_cut_by_contours(), Slic3r::Geometry::rotation_transform(), transformed_bounding_box(), and update_clipper().

Referenced by on_mouse(), and render_flip_plane_button().

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

◆ format()

std::string Slic3r::GUI::GLGizmoBase::format ( float value,
unsigned int decimals ) const
protectedinherited

◆ get_action_snapshot_name()

std::string Slic3r::GUI::GLGizmoCut3D::get_action_snapshot_name ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

351{ return _u8L("Cut gizmo editing"); }

References _u8L.

◆ get_connector_mesh()

indexed_triangle_set Slic3r::GUI::GLGizmoCut3D::get_connector_mesh ( CutConnectorAttributes connector_attributes)
private
4071{
4072 indexed_triangle_set connector_mesh;
4073
4074 int sectorCount{ 1 };
4075 switch (CutConnectorShape(connector_attributes.shape)) {
4077 sectorCount = 3;
4078 break;
4080 sectorCount = 4;
4081 break;
4083 sectorCount = 360;
4084 break;
4086 sectorCount = 6;
4087 break;
4088 default:
4089 break;
4090 }
4091
4092 if (connector_attributes.type == CutConnectorType::Snap)
4094 else if (connector_attributes.style == CutConnectorStyle::Prism)
4095 connector_mesh = its_make_cylinder(1.0, 1.0, (2 * PI / sectorCount));
4096 else if (connector_attributes.type == CutConnectorType::Plug)
4097 connector_mesh = its_make_frustum(1.0, 1.0, (2 * PI / sectorCount));
4098 else
4099 connector_mesh = its_make_frustum_dowel(1.0, 1.0, sectorCount);
4100
4101 return connector_mesh;
4102}
float m_snap_space_proportion
Definition GLGizmoCut.hpp:147
float m_snap_bulge_proportion
Definition GLGizmoCut.hpp:146
@ Snap
Definition Model.hpp:265
@ Hexagon
Definition Model.hpp:279
@ Triangle
Definition Model.hpp:277
@ Square
Definition Model.hpp:278
indexed_triangle_set its_make_frustum_dowel(double radius, double h, int sectorCount)
Definition TriangleMesh.cpp:1184
indexed_triangle_set its_make_frustum(double r, double h, double fa)
Definition TriangleMesh.cpp:978
indexed_triangle_set its_make_cylinder(double r, double h, double fa)
Definition TriangleMesh.cpp:936
indexed_triangle_set its_make_snap(double r, double h, float space_proportion, float bulge_proportion)
Definition TriangleMesh.cpp:1237

References Slic3r::Circle, Slic3r::Hexagon, Slic3r::its_make_cylinder(), Slic3r::its_make_frustum(), Slic3r::its_make_frustum_dowel(), Slic3r::its_make_snap(), m_snap_bulge_proportion, m_snap_space_proportion, PI, Slic3r::Plug, Slic3r::Prism, Slic3r::CutConnectorAttributes::shape, Slic3r::Snap, Slic3r::Square, Slic3r::CutConnectorAttributes::style, Slic3r::Triangle, and Slic3r::CutConnectorAttributes::type.

Referenced by apply_cut_connectors(), init_connector_shapes(), and update_connector_shape().

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

◆ get_count()

int Slic3r::GUI::GLGizmoBase::get_count ( )
inlineinherited
224{ return ++count; }
int count
Definition GLGizmoBase.hpp:294

References count.

◆ get_cut_matrix()

Transform3d Slic3r::GUI::GLGizmoCut3D::get_cut_matrix ( const Selection & selection)
protected
3504{
3505 const int instance_idx = selection.get_instance_idx();
3506 const int object_idx = selection.get_object_idx();
3507 ModelObject* mo = selection.get_model()->objects[object_idx];
3508 if (!mo)
3509 return Transform3d::Identity();
3510
3511 // m_cut_z is the distance from the bed. Subtract possible SLA elevation.
3512 const double sla_shift_z = selection.get_first_volume()->get_sla_shift_z();
3513
3514 const Vec3d instance_offset = mo->instances[instance_idx]->get_offset();
3515 Vec3d cut_center_offset = m_plane_center - instance_offset;
3516 cut_center_offset[Z] -= sla_shift_z;
3517
3518 return translation_transform(cut_center_offset) * m_rotation_m;
3519}

References Slic3r::GUI::Selection::get_first_volume(), Slic3r::GUI::Selection::get_instance_idx(), Slic3r::GUI::Selection::get_model(), Slic3r::GUI::Selection::get_object_idx(), Slic3r::GLVolume::get_sla_shift_z(), Slic3r::ModelObject::instances, m_plane_center, m_rotation_m, Slic3r::Model::objects, Slic3r::Geometry::translation_transform(), and Z.

Referenced by perform_cut(), and process_contours().

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

◆ get_gizmo_entering_text()

std::string Slic3r::GUI::GLGizmoCut3D::get_gizmo_entering_text ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

349{ return _u8L("Entering Cut gizmo"); }

References _u8L.

◆ get_gizmo_leaving_text()

std::string Slic3r::GUI::GLGizmoCut3D::get_gizmo_leaving_text ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

350{ return _u8L("Leaving Cut gizmo"); }

References _u8L.

◆ get_gizmo_name()

std::string Slic3r::GUI::GLGizmoBase::get_gizmo_name ( )
inlineinherited
225{ return on_get_name(); }
virtual std::string on_get_name() const =0

References on_get_name().

Here is the call graph for this function:

◆ get_hover_id()

int Slic3r::GUI::GLGizmoBase::get_hover_id ( ) const
inlineinherited
206{ return m_hover_id; }

References m_hover_id.

Referenced by Slic3r::GUI::GLCanvas3D::_scene_cache_key(), Slic3r::GUI::GLGizmosManager::grabber_contains_mouse(), Slic3r::GUI::GLGizmoBrimEars::on_mouse(), Slic3r::GUI::GLGizmoCut3D::on_mouse(), Slic3r::GUI::GLGizmoMeshBoolean::on_mouse(), and Slic3r::GUI::GLGizmoPainterBase::on_mouse().

Here is the caller graph for this function:

◆ get_icon_filename()

const std::string & Slic3r::GUI::GLGizmoBase::get_icon_filename ( ) const
inlineinherited
180{ return m_icon_filename; }
std::string m_icon_filename
Definition GLGizmoBase.hpp:148

References m_icon_filename.

◆ get_name()

std::string Slic3r::GUI::GLGizmoBase::get_name ( bool include_shortcut = true) const
inherited
545{
546 const std::string name = on_get_name();
547 return include_shortcut && m_shortcut.has_value() ? wxGetApp().shortcuts().with_key(name, *m_shortcut) : name;
548}
std::optional< Shortcut > m_shortcut
Definition GLGizmoBase.hpp:147

References m_shortcut, and on_get_name().

Referenced by Slic3r::GUI::GLGizmoAssembly::on_render_input_window(), Slic3r::GUI::GLGizmoBrimEars::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_render_input_window(), Slic3r::GUI::GLGizmoEmboss::on_render_input_window(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMeasure::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), and Slic3r::GUI::GLGizmosManager::update_hover_state().

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

◆ get_requirements()

CommonGizmosDataID Slic3r::GUI::GLGizmoBase::get_requirements ( ) const
inlineinherited
186{ return on_get_requirements(); }
virtual CommonGizmosDataID on_get_requirements() const
Definition GLGizmoBase.hpp:248

References on_get_requirements().

Here is the call graph for this function:

◆ get_sprite_id()

unsigned int Slic3r::GUI::GLGizmoBase::get_sprite_id ( ) const
inlineinherited
204{ return m_sprite_id; }
unsigned int m_sprite_id
Definition GLGizmoBase.hpp:149

References m_sprite_id.

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

Here is the caller graph for this function:

◆ get_state()

EState Slic3r::GUI::GLGizmoBase::get_state ( ) const
inlineinherited

◆ get_tooltip()

std::string Slic3r::GUI::GLGizmoCut3D::get_tooltip ( ) const
overridevirtual

Mouse tooltip text.

Returns
Text to be visible in mouse tooltip

Reimplemented from Slic3r::GUI::GLGizmoBase.

294{
295 std::string tooltip;
296 if (m_hover_id == Z || (m_dragging && m_hover_id == CutPlane)) {
298 std::string unit_str = " " + (m_imperial_units ? _u8L_CONTEXT("in", "inches") : _u8L("mm"));
299 const BoundingBoxf3& tbb = m_transformed_bounding_box;
300
301 const std::string name = m_keep_as_parts ? _u8L("Part") : _u8L("Object");
302 if (tbb.max.z() >= 0.0) {
303 double top = (tbb.min.z() <= 0.0 ? tbb.max.z() : tbb.size().z()) * koef;
304 tooltip += format(static_cast<float>(top), 2) + " " + unit_str + " (" + name + " A)";
305 if (tbb.min.z() <= 0.0)
306 tooltip += "\n";
307 }
308 if (tbb.min.z() <= 0.0) {
309 double bottom = (tbb.max.z() <= 0.0 ? tbb.size().z() : (tbb.min.z() * (-1))) * koef;
310 tooltip += format(static_cast<float>(bottom), 2) + " " + unit_str + " (" + name + " B)";
311 }
312 return tooltip;
313 }
314
315 if (!m_dragging && m_hover_id == CutPlane) {
317 return _u8L("Click to flip the cut plane\n"
318 "Drag to move the cut plane");
319 return _u8L("Click to flip the cut plane\n"
320 "Drag to move the cut plane\n"
321 "Right-click a part to assign it to the other side");
322 }
323
324 if (tooltip.empty() && (m_hover_id == X || m_hover_id == Y || m_hover_id == CutPlaneZRotation)) {
325 std::string axis = m_hover_id == X ? "X" : m_hover_id == Y ? "Y" : "Z";
326 return axis + ": " + format(float(rad2deg(m_angle)), 1) + "°";
327 }
328
329 return tooltip;
330}
std::string format(float value, unsigned int decimals) const
Definition GLGizmoBase.cpp:519
bool m_imperial_units
Definition GLGizmoCut.hpp:163
bool m_keep_as_parts
Definition GLGizmoCut.hpp:127
static const double mm_to_in
Definition GizmoObjectManipulation.hpp:31
T rad2deg(T angle)
Definition Geometry.hpp:310
#define _u8L_CONTEXT(s, ctx)
Definition I18N.hpp:16

References _u8L, _u8L_CONTEXT, CutPlane, CutPlaneZRotation, cutTongueAndGroove, Slic3r::GUI::GLGizmoBase::format(), m_angle, Slic3r::GUI::GLGizmoBase::m_dragging, Slic3r::GUI::GLGizmoBase::m_hover_id, m_imperial_units, m_keep_as_parts, m_mode, m_transformed_bounding_box, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::max, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::min, Slic3r::GUI::GizmoObjectManipulation::mm_to_in, Slic3r::Geometry::rad2deg(), Slic3r::BoundingBox3Base< PointType >::size(), X, Y, and Z.

Here is the call graph for this function:

◆ gizmo_event()

bool Slic3r::GUI::GLGizmoCut3D::gizmo_event ( SLAGizmoEventType action,
const Vec2d & mouse_position,
bool shift_down,
bool alt_down,
bool control_down )
3981{
3983 return false;
3984
3985 if ( (m_hover_id < 0 || m_hover_id == CutPlane) && shift_down && ! m_connectors_editing &&
3987 return process_cut_line(action, mouse_position);
3988
3989 if (!m_keep_upper || !m_keep_lower)
3990 return false;
3991
3993 return false;
3994
3995 CutConnectors& connectors = m_c->selection_info()->model_object()->cut_connectors;
3996
3997 if (action == SLAGizmoEventType::LeftDown) {
3998 if (shift_down || alt_down) {
3999 // left down with shift - show the selection rectangle:
4000 if (m_hover_id == -1)
4002 }
4003 else
4004 // If there is no selection and no hovering, add new point
4005 if (m_hover_id == -1 && !shift_down && !alt_down)
4006 if (!add_connector(connectors, mouse_position))
4008 return true;
4009 }
4010
4011 if (action == SLAGizmoEventType::LeftUp && !m_selection_rectangle.is_dragging()) {
4012 if ((m_ldown_mouse_position - mouse_position).norm() < 5.)
4014 return is_selection_changed(alt_down, shift_down);
4015 }
4016
4017 // left up with selection rectangle - select points inside the rectangle:
4018 if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) {
4019 // Is this a selection or deselection rectangle?
4020 process_selection_rectangle(connectors);
4021 return true;
4022 }
4023
4024 // dragging the selection rectangle:
4025 if (action == SLAGizmoEventType::Dragging) {
4026 if (m_selection_rectangle.is_dragging()) {
4027 m_selection_rectangle.dragging(mouse_position);
4028 return true;
4029 }
4030 return false;
4031 }
4032
4033 if (action == SLAGizmoEventType::RightDown && !shift_down) {
4034 // If any point is in hover state, this should initiate its move - return control back to GLCanvas:
4036 return false;
4039 return delete_selected_connectors(connectors);
4040 }
4041
4042 if (action == SLAGizmoEventType::Delete)
4043 return delete_selected_connectors(connectors);
4044
4045 if (action == SLAGizmoEventType::SelectAll) {
4047 return true;
4048 }
4049
4050 return false;
4051}
bool is_dragging() const
Definition GLGizmoBase.hpp:209
void process_selection_rectangle(CutConnectors &connectors)
Definition GLGizmoCut.cpp:3957
void select_all_connectors()
Definition GLGizmoCut.cpp:2407
bool is_selection_changed(bool alt_down, bool shift_down)
Definition GLGizmoCut.cpp:3942
void select_connector(int idx, bool select)
Definition GLGizmoCut.cpp:3933
Vec2d m_ldown_mouse_position
Definition GLGizmoCut.hpp:92
@ Auto
Definition GLGizmoCut.hpp:235
bool delete_selected_connectors(CutConnectors &connectors)
Definition GLGizmoCut.cpp:3910
bool add_connector(CutConnectors &connectors, const Vec2d &mouse_position)
Definition GLGizmoCut.cpp:3880
GLSelectionRectangle m_selection_rectangle
Definition GLGizmoCut.hpp:171
bool process_cut_line(SLAGizmoEventType action, const Vec2d &mouse_position)
Definition GLGizmoCut.cpp:3816
@ Select
Definition GLSelectionRectangle.hpp:20
@ Deselect
Definition GLSelectionRectangle.hpp:21
@ LeftUp
Definition GLGizmosCommon.hpp:30
@ ShiftUp
Definition GLGizmosCommon.hpp:39
@ SelectAll
Definition GLGizmosCommon.hpp:35
@ Dragging
Definition GLGizmosCommon.hpp:33
@ LeftDown
Definition GLGizmosCommon.hpp:29
@ RightDown
Definition GLGizmosCommon.hpp:31
@ AltUp
Definition GLGizmosCommon.hpp:40
@ Moving
Definition GLGizmosCommon.hpp:49
@ Delete
Definition GLGizmosCommon.hpp:34

References add_connector(), Slic3r::GUI::AltUp, Auto, CutPlane, Slic3r::GUI::Delete, delete_selected_connectors(), Slic3r::GUI::GLSelectionRectangle::Deselect, Slic3r::GUI::Dragging, Slic3r::GUI::GLGizmoBase::is_dragging(), is_selection_changed(), Slic3r::GUI::LeftDown, Slic3r::GUI::LeftUp, Slic3r::GUI::GLGizmoBase::m_c, m_connector_mode, m_connectors_editing, m_connectors_group_id, Slic3r::GUI::GLGizmoBase::m_hover_id, m_keep_lower, m_keep_upper, m_ldown_mouse_position, m_selection_rectangle, Slic3r::GUI::Moving, process_cut_line(), process_selection_rectangle(), Slic3r::GUI::RightDown, Slic3r::GUI::GLSelectionRectangle::Select, select_all_connectors(), select_connector(), Slic3r::GUI::SelectAll, Slic3r::GUI::ShiftUp, and unselect_all_connectors().

Referenced by Slic3r::GUI::GLGizmosManager::gizmo_event(), and on_mouse().

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

◆ GizmoImguiBegin()

◆ GizmoImguiEnd()

◆ GizmoImguiSetNextWIndowPos() [1/2]

void Slic3r::GUI::GLGizmoBase::GizmoImguiSetNextWIndowPos ( float & x,
float y,
float w,
float h,
int flag,
float pivot_x = 0.0f,
float pivot_y = 0.0f )
protectedinherited
384{
385 if (abs(w) > 0.01f) {
386 if (x + w > m_parent.get_canvas_size().get_width()) {
387 if (w > m_parent.get_canvas_size().get_width()) {
388 x = 0;
389 } else {
390 x = m_parent.get_canvas_size().get_width() - w;
391 }
392 }
393 }
394
395 m_imgui->set_next_window_pos(x, y, flag, pivot_x, pivot_y);
396}

References m_imgui, and m_parent.

◆ GizmoImguiSetNextWIndowPos() [2/2]

void Slic3r::GUI::GLGizmoBase::GizmoImguiSetNextWIndowPos ( float & x,
float y,
int flag,
float pivot_x = 0.0f,
float pivot_y = 0.0f )
protectedinherited

◆ has_valid_contour()

bool Slic3r::GUI::GLGizmoCut3D::has_valid_contour ( ) const
private
3474{
3475 const auto clipper = m_c->object_clipper();
3476 return clipper && clipper->has_valid_contour();
3477}

References Slic3r::GUI::GLGizmoBase::m_c.

Referenced by render_input_window_warning().

Here is the caller graph for this function:

◆ has_valid_groove()

bool Slic3r::GUI::GLGizmoCut3D::has_valid_groove ( ) const
private
3437{
3439 return true;
3440
3441 const float flaps_width = -2.f * m_groove.depth / tan(m_groove.flaps_angle);
3442 if (flaps_width > m_groove.width)
3443 return false;
3444
3445 const Selection& selection = m_parent.get_selection();
3446 const auto&list = selection.get_volume_idxs();
3447 // is more volumes selected?
3448 if (list.empty())
3449 return false;
3450
3452
3453 for (size_t id = 0; id < m_groove_vertices.size(); id += 2) {
3454 const Vec3d beg = cp_matrix * m_groove_vertices[id];
3455 const Vec3d end = cp_matrix * m_groove_vertices[id + 1];
3456
3457 bool intersection = false;
3458 for (const unsigned int volume_idx : list) {
3459 const GLVolume* glvol = selection.get_volume(volume_idx);
3460 if (!glvol->is_modifier &&
3461 glvol->mesh_raycaster->intersects_line(beg, end - beg, glvol->world_matrix())) {
3462 intersection = true;
3463 break;
3464 }
3465 }
3466 if (!intersection)
3467 return false;
3468 }
3469
3470 return true;
3471}
std::vector< Vec3d > m_groove_vertices
Definition GLGizmoCut.hpp:178
Cut::Groove m_groove
Definition GLGizmoCut.hpp:134
T * end(Slic3r::Mat< N, M, T > &mat)
Definition Point.hpp:841
Slic3r::Polygons intersection(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:769

References cutTongueAndGroove, Slic3r::GUI::Selection::get_volume(), Slic3r::GUI::Selection::get_volume_idxs(), Slic3r::intersection(), m_groove, m_groove_vertices, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_plane_center, m_rotation_m, Slic3r::GLVolume::mesh_raycaster, Slic3r::Geometry::translation_transform(), and Slic3r::GLVolume::world_matrix().

Referenced by can_perform_cut(), process_contours(), render_cut_plane(), render_input_window_warning(), and reset_cut_by_contours().

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

◆ init()

bool Slic3r::GUI::GLGizmoBase::init ( )
inlineinherited
168{ return on_init(); }
virtual bool on_init()=0

References on_init().

Here is the call graph for this function:

◆ init_connector_shapes()

void Slic3r::GUI::GLGizmoCut3D::init_connector_shapes ( )
private
3772{
3776 continue;
3778 if (type == CutConnectorType::Snap && shape != CutConnectorShape::Circle)
3779 continue;
3780 const CutConnectorAttributes attribs = { type, style, shape };
3781 indexed_triangle_set its = get_connector_mesh(attribs);
3782 m_shapes[attribs].model.init_from(its);
3783 m_shapes[attribs].mesh_raycaster = std::make_unique<MeshRaycaster>(std::make_shared<const TriangleMesh>(std::move(its)));
3784 }
3785 }
3786}
#define style
Definition WipeTowerDialog.cpp:101
std::map< CutConnectorAttributes, PickingModel > m_shapes
Definition GLGizmoCut.hpp:101
@ Frustum
Definition Model.hpp:271

References Slic3r::Circle, Slic3r::Dowel, Slic3r::Frustum, get_connector_mesh(), Slic3r::Hexagon, m_shapes, Slic3r::Plug, Slic3r::Prism, Slic3r::Snap, Slic3r::Square, style, and Slic3r::Triangle.

Referenced by init_picking_models().

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

◆ init_input_window_data()

void Slic3r::GUI::GLGizmoCut3D::init_input_window_data ( CutConnectors & connectors)
protected
3083{
3084 m_imperial_units = wxGetApp().app_config->get_bool("use_inches");
3085 m_control_width = m_imgui->get_font_size() * 9.f;
3086
3088
3090 float depth_ratio { UndefFloat };
3091 float depth_ratio_tolerance { UndefFloat };
3092 float radius { UndefFloat };
3093 float radius_tolerance { UndefFloat };
3094 float angle { UndefFloat };
3098
3099 bool is_init = false;
3100 for (size_t idx = 0; idx < m_selected.size(); idx++)
3101 if (m_selected[idx]) {
3102 const CutConnector& connector = connectors[idx];
3103 if (!is_init) {
3104 depth_ratio = connector.height;
3105 depth_ratio_tolerance = connector.height_tolerance;
3106 radius = connector.radius;
3107 radius_tolerance = connector.radius_tolerance;
3108 angle = connector.z_angle;
3109 type = connector.attribs.type;
3110 style = connector.attribs.style;
3111 shape = connector.attribs.shape;
3112
3113 if (m_selected_count == 1)
3114 break;
3115 is_init = true;
3116 }
3117 else {
3118 if (!is_approx(depth_ratio, connector.height))
3119 depth_ratio = UndefFloat;
3120 if (!is_approx(depth_ratio_tolerance, connector.height_tolerance))
3121 depth_ratio_tolerance = UndefFloat;
3122 if (!is_approx(radius,connector.radius))
3123 radius = UndefFloat;
3124 if (!is_approx(radius_tolerance, connector.radius_tolerance))
3125 radius_tolerance = UndefFloat;
3126 if (!is_approx(angle, connector.z_angle))
3127 angle = UndefFloat;
3128
3129 if (type != connector.attribs.type)
3131 if (style != connector.attribs.style)
3133 if (shape != connector.attribs.shape)
3135 }
3136 }
3137
3138 m_connector_depth_ratio = depth_ratio;
3139 m_connector_depth_ratio_tolerance = depth_ratio_tolerance;
3140 m_connector_size = 2.f * radius;
3141 m_connector_size_tolerance = 2.f * radius_tolerance;
3142 m_connector_type = type;
3144 m_connector_style = int(style);
3145 m_connector_shape_id = int(shape);
3146 }
3147
3148 if (m_label_width == 0.f) {
3149 for (const auto& item : m_labels_map) {
3150 const float width = m_imgui->calc_text_size(item.second).x;
3151 if (m_label_width < width)
3153 }
3154 m_label_width += m_imgui->scaled(1.f);
3155 m_label_width += ImGui::GetStyle().WindowPadding.x;
3156 }
3157}
float m_label_width
Definition GLGizmoCut.hpp:160
float m_control_width
Definition GLGizmoCut.hpp:161
double m_editing_window_width
Definition GLGizmoCut.hpp:162
const float UndefFloat
Definition GLGizmoCut.cpp:106
coord_t width(const BoundingBox &box)
Definition Arrange.cpp:1184
@ Undef
Definition Model.hpp:266
@ Undef
Definition Model.hpp:281
@ Undef
Definition Model.hpp:272
double angle(const Eigen::MatrixBase< Derived > &v1, const Eigen::MatrixBase< Derived2 > &v2)
Definition Point.hpp:138

References Slic3r::angle(), Slic3r::CutConnector::attribs, Slic3r::CutConnector::height, Slic3r::CutConnector::height_tolerance, Slic3r::is_approx(), m_connector_angle, m_connector_depth_ratio, m_connector_depth_ratio_tolerance, m_connector_shape_id, m_connector_size, m_connector_size_tolerance, m_connector_style, m_connector_type, m_connectors_editing, m_control_width, m_editing_window_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_imperial_units, m_label_width, m_labels_map, m_selected, m_selected_count, Slic3r::CutConnector::radius, Slic3r::CutConnector::radius_tolerance, Slic3r::CutConnectorAttributes::shape, Slic3r::CutConnectorAttributes::style, style, Slic3r::CutConnectorAttributes::type, Slic3r::Undef, Slic3r::GUI::UndefFloat, and Slic3r::CutConnector::z_angle.

Referenced by on_render_input_window().

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

◆ init_picking_models()

void Slic3r::GUI::GLGizmoCut3D::init_picking_models ( )
private
2004{
2005 if (!m_cone.model.is_initialized()) {
2006 indexed_triangle_set its = its_make_cone(1.0, 1.0, PI / 12.0);
2007 m_cone.model.init_from(its);
2008 m_cone.mesh_raycaster = std::make_unique<MeshRaycaster>(std::make_shared<const TriangleMesh>(std::move(its)));
2009 }
2010 if (!m_sphere.model.is_initialized()) {
2011 indexed_triangle_set its = its_make_sphere(1.0, PI / 12.0);
2012 m_sphere.model.init_from(its);
2013 m_sphere.mesh_raycaster = std::make_unique<MeshRaycaster>(std::make_shared<const TriangleMesh>(std::move(its)));
2014 }
2015 if (!m_cube.model.is_initialized()) {
2016 indexed_triangle_set its = its_make_cube(1., 1., 1.);
2017 m_cube.model.init_from(its);
2018 m_cube.mesh_raycaster = std::make_unique<MeshRaycaster>(std::make_shared<const TriangleMesh>(std::move(its)));
2019 }
2020
2021 if (!m_plane.model.is_initialized() && !m_hide_cut_plane && !m_connectors_editing) {
2022 const double cp_width = 0.02 * get_grabber_mean_size(m_bounding_box);
2023 indexed_triangle_set its = m_mode == size_t(CutMode::cutTongueAndGroove) ? its_make_groove_plane() :
2025
2026 m_plane.model.init_from(its);
2027 m_plane.mesh_raycaster = std::make_unique<MeshRaycaster>(std::make_shared<const TriangleMesh>(std::move(its)));
2028 }
2029
2030 if (m_shapes.empty())
2032}
double m_radius
Definition GLGizmoCut.hpp:72
void init_connector_shapes()
Definition GLGizmoCut.cpp:3771
indexed_triangle_set its_make_groove_plane()
Definition GLGizmoCut.cpp:811
BoundingBoxf3 m_bounding_box
Definition GLGizmoCut.hpp:68
PickingModel m_sphere
Definition GLGizmoCut.hpp:98
float m_cut_plane_radius_koef
Definition GLGizmoCut.hpp:166
bool m_hide_cut_plane
Definition GLGizmoCut.hpp:149
PickingModel m_cube
Definition GLGizmoCut.hpp:100
PickingModel m_cone
Definition GLGizmoCut.hpp:99
PickingModel m_plane
Definition GLGizmoCut.hpp:97
bool m_cut_plane_as_circle
Definition GLGizmoCut.hpp:151
static double get_grabber_mean_size(const BoundingBoxf3 &bb)
Definition GLGizmoCut.cpp:791
indexed_triangle_set its_make_sphere(double radius, double fa)
Definition TriangleMesh.cpp:1128
indexed_triangle_set its_make_cube(double xd, double yd, double zd)
Definition TriangleMesh.cpp:902
indexed_triangle_set its_make_cone(double r, double h, double fa)
Definition TriangleMesh.cpp:1079

References cutTongueAndGroove, Slic3r::GUI::get_grabber_mean_size(), init_connector_shapes(), Slic3r::its_make_cone(), Slic3r::its_make_cube(), Slic3r::its_make_frustum_dowel(), its_make_groove_plane(), Slic3r::its_make_sphere(), m_bounding_box, m_cone, m_connectors_editing, m_cube, m_cut_plane_as_circle, m_cut_plane_radius_koef, m_hide_cut_plane, m_mode, m_plane, m_radius, m_shapes, m_sphere, and PI.

Referenced by on_register_raycasters_for_picking(), on_render(), and update_plane_model().

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

◆ init_rendering_items()

void Slic3r::GUI::GLGizmoCut3D::init_rendering_items ( )
private
2035{
2036 if (!m_grabber_connection.is_initialized())
2037 m_grabber_connection.init_from(its_make_line(Vec3f::Zero(), Vec3f::UnitZ()));
2038 if (!m_circle.is_initialized())
2040 if (!m_scale.is_initialized())
2042 if (!m_snap_radii.is_initialized())
2044 if (!m_reference_radius.is_initialized()) {
2045 m_reference_radius.init_from(its_make_line(Vec3f::Zero(), m_grabber_connection_len * Vec3f::UnitX()));
2047 }
2048 if (!m_angle_arc.is_initialized() || m_angle != 0.0)
2050}
static const ColorRGBA WHITE()
Definition Color.hpp:142
GLModel m_angle_arc
Definition GLGizmoCut.hpp:108
GLModel m_grabber_connection
Definition GLGizmoCut.hpp:94
GLModel m_snap_radii
Definition GLGizmoCut.hpp:106
GLModel m_scale
Definition GLGizmoCut.hpp:105
GLModel m_circle
Definition GLGizmoCut.hpp:104
double m_grabber_radius
Definition GLGizmoCut.hpp:73
GLModel m_reference_radius
Definition GLGizmoCut.hpp:107
static GLModel::Geometry its_make_line(Vec3f beg_pos, Vec3f end_pos)
Definition GLGizmoCut.cpp:112
static void init_from_scale(GLModel &model, double radius)
Definition GLGizmoCut.cpp:149
static void init_from_snap_radii(GLModel &model, double radius)
Definition GLGizmoCut.cpp:182
static void init_from_circle(GLModel &model, double radius)
– ysFIXME those functions bodies are ported from GizmoRotation
Definition GLGizmoCut.cpp:130
static void init_from_angle_arc(GLModel &model, double angle, double radius)
Definition GLGizmoCut.cpp:216

References Slic3r::GUI::init_from_angle_arc(), Slic3r::GUI::init_from_circle(), Slic3r::GUI::init_from_scale(), Slic3r::GUI::init_from_snap_radii(), Slic3r::GUI::its_make_line(), m_angle, m_angle_arc, m_circle, m_grabber_connection, m_grabber_connection_len, m_grabber_radius, m_reference_radius, m_scale, m_snap_radii, and Slic3r::ColorRGBA::WHITE().

Referenced by on_render().

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

◆ invalidate_cut_plane()

void Slic3r::GUI::GLGizmoCut3D::invalidate_cut_plane ( )
2551{
2552 m_rotation_m = Transform3d::Identity();
2553 m_plane_center = Vec3d::Zero();
2554 m_min_pos = Vec3d::Zero();
2555 m_max_pos = Vec3d::Zero();
2556 m_bb_center = Vec3d::Zero();
2557 m_center_offset = Vec3d::Zero();
2558}
Vec3d m_center_offset
Definition GLGizmoCut.hpp:66
Vec3d m_max_pos
Definition GLGizmoCut.hpp:64
Vec3d m_min_pos
Definition GLGizmoCut.hpp:63
Vec3d m_bb_center
Definition GLGizmoCut.hpp:65

References m_bb_center, m_center_offset, m_max_pos, m_min_pos, m_plane_center, and m_rotation_m.

Referenced by update_bb().

Here is the caller graph for this function:

◆ is_activable()

bool Slic3r::GUI::GLGizmoBase::is_activable ( ) const
inlineinherited
184{ return on_is_activable(); }
virtual bool on_is_activable() const
Definition GLGizmoBase.hpp:246

References on_is_activable().

Referenced by Slic3r::GUI::GLGizmosManager::activate_gizmo(), Slic3r::GUI::GLGizmosManager::do_render_overlay(), Slic3r::GUI::GLGizmoEmboss::init_create(), and Slic3r::GUI::GLGizmosManager::update_hover_state().

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

◆ is_conflict_for_connector()

bool Slic3r::GUI::GLGizmoCut3D::is_conflict_for_connector ( size_t idx,
const CutConnectors & connectors,
const Vec3d cur_pos )
private
3271{
3272 if (is_outside_of_cut_contour(idx, connectors, cur_pos))
3273 return true;
3274
3275 const CutConnector& cur_connector = connectors[idx];
3276
3277 const Transform3d matrix = translation_transform(cur_pos) * m_rotation_m *
3278 scale_transform(Vec3f(cur_connector.radius, cur_connector.radius, cur_connector.height).cast<double>());
3279 const BoundingBoxf3 cur_tbb = m_shapes[cur_connector.attribs].model.get_bounding_box().transformed(matrix);
3280
3281 // check if connector's bounding box is inside the object's bounding box
3282 if (!m_bounding_box.contains(cur_tbb)) {
3283 m_info_stats.outside_bb++;
3284 return true;
3285 }
3286
3287 // check if connectors are overlapping
3288 for (size_t i = 0; i < connectors.size(); ++i) {
3289 if (i == idx)
3290 continue;
3291 const CutConnector& connector = connectors[i];
3292
3293 if ((connector.pos - cur_connector.pos).norm() < double(connector.radius + cur_connector.radius)) {
3294 m_info_stats.is_overlap = true;
3295 return true;
3296 }
3297 }
3298
3299 return false;
3300}
bool is_outside_of_cut_contour(size_t idx, const CutConnectors &connectors, const Vec3d cur_pos)
Definition GLGizmoCut.cpp:3223

References Slic3r::CutConnector::attribs, Slic3r::CutConnector::height, is_outside_of_cut_contour(), m_bounding_box, m_info_stats, m_rotation_m, m_shapes, Slic3r::CutConnector::pos, Slic3r::CutConnector::radius, Slic3r::Geometry::scale_transform(), and Slic3r::Geometry::translation_transform().

Referenced by check_and_update_connectors_state().

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

◆ is_dragging()

bool Slic3r::GUI::GLGizmoBase::is_dragging ( ) const
inlineinherited
209{ return m_dragging; }

References m_dragging.

Referenced by Slic3r::GUI::GLGizmoCut3D::gizmo_event(), Slic3r::GUI::GLGizmoEmboss::on_mouse_for_translate(), and Slic3r::GUI::GLGizmoSVG::on_mouse_for_translate().

Here is the caller graph for this function:

◆ is_in_editing_mode()

bool Slic3r::GUI::GLGizmoCut3D::is_in_editing_mode ( ) const
inlineoverridevirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

267{ return m_connectors_editing; }

References m_connectors_editing.

◆ is_looking_forward()

bool Slic3r::GUI::GLGizmoCut3D::is_looking_forward ( ) const
497{
498 const Camera& camera = wxGetApp().plater()->get_camera();
499 const double dot = camera.get_dir_forward().dot(m_cut_normal);
500 return dot < 0.05;
501}
@ Camera
Definition Shortcuts.hpp:72
T dot(const boost::geometry::model::d2::point_xy< T > &v1, const boost::geometry::model::d2::point_xy< T > &v2)
Definition ExtrusionSimulator.cpp:154

References Slic3r::dot(), Slic3r::GUI::Camera::get_dir_forward(), and m_cut_normal.

Referenced by Slic3r::GUI::GLGizmoCut3D::PartSelection::render(), render_connectors(), update_clipper(), and update_raycasters_for_picking_transform().

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

◆ is_outside_of_cut_contour()

bool Slic3r::GUI::GLGizmoCut3D::is_outside_of_cut_contour ( size_t idx,
const CutConnectors & connectors,
const Vec3d cur_pos )
private
3224{
3225 // check if connector pos is out of clipping plane
3226 if (m_c->object_clipper() && m_c->object_clipper()->is_projection_inside_cut(cur_pos) == -1) {
3227 m_info_stats.outside_cut_contour++;
3228 return true;
3229 }
3230
3231 // check if connector bottom contour is out of clipping plane
3232 const CutConnector& cur_connector = connectors[idx];
3233 const CutConnectorShape shape = CutConnectorShape(cur_connector.attribs.shape);
3234 const int sectorCount = shape == CutConnectorShape::Triangle ? 3 :
3235 shape == CutConnectorShape::Square ? 4 :
3236 shape == CutConnectorShape::Circle ? 60: // supposably, 60 points are enough for conflict detection
3237 shape == CutConnectorShape::Hexagon ? 6 : 1 ;
3238
3239 indexed_triangle_set mesh;
3240 auto& vertices = mesh.vertices;
3241 vertices.reserve(sectorCount + 1);
3242
3243 float fa = 2 * PI / sectorCount;
3244 auto vec = Eigen::Vector2f(0, cur_connector.radius);
3245 for (float angle = 0; angle < 2.f * PI; angle += fa) {
3246 Vec2f p = Eigen::Rotation2Df(angle) * vec;
3247 vertices.emplace_back(Vec3f(p(0), p(1), 0.f));
3248 }
3249 its_transform(mesh, translation_transform(cur_pos) * m_rotation_m);
3250
3251 for (const Vec3f& vertex : vertices) {
3252 if (m_c->object_clipper()) {
3253 int contour_idx = m_c->object_clipper()->is_projection_inside_cut(vertex.cast<double>());
3254 bool is_invalid = (contour_idx == -1);
3255 if (m_part_selection.valid() && ! is_invalid) {
3256 assert(contour_idx >= 0);
3257 const std::vector<size_t>& ignored = *(m_part_selection.get_ignored_contours_ptr());
3258 is_invalid = (std::find(ignored.begin(), ignored.end(), size_t(contour_idx)) != ignored.end());
3259 }
3260 if (is_invalid) {
3261 m_info_stats.outside_cut_contour++;
3262 return true;
3263 }
3264 }
3265 }
3266
3267 return false;
3268}
Eigen::Matrix< float, 2, 1, Eigen::DontAlign > Vec2f
Definition Point.hpp:64

References Slic3r::angle(), Slic3r::CutConnector::attribs, Slic3r::Circle, Slic3r::Hexagon, Slic3r::GUI::GLGizmoBase::m_c, m_info_stats, m_part_selection, m_rotation_m, PI, Slic3r::CutConnector::radius, Slic3r::CutConnectorAttributes::shape, Slic3r::Square, Slic3r::Geometry::translation_transform(), and Slic3r::Triangle.

Referenced by is_conflict_for_connector().

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

◆ is_selectable()

bool Slic3r::GUI::GLGizmoBase::is_selectable ( ) const
inlineinherited
185{ return on_is_selectable(); }
virtual bool on_is_selectable() const
Definition GLGizmoBase.hpp:247

References on_is_selectable().

Here is the call graph for this function:

◆ is_selection_changed()

bool Slic3r::GUI::GLGizmoCut3D::is_selection_changed ( bool alt_down,
bool shift_down )
protected
3943{
3945 if (alt_down)
3947 else {
3948 if (!shift_down)
3951 }
3952 return true;
3953 }
3954 return false;
3955}

References m_connectors_group_id, Slic3r::GUI::GLGizmoBase::m_hover_id, select_connector(), and unselect_all_connectors().

Referenced by gizmo_event().

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

◆ is_selection_rectangle_dragging()

bool Slic3r::GUI::GLGizmoCut3D::is_selection_rectangle_dragging ( ) const
inlineoverridevirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

268{ return m_selection_rectangle.is_dragging(); }

References m_selection_rectangle.

◆ its_make_groove_plane()

indexed_triangle_set Slic3r::GUI::GLGizmoCut3D::its_make_groove_plane ( )
private
812{
813 // This function generates a dovetail slot in a wall, viewed from above (top-down).
814 // The slot has a wide "mouth" (closest to the wall surface) and a narrow "neck" (deepest into the wall).
815 // The flaps are the tapered sides connecting the mouth to the neck.
816
817 const float flap_taper_width = is_approx(m_groove.flaps_angle, 0.f) ? m_groove.depth : (m_groove.depth / sin(m_groove.flaps_angle));
818 const float total_flap_taper_width = 2.f * flap_taper_width * cos(m_groove.flaps_angle);
819
820 const float slot_neck_half_width = 0.5f * (m_groove.width);
821 const float slot_mouth_half_width = 0.5f * (m_groove.width + total_flap_taper_width);
822
823 const float cut_plane_radius = 1.5f * float(m_radius);
824 const float cut_plane_length = 1.5f * cut_plane_radius;
825
826 const float plane_half_width = 0.5f * cut_plane_radius; // x
827 const float plane_half_height = 0.5f * cut_plane_length; // y
828
829 const float slot_half_depth = 0.5f * m_groove.depth; // z
830 float slot_front_z = slot_half_depth;
831 float slot_back_z = -slot_half_depth;
832
833 const float flap_taper_offset = plane_half_height * tan(m_groove.angle);
834
835 float slot_mouth_outer_x = slot_neck_half_width + flap_taper_offset; // upper_x extension
836 float slot_neck_outer_x = slot_mouth_half_width + flap_taper_offset; // lower_x extension
837 float slot_outer_x_max = std::max(slot_neck_outer_x, slot_mouth_outer_x); // max x extension
838
839 float slot_neck_inner_x = slot_neck_half_width - flap_taper_offset; // upper_x narrowing
840 float slot_mouth_inner_x = slot_mouth_half_width - flap_taper_offset; // lower_x narrowing
841
842 const float wall_thickness = 0.02f; // 0.02f * (float)get_grabber_mean_size(m_bounding_box); // cut_plane_thiknes
843
844 int groove_count = this->m_groove_count;
845 float groove_gap = this->m_groove_gap;
846
847 indexed_triangle_set mesh;
848
849 // handle multiple dovetails/grooves
850 m_groove_vertices.clear();
851 m_groove_vertices.reserve(8 * groove_count);
852 for (int i = 0; i < groove_count; ++i) {
853 bool is_first_groove = i == 0; // when a groove is not the last groove, then limit the extent of the right plane so that it doesnt overlap the next groove
854 bool is_last_groove = i == groove_count - 1; // do the same in reverse if a groove is not the first groove
855 size_t vertex_index_offset = mesh.vertices.size();
856
857 // Calculate the x-axis offset for this dovetail
858 float groove_offset_factor_start = -.5 * ((groove_count - 1));
859 float groove_offset_factor = groove_offset_factor_start + i;
860 // Recalculate x with offset (only X-axis offset)
861 float offset_x = groove_offset_factor * (groove_gap + (2 * slot_outer_x_max));
862
863 // Vertices of the groove used to detection if groove is valid (not used in mesh)
864 {
865 m_groove_vertices.emplace_back(Vec3f(-slot_neck_outer_x + offset_x, -plane_half_height, slot_front_z).cast<double>());
866 m_groove_vertices.emplace_back(Vec3f(-slot_mouth_inner_x + offset_x, plane_half_height, slot_front_z).cast<double>());
867 m_groove_vertices.emplace_back(Vec3f(-slot_mouth_outer_x + offset_x, -plane_half_height, slot_back_z).cast<double>());
868 m_groove_vertices.emplace_back(Vec3f(-slot_neck_outer_x + offset_x, plane_half_height, slot_back_z).cast<double>());
869 m_groove_vertices.emplace_back(Vec3f(slot_neck_outer_x + offset_x, -plane_half_height, slot_front_z).cast<double>());
870 m_groove_vertices.emplace_back(Vec3f(slot_mouth_inner_x + offset_x, plane_half_height, slot_front_z).cast<double>());
871 m_groove_vertices.emplace_back(Vec3f(slot_mouth_outer_x + offset_x, -plane_half_height, slot_back_z).cast<double>());
872 m_groove_vertices.emplace_back(Vec3f(slot_neck_outer_x + offset_x, plane_half_height, slot_back_z).cast<double>());
873 }
874
875 // ___
876 // Case: Groove is open (Top&bottom: __\ /__ )
877 if (slot_neck_half_width > flap_taper_offset && slot_mouth_half_width > flap_taper_offset) {
878 auto get_vertices = [plane_half_width, plane_half_height]
879 (float slot_front_z, float slot_back_z, float slot_neck_inner_x, float slot_mouth_inner_x, float slot_mouth_outer_x, float slot_neck_outer_x,
880 float slot_outer_x_max, bool is_first_groove, bool is_last_groove, float groove_gap, float offset_x)
881 {
882
883 return std::vector<stl_vertex>({
884 // front left part vertices
885 {is_first_groove ? -plane_half_width + offset_x : -(groove_gap / 2.f) - slot_outer_x_max + offset_x, -plane_half_height, slot_front_z}, // *__/ \__
886 {is_first_groove ? -plane_half_width + offset_x : -(groove_gap / 2.f) - slot_outer_x_max + offset_x, plane_half_height, slot_front_z}, // *__/ \__
887 {-slot_neck_inner_x + offset_x, plane_half_height, slot_front_z}, // __*/ \__
888 {-slot_mouth_outer_x + offset_x, -plane_half_height, slot_front_z}, // __/* \__
889 // back part vertices
890 {-slot_neck_outer_x + offset_x, -plane_half_height, slot_back_z}, // __*/ \__
891 {-slot_mouth_inner_x + offset_x, plane_half_height, slot_back_z}, // __/* \__
892 {slot_mouth_inner_x + offset_x, plane_half_height, slot_back_z}, // __/ *\__
893 {slot_neck_outer_x + offset_x, -plane_half_height, slot_back_z}, // __/ \*__
894 // front right part vertices
895 {slot_mouth_outer_x + offset_x, -plane_half_height, slot_front_z}, // __/ \*__
896 {slot_neck_inner_x + offset_x, plane_half_height, slot_front_z}, // __/ *\__
897 {is_last_groove ? plane_half_width + offset_x : (groove_gap / 2.f) + slot_outer_x_max + offset_x, plane_half_height, slot_front_z}, // __/ \__*
898 {is_last_groove ? plane_half_width + offset_x : (groove_gap / 2.f) + slot_outer_x_max + offset_x, -plane_half_height, slot_front_z}}); // __/ \__*
899 };
900
901 std::vector<stl_vertex> vertices = get_vertices(slot_front_z, slot_back_z, slot_neck_inner_x, slot_mouth_inner_x, slot_mouth_outer_x, slot_neck_outer_x, slot_outer_x_max,
902 is_first_groove, is_last_groove, groove_gap, offset_x);
903 mesh.vertices.insert(mesh.vertices.end(), vertices.begin(), vertices.end());
904
905 // Back face
906 slot_front_z -= wall_thickness;
907 slot_back_z -= wall_thickness;
908
909 const float slot_back_face_x_offset = wall_thickness / tan(0.5f * m_groove.flaps_angle);
910 slot_neck_inner_x += slot_back_face_x_offset;
911 slot_mouth_inner_x += slot_back_face_x_offset;
912 slot_mouth_outer_x += slot_back_face_x_offset;
913 slot_neck_outer_x += slot_back_face_x_offset;
914
915 vertices = get_vertices(slot_front_z, slot_back_z, slot_neck_inner_x, slot_mouth_inner_x, slot_mouth_outer_x, slot_neck_outer_x,
916 slot_outer_x_max, is_first_groove,
917 is_last_groove, groove_gap, offset_x);
918 mesh.vertices.insert(mesh.vertices.end(), vertices.begin(), vertices.end());
919
920 std::vector<Vec3i32> base_indices;
921
922 base_indices = {
923 // above view
924 {5,4,7}, {5,7,6}, // lower part
925 {3,4,5}, {3,5,2}, // left side
926 {9,6,8}, {8,6,7}, // right side
927 {1,0,2}, {2,0,3}, // upper left part
928 {9,8,10}, {10,8,11}, // upper right part
929 // under view
930 {20,21,22}, {20,22,23}, // upper right part
931 {12,13,14}, {12,14,15}, // upper left part
932 {18,21,20}, {18,20,19}, // right side
933 {16,15,14}, {16,14,17}, // left side
934 {16,17,18}, {16,18,19}, // lower part
935 // left edge
936 {1,13,0}, {0,13,12},
937 // front edge
938 {0,12,3}, {3,12,15}, {3,15,4}, {4,15,16}, {4,16,7}, {7,16,19}, {7,19,20}, {7,20,8}, {8,20,11}, {11,20,23},
939 // right edge
940 {11,23,10}, {10,23,22},
941 // back edge
942 {1,13,2}, {2,13,14}, {2,14,17}, {2,17,5}, {5,17,6}, {6,17,18}, {6,18,9}, {9,18,21}, {9,21,10}, {10,21,22}
943 };
944
945 std::vector<Vec3i32> indices = offset_indices(base_indices, vertex_index_offset);
946 mesh.indices.insert(mesh.indices.end(), indices.begin(), indices.end());
947 }
948
949 // __
950 // CASE: Groove is closed (Top&Bottom: ___/ \___)
951 else if (slot_neck_half_width < flap_taper_offset && slot_mouth_half_width < flap_taper_offset) {
952 float slot_neck_apex_y = slot_neck_half_width / tan(m_groove.angle);
953 float slot_mouth_apex_y = slot_mouth_half_width / tan(m_groove.angle);
954
955 auto get_vertices = [plane_half_width, plane_half_height]
956 (float slot_front_z, float slot_back_z, float slot_neck_apex_y, float slot_mouth_apex_y, float slot_mouth_outer_x, float slot_neck_outer_x,
957 float slot_outer_x_max, bool is_first_groove, bool is_last_groove, float groove_gap, float offset_x)
958 {
959 return std::vector<stl_vertex>({
960 // front part vertices
961 {is_first_groove ? -plane_half_width + offset_x : -(groove_gap / 2.f) - slot_outer_x_max + offset_x, -plane_half_height, slot_front_z}, // *__/\__
962 {is_first_groove ? -plane_half_width + offset_x : -(groove_gap / 2.f) - slot_outer_x_max + offset_x, plane_half_height, slot_front_z}, // *__/\__
963 {is_last_groove ? plane_half_width + offset_x : (groove_gap / 2.f) + slot_outer_x_max + offset_x, plane_half_height, slot_front_z}, // __/\__*
964 {is_last_groove ? plane_half_width + offset_x : (groove_gap / 2.f) + slot_outer_x_max + offset_x, -plane_half_height, slot_front_z}, // __/\__*
965 {slot_mouth_outer_x + offset_x, -plane_half_height, slot_front_z}, // __*/\__
966 {offset_x, slot_neck_apex_y, slot_front_z}, // __/*\__
967 {-slot_mouth_outer_x + offset_x, -plane_half_height, slot_front_z}, // __/\*__
968 // back part vertices
969 {-slot_neck_outer_x + offset_x, -plane_half_height, slot_back_z}, // __*/\__
970 {offset_x, slot_mouth_apex_y, slot_back_z}, // __/*\__
971 {slot_neck_outer_x + offset_x, -plane_half_height, slot_back_z}}); // __/\*__
972 };
973
974 std::vector<stl_vertex> vertices = get_vertices(slot_front_z, slot_back_z, slot_neck_apex_y, slot_mouth_apex_y,
975 slot_mouth_outer_x, slot_neck_outer_x, slot_outer_x_max,
976 is_first_groove, is_last_groove, groove_gap, offset_x);
977 mesh.vertices.insert(mesh.vertices.end(), vertices.begin(), vertices.end());
978
979 // Back face
980 slot_front_z -= wall_thickness;
981 slot_back_z -= wall_thickness;
982 slot_neck_apex_y += wall_thickness;
983 slot_mouth_apex_y += wall_thickness;
984
985 const float slot_back_face_x_offset = wall_thickness / tan(0.5f * m_groove.flaps_angle);
986 slot_mouth_outer_x += slot_back_face_x_offset;
987 slot_neck_outer_x += slot_back_face_x_offset;
988
989 vertices = get_vertices(slot_front_z, slot_back_z, slot_neck_apex_y, slot_mouth_apex_y, slot_mouth_outer_x, slot_neck_outer_x,
990 slot_outer_x_max, is_first_groove,
991 is_last_groove, groove_gap, offset_x);
992 mesh.vertices.insert(mesh.vertices.end(), vertices.begin(), vertices.end());
993
994 std::vector<Vec3i32> base_indices = {
995 // above view
996 {8,7,9}, // lower part
997 {5,8,6}, {6,8,7}, // left side
998 {4,9,8}, {4,8,5}, // right side
999 {1,0,6}, {1,6,5},{1,5,2},
1000 {2,5,4}, {2,4,3}, // upper part
1001 // under view
1002 {10,11,16}, {16,11,15},
1003 {15,11,12}, {15,12,14}, {14,12,13}, // upper part
1004 {18,15,14}, {14,18,19}, // right side
1005 {17,16,15}, {17,15,18}, // left side
1006 {17,18,19}, // lower part
1007 // left edge
1008 {1,11,0}, {0,11,10},
1009 // front edge
1010 {0,10,6}, {6,10,16}, {6,17,16}, {6,7,17}, {7,17,19}, {7,19,9}, {4,14,19}, {4,19,9}, {4,14,13}, {4,13,3},
1011 // right edge
1012 {3,13,12}, {3,12,2},
1013 // back edge
1014 {2,12,11}, {2,11,1}
1015 };
1016 std::vector<Vec3i32> indices = offset_indices(base_indices, vertex_index_offset);
1017
1018 mesh.indices.insert(mesh.indices.end(), indices.begin(), indices.end());
1019 }
1020
1021 // Case: Groove is closed from the roof (TOP&Bottom: __/\__ )
1022 else {
1023 float slot_neck_apex_y = slot_neck_half_width / tan(m_groove.angle);
1024
1025 std::vector<stl_vertex> vertices = {
1026 // front part vertices
1027 {is_first_groove ? -plane_half_width + offset_x : -(groove_gap / 2.f) - slot_outer_x_max + offset_x, -plane_half_height, slot_front_z},
1028 {is_first_groove ? -plane_half_width + offset_x : -(groove_gap / 2.f) - slot_outer_x_max + offset_x, plane_half_height, slot_front_z},
1029 {is_last_groove ? plane_half_width + offset_x : (groove_gap / 2.f) + slot_outer_x_max + offset_x, plane_half_height, slot_front_z},
1030 {is_last_groove ? plane_half_width + offset_x : (groove_gap / 2.f) + slot_outer_x_max + offset_x, -plane_half_height, slot_front_z},
1031 {slot_mouth_outer_x + offset_x, -plane_half_height, slot_front_z},
1032 {offset_x, slot_neck_apex_y, slot_front_z},
1033 {-slot_mouth_outer_x + offset_x, -plane_half_height, slot_front_z},
1034 // back part vertices
1035 {-slot_neck_outer_x + offset_x, -plane_half_height, slot_back_z},
1036 {-slot_mouth_inner_x + offset_x, plane_half_height, slot_back_z},
1037 {slot_mouth_inner_x + offset_x, plane_half_height, slot_back_z},
1038 {slot_neck_outer_x + offset_x, -plane_half_height, slot_back_z}};
1039 mesh.vertices.insert(mesh.vertices.end(), vertices.begin(), vertices.end());
1040
1041 // Back face
1042 slot_front_z -= wall_thickness;
1043 slot_back_z -= wall_thickness;
1044
1045 const float slot_back_face_x_offset = wall_thickness / tan(0.5f * m_groove.flaps_angle);
1046 slot_mouth_inner_x += slot_back_face_x_offset;
1047 slot_mouth_outer_x += slot_back_face_x_offset;
1048 slot_neck_outer_x += slot_back_face_x_offset;
1049
1050 vertices = {
1051 // upper part vertices
1052 {is_first_groove ? -plane_half_width + offset_x : -(groove_gap / 2.f) - slot_outer_x_max + offset_x, -plane_half_height, slot_front_z},
1053 {is_first_groove ? -plane_half_width + offset_x : -(groove_gap / 2.f) - slot_outer_x_max + offset_x, plane_half_height, slot_front_z},
1054 {is_last_groove ? plane_half_width + offset_x : (groove_gap / 2.f) + slot_outer_x_max + offset_x, plane_half_height, slot_front_z},
1055 {is_last_groove ? plane_half_width + offset_x : (groove_gap / 2.f) + slot_outer_x_max + offset_x, -plane_half_height, slot_front_z},
1056 {slot_mouth_outer_x + offset_x, -plane_half_height, slot_front_z},
1057 {slot_back_face_x_offset + offset_x, slot_neck_apex_y, slot_front_z},
1058 {-slot_back_face_x_offset + offset_x, slot_neck_apex_y, slot_front_z},
1059 {-slot_mouth_outer_x + offset_x, -plane_half_height, slot_front_z},
1060 // lower part vertices
1061 {-slot_neck_outer_x + offset_x, -plane_half_height, slot_back_z},
1062 {-slot_mouth_inner_x + offset_x, plane_half_height, slot_back_z},
1063 {slot_mouth_inner_x + offset_x, plane_half_height, slot_back_z},
1064 {slot_neck_outer_x + offset_x, -plane_half_height, slot_back_z}};
1065 mesh.vertices.insert(mesh.vertices.end(), vertices.begin(), vertices.end());
1066
1067 // Indices for this dovetail
1068 std::vector<Vec3i32> base_indices = {
1069 // above view
1070 {8,7,10}, {8,10,9}, // lower part
1071 {5,8,7}, {5,7,6}, // left side
1072 {4,10,9}, {4,9,5}, // right side
1073 {1,0,6}, {1,6,5},{1,5,2}, {2,5,4}, {2,4,3}, // upper part
1074 // under view
1075 {11,12,18}, {18,12,17}, {17,12,16}, {16,12,13}, {16,13,15}, {15,13,14}, // upper part
1076 {21,16,15}, {21,15,22}, // right side
1077 {19,18,17}, {19,17,20}, // left side
1078 {19,20,21}, {19,21,22}, // lower part
1079 // left edge
1080 {1,12,11}, {1,11,0},
1081 // front edge
1082 {0,11,18}, {0,18,6}, {7,19,18}, {7,18,6}, {7,19,22}, {7,22,10}, {10,22,15}, {10,15,4}, {4,15,14}, {4,14,3},
1083 // right edge
1084 {3,14,13}, {3,14,2},
1085 // back edge
1086 {2,13,12}, {2,12,1}, {5,16,21}, {5,21,9}, {9,21,20}, {9,20,8}, {5,17,20}, {5,20,8}
1087 };
1088 std::vector<Vec3i32> indices = offset_indices(base_indices, vertex_index_offset);
1089
1090 mesh.indices.insert(mesh.indices.end(), indices.begin(), indices.end());
1091 }
1092 }
1093
1094 return mesh;
1095}
int m_groove_count
Definition GLGizmoCut.hpp:141
float m_groove_gap
Definition GLGizmoCut.hpp:142
std::vector< Vec3i32 > offset_indices(const std::vector< Vec3i32 > &base_indices, size_t vo)
Definition GLGizmoCut.cpp:801
auto cast(const BoundingBoxBase< Tin > &b)
Definition BoundingBox.hpp:299

References Slic3r::cast(), Slic3r::is_approx(), m_groove, m_groove_count, m_groove_gap, m_groove_vertices, m_radius, and offset_indices().

Referenced by init_picking_models().

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

◆ load()

void Slic3r::GUI::GLGizmoBase::load ( cereal::BinaryInputArchive & ar)
inlineinherited
170{ m_state = On; on_load(ar); }
virtual void on_load(cereal::BinaryInputArchive &ar)
Definition GLGizmoBase.hpp:241

References m_state, On, and on_load().

Here is the call graph for this function:

◆ load_render_colors()

void Slic3r::GUI::GLGizmoBase::load_render_colors ( )
staticinherited
93{
99}
@ RenderCol_Grabber_Y
Definition GUI_Colors.hpp:27
@ RenderCol_Flatten_Plane
Definition GUI_Colors.hpp:29
@ RenderCol_Grabber_X
Definition GUI_Colors.hpp:26
@ RenderCol_Grabber_Z
Definition GUI_Colors.hpp:28
@ RenderCol_Flatten_Plane_Hover
Definition GUI_Colors.hpp:30
static ColorRGBA FLATTEN_COLOR
Definition GLGizmoBase.hpp:63
static std::array< ColorRGBA, 3 > AXES_COLOR
Definition GLGizmoBase.hpp:60
static ColorRGBA FLATTEN_HOVER_COLOR
Definition GLGizmoBase.hpp:64
static ImVec4 to_ImVec4(const ColorRGB &color)
Definition ImGuiWrapper.cpp:1053
static ImVec4 colors[RenderCol_Count]
Definition GUI_Colors.hpp:40

References AXES_COLOR, Slic3r::RenderColor::colors, FLATTEN_COLOR, FLATTEN_HOVER_COLOR, RenderCol_Flatten_Plane, RenderCol_Flatten_Plane_Hover, RenderCol_Grabber_X, RenderCol_Grabber_Y, RenderCol_Grabber_Z, and Slic3r::GUI::ImGuiWrapper::to_ImVec4().

Referenced by Slic3r::GUI::GLCanvas3D::init().

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

◆ mouse_position_in_local_plane()

Vec3d Slic3r::GUI::GLGizmoCut3D::mouse_position_in_local_plane ( GrabberID axis,
const Linef3 & mouse_ray ) const
protected
1694{
1695 double half_pi = 0.5 * PI;
1696
1697 Transform3d m = Transform3d::Identity();
1698
1699 switch (axis)
1700 {
1701 case X:
1702 {
1703 m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitZ()));
1704 m.rotate(Eigen::AngleAxisd(-half_pi, Vec3d::UnitY()));
1705 break;
1706 }
1707 case Y:
1708 {
1709 m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitY()));
1710 m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitZ()));
1711 break;
1712 }
1713 case Z:
1714 default:
1715 {
1716 // no rotation applied
1717 break;
1718 }
1719 }
1720
1721 m = m * m_start_dragging_m.inverse();
1722 m.translate(-m_plane_center);
1723
1724 return transform(mouse_ray, m).intersect_plane(0.0);
1725}
Vec3d intersect_plane(double z) const
Definition Line.cpp:133
Linef3 transform(const Linef3 &line, const Transform3d &t)
Definition Line.cpp:15

References Slic3r::Linef3::intersect_plane(), m_plane_center, m_start_dragging_m, PI, Slic3r::transform(), X, Y, and Z.

Referenced by dragging_grabber_rotation().

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

◆ offset_indices()

std::vector< Vec3i32 > Slic3r::GUI::GLGizmoCut3D::offset_indices ( const std::vector< Vec3i32 > & base_indices,
size_t vo )
private
802{
803 std::vector<Vec3i32> offset;
804 int vo_int = static_cast<int>(vo);
805 for (const auto& tri : base_indices) {
806 offset.push_back({tri[0] + vo_int, tri[1] + vo_int, tri[2] + vo_int});
807 }
808 return offset;
809}
Slic3r::Polygons offset(const Slic3r::Polygon &polygon, const float delta, JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:582

References Slic3r::offset().

Referenced by its_make_groove_plane().

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

◆ on_change_color_mode()

virtual void Slic3r::GUI::GLGizmoBase::on_change_color_mode ( bool is_dark)
inlinevirtualinherited
static bool is_dark()
Definition TextureImportDialog.cpp:85
bool m_is_dark_mode
Definition GLGizmoBase.hpp:157

References is_dark(), and m_is_dark_mode.

Here is the call graph for this function:

◆ on_disable_grabber()

virtual void Slic3r::GUI::GLGizmoBase::on_disable_grabber ( unsigned int id)
inlineprotectedvirtualinherited

◆ on_dragging()

void Slic3r::GUI::GLGizmoCut3D::on_dragging ( const UpdateData & data)
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1829{
1830 if (m_hover_id < 0)
1831 return;
1834 else if (m_hover_id == X || m_hover_id == Y || m_hover_id == CutPlaneZRotation)
1837 dragging_connector(data);
1839
1842}
void dragging_grabber_rotation(const GLGizmoBase::UpdateData &data)
Definition GLGizmoCut.cpp:1765
void dragging_connector(const GLGizmoBase::UpdateData &data)
Definition GLGizmoCut.cpp:1816
void dragging_grabber_move(const GLGizmoBase::UpdateData &data)
Definition GLGizmoCut.cpp:1727

References check_and_update_connectors_state(), CutPlane, CutPlaneXMove, CutPlaneYMove, CutPlaneZRotation, cutTongueAndGroove, dragging_connector(), dragging_grabber_move(), dragging_grabber_rotation(), m_connector_mode, m_connectors_group_id, Slic3r::GUI::GLGizmoBase::m_hover_id, m_mode, Manual, reset_cut_by_contours(), X, Y, and Z.

Here is the call graph for this function:

◆ on_enable_grabber()

virtual void Slic3r::GUI::GLGizmoBase::on_enable_grabber ( unsigned int id)
inlineprotectedvirtualinherited

◆ on_get_name()

std::string Slic3r::GUI::GLGizmoCut3D::on_get_name ( ) const
overrideprotectedvirtual

Implements Slic3r::GUI::GLGizmoBase.

1442{
1443 return _u8L_CONTEXT("Cut", "Cut tool");
1444}

References _u8L_CONTEXT.

◆ on_get_requirements()

CommonGizmosDataID Slic3r::GUI::GLGizmoCut3D::on_get_requirements ( ) const
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

4053 {
4054 return CommonGizmosDataID(
4058}
CommonGizmosDataID
Definition GLGizmosCommon.hpp:72
@ SelectionInfo
Definition GLGizmosCommon.hpp:74
@ InstancesHider
Definition GLGizmosCommon.hpp:75
@ ObjectClipper
Definition GLGizmosCommon.hpp:77

References Slic3r::GUI::InstancesHider, Slic3r::GUI::ObjectClipper, and Slic3r::GUI::SelectionInfo.

◆ on_init()

bool Slic3r::GUI::GLGizmoCut3D::on_init ( )
overrideprotectedvirtual

Implements Slic3r::GUI::GLGizmoBase.

1365{
1366 m_grabbers.emplace_back();
1368
1369 // initiate info shortcuts
1370 const wxString ctrl = GUI::shortkey_ctrl_prefix();
1371 const wxString alt = GUI::shortkey_alt_prefix();
1372 const wxString shift = GUI::shortkey_shift_prefix();
1373
1374 m_shortcuts_cut = {
1375 {_L("Drag"), _L("Move cut line")},
1376 {shift + _L("Drag"), _L("Draw cut line")}
1377 };
1378
1380 {_L("Left mouse button"), _L("Add connector")},
1381 {_L("Right mouse button"), _L("Remove connector")},
1382 {_L("Drag"), _L("Move connector")},
1383 {shift + _L("Left mouse button"), _L("Add connector to selection")},
1384 {alt + _L("Left mouse button"), _L("Remove connector from selection")},
1385 {ctrl + "A", _L("Select all connectors")},
1386 };
1387
1388 return true;
1389}
std::vector< std::pair< wxString, wxString > > m_shortcuts_connector
Definition GLGizmoCut.hpp:224
std::vector< std::pair< wxString, wxString > > m_shortcuts_cut
Definition GLGizmoCut.hpp:222
const std::string & shortkey_shift_prefix()
Definition GUI.cpp:109
@ GizmoCut
Definition Shortcuts.hpp:40
const std::string & shortkey_alt_prefix()
Definition GUI.cpp:127
const std::string & shortkey_ctrl_prefix()
Definition GUI.cpp:115

References _L, Slic3r::GUI::GizmoCut, Slic3r::GUI::GLGizmoBase::m_grabbers, Slic3r::GUI::GLGizmoBase::m_shortcut, m_shortcuts_connector, m_shortcuts_cut, Slic3r::GUI::shortkey_alt_prefix(), Slic3r::GUI::shortkey_ctrl_prefix(), and Slic3r::GUI::shortkey_shift_prefix().

Here is the call graph for this function:

◆ on_is_activable()

bool Slic3r::GUI::GLGizmoCut3D::on_is_activable ( ) const
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1670{
1671 const Selection& selection = m_parent.get_selection();
1672 const int object_idx = selection.get_object_idx();
1673 if (object_idx < 0 || selection.is_wipe_tower())
1674 return false;
1675
1676 if (const ModelObject* mo = wxGetApp().plater()->model().objects[object_idx];
1677 mo->is_cut() && mo->volumes.size() == 1) {
1678 const ModelVolume* volume = mo->volumes[0];
1679 if (volume->is_cut_connector() && volume->cut_info.connector_type == CutConnectorType::Dowel)
1680 return false;
1681 }
1682
1683 // This is assumed in GLCanvas3D::do_rotate, do not change this
1684 // without updating that function too.
1685 return selection.is_single_full_instance() && !m_parent.is_layers_editing_enabled();
1686}

References Slic3r::ModelVolume::CutInfo::connector_type, Slic3r::ModelVolume::cut_info, Slic3r::Dowel, Slic3r::GUI::Selection::get_object_idx(), Slic3r::ModelVolume::is_cut_connector(), Slic3r::GUI::Selection::is_single_full_instance(), Slic3r::GUI::Selection::is_wipe_tower(), Slic3r::GUI::GLGizmoBase::m_parent, and Slic3r::GUI::plater().

Here is the call graph for this function:

◆ on_is_selectable()

bool Slic3r::GUI::GLGizmoCut3D::on_is_selectable ( ) const
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1689{
1690 return wxGetApp().get_mode() != comSimple;
1691}
@ comSimple
Definition Config.hpp:222

References Slic3r::comSimple.

◆ on_load()

void Slic3r::GUI::GLGizmoCut3D::on_load ( cereal::BinaryInputArchive & ar)
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1392{
1393 size_t mode;
1394 float groove_depth;
1395 float groove_width;
1396 float groove_flaps_angle;
1397 float groove_angle;
1398 float groove_depth_tolerance;
1399 float groove_width_tolerance;
1400
1403 groove_depth, groove_width, groove_flaps_angle, groove_angle, groove_depth_tolerance, groove_width_tolerance);
1404
1406
1409
1410 if (m_mode != mode)
1411 switch_to_mode(mode);
1413 if (!is_approx(m_groove.depth , groove_depth) ||
1414 !is_approx(m_groove.width , groove_width) ||
1415 !is_approx(m_groove.flaps_angle , groove_flaps_angle) ||
1416 !is_approx(m_groove.angle , groove_angle) ||
1417 !is_approx(m_groove.depth_tolerance, groove_depth_tolerance) ||
1418 !is_approx(m_groove.width_tolerance, groove_width_tolerance) )
1419 {
1420 m_groove.depth = groove_depth;
1421 m_groove.width = groove_width;
1422 m_groove.flaps_angle = groove_flaps_angle;
1423 m_groove.angle = groove_angle;
1424 m_groove.depth_tolerance= groove_depth_tolerance;
1425 m_groove.width_tolerance= groove_width_tolerance;
1427 }
1429 }
1430
1431 m_parent.request_extra_frame();
1432}
void switch_to_mode(size_t new_mode)
Definition GLGizmoCut.cpp:552
void set_center_pos(const Vec3d &center_pos, bool update_tbb=false)
Definition GLGizmoCut.cpp:1873
void update_plane_model()
Definition GLGizmoCut.cpp:1657
bool m_rotate_upper
Definition GLGizmoCut.hpp:130
bool m_rotate_lower
Definition GLGizmoCut.hpp:131
Vec3d m_ar_plane_center
Definition GLGizmoCut.hpp:58

References cutTongueAndGroove, Slic3r::is_approx(), m_ar_plane_center, m_connectors_editing, m_groove, m_hide_cut_plane, m_keep_lower, m_keep_upper, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_rotate_lower, m_rotate_upper, m_rotation_m, m_start_dragging_m, m_transformed_bounding_box, reset_cut_by_contours(), set_center_pos(), switch_to_mode(), transformed_bounding_box(), and update_plane_model().

Here is the call graph for this function:

◆ on_mouse()

bool Slic3r::GUI::GLGizmoCut3D::on_mouse ( const wxMouseEvent & mouse_event)
overridevirtual

Drag of plane.

Parameters
mouse_eventKeep information about mouse click
Returns
Return True when use the information otherwise False.

Reimplemented from Slic3r::GUI::GLGizmoBase.

333{
334 Vec2i32 mouse_coord(mouse_event.GetX(), mouse_event.GetY());
335 Vec2d mouse_pos = mouse_coord.cast<double>();
336
337 if (mouse_event.ShiftDown() && mouse_event.LeftDown())
338 return gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown());
339 if (mouse_event.CmdDown() && mouse_event.LeftDown())
340 return false;
341 if (cut_line_processing()) {
342 if (mouse_event.ShiftDown()) {
343 if (mouse_event.Moving()|| mouse_event.Dragging())
344 return gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown());
345 if (mouse_event.LeftUp())
346 return gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown());
347 }
349 }
350 else if (mouse_event.Moving())
351 return false;
352
353 if (m_hover_id >= CutPlane && mouse_event.LeftDown() && !m_connectors_editing) {
354 // before processing of a use_grabbers(), detect start move position as a projection of mouse position to the cut plane
355 Vec3d pos;
356 Vec3d pos_world;
357 if (unproject_on_cut_plane(mouse_pos, pos, pos_world, false))
358 m_cut_plane_start_move_pos = pos_world;
359 }
360
361 if (use_grabbers(mouse_event)) {
363 if (mouse_event.LeftDown() && !mouse_event.CmdDown() && !mouse_event.AltDown())
365 if (mouse_event.LeftUp() && !mouse_event.ShiftDown())
366 gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown());
367 }
368 else if (m_hover_id == CutPlane) {
369 if (mouse_event.LeftDown()) {
371
372 // disable / enable current contour
373 Vec3d pos;
374 Vec3d pos_world;
375 m_was_contour_selected = unproject_on_cut_plane(mouse_pos.cast<double>(), pos, pos_world);
377 // Following would inform the clipper about the mouse click, so it can
378 // toggle the respective contour as disabled.
379 //m_c->object_clipper()->pass_mouse_click(pos_world);
380 //process_contours();
381 return true;
382 }
383
384 }
385 else if (mouse_event.LeftUp() && !m_was_cut_plane_dragged && !m_was_contour_selected)
387 }
388
389 if (m_hover_id >= CutPlane && mouse_event.Dragging() && !m_connectors_editing) {
390 // if we continue to dragging a cut plane, than update a start move position as a projection of mouse position to the cut plane after processing of a use_grabbers()
391 Vec3d pos;
392 Vec3d pos_world;
393 if (unproject_on_cut_plane(mouse_pos, pos, pos_world, false))
394 m_cut_plane_start_move_pos = pos_world;
395 }
396
398 return true;
399 }
400
401 static bool pending_right_up = false;
402 if (mouse_event.LeftDown()) {
403 bool grabber_contains_mouse = (get_hover_id() != -1);
404 const bool shift_down = mouse_event.ShiftDown();
405 if ((!shift_down || grabber_contains_mouse) &&
406 gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false))
407 return true;
408 }
409 else if (mouse_event.Dragging()) {
410 bool control_down = mouse_event.CmdDown();
411 if (m_parent.get_move_volume_id() != -1) {
412 // don't allow dragging objects with the Sla gizmo on
413 return true;
414 }
415 if (!control_down &&
416 gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) {
417 // the gizmo got the event and took some action, no need to do
418 // anything more here
419 m_parent.set_as_dirty();
420 return true;
421 }
422 if (control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())) {
423 // CTRL has been pressed while already dragging -> stop current action
424 if (mouse_event.LeftIsDown())
425 gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
426 else if (mouse_event.RightIsDown())
427 pending_right_up = false;
428 }
429 }
430 else if (mouse_event.LeftUp() && !m_parent.is_mouse_dragging()) {
431 // in case SLA/FDM gizmo is selected, we just pass the LeftUp event
432 // and stop processing - neither object moving or selecting is
433 // suppressed in that case
434 gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown());
435 return true;
436 }
437 else if (mouse_event.RightDown()) {
438 if (! m_connectors_editing && mouse_event.GetModifiers() == wxMOD_NONE &&
440 // Check the internal part raycasters.
441 if (! m_part_selection.valid())
443 m_part_selection.toggle_selection(mouse_pos);
444 check_and_update_connectors_state(); // after a contour is deactivated, its connectors are inside the object
445 return true;
446 }
447
448 if (m_parent.get_selection().get_object_idx() != -1 &&
449 gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) {
450 // we need to set the following right up as processed to avoid showing
451 // the context menu if the user release the mouse over the object
452 pending_right_up = true;
453 // event was taken care of by the SlaSupports gizmo
454 return true;
455 }
456 }
457 else if (pending_right_up && mouse_event.RightUp()) {
458 pending_right_up = false;
459 return true;
460 }
461 return false;
462}
bool use_grabbers(const wxMouseEvent &mouse_event)
function which Set up m_dragging and call functions on_start_dragging / on_dragging / on_stop_draggin...
Definition GLGizmoBase.cpp:444
int get_hover_id() const
Definition GLGizmoBase.hpp:206
void toggle_model_objects_visibility()
Definition GLGizmoCut.cpp:3325
bool m_was_contour_selected
Definition GLGizmoCut.hpp:175
void flip_cut_plane()
Definition GLGizmoCut.cpp:2573
bool gizmo_event(SLAGizmoEventType action, const Vec2d &mouse_position, bool shift_down, bool alt_down, bool control_down)
Definition GLGizmoCut.cpp:3980
bool cut_line_processing() const
Definition GLGizmoCut.cpp:3806
void process_contours()
Definition GLGizmoCut.cpp:2601
void discard_cut_line_processing()
Definition GLGizmoCut.cpp:3811
Eigen::Matrix< int32_t, 2, 1, Eigen::DontAlign > Vec2i32
Definition Point.hpp:57

References check_and_update_connectors_state(), cut_line_processing(), cutPlanar, CutPlane, discard_cut_line_processing(), Slic3r::GUI::Dragging, flip_cut_plane(), Slic3r::GUI::GLGizmoBase::get_hover_id(), gizmo_event(), Slic3r::GUI::LeftDown, Slic3r::GUI::LeftUp, m_connectors_editing, m_connectors_group_id, m_cut_plane_start_move_pos, Slic3r::GUI::GLGizmoBase::m_hover_id, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_part_selection, m_was_contour_selected, m_was_cut_plane_dragged, Slic3r::GUI::Moving, process_contours(), Slic3r::GUI::RightDown, toggle_model_objects_visibility(), unproject_on_cut_plane(), unselect_all_connectors(), Slic3r::GUI::GLGizmoBase::use_grabbers(), and Slic3r::GUI::wxMouseEvent.

Here is the call graph for this function:

◆ on_register_raycasters_for_picking()

void Slic3r::GUI::GLGizmoCut3D::on_register_raycasters_for_picking ( )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1489{
1490 // assert(m_raycasters.empty());
1491 if (!m_raycasters.empty())
1493 // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account
1494 m_parent.set_raycaster_gizmos_on_top(true);
1495
1497
1499 if (CommonGizmosDataObjects::SelectionInfo* si = m_c->selection_info()) {
1500 const CutConnectors& connectors = si->model_object()->cut_connectors;
1501 for (int i = 0; i < int(connectors.size()); ++i)
1502 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i + m_connectors_group_id, *(m_shapes[connectors[i].attribs]).mesh_raycaster, Transform3d::Identity()));
1503 }
1504 }
1505 else if (!cut_line_processing()) {
1506 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, X, *m_cone.mesh_raycaster, Transform3d::Identity()));
1507 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, X, *m_cone.mesh_raycaster, Transform3d::Identity()));
1508
1509 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, Y, *m_cone.mesh_raycaster, Transform3d::Identity()));
1510 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, Y, *m_cone.mesh_raycaster, Transform3d::Identity()));
1511
1512 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, Z, *m_sphere.mesh_raycaster, Transform3d::Identity()));
1513
1514 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::FallbackGizmo, CutPlane, *m_plane.mesh_raycaster, Transform3d::Identity()));
1515
1517 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CutPlaneZRotation, *m_sphere.mesh_raycaster, Transform3d::Identity()));
1518 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CutPlaneZRotation, *m_cone.mesh_raycaster, Transform3d::Identity()));
1519 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CutPlaneZRotation, *m_cone.mesh_raycaster, Transform3d::Identity()));
1520
1521 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CutPlaneXMove, *m_cube.mesh_raycaster, Transform3d::Identity()));
1522 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CutPlaneXMove, *m_cone.mesh_raycaster, Transform3d::Identity()));
1523
1524 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CutPlaneYMove, *m_cube.mesh_raycaster, Transform3d::Identity()));
1525 m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, CutPlaneYMove, *m_cone.mesh_raycaster, Transform3d::Identity()));
1526 }
1527 }
1528
1530}
std::vector< std::shared_ptr< SceneRaycasterItem > > m_raycasters
Definition GLGizmoCut.hpp:102
virtual void on_unregister_raycasters_for_picking() override
Definition GLGizmoCut.cpp:1532
void init_picking_models()
Definition GLGizmoCut.cpp:2003
@ FallbackGizmo
Definition SceneRaycaster.hpp:52
@ Gizmo
Definition SceneRaycaster.hpp:51

References cut_line_processing(), CutPlane, CutPlaneXMove, CutPlaneYMove, CutPlaneZRotation, cutTongueAndGroove, Slic3r::GUI::SceneRaycaster::FallbackGizmo, Slic3r::GUI::SceneRaycaster::Gizmo, init_picking_models(), Slic3r::GUI::GLGizmoBase::m_c, m_cone, m_connectors_editing, m_connectors_group_id, m_cube, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_plane, m_raycasters, m_shapes, m_sphere, on_unregister_raycasters_for_picking(), update_raycasters_for_picking_transform(), X, Y, and Z.

Referenced by update_clipper(), and update_raycasters_for_picking().

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

◆ on_render()

void Slic3r::GUI::GLGizmoCut3D::on_render ( )
overrideprotectedvirtual

Implements Slic3r::GUI::GLGizmoBase.

2330{
2331 if (m_state == On) {
2332 // This gizmo is showing the object elevated. Tell the common
2333 // SelectionInfo object to lie about the actual shift.
2334 //m_c->selection_info()->set_use_shift(true);
2335 }
2336
2337 // check objects visibility
2339
2341
2343
2345
2347
2349 m_part_selection.render(nullptr, m_sphere.model);
2350 else
2351 m_part_selection.render(&m_cut_normal, m_sphere.model);
2352
2354
2358 }
2359
2361
2363}
void render_connectors()
Definition GLGizmoCut.cpp:3344
void init_rendering_items()
Definition GLGizmoCut.cpp:2034
void render_clipper_cut()
Definition GLGizmoCut.cpp:2052
void render_cut_plane()
Definition GLGizmoCut.cpp:1097
void render_cut_plane_grabbers()
Definition GLGizmoCut.cpp:1217
void render_cut_line()
Definition GLGizmoCut.cpp:1350

References init_picking_models(), init_rendering_items(), m_connectors_editing, m_cut_normal, m_hide_cut_plane, Slic3r::GUI::GLGizmoBase::m_parent, m_part_selection, m_selection_rectangle, m_sphere, Slic3r::GUI::GLGizmoBase::m_state, Slic3r::GUI::GLGizmoBase::On, render_clipper_cut(), render_connectors(), render_cut_line(), render_cut_plane(), render_cut_plane_grabbers(), toggle_model_objects_visibility(), and update_clipper().

Here is the call graph for this function:

◆ on_render_input_window()

void Slic3r::GUI::GLGizmoCut3D::on_render_input_window ( float x,
float y,
float bottom_limit )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

3191{
3192 GizmoImguiSetNextWIndowPos(x, y, ImGuiCond_Always, 0.0f, 0.0f);
3194 GizmoImguiBegin(get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar);
3195
3196 CutConnectors& connectors = m_c->selection_info()->model_object()->cut_connectors;
3197
3198 init_input_window_data(connectors);
3199
3200 if (m_connectors_editing) // connectors mode
3201 render_connectors_input_window(connectors, x, y, bottom_limit);
3202 else
3203 render_cut_plane_input_window(connectors, x, y, bottom_limit);
3204
3206
3207 GizmoImguiEnd();
3208
3209 // Orca
3211
3212 if (!m_connectors_editing) // connectors mode
3214}
std::string get_name(bool include_shortcut=true) const
Definition GLGizmoBase.cpp:544
void GizmoImguiEnd()
Definition GLGizmoBase.cpp:372
bool GizmoImguiBegin(const std::string &name, int flags)
Definition GLGizmoBase.cpp:367
void render_debug_input_window(float x)
Definition GLGizmoCut.cpp:2365
void render_connectors_input_window(CutConnectors &connectors, float x, float y, float bottom_limit)
Definition GLGizmoCut.cpp:2422
void render_input_window_warning() const
Definition GLGizmoCut.cpp:3159
void render_cut_plane_input_window(CutConnectors &connectors, float x, float y, float bottom_limit)
Definition GLGizmoCut.cpp:2906
void init_input_window_data(CutConnectors &connectors)
Definition GLGizmoCut.cpp:3082
static void push_toolbar_style(const float scale)
Definition ImGuiWrapper.cpp:2705
static void pop_toolbar_style()
Definition ImGuiWrapper.cpp:2757

References Slic3r::GUI::GLGizmoBase::get_name(), Slic3r::GUI::GLGizmoBase::GizmoImguiBegin(), Slic3r::GUI::GLGizmoBase::GizmoImguiEnd(), Slic3r::GUI::GLGizmoBase::GizmoImguiSetNextWIndowPos(), init_input_window_data(), Slic3r::GUI::GLGizmoBase::m_c, m_connectors_editing, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::GUI::ImGuiWrapper::pop_toolbar_style(), Slic3r::GUI::ImGuiWrapper::push_toolbar_style(), render_connectors_input_window(), render_cut_plane_input_window(), render_debug_input_window(), and render_input_window_warning().

Here is the call graph for this function:

◆ on_save()

void Slic3r::GUI::GLGizmoCut3D::on_save ( cereal::BinaryOutputArchive & ar) const
overrideprotectedvirtual

◆ on_set_hover_id()

void Slic3r::GUI::GLGizmoCut3D::on_set_hover_id ( )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1666{
1667}

◆ on_set_state()

void Slic3r::GUI::GLGizmoCut3D::on_set_state ( )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1455{
1456 if (m_state == On) {
1457 m_parent.set_use_color_clip_plane(true);
1458
1459 update_bb();
1462
1463 // initiate archived values
1467
1468 m_parent.request_extra_frame();
1469 }
1470 else {
1471 if (auto oc = m_c->object_clipper()) {
1472 oc->set_behavior(true, true, 0.);
1473 oc->release();
1474 }
1475 m_selected.clear();
1476 m_parent.set_use_color_clip_plane(false);
1477 //m_c->selection_info()->set_use_shift(false);
1478
1479 // Make sure that the part selection data are released when the gizmo is closed.
1480 // The CallAfter is needed because in perform_cut, the gizmo is closed BEFORE
1481 // the cut is performed (because of undo/redo snapshots), so the data would
1482 // be deleted prematurely.
1483 if (m_part_selection.valid())
1484 wxGetApp().CallAfter([this]() { m_part_selection = PartSelection(); });
1485 }
1486}
Definition GLGizmoCut.hpp:180

References m_ar_plane_center, Slic3r::GUI::GLGizmoBase::m_c, m_connectors_editing, Slic3r::GUI::GLGizmoBase::m_parent, m_part_selection, m_plane_center, m_rotation_m, m_selected, m_start_dragging_m, Slic3r::GUI::GLGizmoBase::m_state, m_transformed_bounding_box, Slic3r::GUI::GLGizmoBase::On, reset_cut_by_contours(), transformed_bounding_box(), and update_bb().

Here is the call graph for this function:

◆ on_start_dragging()

void Slic3r::GUI::GLGizmoCut3D::on_start_dragging ( )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1845{
1846 m_angle = 0.0;
1848 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Move connector"), UndoRedo::SnapshotType::GizmoAction);
1849
1852}

References _u8L, CutPlaneZRotation, Slic3r::UndoRedo::GizmoAction, m_angle, m_connector_mode, m_connectors_group_id, Slic3r::GUI::GLGizmoBase::m_hover_id, m_rotation_m, m_start_dragging_m, Manual, Slic3r::GUI::plater(), X, and Y.

Here is the call graph for this function:

◆ on_stop_dragging()

void Slic3r::GUI::GLGizmoCut3D::on_stop_dragging ( )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1855{
1856 if (m_hover_id == X || m_hover_id == Y || m_hover_id == CutPlaneZRotation) {
1857 m_angle_arc.reset();
1858 m_angle = 0.0;
1859 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Rotate cut plane"), UndoRedo::SnapshotType::GizmoAction);
1861 }
1864 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Move cut plane"), UndoRedo::SnapshotType::GizmoAction);
1866 }
1867
1870 //check_and_update_connectors_state();
1871}

References _u8L, CutPlane, CutPlaneXMove, CutPlaneYMove, CutPlaneZRotation, cutTongueAndGroove, Slic3r::UndoRedo::GizmoAction, m_angle, m_angle_arc, m_ar_plane_center, Slic3r::GUI::GLGizmoBase::m_hover_id, m_mode, m_plane_center, m_rotation_m, m_start_dragging_m, m_was_cut_plane_dragged, Slic3r::GUI::plater(), reset_cut_by_contours(), X, Y, and Z.

Here is the call graph for this function:

◆ on_unregister_raycasters_for_picking()

void Slic3r::GUI::GLGizmoCut3D::on_unregister_raycasters_for_picking ( )
overrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

1533{
1534 m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo);
1535 m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::FallbackGizmo);
1536 m_raycasters.clear();
1537 // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account
1538 m_parent.set_raycaster_gizmos_on_top(false);
1539}

References Slic3r::GUI::SceneRaycaster::FallbackGizmo, Slic3r::GUI::SceneRaycaster::Gizmo, Slic3r::GUI::GLGizmoBase::m_parent, and m_raycasters.

Referenced by on_register_raycasters_for_picking(), process_cut_line(), update_bb(), update_plane_model(), and update_raycasters_for_picking().

Here is the caller graph for this function:

◆ perform_cut()

void Slic3r::GUI::GLGizmoCut3D::perform_cut ( const Selection & selection)
private
3580{
3581 if (!can_perform_cut())
3582 return;
3583 const int instance_idx = selection.get_instance_idx();
3584 const int object_idx = selection.get_object_idx();
3585
3586 wxCHECK_RET(instance_idx >= 0 && object_idx >= 0, "GLGizmoCut: Invalid object selection");
3587
3588 Plater* plater = wxGetApp().plater();
3589 ModelObject* mo = plater->model().objects[object_idx];
3590 if (!mo)
3591 return;
3592
3593 // deactivate CutGizmo and than perform a cut
3594 m_parent.reset_all_gizmos();
3595
3596 // perform cut
3597 {
3598 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Cut by Plane"));
3599
3600 // This shall delete the part selection class and deallocate the memory.
3601 ScopeGuard part_selection_killer([this]() { m_part_selection = PartSelection(); });
3602
3603 const bool cut_with_groove = CutMode(m_mode) == CutMode::cutTongueAndGroove;
3604 const bool cut_by_contour = !cut_with_groove && m_part_selection.valid();
3605
3606 ModelObject* cut_mo = cut_by_contour ? m_part_selection.model_object() : nullptr;
3607 if (cut_mo)
3608 cut_mo->cut_connectors = mo->cut_connectors;
3609 else
3610 cut_mo = mo;
3611
3612 int dowels_count = 0;
3613 const bool has_connectors = !mo->cut_connectors.empty();
3614 // update connectors pos as offset of its center before cut performing
3615 apply_connectors_in_model(cut_mo , dowels_count);
3616
3617 wxBusyCursor wait;
3618
3619 const bool keep_painting = GUI::wxGetApp().app_config->get_bool("keep_painting");
3621 only_if(has_connectors ? true : m_keep_lower, ModelObjectCutAttribute::KeepLower) |
3628 only_if(!has_connectors && !cut_with_groove && cut_mo->cut_id.id().invalid(), ModelObjectCutAttribute::InvalidateCutInfo) |
3630
3631 // update cut_id for the cut object in respect to the attributes
3632 update_object_cut_id(cut_mo->cut_id, attributes, dowels_count);
3633
3634 Cut cut(cut_mo, instance_idx, get_cut_matrix(selection), attributes);
3635 const ModelObjectPtrs& new_objects = cut_by_contour ? cut.perform_by_contour(mo, m_part_selection.get_cut_parts(), dowels_count):
3636 cut_with_groove ? cut.perform_with_groove(m_groove, m_rotation_m, m_groove_count, m_groove_gap, m_radius) :
3637 cut.perform_with_plane();
3638
3639 // fix_non_manifold_edges
3640 {
3641 bool is_showed_dialog = false;
3642 bool user_fix_model = false;
3643 for (size_t i = 0; i < new_objects.size(); i++) {
3644 for (size_t j = 0; j < new_objects[i]->volumes.size(); j++) {
3645 if (its_num_open_edges(new_objects[i]->volumes[j]->mesh().its) > 0) {
3646 if (!is_showed_dialog) {
3647 is_showed_dialog = true;
3648 MessageDialog dlg(nullptr, _L("Non-manifold edges be caused by cut tool: do you want to fix now\?"), "", wxYES | wxCANCEL);
3649 int ret = dlg.ShowModal();
3650 if (ret == wxID_YES) {
3651 user_fix_model = true;
3652 }
3653 }
3654 if (!user_fix_model) {
3655 break;
3656 }
3657 // model_name
3658 std::vector<std::string> succes_models;
3659 // model_name failing reason
3660 std::vector<std::pair<std::string, std::string>> failed_models;
3661 auto plater = wxGetApp().plater();
3662 auto fix_and_update_progress = [keep_painting](ModelObject *model_object, const int vol_idx, const std::string &model_name, ProgressDialog &progress_dlg,
3663 std::vector<std::string> &succes_models, std::vector<std::pair<std::string, std::string>> &failed_models) {
3664 wxString msg = _L("Repairing model object");
3665 msg += ": " + from_u8(model_name) + "\n";
3666 std::string res;
3667 if (!fix_model_with_cgal_gui(*model_object, vol_idx, progress_dlg, msg, res, keep_painting)) return false;
3668 return true;
3669 };
3670 ProgressDialog progress_dlg(_L("Repairing model object"), "", 100, find_toplevel_parent(plater), wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT, true);
3671
3672 auto model_name = new_objects[i]->name;
3673 if (!fix_and_update_progress(new_objects[i], j, model_name, progress_dlg, succes_models, failed_models)) {
3674 BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "run fix_and_update_progress error";
3675 };
3676 };
3677 }
3678 }
3679 }
3680 check_objects_after_cut(new_objects);
3681
3682 // save cut_id to post update synchronization
3683 const CutObjectBase cut_id = cut_mo->cut_id;
3684
3685 // update cut results on plater and in the model
3686 plater->apply_cut_object_to_model(object_idx, new_objects);
3687
3689 }
3690}
bool m_place_on_cut_upper
Definition GLGizmoCut.hpp:128
bool can_perform_cut() const
Definition GLGizmoCut.cpp:3422
Transform3d get_cut_matrix(const Selection &selection)
Definition GLGizmoCut.cpp:3503
bool m_place_on_cut_lower
Definition GLGizmoCut.hpp:129
void apply_connectors_in_model(ModelObject *mo, int &dowels_count)
Definition GLGizmoCut.cpp:3479
void apply_cut_object_to_model(size_t init_obj_idx, const ModelObjectPtrs &cut_objects)
Definition Plater.cpp:19468
const Model & model() const
Definition Plater.cpp:16047
ModelObjectPtrs objects
Definition Model.hpp:1702
wxTopLevelWindow * find_toplevel_parent(wxWindow *window)
Definition GUI_Utils.cpp:155
@ Cut
Definition Shortcuts.hpp:33
void update_object_cut_id(CutObjectBase &cut_id, ModelObjectCutAttributes attributes, const int dowels_count)
Definition GLGizmoCut.cpp:3521
static void check_objects_after_cut(const ModelObjectPtrs &objects)
Definition GLGizmoCut.cpp:3542
@ Plater
Definition Shortcuts.hpp:21
void synchronize_model_after_cut(Model &model, const CutObjectBase &cut_id)
Definition GLGizmoCut.cpp:3572
wxString from_u8(const std::string &str)
Definition GUI.cpp:544
constexpr std::enable_if_t< is_enum_bitmask_type_v< option_type >, enum_bitmask< option_type > > only_if(bool condition, option_type opt)
Definition enum_bitmask.hpp:78
bool fix_model_with_cgal_gui(ModelObject &model_object, int volume_idx, GUI::ProgressDialog &progress_dialog, const wxString &msg_header, std::string &fix_result, bool keep_painting, bool *modified)
Definition FixModelByCgal.cpp:35
size_t its_num_open_edges(const std::vector< Vec3i32 > &face_neighbors)
Definition TriangleMesh.cpp:1575
enum_bitmask< ModelObjectCutAttribute > ModelObjectCutAttributes
Definition CutUtils.hpp:16
@ PlaceOnCutLower
Definition CutUtils.hpp:15
@ CreateDowels
Definition CutUtils.hpp:15
@ KeepPaint
Definition CutUtils.hpp:15
@ KeepLower
Definition CutUtils.hpp:15
@ PlaceOnCutUpper
Definition CutUtils.hpp:15
@ FlipUpper
Definition CutUtils.hpp:15
@ KeepAsParts
Definition CutUtils.hpp:15
@ FlipLower
Definition CutUtils.hpp:15
@ InvalidateCutInfo
Definition CutUtils.hpp:15
@ KeepUpper
Definition CutUtils.hpp:15
std::vector< ModelObject * > ModelObjectPtrs
Definition CutUtils.hpp:13

References _L, _u8L, apply_connectors_in_model(), can_perform_cut(), Slic3r::GUI::check_objects_after_cut(), Slic3r::CreateDowels, Slic3r::ModelObject::cut_connectors, Slic3r::ModelObject::cut_id, cutTongueAndGroove, Slic3r::GUI::find_toplevel_parent(), Slic3r::fix_model_with_cgal_gui(), Slic3r::FlipLower, Slic3r::FlipUpper, Slic3r::GUI::from_u8(), get_cut_matrix(), Slic3r::GUI::Selection::get_instance_idx(), Slic3r::GUI::Selection::get_object_idx(), Slic3r::ObjectBase::id(), Slic3r::ObjectID::invalid(), Slic3r::InvalidateCutInfo, Slic3r::its_num_open_edges(), Slic3r::KeepAsParts, Slic3r::KeepLower, Slic3r::KeepPaint, Slic3r::KeepUpper, m_groove, m_groove_count, m_groove_gap, m_keep_as_parts, m_keep_lower, m_keep_upper, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_part_selection, m_place_on_cut_lower, m_place_on_cut_upper, m_radius, m_rotate_lower, m_rotate_upper, m_rotation_m, Slic3r::only_if(), Slic3r::Cut::perform_by_contour(), Slic3r::Cut::perform_with_groove(), Slic3r::Cut::perform_with_plane(), Slic3r::PlaceOnCutLower, Slic3r::PlaceOnCutUpper, Slic3r::GUI::plater(), Slic3r::GUI::DPIAware< P >::ShowModal(), Slic3r::GUI::synchronize_model_after_cut(), and Slic3r::GUI::update_object_cut_id().

Referenced by render_cut_plane_input_window().

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

◆ process_contours()

void Slic3r::GUI::GLGizmoCut3D::process_contours ( )
protected
2602{
2603 const Selection& selection = m_parent.get_selection();
2604 const ModelObjectPtrs& model_objects = selection.get_model()->objects;
2605
2606 const int instance_idx = selection.get_instance_idx();
2607 if (instance_idx < 0)
2608 return;
2609 const int object_idx = selection.get_object_idx();
2610
2611 wxBusyCursor wait;
2612
2614 if (has_valid_groove()) {
2615 Cut cut(model_objects[object_idx], instance_idx, get_cut_matrix(selection));
2616 const ModelObjectPtrs& new_objects = cut.perform_with_groove(m_groove, m_rotation_m, m_groove_count, m_groove_gap, m_radius, true);
2617 if (!new_objects.empty())
2618 m_part_selection = PartSelection(new_objects.front(), instance_idx);
2619 }
2620 }
2621 else {
2623 m_part_selection = PartSelection(model_objects[object_idx], get_cut_matrix(selection), instance_idx, m_plane_center, m_cut_normal, *m_c->object_clipper());
2624 }
2625
2627}

References cutTongueAndGroove, get_cut_matrix(), Slic3r::GUI::Selection::get_instance_idx(), Slic3r::GUI::Selection::get_model(), Slic3r::GUI::Selection::get_object_idx(), has_valid_groove(), Slic3r::GUI::GLGizmoBase::m_c, m_cut_normal, m_groove, m_groove_count, m_groove_gap, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_part_selection, m_plane_center, m_radius, m_rotation_m, Slic3r::Model::objects, Slic3r::Cut::perform_with_groove(), reset_cut_by_contours(), and toggle_model_objects_visibility().

Referenced by on_mouse(), and reset_cut_by_contours().

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

◆ process_cut_line()

bool Slic3r::GUI::GLGizmoCut3D::process_cut_line ( SLAGizmoEventType action,
const Vec2d & mouse_position )
private
3817{
3818 const Camera& camera = wxGetApp().plater()->get_camera();
3819
3820 Vec3d pt;
3821 Vec3d dir;
3822 MeshRaycaster::line_from_mouse_pos(mouse_position, Transform3d::Identity(), camera, pt, dir);
3823 dir.normalize();
3824 pt += dir; // Move the pt along dir so it is not clipped.
3825
3827 m_line_beg = pt;
3828 m_line_end = pt;
3830 return true;
3831 }
3832
3833 if (cut_line_processing()) {
3835 m_groove_editing = true;
3837
3838 m_line_end = pt;
3839 if (action == SLAGizmoEventType::LeftDown || action == SLAGizmoEventType::LeftUp) {
3840 Vec3d line_dir = m_line_end - m_line_beg;
3841 if (line_dir.norm() < 3.0)
3842 return true;
3843
3844 Vec3d cross_dir = line_dir.cross(dir).normalized();
3845 Eigen::Quaterniond q;
3846 Transform3d m = Transform3d::Identity();
3847 m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3d::UnitZ(), cross_dir).toRotationMatrix();
3848
3849 const Vec3d new_plane_center = m_bb_center + cross_dir * cross_dir.dot(pt - m_bb_center);
3850 // update transformed bb
3851 const auto new_tbb = transformed_bounding_box(new_plane_center, m);
3852 const GLVolume* first_volume = m_parent.get_selection().get_first_volume();
3853 Vec3d instance_offset = first_volume->get_instance_offset();
3854 instance_offset[Z] += first_volume->get_sla_shift_z();
3855
3856 const Vec3d trans_center_pos = m.inverse() * (new_plane_center - instance_offset) + new_tbb.center();
3857 if (new_tbb.contains(trans_center_pos)) {
3858 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Cut by line"), UndoRedo::SnapshotType::GizmoAction);
3860 set_center(new_plane_center);
3863 }
3864
3865 m_angle_arc.reset();
3867
3869 m_groove_editing = false;
3871 }
3872 }
3873 else if (action == SLAGizmoEventType::Moving)
3874 this->set_dirty();
3875 return true;
3876 }
3877 return false;
3878}
void set_dirty()
Definition GLGizmoBase.cpp:524
bool m_groove_editing
Definition GLGizmoCut.hpp:135
static void line_from_mouse_pos(const Vec2d &mouse_pos, const Transform3d &trafo, const Camera &camera, Vec3d &point, Vec3d &direction)
Definition MeshUtils.cpp:439

References _u8L, cut_line_processing(), cutTongueAndGroove, discard_cut_line_processing(), Slic3r::GLVolume::get_instance_offset(), Slic3r::GLVolume::get_sla_shift_z(), Slic3r::UndoRedo::GizmoAction, Slic3r::GUI::LeftDown, Slic3r::GUI::LeftUp, Slic3r::GUI::MeshRaycaster::line_from_mouse_pos(), m_angle_arc, m_ar_plane_center, m_bb_center, m_groove_editing, m_line_beg, m_line_end, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_plane_center, m_rotation_m, m_start_dragging_m, m_transformed_bounding_box, Slic3r::GUI::Moving, on_unregister_raycasters_for_picking(), Slic3r::GUI::plater(), reset_cut_by_contours(), set_center(), Slic3r::GUI::GLGizmoBase::set_dirty(), transformed_bounding_box(), and Z.

Referenced by gizmo_event().

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

◆ process_selection_rectangle()

void Slic3r::GUI::GLGizmoCut3D::process_selection_rectangle ( CutConnectors & connectors)
protected
3958{
3959 GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state();
3960
3961 ModelObject* mo = m_c->selection_info()->model_object();
3962 int active_inst = m_c->selection_info()->get_active_instance();
3963
3964 // First collect positions of all the points in world coordinates.
3965 Transformation trafo = mo->instances[active_inst]->get_transformation();
3966 trafo.set_offset(trafo.get_offset() + double(m_c->selection_info()->get_sla_shift()) * Vec3d::UnitZ());
3967
3968 std::vector<Vec3d> points;
3969 for (const CutConnector&connector : connectors)
3970 points.push_back(connector.pos + trafo.get_offset());
3971
3972 // Now ask the rectangle which of the points are inside.
3973 std::vector<unsigned int> points_idxs = m_selection_rectangle.contains(points);
3974 m_selection_rectangle.stop_dragging();
3975
3976 for (size_t idx : points_idxs)
3977 select_connector(int(idx), rectangle_status == GLSelectionRectangle::EState::Select);
3978}
EState
Definition GLSelectionRectangle.hpp:18

References Slic3r::Geometry::Transformation::get_offset(), Slic3r::ModelObject::instances, Slic3r::GUI::GLGizmoBase::m_c, m_selection_rectangle, Slic3r::GUI::GLSelectionRectangle::Select, select_connector(), and Slic3r::Geometry::Transformation::set_offset().

Referenced by gizmo_event().

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

◆ put_connectors_on_cut_plane()

void Slic3r::GUI::GLGizmoCut3D::put_connectors_on_cut_plane ( const Vec3d & cp_normal,
double cp_offset )
477{
478 ModelObject* mo = m_c->selection_info()->model_object();
479 if (CutConnectors& connectors = mo->cut_connectors; !connectors.empty()) {
480 const float sla_shift = m_c->selection_info()->get_sla_shift();
481 const Vec3d& instance_offset = mo->instances[m_c->selection_info()->get_active_instance()]->get_offset();
482
483 for (auto& connector : connectors) {
484 // convert connetor pos to the world coordinates
485 Vec3d pos = connector.pos + instance_offset;
486 pos[Z] += sla_shift;
487 // scalar distance from point to plane along the normal
488 double distance = -cp_normal.dot(pos) + cp_offset;
489 // move connector
490 connector.pos += distance * cp_normal;
491 }
492 }
493}
float distance(SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b)
Definition SpiralVase.cpp:19

References Slic3r::ModelObject::cut_connectors, Slic3r::ModelObject::instances, Slic3r::GUI::GLGizmoBase::m_c, and Z.

Referenced by update_clipper().

Here is the caller graph for this function:

◆ register_grabbers_for_picking()

void Slic3r::GUI::GLGizmoBase::register_grabbers_for_picking ( )
protectedinherited
399{
400 for (size_t i = 0; i < m_grabbers.size(); ++i) {
401 m_grabbers[i].register_raycasters_for_picking((m_group_id >= 0) ? m_group_id : i);
402 }
403}
int m_group_id
Definition GLGizmoBase.hpp:145

References m_grabbers, and m_group_id.

Referenced by register_raycasters_for_picking().

Here is the caller graph for this function:

◆ register_raycasters_for_picking()

void Slic3r::GUI::GLGizmoBase::register_raycasters_for_picking ( )
inlineinherited
void register_grabbers_for_picking()
Definition GLGizmoBase.cpp:398
virtual void on_register_raycasters_for_picking()
Definition GLGizmoBase.hpp:267

References on_register_raycasters_for_picking(), and register_grabbers_for_picking().

Referenced by Slic3r::GUI::GLGizmosManager::activate_gizmo(), and Slic3r::GUI::GLCanvas3D::reload_scene().

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

◆ render()

void Slic3r::GUI::GLGizmoBase::render ( )
inlineinherited
214{ on_render(); }
virtual void on_render()=0

References on_render().

Here is the call graph for this function:

◆ render_angle_input()

bool Slic3r::GUI::GLGizmoCut3D::render_angle_input ( const std::string & label,
float & in_val,
const float & init_val,
float min_val,
float max_val )
protected
2793{
2794 // -------- [ ]
2795 // slider_with + item_in_gap + input_width
2796 double slider_with = 0.24 * m_editing_window_width; // m_control_width * 0.35;
2797 double item_in_gap = 0.01 * m_editing_window_width;
2798 double input_width = 0.29 * m_editing_window_width;
2799
2800 ImGui::AlignTextToFramePadding();
2801 m_imgui->text(label);
2802 ImGui::SameLine(m_label_width);
2803 ImGui::PushItemWidth(slider_with);
2804
2805 double left_width = m_label_width + slider_with + item_in_gap;
2806
2807 bool is_changed{ false };
2808
2809 float val = rad2deg(in_val);
2810 const float old_val = val;
2811
2812 const std::string format = "%.0f°";
2813 m_imgui->bbl_slider_float_style("##angle_" + label, &val, min_val, max_val, format.c_str(), 1.f, true, from_u8(label));
2814
2815 ImGui::SameLine(left_width);
2816 ImGui::PushItemWidth(input_width);
2817 ImGui::BBLDragFloat(("##angle_input_" + label).c_str(), &val, 0.05f, min_val, max_val, format.c_str());
2818
2819 m_is_slider_editing_done |= m_imgui->get_last_slider_status().deactivated_after_edit;
2820 if (!is_approx(old_val, val)) {
2821 if (m_imgui->get_last_slider_status().can_take_snapshot) {
2822 // TRN: This is an entry in the Undo/Redo stack. The whole line will be 'Edited: (name of whatever was edited)'.
2823 Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", _L("Edited"), label), UndoRedo::SnapshotType::GizmoAction);
2824 m_imgui->get_last_slider_status().invalidate_snapshot();
2825 if (m_mode == size_t(CutMode::cutTongueAndGroove))
2826 m_groove_editing = true;
2827 }
2828 in_val = deg2rad(val);
2829 is_changed = true;
2830 }
2831
2832 ImGui::SameLine();
2833
2834 m_imgui->disabled_begin(is_approx(in_val, init_val));
2835 const std::string act_name = _u8L("Reset");
2836 if (render_reset_button("##angle_" + label + act_name, act_name)) {
2837 Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", act_name, label), UndoRedo::SnapshotType::GizmoAction);
2838 in_val = init_val;
2839 is_changed = true;
2840 }
2841 m_imgui->disabled_end();
2842
2843 return is_changed;
2844}
bool m_is_slider_editing_done
Definition GLGizmoCut.hpp:137
bool render_reset_button(const std::string &label_id, const std::string &tooltip) const
Definition GLGizmoCut.cpp:768
std::string format(const char *fmt, TArgs &&... args)
Definition format.hpp:36
constexpr T deg2rad(const T angle)
Definition Geometry.hpp:312

References _L, _u8L, cutTongueAndGroove, Slic3r::Geometry::deg2rad(), Slic3r::GUI::format(), Slic3r::GUI::GLGizmoBase::format(), Slic3r::GUI::from_u8(), Slic3r::UndoRedo::GizmoAction, Slic3r::is_approx(), m_editing_window_width, m_groove_editing, Slic3r::GUI::GLGizmoBase::m_imgui, m_is_slider_editing_done, m_label_width, m_mode, Slic3r::GUI::plater(), Slic3r::Geometry::rad2deg(), and render_reset_button().

Referenced by render_connectors_input_window(), and render_groove_angle_input().

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

◆ render_build_size()

void Slic3r::GUI::GLGizmoCut3D::render_build_size ( )
protected
2527{
2529 wxString unit_str = m_imperial_units ? _L_CONTEXT("in", "inches") : _L("mm");
2530 Vec3d tbb_sz = m_transformed_bounding_box.size() * koef; // ORCA
2531
2532 ImGui::AlignTextToFramePadding();
2533 m_imgui->text(_L("Size"));
2534 ImGui::SameLine(m_label_width);
2535 ImGui::Text("%.2f x %.2f x %.2f %s", tbb_sz.x(), tbb_sz.y(), tbb_sz.z(), unit_str.ToUTF8().data()); // ORCA use regular text color and simplify format
2536}
#define _L_CONTEXT(s, ctx)
Definition I18N.hpp:15

References _L, _L_CONTEXT, Slic3r::GUI::GLGizmoBase::m_imgui, m_imperial_units, m_label_width, m_transformed_bounding_box, and Slic3r::GUI::GizmoObjectManipulation::mm_to_in.

Referenced by render_cut_plane_input_window().

Here is the caller graph for this function:

◆ render_clipper_cut()

void Slic3r::GUI::GLGizmoCut3D::render_clipper_cut ( )
private
2053{
2056
2057 GLboolean cull_face = GL_FALSE;
2058 ::glGetBooleanv(GL_CULL_FACE, &cull_face);
2060 m_c->object_clipper()->render_cut(m_part_selection.get_ignored_contours_ptr());
2061 if (cull_face)
2063
2066}
#define glEnable
Definition gl.h:3667
#define GL_DEPTH_TEST
Definition gl.h:574
#define GL_CULL_FACE
Definition gl.h:500
unsigned char GLboolean
Definition gl.h:2055
#define GL_FALSE
Definition gl.h:648
#define glGetBooleanv
Definition gl.h:3825
#define glDisable
Definition gl.h:3607

References GL_CULL_FACE, GL_DEPTH_TEST, GL_FALSE, glDisable, glEnable, glGetBooleanv, Slic3r::GUI::GLGizmoBase::m_c, m_connectors_editing, and m_part_selection.

Referenced by on_render().

Here is the caller graph for this function:

◆ render_color_marker()

void Slic3r::GUI::GLGizmoCut3D::render_color_marker ( float size,
const ImU32 & color )
protected
2661{
2662 const float radius = 0.5f * size;
2663 ImVec2 pos = ImGui::GetCurrentWindow()->DC.CursorPos;
2664 pos.x += radius;
2665 pos.y += 1.4f * radius;
2666 ImGui::GetCurrentWindow()->DrawList->AddNgonFilled(pos, radius, color, 6);
2667 m_imgui->text(" ");
2668 ImGui::SameLine();
2669}

References Slic3r::GUI::GLGizmoBase::m_imgui.

Referenced by render_cut_plane_input_window().

Here is the caller graph for this function:

◆ render_combo()

bool Slic3r::GUI::GLGizmoBase::render_combo ( const std::string & label,
const std::vector< std::string > & lines,
int & selection_idx,
float label_width,
float item_width )
protectedinherited
227{
229 ImGui::AlignTextToFramePadding();
230 m_imgui->text(label);
231 ImGui::SameLine(label_width);
232 ImGui::PushItemWidth(item_width);
233
234 size_t selection_out = selection_idx;
235
236 const char *selected_str = (selection_idx >= 0 && selection_idx < int(lines.size())) ? lines[selection_idx].c_str() : "";
237 if (ImGui::BBLBeginCombo(("##" + label).c_str(), selected_str, 0)) {
238 for (size_t line_idx = 0; line_idx < lines.size(); ++line_idx) {
239 ImGui::PushID(int(line_idx));
240 if (ImGui::Selectable("", line_idx == selection_idx)) selection_out = line_idx;
241
242 ImGui::SameLine();
243 ImGui::Text("%s", lines[line_idx].c_str());
244 ImGui::PopID();
245 }
246
247 ImGui::EndCombo();
248 }
249
250 bool is_changed = selection_idx != selection_out;
251 selection_idx = selection_out;
252
253 //if (is_changed) update_connector_shape();
255
256 return is_changed;
257}
static void pop_combo_style()
Definition ImGuiWrapper.cpp:2932
static void push_combo_style(const float scale)
Definition ImGuiWrapper.cpp:2907

References m_imgui, m_parent, Slic3r::GUI::ImGuiWrapper::pop_combo_style(), and Slic3r::GUI::ImGuiWrapper::push_combo_style().

Referenced by Slic3r::GUI::GLGizmoAssembly::render_assembly_mode_combo(), and Slic3r::GUI::GLGizmoCut3D::render_connectors_input_window().

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

◆ render_connect_mode_radio_button()

void Slic3r::GUI::GLGizmoCut3D::render_connect_mode_radio_button ( CutConnectorMode mode)
private
761{
762 ImGui::SameLine(mode == CutConnectorMode::Auto ? m_label_width : 2 * m_label_width);
763 ImGui::PushItemWidth(m_control_width);
764 if (ImGui::RadioButton(m_connector_modes[int(mode)].c_str(), m_connector_mode == mode))
765 m_connector_mode = mode;
766}

References Auto, m_connector_mode, m_connector_modes, m_control_width, and m_label_width.

◆ render_connect_type_radio_button()

bool Slic3r::GUI::GLGizmoCut3D::render_connect_type_radio_button ( CutConnectorType type)
private
749{
750 ImGui::SameLine(type == CutConnectorType::Plug ? m_label_width : 0);
751 ImGui::PushItemWidth(m_control_width);
752 if (ImGui::RadioButton(m_connector_types[size_t(type)].c_str(), m_connector_type == type)) {
753 m_connector_type = type;
754// update_connector_shape();
755 return true;
756 }
757 return false;
758}

References m_connector_type, m_connector_types, m_control_width, m_label_width, and Slic3r::Plug.

Referenced by render_connectors_input_window().

Here is the caller graph for this function:

◆ render_connectors()

void Slic3r::GUI::GLGizmoCut3D::render_connectors ( )
private
3345{
3347
3348 if (cut_line_processing() ||
3350 m_connector_mode == CutConnectorMode::Auto || !m_c->selection_info())
3351 return;
3352
3353 const ModelObject* mo = m_c->selection_info()->model_object();
3354 auto inst_id = m_c->selection_info()->get_active_instance();
3355 if (inst_id < 0)
3356 return;
3357 const CutConnectors& connectors = mo->cut_connectors;
3358 if (connectors.size() != m_selected.size()) {
3359 // #ysFIXME
3361 m_selected.resize(connectors.size(), false);
3362 }
3363
3364 ColorRGBA render_color = CONNECTOR_DEF_COLOR;
3365
3366 const ModelInstance* mi = mo->instances[inst_id];
3367 const Vec3d& instance_offset = mi->get_offset();
3368 const double sla_shift = double(m_c->selection_info()->get_sla_shift());
3369
3370 const bool looking_forward = is_looking_forward();
3371
3372 for (size_t i = 0; i < connectors.size(); ++i) {
3373 const CutConnector& connector = connectors[i];
3374
3375 float height = connector.height;
3376 // recalculate connector position to world position
3377 Vec3d pos = connector.pos + instance_offset + sla_shift * Vec3d::UnitZ();
3378
3379 // First decide about the color of the point.
3380 assert(std::is_sorted(m_invalid_connectors_idxs.begin(), m_invalid_connectors_idxs.end()));
3381 const bool conflict_connector = std::binary_search(m_invalid_connectors_idxs.begin(), m_invalid_connectors_idxs.end(), i);
3382 if (conflict_connector)
3383 render_color = CONNECTOR_ERR_COLOR;
3384 else // default connector color
3385 render_color = connector.attribs.type == CutConnectorType::Dowel ? DOWEL_COLOR : PLAG_COLOR;
3386
3388 render_color = CONNECTOR_ERR_COLOR;
3389 else if (size_t(m_hover_id - m_connectors_group_id) == i)
3390 render_color = conflict_connector ? HOVERED_ERR_COLOR :
3392 else if (m_selected[i])
3393 render_color = connector.attribs.type == CutConnectorType::Dowel ? SELECTED_DOWEL_COLOR : SELECTED_PLAG_COLOR;
3394
3395 const Camera& camera = wxGetApp().plater()->get_camera();
3396 if (connector.attribs.type == CutConnectorType::Dowel &&
3397 connector.attribs.style == CutConnectorStyle::Prism) {
3399 height = 0.05f;
3400 if (!looking_forward)
3401 pos += 0.05 * m_clp_normal;
3402 }
3403 else {
3404 if (looking_forward)
3405 pos -= static_cast<double>(height) * m_clp_normal;
3406 else
3407 pos += static_cast<double>(height) * m_clp_normal;
3408 height *= 2;
3409 }
3410 }
3411 else if (!looking_forward)
3412 pos += 0.05 * m_clp_normal;
3413
3414 const Transform3d view_model_matrix = camera.get_view_matrix() * translation_transform(pos) * m_rotation_m *
3415 rotation_transform(-connector.z_angle * Vec3d::UnitZ()) *
3416 scale_transform(Vec3f(connector.radius, connector.radius, height).cast<double>());
3417
3418 render_model(m_shapes[connector.attribs].model, render_color, view_model_matrix);
3419 }
3420}
Vec3d m_clp_normal
Definition GLGizmoCut.hpp:87
bool is_looking_forward() const
Definition GLGizmoCut.cpp:496
static void render_model(GLModel &model, const ColorRGBA &color, Transform3d view_model_matrix)
Definition GLGizmoCut.cpp:1142
static const ColorRGBA SELECTED_PLAG_COLOR
Definition GLGizmoCut.cpp:90
static const ColorRGBA SELECTED_DOWEL_COLOR
Definition GLGizmoCut.cpp:91
static const ColorRGBA PLAG_COLOR
Definition GLGizmoCut.cpp:86
static const ColorRGBA HOVERED_ERR_COLOR
Definition GLGizmoCut.cpp:94
static const ColorRGBA DOWEL_COLOR
Definition GLGizmoCut.cpp:87
static const ColorRGBA HOVERED_DOWEL_COLOR
Definition GLGizmoCut.cpp:89
static const ColorRGBA HOVERED_PLAG_COLOR
Definition GLGizmoCut.cpp:88
static const ColorRGBA CONNECTOR_ERR_COLOR
Definition GLGizmoCut.cpp:93
static const ColorRGBA CONNECTOR_DEF_COLOR
Definition GLGizmoCut.cpp:92
coord_t height(const BoundingBox &box)
Definition Arrange.cpp:1185

References Slic3r::CutConnector::attribs, Auto, clear_selection(), Slic3r::GUI::CONNECTOR_DEF_COLOR, Slic3r::GUI::CONNECTOR_ERR_COLOR, Slic3r::ModelObject::cut_connectors, cut_line_processing(), cutPlanar, Slic3r::Dowel, Slic3r::GUI::DOWEL_COLOR, Slic3r::ModelInstance::get_offset(), Slic3r::GUI::Camera::get_view_matrix(), GL_DEPTH_TEST, glEnable, Slic3r::CutConnector::height, Slic3r::GUI::HOVERED_DOWEL_COLOR, Slic3r::GUI::HOVERED_ERR_COLOR, Slic3r::GUI::HOVERED_PLAG_COLOR, Slic3r::ModelObject::instances, is_looking_forward(), Slic3r::GUI::GLGizmoBase::m_c, m_clp_normal, m_connector_mode, m_connectors_editing, m_connectors_group_id, Slic3r::GUI::GLGizmoBase::m_hover_id, m_invalid_connectors_idxs, m_mode, m_rotation_m, m_selected, m_shapes, Slic3r::GUI::PLAG_COLOR, Slic3r::CutConnector::pos, Slic3r::Prism, Slic3r::CutConnector::radius, render_model(), Slic3r::Geometry::rotation_transform(), Slic3r::Geometry::scale_transform(), Slic3r::GUI::SELECTED_DOWEL_COLOR, Slic3r::GUI::SELECTED_PLAG_COLOR, Slic3r::CutConnectorAttributes::style, Slic3r::Geometry::translation_transform(), Slic3r::CutConnectorAttributes::type, and Slic3r::CutConnector::z_angle.

Referenced by on_render().

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

◆ render_connectors_input_window()

void Slic3r::GUI::GLGizmoCut3D::render_connectors_input_window ( CutConnectors & connectors,
float x,
float y,
float bottom_limit )
protected
2423{
2424 // Connectors section
2425
2426 float f_scale = m_parent.get_gizmos_manager().get_layout_scale();
2427 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 4.0f * f_scale));
2428
2429 ImGui::Separator();
2430
2431 // WIP : Auto : Need to implement
2432 // m_imgui->text(_L("Mode"));
2433 // render_connect_mode_radio_button(CutConnectorMode::Auto);
2434 // render_connect_mode_radio_button(CutConnectorMode::Manual);
2435
2436 ImGui::AlignTextToFramePadding();
2437 m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, m_labels_map["Connectors"]);
2438
2439 m_imgui->disabled_begin(connectors.empty());
2440 ImGui::SameLine(m_label_width);
2441 const std::string act_name = _u8L("Remove connectors");
2442 if (render_reset_button("connectors", act_name)) {
2443 Plater::TakeSnapshot snapshot(wxGetApp().plater(), act_name, UndoRedo::SnapshotType::GizmoAction);
2445 }
2446 m_imgui->disabled_end();
2447
2448 render_flip_plane_button(m_connectors_editing && connectors.empty());
2449
2450 m_imgui->text(m_labels_map["Type"]);
2451 ImGuiWrapper::push_radio_style(m_parent.get_scale()); // ORCA
2455 if (type_changed)
2456 apply_selected_connectors([this, &connectors] (size_t idx) { connectors[idx].attribs.type = CutConnectorType(m_connector_type); });
2458
2460 if (type_changed && m_connector_type == CutConnectorType::Dowel) {
2462 apply_selected_connectors([this, &connectors](size_t idx) { connectors[idx].attribs.style = CutConnectorStyle(m_connector_style); });
2463 }
2465 apply_selected_connectors([this, &connectors](size_t idx) { connectors[idx].attribs.style = CutConnectorStyle(m_connector_style); });
2466 m_imgui->disabled_end();
2467
2469 if (type_changed && m_connector_type == CutConnectorType::Snap) {
2471 apply_selected_connectors([this, &connectors](size_t idx) { connectors[idx].attribs.shape = CutConnectorShape(m_connector_shape_id); });
2472 }
2474 apply_selected_connectors([this, &connectors](size_t idx) { connectors[idx].attribs.shape = CutConnectorShape(m_connector_shape_id); });
2475 m_imgui->disabled_end();
2476
2477 const float depth_min_value = m_connector_type == CutConnectorType::Snap ? m_connector_size : -0.1f;
2479 apply_selected_connectors([this, &connectors](size_t idx) {
2481 connectors[idx].height = m_connector_depth_ratio;
2483 connectors[idx].height_tolerance = m_connector_depth_ratio_tolerance;
2484 });
2485
2487 apply_selected_connectors([this, &connectors](size_t idx) {
2488 if (m_connector_size > 0)
2489 connectors[idx].radius = 0.5f * m_connector_size;
2491 connectors[idx].radius_tolerance = 0.5f * m_connector_size_tolerance;
2492 });
2493
2494 if (render_angle_input(m_labels_map["Rotation"], m_connector_angle, 0.f, 0.f, 180.f))
2495 apply_selected_connectors([this, &connectors](size_t idx) {
2496 connectors[idx].z_angle = m_connector_angle;
2497 });
2498
2500 render_snap_specific_input(_u8L("Bulge"), _L("Bulge proportion related to radius"), m_snap_bulge_proportion, 0.15f, 5.f, 100.f * m_snap_space_proportion);
2501 render_snap_specific_input(_u8L("Space"), _L("Space proportion related to radius"), m_snap_space_proportion, 0.3f, 10.f, 50.f);
2502 }
2503
2504 ImGui::Separator();
2505
2507
2508 ImGui::SameLine();
2509 GLGizmoUtils::begin_right_aligned_buttons({_L("Confirm connectors"), _L("Cancel")});
2511 if (m_imgui->button(_L("Confirm connectors"))) {
2514 }
2516
2517 ImGui::SameLine();
2518 if (m_imgui->button(_L("Cancel"))) {
2521 }
2522
2523 ImGui::PopStyleVar(1); // ImGuiStyleVar_FramePadding
2524}
bool render_combo(const std::string &label, const std::vector< std::string > &lines, int &selection_idx, float label_width, float item_width)
Definition GLGizmoBase.cpp:226
void set_connectors_editing(bool connectors_editing)
Definition GLGizmoCut.cpp:2560
void render_tooltip_button(float x, float y)
Definition GLGizmoCut.cpp:3216
void reset_connectors()
Definition GLGizmoCut.cpp:3763
void render_flip_plane_button(bool disable_pred=false)
Definition GLGizmoCut.cpp:2629
bool render_connect_type_radio_button(CutConnectorType type)
Definition GLGizmoCut.cpp:748
bool render_slider_two_input(const std::string &label, float &value_in, float &tolerance_in, float min_val=-0.1f, float max_tolerance=-0.1f)
Definition GLGizmoCut.cpp:604
bool render_angle_input(const std::string &label, float &in_val, const float &init_val, float min_val, float max_val)
Definition GLGizmoCut.cpp:2792
void render_snap_specific_input(const std::string &label, const wxString &tooltip, float &in_val, const float &init_val, const float min_val, const float max_val)
Definition GLGizmoCut.cpp:2859
void apply_selected_connectors(std::function< void(size_t idx)> apply_fn)
Definition GLGizmoCut.cpp:2413
static void pop_radio_style()
Definition ImGuiWrapper.cpp:2950
static void push_radio_style(const float scale)
Definition ImGuiWrapper.cpp:2938
static const ImVec4 COL_ORANGE_LIGHT
Definition ImGuiWrapper.hpp:387
void push_orca_button_style()
Definition GLGizmoUtils.cpp:161
void begin_right_aligned_buttons(const std::vector< wxString > &labels)
Definition GLGizmoUtils.cpp:135
void pop_orca_button_style()
Definition GLGizmoUtils.cpp:187

References _L, _u8L, apply_selected_connectors(), Slic3r::GUI::GLGizmoUtils::begin_right_aligned_buttons(), Slic3r::Circle, Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, Slic3r::Dowel, Slic3r::UndoRedo::GizmoAction, m_connector_angle, m_connector_depth_ratio, m_connector_depth_ratio_tolerance, m_connector_shape_id, m_connector_shapes, m_connector_size, m_connector_size_tolerance, m_connector_style, m_connector_styles, m_connector_type, m_connectors_editing, m_editing_window_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_label_width, m_labels_map, Slic3r::GUI::GLGizmoBase::m_parent, m_snap_bulge_proportion, m_snap_space_proportion, Slic3r::GUI::plater(), Slic3r::Plug, Slic3r::GUI::GLGizmoUtils::pop_orca_button_style(), Slic3r::GUI::ImGuiWrapper::pop_radio_style(), Slic3r::Prism, Slic3r::GUI::GLGizmoUtils::push_orca_button_style(), Slic3r::GUI::ImGuiWrapper::push_radio_style(), render_angle_input(), Slic3r::GUI::GLGizmoBase::render_combo(), render_connect_type_radio_button(), render_flip_plane_button(), render_reset_button(), render_slider_two_input(), render_snap_specific_input(), render_tooltip_button(), reset_connectors(), set_connectors_editing(), Slic3r::Snap, and unselect_all_connectors().

Referenced by on_render_input_window().

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

◆ render_cross_mark()

void Slic3r::GUI::GLGizmoBase::render_cross_mark ( const Vec3f & target,
bool is_single = false )
protectedinherited
260{
261 const float half_length = 4.0f;
262
263 // ORCA: OpenGL Core Profile
264#if !SLIC3R_OPENGL_ES
265 if (!OpenGLManager::get_gl_info().is_core_profile())
266 glsafe(::glLineWidth(2.0f));
267#endif // !SLIC3R_OPENGL_ES
268
269 auto render_line = [](const Vec3f& p1, const Vec3f& p2, const ColorRGBA& color) {
270 GLModel::Geometry init_data;
272 init_data.color = color;
273 init_data.reserve_vertices(2);
274 init_data.reserve_indices(2);
275
276 // vertices
277 init_data.add_vertex(p1);
278 init_data.add_vertex(p2);
279
280 // indices
281 init_data.add_line(0, 1);
282
283 GLModel model;
284 model.init_from(std::move(init_data));
285 model.render();
286 };
287
288 // draw line for x axis
289 if (!is_single) {
290 render_line(
291 {target(0) - half_length, target(1), target(2)},
292 {target(0) + half_length, target(1), target(2)},
293 ColorRGBA::X()); // ORCA match axis colors
294 }
295 else {
296 render_line(
297 {target(0), target(1), target(2)},
298 {target(0) + half_length, target(1), target(2)},
299 ColorRGBA::X()); // ORCA match axis colors
300 }
301 // draw line for y axis
302 if (!is_single) {
303 render_line(
304 {target(0), target(1) - half_length, target(2)},
305 {target(0), target(1) + half_length, target(2)},
306 ColorRGBA::Y()); // ORCA match axis colors
307 } else {
308 render_line(
309 {target(0), target(1), target(2)},
310 {target(0), target(1) + half_length, target(2)},
311 ColorRGBA::Y()); // ORCA match axis colors
312 }
313 // draw line for z axis
314 if (!is_single) {
315 render_line(
316 {target(0), target(1), target(2) - half_length},
317 {target(0), target(1), target(2) + half_length},
318 ColorRGBA::Z()); // ORCA match axis colors
319 } else {
320 render_line(
321 {target(0), target(1), target(2)},
322 {target(0), target(1), target(2) + half_length},
323 ColorRGBA::Z()); // ORCA match axis colors
324 }
325}
#define glsafe(cmd)
Definition OpenGLUtils.hpp:25
static const ColorRGBA Y()
Definition Color.hpp:146
static const ColorRGBA X()
Definition Color.hpp:145
static const ColorRGBA Z()
Definition Color.hpp:147
static const GLInfo & get_gl_info()
Definition OpenGLManager.hpp:106
#define glLineWidth
Definition gl.h:4215

References Slic3r::GUI::GLModel::Geometry::add_line(), Slic3r::GUI::GLModel::Geometry::add_vertex(), Slic3r::GUI::GLModel::Geometry::color, Slic3r::GUI::GLModel::Geometry::format, Slic3r::GUI::OpenGLManager::get_gl_info(), glLineWidth, glsafe, Slic3r::GUI::GLModel::init_from(), Slic3r::GUI::GLModel::Geometry::Lines, Slic3r::GUI::GLModel::Geometry::P3, Slic3r::GUI::GLModel::render(), Slic3r::GUI::GLModel::Geometry::reserve_indices(), Slic3r::GUI::GLModel::Geometry::reserve_vertices(), Slic3r::ColorRGBA::X(), Slic3r::ColorRGBA::Y(), and Slic3r::ColorRGBA::Z().

Referenced by Slic3r::GUI::GLGizmoMove3D::on_render().

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

◆ render_cut_line()

void Slic3r::GUI::GLGizmoCut3D::render_cut_line ( )
private
1351{
1352 if (!cut_line_processing() || m_line_end.isApprox(Vec3d::Zero()))
1353 return;
1354
1357
1358 m_cut_line.reset();
1359 m_cut_line.init_from(its_make_line((Vec3f)m_line_beg.cast<float>(), (Vec3f)m_line_end.cast<float>()));
1360
1361 render_line(m_cut_line, GRABBER_COLOR, wxGetApp().plater()->get_camera().get_view_matrix(), 0.25f);
1362}
GLModel m_cut_line
Definition GLGizmoCut.hpp:95
void render_line(GLModel &line_model, const ColorRGBA &color, Transform3d view_model_matrix, float width)
Definition GLGizmoCut.cpp:1159
#define GL_DEPTH_BUFFER_BIT
Definition gl.h:558
#define glClear
Definition gl.h:3357
static const ColorRGBA GRABBER_COLOR
Definition GLGizmoCut.cpp:80

References cut_line_processing(), GL_DEPTH_BUFFER_BIT, GL_DEPTH_TEST, glClear, glEnable, glsafe, Slic3r::GUI::GRABBER_COLOR, Slic3r::GUI::its_make_line(), m_cut_line, m_line_beg, m_line_end, Slic3r::GUI::plater(), and render_line().

Referenced by on_render().

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

◆ render_cut_mode_combo()

bool Slic3r::GUI::GLGizmoCut3D::render_cut_mode_combo ( )
private
568{
569 ImGui::AlignTextToFramePadding();
571 int selection_idx = int(m_mode);
572 const bool is_changed = m_imgui->combo(_u8L("Mode"), m_modes, selection_idx, 0, m_label_width, m_control_width);
574
575 if (is_changed) {
576 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Change cut mode"), UndoRedo::SnapshotType::GizmoAction);
577 switch_to_mode(size_t(selection_idx));
579 }
580
581 return is_changed;
582}

References _u8L, check_and_update_connectors_state(), Slic3r::UndoRedo::GizmoAction, m_control_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_label_width, m_mode, m_modes, Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::GUI::plater(), Slic3r::GUI::ImGuiWrapper::pop_combo_style(), Slic3r::GUI::ImGuiWrapper::push_combo_style(), and switch_to_mode().

Referenced by render_cut_plane_input_window().

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

◆ render_cut_plane()

void Slic3r::GUI::GLGizmoCut3D::render_cut_plane ( )
private
1098{
1099 if (cut_line_processing())
1100 return;
1101
1102 GLShaderProgram* shader = wxGetApp().get_shader("flat");
1103 if (shader == nullptr)
1104 return;
1105
1110
1111 shader->start_using();
1112
1113 const Camera& camera = wxGetApp().plater()->get_camera();
1114
1115 shader->set_uniform("projection_matrix", camera.get_projection_matrix());
1116
1118 if (m_mode == size_t(CutMode::cutTongueAndGroove))
1119 cp_clr.a(cp_clr.a() - 0.1f);
1120 m_plane.model.set_color(cp_clr);
1121
1122 const Transform3d view_model_matrix = camera.get_view_matrix() * translation_transform(m_plane_center) * m_rotation_m;
1123 shader->set_uniform("view_model_matrix", view_model_matrix);
1124 m_plane.model.render();
1125
1128
1129 shader->stop_using();
1130}
float a() const
Definition Color.hpp:108
#define GL_SRC_ALPHA
Definition gl.h:1621
#define GL_BLEND
Definition gl.h:275
#define GL_ONE_MINUS_SRC_ALPHA
Definition gl.h:1239
#define glBlendFunc
Definition gl.h:3325
static const ColorRGBA CUT_PLANE_ERR_COLOR
Definition GLGizmoCut.cpp:97

References Slic3r::ColorRGBA::a(), can_perform_cut(), cut_line_processing(), Slic3r::GUI::CUT_PLANE_DEF_COLOR, Slic3r::GUI::CUT_PLANE_ERR_COLOR, cutTongueAndGroove, Slic3r::GUI::Camera::get_projection_matrix(), Slic3r::GUI::Camera::get_view_matrix(), GL_BLEND, GL_CULL_FACE, GL_DEPTH_TEST, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, glBlendFunc, glDisable, glEnable, glsafe, has_valid_groove(), m_mode, m_plane, m_plane_center, m_rotation_m, Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), Slic3r::GLShaderProgram::stop_using(), and Slic3r::Geometry::translation_transform().

Referenced by on_render().

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

◆ render_cut_plane_grabbers()

void Slic3r::GUI::GLGizmoCut3D::render_cut_plane_grabbers ( )
private
1218{
1220
1221 ColorRGBA color = ColorRGBA::GRAY();
1222
1223 const Transform3d view_matrix = wxGetApp().plater()->get_camera().get_view_matrix() * translation_transform(m_plane_center) * m_rotation_m;
1224
1225 const double mean_size = get_grabber_mean_size(m_bounding_box);
1226 double size;
1227
1228 const bool no_xy_dragging = m_dragging && m_hover_id == CutPlane;
1229
1230 if (!no_xy_dragging && m_hover_id != CutPlaneZRotation && m_hover_id != CutPlaneXMove && m_hover_id != CutPlaneYMove) {
1232
1233 // render sphere grabber
1234 size = m_dragging ? get_dragging_half_size(mean_size) : get_half_size(mean_size);
1235 color = m_hover_id == Y ? ColorRGBA::Y() : // ORCA match axis colors
1236 m_hover_id == X ? ColorRGBA::X() : // ORCA match axis colors
1237 m_hover_id == Z ? GRABBER_COLOR : ColorRGBA::GRAY();
1238 render_model(m_sphere.model, color, view_matrix * translation_transform(m_grabber_connection_len * Vec3d::UnitZ()) * scale_transform(size));
1239 }
1240
1241 const bool no_xy_grabber_hovered = !m_dragging && (m_hover_id < 0 || m_hover_id == CutPlane);
1242
1243 // render X grabber
1244
1245 if (no_xy_grabber_hovered || m_hover_id == X)
1246 {
1247 size = m_dragging && m_hover_id == X ? get_dragging_half_size(mean_size) : get_half_size(mean_size);
1248 const Vec3d cone_scale = Vec3d(0.75 * size, 0.75 * size, 1.8 * size);
1249 //color = m_hover_id == X ? complementary(ColorRGBA::X()) : ColorRGBA::X();
1250 color = ColorRGBA::X(); // ORCA match axis colors
1251
1252 if (m_hover_id == X) {
1253 render_grabber_connection(color, view_matrix);
1255 }
1256
1257 Vec3d offset = Vec3d(0.0, 1.25 * size, m_grabber_connection_len);
1258 render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitX()) * scale_transform(cone_scale));
1259 offset = Vec3d(0.0, -1.25 * size, m_grabber_connection_len);
1260 render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitX()) * scale_transform(cone_scale));
1261 }
1262
1263 // render Y grabber
1264
1265 if (no_xy_grabber_hovered || m_hover_id == Y)
1266 {
1267 size = m_dragging && m_hover_id == Y ? get_dragging_half_size(mean_size) : get_half_size(mean_size);
1268 const Vec3d cone_scale = Vec3d(0.75 * size, 0.75 * size, 1.8 * size);
1269 //color = m_hover_id == Y ? complementary(ColorRGBA::Y()) : ColorRGBA::Y();
1270 color = ColorRGBA::Y(); // ORCA match axis colors
1271
1272 if (m_hover_id == Y) {
1273 render_grabber_connection(color, view_matrix);
1275 }
1276
1277 Vec3d offset = Vec3d(1.25 * size, 0.0, m_grabber_connection_len);
1278 render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitY()) * scale_transform(cone_scale));
1279 offset = Vec3d(-1.25 * size, 0.0, m_grabber_connection_len);
1280 render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitY()) * scale_transform(cone_scale));
1281 }
1282
1284
1285 // render CutPlaneZRotation grabber
1286
1287 if (no_xy_grabber_hovered || m_hover_id == CutPlaneZRotation)
1288 {
1289 size = 0.75 * (m_dragging ? get_dragging_half_size(mean_size) : get_half_size(mean_size));
1290 color = ColorRGBA::Z(); // ORCA match axis colors
1291 const ColorRGBA cp_color = m_hover_id == CutPlaneZRotation ? color : m_plane.model.get_color();
1292
1293 const double grabber_shift = -1.75 * m_grabber_connection_len;
1294
1295 render_model(m_sphere.model, cp_color, view_matrix * translation_transform(grabber_shift * Vec3d::UnitY()) * scale_transform(size));
1296
1298 const Vec3d cone_scale = Vec3d(0.75 * size, 0.75 * size, 1.8 * size);
1299
1301 render_grabber_connection(GRABBER_COLOR, view_matrix * rotation_transform(0.5 * PI * Vec3d::UnitX()), 1.75);
1302
1303 Vec3d offset = Vec3d(1.25 * size, grabber_shift, 0.0);
1304 render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitY()) * scale_transform(cone_scale));
1305 offset = Vec3d(-1.25 * size, grabber_shift, 0.0);
1306 render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitY()) * scale_transform(cone_scale));
1307 }
1308 }
1309
1310 const double xy_connection_len = 0.75 * m_grabber_connection_len;
1311
1312 // render CutPlaneXMove grabber
1313
1314 if (no_xy_grabber_hovered || m_hover_id == CutPlaneXMove)
1315 {
1316 size = (m_dragging ? get_dragging_half_size(mean_size) : get_half_size(mean_size));
1317 color = m_hover_id == CutPlaneXMove ? ColorRGBA::X() : m_plane.model.get_color(); // ORCA match axis colors
1318
1319 render_grabber_connection(GRABBER_COLOR, view_matrix * rotation_transform(0.5 * PI * Vec3d::UnitY()), 0.75);
1320
1321 Vec3d offset = xy_connection_len * Vec3d::UnitX() - 0.5 * size * Vec3d::Ones();
1322 render_model(m_cube.model, color, view_matrix * translation_transform(offset) * scale_transform(size));
1323
1324 const Vec3d cone_scale = Vec3d(0.5 * size, 0.5 * size, 1.8 * size);
1325
1326 offset = (size + xy_connection_len) * Vec3d::UnitX();
1327 render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitY()) * scale_transform(cone_scale));
1328 }
1329
1330 // render CutPlaneYMove grabber
1331
1332 if (m_groove.angle > 0.0f && (no_xy_grabber_hovered || m_hover_id == CutPlaneYMove))
1333 {
1334 size = (m_dragging ? get_dragging_half_size(mean_size) : get_half_size(mean_size));
1335 color = m_hover_id == CutPlaneYMove ? ColorRGBA::Y() : m_plane.model.get_color(); // ORCA match axis colors
1336
1337 render_grabber_connection(GRABBER_COLOR, view_matrix * rotation_transform(-0.5 * PI * Vec3d::UnitX()), 0.75);
1338
1339 Vec3d offset = xy_connection_len * Vec3d::UnitY() - 0.5 * size * Vec3d::Ones();
1340 render_model(m_cube.model, color, view_matrix * translation_transform(offset) * scale_transform(size));
1341
1342 const Vec3d cone_scale = Vec3d(0.5 * size, 0.5 * size, 1.8 * size);
1343
1344 offset = (size + xy_connection_len) * Vec3d::UnitY();
1345 render_model(m_cone.model, color, view_matrix * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitX()) * scale_transform(cone_scale));
1346 }
1347 }
1348}
static const ColorRGBA GRAY()
Definition Color.hpp:133
void render_rotation_snapping(GrabberID axis, const ColorRGBA &color)
Definition GLGizmoCut.cpp:1176
void render_grabber_connection(const ColorRGBA &color, Transform3d view_matrix, double line_len_koef=1.0)
Definition GLGizmoCut.cpp:1210
static ColorRGBA get_color(Axis axis)
Definition Selection.cpp:2791
static double get_half_size(double size)
Definition GLGizmoCut.cpp:1132
static double get_dragging_half_size(double size)
Definition GLGizmoCut.cpp:1137

References CutPlane, CutPlaneXMove, CutPlaneYMove, CutPlaneZRotation, cutTongueAndGroove, Slic3r::GUI::get_dragging_half_size(), Slic3r::GUI::get_grabber_mean_size(), Slic3r::GUI::get_half_size(), GL_DEPTH_BUFFER_BIT, glClear, glsafe, Slic3r::GUI::GRABBER_COLOR, Slic3r::ColorRGBA::GRAY(), m_bounding_box, m_cone, m_cube, Slic3r::GUI::GLGizmoBase::m_dragging, m_grabber_connection_len, m_groove, Slic3r::GUI::GLGizmoBase::m_hover_id, m_mode, m_plane, m_plane_center, m_rotation_m, m_sphere, Slic3r::offset(), PI, render_grabber_connection(), render_model(), render_rotation_snapping(), Slic3r::Geometry::rotation_transform(), Slic3r::Geometry::scale_transform(), Slic3r::Geometry::translation_transform(), Slic3r::ColorRGBA::X(), X, Slic3r::ColorRGBA::Y(), Y, Slic3r::ColorRGBA::Z(), and Z.

Referenced by on_render().

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

◆ render_cut_plane_input_window()

void Slic3r::GUI::GLGizmoCut3D::render_cut_plane_input_window ( CutConnectors & connectors,
float x,
float y,
float bottom_limit )
protected
2907{
2908 const bool has_connectors = !connectors.empty();
2909 const bool is_cut_plane_init = m_rotation_m.isApprox(Transform3d::Identity()) && m_bb_center.isApprox(m_plane_center);
2910
2911 float f_scale = m_parent.get_gizmos_manager().get_layout_scale();
2912 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6.0f, 4.0f * f_scale));
2913
2914 CutMode mode = CutMode(m_mode);
2915 if (mode == CutMode::cutPlanar || mode == CutMode::cutTongueAndGroove) {
2916
2917 m_imgui->disabled_begin(has_connectors);
2919 mode = CutMode(m_mode);
2920 m_imgui->disabled_end();
2921
2923
2924 ImGui::AlignTextToFramePadding();
2925 m_imgui->text(_L("Cut position"));
2926 ImGui::SameLine(m_label_width);
2928 ImGui::SameLine();
2929
2930 m_imgui->disabled_begin(is_cut_plane_init);
2931 std::string act_name = _u8L("Reset cutting plane");
2932 if (render_reset_button("cut_plane", act_name)) {
2933 Plater::TakeSnapshot snapshot(wxGetApp().plater(), act_name, UndoRedo::SnapshotType::GizmoAction);
2935 }
2936 m_imgui->disabled_end();
2937
2938 if (mode == CutMode::cutPlanar) {
2939 ImGui::Separator();
2940
2941 m_imgui->disabled_begin(!m_keep_upper || !m_keep_lower || m_keep_as_parts || (m_part_selection.valid() && m_part_selection.is_one_object()));
2942 if (m_imgui->button(has_connectors ? _L("Edit connectors") : _L("Add connectors")))
2944 m_imgui->disabled_end();
2945 }
2946 else if (mode == CutMode::cutTongueAndGroove) {
2948 ImGui::Separator();
2949 m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, m_labels_map["Groove"] + ": ");
2950 render_groove_two_float_input(m_labels_map["Depth"], m_groove.depth, m_groove.depth_init, m_groove.depth_tolerance);
2951 render_groove_two_float_input(m_labels_map["Width"], m_groove.width, m_groove.width_init, m_groove.width_tolerance);
2952 render_groove_angle_input(m_labels_map["Flap Angle"], m_groove.flaps_angle, m_groove.flaps_angle_init, 30.f, 120.f);
2953 render_groove_angle_input(m_labels_map["Groove Angle"], m_groove.angle, m_groove.angle_init, 0.f, 15.f);
2954
2955 ImGui::Spacing();
2956 m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, m_labels_map["Multiple"] + ": ");
2959
2960 m_imgui->disabled_begin(true);
2961 const float groove_width = Cut::calculate_groove_width(m_groove, m_radius);
2962 m_imgui->text(m_labels_map["Spacing"]);
2963 ImGui::SameLine(m_label_width);
2964 std::ostringstream oss;
2965 oss << std::fixed << std::setprecision(2) << (m_groove_gap + groove_width);
2966 m_imgui->text(oss.str() + "mm");
2967 m_imgui->disabled_end();
2968 }
2969
2970 ImGui::Separator();
2971
2972 // render "After Cut" section
2973
2974 ImVec2 label_size;
2975 for (const wxString &label : {_L("Upper part"), _L("Lower part")}) {
2976 const ImVec2 text_size = ImGuiWrapper::calc_text_size(label);
2977 if (label_size.x < text_size.x)
2978 label_size.x = text_size.x;
2979 if (label_size.y < text_size.y)
2980 label_size.y = text_size.y;
2981 }
2982
2983 const float marker_size = label_size.y;
2984 const float h_shift = marker_size + label_size.x + m_imgui->scaled(2.f);
2985
2986 auto render_part_action_line = [this, h_shift, marker_size, &connectors](const wxString &label, const wxString &suffix, bool &keep_part,
2987 bool &place_on_cut_part, bool &rotate_part) {
2988 bool keep = true;
2989
2990 ImGui::AlignTextToFramePadding();
2991 render_color_marker(marker_size, ImGuiWrapper::to_ImU32(suffix == "##upper" ? UPPER_PART_COLOR : LOWER_PART_COLOR));
2992 m_imgui->text(label);
2993
2994 ImGui::SameLine(h_shift);
2995
2996 m_imgui->disabled_begin(!connectors.empty() || m_keep_as_parts);
2997 m_imgui->bbl_checkbox(_L("Keep") + suffix, connectors.empty() ? keep_part : keep);
2998 m_imgui->disabled_end();
2999
3000 ImGui::SameLine();
3001
3002 m_imgui->disabled_begin(!keep_part || m_keep_as_parts);
3003 if (m_imgui->bbl_checkbox(_L("Place on cut") + suffix, place_on_cut_part))
3004 rotate_part = false;
3005 ImGui::SameLine();
3006 if (m_imgui->bbl_checkbox(_L("Flip") + suffix, rotate_part))
3007 place_on_cut_part = false;
3008 m_imgui->disabled_end();
3009 };
3010
3011 m_imgui->text(_L("After cut") + ": ");
3012 render_part_action_line(_L("Upper part"), "##upper", m_keep_upper, m_place_on_cut_upper, m_rotate_upper);
3013 render_part_action_line(_L("Lower part"), "##lower", m_keep_lower, m_place_on_cut_lower, m_rotate_lower);
3014
3015 m_imgui->disabled_begin(has_connectors || m_part_selection.valid() || mode == CutMode::cutTongueAndGroove);
3016
3017 if (m_part_selection.valid())
3018 m_keep_as_parts = false;
3019
3020 m_imgui->bbl_checkbox(_L("Cut to parts"), m_keep_as_parts);
3021 if (m_keep_as_parts) {
3022 m_keep_upper = m_keep_lower = true;
3025 }
3026 m_imgui->disabled_end();
3027 }
3028
3029 ImGui::Separator();
3030
3032
3033 if (mode == CutMode::cutPlanar) {
3034 ImGui::SameLine();
3035 m_imgui->disabled_begin(is_cut_plane_init && !has_connectors);
3036 if (m_imgui->button(_L("Reset"), _L("Reset cutting plane and remove connectors"))) {
3037 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Reset Cut"), UndoRedo::SnapshotType::GizmoAction);
3040 }
3041 m_imgui->disabled_end();
3042 }
3043
3044 ImGui::SameLine();
3045 GLGizmoUtils::begin_right_aligned_buttons({_L("Perform cut"), _L("Cancel")});
3046 m_imgui->disabled_begin(!can_perform_cut());
3048 if(m_imgui->button(_L("Perform cut")))
3049 perform_cut(m_parent.get_selection());
3051 m_imgui->disabled_end();
3052
3053 ImGui::SameLine();
3054 if (m_imgui->button(_L("Cancel"))) {
3055 m_parent.reset_all_gizmos();
3056 }
3057
3058 ImGui::PopStyleVar(1); // ImGuiStyleVar_FramePadding
3059}
static float calculate_groove_width(const Cut::Groove &groove, const float m_radius)
Definition CutUtils.cpp:780
void render_groove_int_input(const std::string &label, int &in_val, const int &init_val, int min_val, int max_val)
Definition GLGizmoCut.cpp:2757
void render_groove_angle_input(const std::string &label, float &in_val, const float &init_val, float min_val, float max_val)
Definition GLGizmoCut.cpp:2846
void render_move_center_input(int axis)
Definition GLGizmoCut.cpp:723
void render_color_marker(float size, const ImU32 &color)
Definition GLGizmoCut.cpp:2660
void render_build_size()
Definition GLGizmoCut.cpp:2526
int m_groove_count_init
Definition GLGizmoCut.hpp:140
bool render_cut_mode_combo()
Definition GLGizmoCut.cpp:567
void render_groove_float_input(const std::string &label, float &in_val, const float &init_val, const bool disabled)
Definition GLGizmoCut.cpp:2711
void perform_cut(const Selection &selection)
Definition GLGizmoCut.cpp:3579
void reset_cut_plane()
Definition GLGizmoCut.cpp:2538
float m_groove_gap_init
Definition GLGizmoCut.hpp:143
void render_groove_two_float_input(const std::string &label, float &in_val, const float &init_val, float &in_tolerance)
Definition GLGizmoCut.cpp:2671
static ImU32 to_ImU32(const ColorRGBA &color)
Definition ImGuiWrapper.cpp:2239
static ImVec2 calc_text_size(std::string_view text, bool hide_text_after_double_hash=false, float wrap_width=-1.0f)
Extend ImGui::CalcTextSize to use string_view.
Definition ImGuiWrapper.cpp:667

References _L, _u8L, Slic3r::GUI::GLGizmoUtils::begin_right_aligned_buttons(), Slic3r::GUI::ImGuiWrapper::calc_text_size(), Slic3r::Cut::calculate_groove_width(), can_perform_cut(), Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, cutPlanar, cutTongueAndGroove, Slic3r::UndoRedo::GizmoAction, Slic3r::GUI::LOWER_PART_COLOR, m_bb_center, m_groove, m_groove_count, m_groove_count_init, m_groove_gap, m_groove_gap_init, Slic3r::GUI::GLGizmoBase::m_imgui, m_is_slider_editing_done, m_keep_as_parts, m_keep_lower, m_keep_upper, m_label_width, m_labels_map, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_part_selection, m_place_on_cut_lower, m_place_on_cut_upper, m_plane_center, m_radius, m_rotate_lower, m_rotate_upper, m_rotation_m, perform_cut(), Slic3r::GUI::plater(), Slic3r::GUI::GLGizmoUtils::pop_orca_button_style(), Slic3r::GUI::GLGizmoUtils::push_orca_button_style(), render_build_size(), render_color_marker(), render_cut_mode_combo(), render_groove_angle_input(), render_groove_float_input(), render_groove_int_input(), render_groove_two_float_input(), render_move_center_input(), render_reset_button(), render_tooltip_button(), reset_connectors(), reset_cut_plane(), set_connectors_editing(), Slic3r::GUI::ImGuiWrapper::to_ImU32(), Slic3r::GUI::UPPER_PART_COLOR, and Z.

Referenced by on_render_input_window().

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

◆ render_debug_input_window()

void Slic3r::GUI::GLGizmoCut3D::render_debug_input_window ( float x)
protected
2366{
2367 return;
2368 m_imgui->begin(wxString("DEBUG"));
2369
2370 m_imgui->end();
2371/*
2372 static bool hide_clipped = false;
2373 static bool fill_cut = false;
2374 static float contour_width = 0.4f;
2375
2376 m_imgui->checkbox(_L("Hide cut plane and grabbers"), m_hide_cut_plane);
2377 if (m_imgui->checkbox("hide_clipped", hide_clipped) && !hide_clipped)
2378 m_clp_normal = m_c->object_clipper()->get_clipping_plane()->get_normal();
2379 m_imgui->checkbox("fill_cut", fill_cut);
2380 m_imgui->slider_float("contour_width", &contour_width, 0.f, 3.f);
2381 if (auto oc = m_c->object_clipper())
2382 oc->set_behavior(hide_clipped || m_connectors_editing, fill_cut || m_connectors_editing, double(contour_width));
2383*/
2384 ImGui::PushItemWidth(0.5f * m_label_width);
2385 if (auto oc = m_c->object_clipper(); oc && m_imgui->slider_float("contour_width", &m_contour_width, 0.f, 3.f))
2386 oc->set_behavior(m_connectors_editing, m_connectors_editing, double(m_contour_width));
2387
2388 ImGui::Separator();
2389
2390 if (m_imgui->checkbox(("Render cut plane as disc"), m_cut_plane_as_circle))
2391 m_plane.reset();
2392
2393 ImGui::PushItemWidth(0.5f * m_label_width);
2394 if (m_imgui->slider_float("cut_plane_radius_koef", &m_cut_plane_radius_koef, 1.f, 2.f))
2395 m_plane.reset();
2396
2397 m_imgui->end();
2398}

References Slic3r::GUI::GLGizmoBase::m_c, m_connectors_editing, m_contour_width, m_cut_plane_as_circle, m_cut_plane_radius_koef, Slic3r::GUI::GLGizmoBase::m_imgui, m_label_width, and m_plane.

Referenced by on_render_input_window().

Here is the caller graph for this function:

◆ render_double_input()

bool Slic3r::GUI::GLGizmoCut3D::render_double_input ( const std::string & label,
double & value_in )
private
585{
586 ImGui::AlignTextToFramePadding();
587 m_imgui->text(label);
588 ImGui::SameLine(m_label_width);
589 ImGui::PushItemWidth(m_control_width);
590
591 double value = value_in;
594 double old_val = value;
595 ImGui::InputDouble(("##" + label).c_str(), &value, 0.0f, 0.0f, "%.2f", ImGuiInputTextFlags_CharsDecimal);
596
597 ImGui::SameLine();
598 m_imgui->text(m_imperial_units ? _L_CONTEXT("in", "inches") : _L("mm"));
599
600 value_in = value * (m_imperial_units ? GizmoObjectManipulation::in_to_mm : 1.0);
601 return !is_approx(old_val, value);
602}
static const double in_to_mm
Definition GizmoObjectManipulation.hpp:30

References _L, _L_CONTEXT, Slic3r::GUI::GizmoObjectManipulation::in_to_mm, Slic3r::is_approx(), m_control_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_imperial_units, m_label_width, and Slic3r::GUI::GizmoObjectManipulation::mm_to_in.

Here is the call graph for this function:

◆ render_flip_plane_button()

void Slic3r::GUI::GLGizmoCut3D::render_flip_plane_button ( bool disable_pred = false)
protected
2630{
2631 ImGui::SameLine();
2632
2633 if (m_hover_id == CutPlane)
2634 ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetColorU32(ImGuiCol_ButtonHovered));
2635
2636 m_imgui->disabled_begin(disable_pred);
2637 if (m_imgui->button(_L("Flip cut plane")))
2639 m_imgui->disabled_end();
2640
2641 if (m_hover_id == CutPlane)
2642 ImGui::PopStyleColor();
2643}

References _L, CutPlane, flip_cut_plane(), Slic3r::GUI::GLGizmoBase::m_hover_id, and Slic3r::GUI::GLGizmoBase::m_imgui.

Referenced by render_connectors_input_window().

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

◆ render_follows_cursor()

virtual bool Slic3r::GUI::GLGizmoBase::render_follows_cursor ( ) const
inlinevirtualinherited

Reimplemented in Slic3r::GUI::GLGizmoBrimEars, Slic3r::GUI::GLGizmoMeasure, and Slic3r::GUI::GLGizmoPainterBase.

189{ return false; }

Referenced by Slic3r::GUI::GLCanvas3D::_is_scene_cacheable().

Here is the caller graph for this function:

◆ render_grabber_connection()

void Slic3r::GUI::GLGizmoCut3D::render_grabber_connection ( const ColorRGBA & color,
Transform3d view_matrix,
double line_len_koef = 1.0 )
private
1211{
1212 const Transform3d line_view_matrix = view_matrix * scale_transform(Vec3d(1.0, 1.0, line_len_koef * m_grabber_connection_len));
1213
1214 render_line(m_grabber_connection, color, line_view_matrix, 0.2f);
1215};

References m_grabber_connection, m_grabber_connection_len, render_line(), and Slic3r::Geometry::scale_transform().

Referenced by render_cut_plane_grabbers().

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

◆ render_grabbers() [1/3]

void Slic3r::GUI::GLGizmoBase::render_grabbers ( const BoundingBoxf3 & box) const
protectedinherited
413{
414#if ENABLE_FIXED_GRABBER
416#else
417 render_grabbers((float)((box.size().x() + box.size().y() + box.size().z()) / 3.0));
418#endif
419}
void render_grabbers(const BoundingBoxf3 &box) const
Definition GLGizmoBase.cpp:412
static const float FixedGrabberSize
Definition GLGizmoBase.hpp:90

References Slic3r::GUI::GLGizmoBase::Grabber::FixedGrabberSize, render_grabbers(), and Slic3r::BoundingBox3Base< PointType >::size().

Referenced by Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoScale3D::on_render(), Slic3r::GUI::GLGizmoRotate::render_grabber(), render_grabbers(), and render_grabbers().

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

◆ render_grabbers() [2/3]

void Slic3r::GUI::GLGizmoBase::render_grabbers ( float size) const
protectedinherited
422{
423 render_grabbers(0, m_grabbers.size() - 1, size, false);
424}

References m_grabbers, and render_grabbers().

Here is the call graph for this function:

◆ render_grabbers() [3/3]

void Slic3r::GUI::GLGizmoBase::render_grabbers ( size_t first,
size_t last,
float size,
bool force_hover ) const
protectedinherited
427{
428 GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
429 if (shader == nullptr)
430 return;
431 shader->start_using();
432 shader->set_uniform("emission_factor", 0.1f);
434 for (size_t i = first; i <= last; ++i) {
435 if (m_grabbers[i].enabled)
436 m_grabbers[i].render(force_hover ? true : m_hover_id == (int)i, size);
437 }
439 shader->stop_using();
440}

References GL_CULL_FACE, glDisable, glEnable, glsafe, m_grabbers, m_hover_id, Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), and Slic3r::GLShaderProgram::stop_using().

Here is the call graph for this function:

◆ render_groove_angle_input()

void Slic3r::GUI::GLGizmoCut3D::render_groove_angle_input ( const std::string & label,
float & in_val,
const float & init_val,
float min_val,
float max_val )
protected
2847{
2848 if (render_angle_input(label, in_val, init_val, min_val, max_val)) {
2851 }
2852
2854 m_groove_editing = false;
2856 }
2857}

References m_groove_editing, m_is_slider_editing_done, render_angle_input(), reset_cut_by_contours(), and update_plane_model().

Referenced by render_cut_plane_input_window().

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

◆ render_groove_float_input()

void Slic3r::GUI::GLGizmoCut3D::render_groove_float_input ( const std::string & label,
float & in_val,
const float & init_val,
const bool disabled )
protected
2712{
2713 if (disabled)
2714 m_imgui->disabled_begin(true);
2715
2716 bool is_changed{false};
2717 Vec2d plate_size = wxGetApp().plater()->get_partplate_list().get_plate(0)->get_size();
2718 float max_val = std::max(plate_size.x(), plate_size.y()) / (std::max(m_groove_count - 1, 1));
2719
2720 float val = in_val;
2721 if (render_slider_input(label, val, -0.1f, max_val)) {
2722 if (m_imgui->get_last_slider_status().can_take_snapshot) {
2723 Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", _u8L("Groove change"), label),
2725 m_imgui->get_last_slider_status().invalidate_snapshot();
2726 m_groove_editing = true;
2727 }
2728 in_val = val;
2729 is_changed = true;
2730 }
2731
2732 ImGui::SameLine();
2733
2734 if (!disabled) m_imgui->disabled_begin(is_approx(in_val, init_val) );
2735 const std::string act_name = _u8L("Reset");
2736 if (render_reset_button("##groove_" + label + act_name, act_name)) {
2737 Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", act_name, label), UndoRedo::SnapshotType::GizmoAction);
2738 in_val = init_val;
2739 is_changed = true;
2740 }
2741 if (!disabled) m_imgui->disabled_end();
2742
2743 if (is_changed) {
2746 }
2747
2749 m_groove_editing = false;
2751 }
2752
2753 if (disabled)
2754 m_imgui->disabled_end();
2755}
bool render_slider_input(const std::string &label, float &value_in, float min_val=-0.1f, float max_val=100.f)
Definition GLGizmoCut.cpp:674

References _u8L, Slic3r::GUI::format(), Slic3r::UndoRedo::GizmoAction, Slic3r::is_approx(), m_groove_count, m_groove_editing, Slic3r::GUI::GLGizmoBase::m_imgui, m_is_slider_editing_done, Slic3r::GUI::plater(), render_reset_button(), render_slider_input(), reset_cut_by_contours(), and update_plane_model().

Referenced by render_cut_plane_input_window().

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

◆ render_groove_int_input()

void Slic3r::GUI::GLGizmoCut3D::render_groove_int_input ( const std::string & label,
int & in_val,
const int & init_val,
int min_val,
int max_val )
protected
2758{
2759 bool is_changed{false};
2760
2761 m_imgui->text(label);
2762 ImGui::AlignTextToFramePadding();
2763 ImGui::SameLine(m_label_width);
2764 ImGui::PushItemWidth(m_control_width);
2765 int val = in_val;
2766 if (ImGui::InputInt("##int_input", &val, 1, 5)) {
2767 val = std::clamp(val, min_val, max_val);
2768 // ORCA Holding +/- at the limit clamps back to the same value, don't rebuild for that.
2769 if (val != in_val) {
2770 in_val = val;
2771 is_changed = true;
2772 }
2773 }
2774 m_imgui->request_frames_while_held(); // ORCA auto-repeat of the +/- buttons
2775
2776 ImGui::SameLine();
2777 m_imgui->disabled_begin(in_val == init_val);
2778 const std::string act_name = _u8L("Reset");
2779 if (render_reset_button("##int_" + label + act_name, act_name)) {
2780 Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", act_name, label), UndoRedo::SnapshotType::GizmoAction);
2781 in_val = init_val;
2782 is_changed = true;
2783 }
2784 m_imgui->disabled_end();
2785
2786 if (is_changed) {
2789 }
2790}

References _u8L, Slic3r::GUI::format(), Slic3r::UndoRedo::GizmoAction, m_control_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_label_width, Slic3r::GUI::plater(), render_reset_button(), reset_cut_by_contours(), and update_plane_model().

Referenced by render_cut_plane_input_window().

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

◆ render_groove_two_float_input()

void Slic3r::GUI::GLGizmoCut3D::render_groove_two_float_input ( const std::string & label,
float & in_val,
const float & init_val,
float & in_tolerance )
protected
2672{
2673 bool is_changed{false};
2674
2675 float val = in_val;
2676 float tolerance = in_tolerance;
2677 if (render_slider_two_input(label, val, tolerance, -0.1f, std::min(0.3f*in_val, 1.5f))) {
2678 if (m_imgui->get_last_slider_status().can_take_snapshot) {
2679 Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", _u8L("Groove change"), label), UndoRedo::SnapshotType::GizmoAction);
2680 m_imgui->get_last_slider_status().invalidate_snapshot();
2681 m_groove_editing = true;
2682 }
2683 in_val = val;
2684 in_tolerance = tolerance;
2685 is_changed = true;
2686 }
2687
2688 ImGui::SameLine();
2689
2690 m_imgui->disabled_begin(is_approx(in_val, init_val) && is_approx(in_tolerance, 0.1f));
2691 const std::string act_name = _u8L("Reset");
2692 if (render_reset_button("##groove_" + label + act_name, act_name)) {
2693 Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", act_name, label), UndoRedo::SnapshotType::GizmoAction);
2694 in_val = init_val;
2695 in_tolerance = 0.1f;
2696 is_changed = true;
2697 }
2698 m_imgui->disabled_end();
2699
2700 if (is_changed) {
2703 }
2704
2706 m_groove_editing = false;
2708 }
2709}

References _u8L, Slic3r::GUI::format(), Slic3r::UndoRedo::GizmoAction, Slic3r::is_approx(), m_groove_editing, Slic3r::GUI::GLGizmoBase::m_imgui, m_is_slider_editing_done, Slic3r::GUI::plater(), render_reset_button(), render_slider_two_input(), reset_cut_by_contours(), and update_plane_model().

Referenced by render_cut_plane_input_window().

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

◆ render_input_window()

void Slic3r::GUI::GLGizmoBase::render_input_window ( float x,
float y,
float bottom_limit )
inherited
529{
530 on_render_input_window(x, y, bottom_limit);
532 // imgui windows that don't have an initial size needs to be processed once to get one
533 // and are not rendered in the first frame
534 // so, we forces to render another frame the first time the imgui window is shown
535 // https://github.com/ocornut/imgui/issues/2949
536 m_parent.set_as_dirty();
537 m_parent.request_extra_frame();
539 }
540}
virtual void on_render_input_window(float x, float y, float bottom_limit)
Definition GLGizmoBase.hpp:258
bool m_first_input_window_render
Definition GLGizmoBase.hpp:154

References m_first_input_window_render, m_parent, and on_render_input_window().

Here is the call graph for this function:

◆ render_input_window_warning()

void Slic3r::GUI::GLGizmoCut3D::render_input_window_warning ( ) const
protected
3160{
3161 const bool invalid_connector_warning = !m_invalid_connectors_idxs.empty();
3162 const bool keep_after_cut_warning = !m_keep_upper && !m_keep_lower;
3163 const bool invalid_contour_warning = !has_valid_contour();
3164 const bool invalid_groove_warning = !has_valid_groove();
3165
3166 if (invalid_connector_warning || keep_after_cut_warning || invalid_contour_warning || invalid_groove_warning) {
3167 ImGui::Separator();
3168 }
3169
3170 if (invalid_connector_warning) {
3171 wxString out = /*wxString(ImGui::WarningMarkerSmall)*/ _L("Warning") + ": " + _L("Invalid connectors detected") + ":";
3172 if (m_info_stats.outside_cut_contour > size_t(0))
3173 out += "\n - " + format_wxstr(_L_PLURAL("%1$d connector is out of cut contour", "%1$d connectors are out of cut contour", m_info_stats.outside_cut_contour),
3174 m_info_stats.outside_cut_contour);
3175 if (m_info_stats.outside_bb > size_t(0))
3176 out += "\n - " + format_wxstr(_L_PLURAL("%1$d connector is out of object", "%1$d connectors are out of object", m_info_stats.outside_bb),
3177 m_info_stats.outside_bb);
3178 if (m_info_stats.is_overlap)
3179 out += "\n - " + _L("Some connectors are overlapped");
3180 m_imgui->warning_text(out);
3181 }
3182 if (keep_after_cut_warning)
3183 m_imgui->warning_text(/*wxString(ImGui::WarningMarkerSmall)*/ _L("Warning") + ": " + _L("Select at least one object to keep after cutting."));
3184 if (invalid_contour_warning)
3185 m_imgui->warning_text(/*wxString(ImGui::WarningMarkerSmall)*/ _L("Warning") + ": " + _L("Cut plane is placed out of object"));
3186 else if (invalid_groove_warning)
3187 m_imgui->warning_text(/*wxString(ImGui::WarningMarkerSmall)*/ _L("Warning") + ": " + _L("Cut plane with groove is invalid"));
3188}
bool has_valid_contour() const
Definition GLGizmoCut.cpp:3473
wxString format_wxstr(const char *fmt, TArgs &&... args)
Definition format.hpp:22
#define _L_PLURAL(s, plural, n)
Definition I18N.hpp:96

References _L, _L_PLURAL, Slic3r::GUI::format_wxstr(), has_valid_contour(), has_valid_groove(), Slic3r::GUI::GLGizmoBase::m_imgui, m_info_stats, m_invalid_connectors_idxs, m_keep_lower, and m_keep_upper.

Referenced by on_render_input_window().

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

◆ render_line()

void Slic3r::GUI::GLGizmoCut3D::render_line ( GLModel & line_model,
const ColorRGBA & color,
Transform3d view_model_matrix,
float width )
private
1160{
1161 GLShaderProgram* shader = wxGetApp().get_shader("flat");
1162 if (shader) {
1163 shader->start_using();
1164
1165 shader->set_uniform("view_model_matrix", view_model_matrix);
1166 shader->set_uniform("projection_matrix", wxGetApp().plater()->get_camera().get_projection_matrix());
1167 shader->set_uniform("width", width);
1168
1169 line_model.set_color(color);
1170 line_model.render();
1171
1172 shader->stop_using();
1173 }
1174}

References Slic3r::GUI::plater(), Slic3r::GUI::GLModel::render(), Slic3r::GUI::GLModel::set_color(), Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), and Slic3r::GLShaderProgram::stop_using().

Referenced by render_cut_line(), and render_grabber_connection().

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

◆ render_model()

void Slic3r::GUI::GLGizmoCut3D::render_model ( GLModel & model,
const ColorRGBA & color,
Transform3d view_model_matrix )
staticprivate
1143{
1144 GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
1145 if (shader) {
1146 shader->start_using();
1147
1148 shader->set_uniform("view_model_matrix", view_model_matrix);
1149 shader->set_uniform("emission_factor", 0.2f);
1150 shader->set_uniform("projection_matrix", wxGetApp().plater()->get_camera().get_projection_matrix());
1151
1152 model.set_color(color);
1153 model.render();
1154
1155 shader->stop_using();
1156 }
1157}

References Slic3r::GUI::plater(), Slic3r::GUI::GLModel::render(), Slic3r::GUI::GLModel::set_color(), Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), and Slic3r::GLShaderProgram::stop_using().

Referenced by render_connectors(), and render_cut_plane_grabbers().

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

◆ render_move_center_input()

void Slic3r::GUI::GLGizmoCut3D::render_move_center_input ( int axis)
private
724{
725 m_imgui->text(m_axis_names[axis]+":");
726 ImGui::SameLine();
727 ImGui::PushItemWidth(0.3f*m_control_width);
728
729 Vec3d move = m_plane_center;
730 double in_val, value = in_val = move[axis];
733 ImGui::InputDouble(("##move_" + m_axis_names[axis]).c_str(), &value, 0.0, 0.0, "%.2f", ImGuiInputTextFlags_CharsDecimal);
734 ImGui::SameLine();
735
736 double val = value * (m_imperial_units ? GizmoObjectManipulation::in_to_mm : 1.0);
737
738 if (in_val != val) {
739 move[axis] = val;
740 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Move cut plane"), UndoRedo::SnapshotType::GizmoAction);
741 set_center(move, true);
743
745 }
746}

References _u8L, Slic3r::UndoRedo::GizmoAction, Slic3r::GUI::GizmoObjectManipulation::in_to_mm, m_ar_plane_center, m_axis_names, m_control_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_imperial_units, m_plane_center, Slic3r::GUI::GizmoObjectManipulation::mm_to_in, Slic3r::GUI::plater(), reset_cut_by_contours(), and set_center().

Referenced by render_cut_plane_input_window().

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

◆ render_reset_button()

bool Slic3r::GUI::GLGizmoCut3D::render_reset_button ( const std::string & label_id,
const std::string & tooltip ) const
private
769{
770 const ImGuiStyle &style = ImGui::GetStyle();
771
772 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, {1, style.ItemSpacing.y});
773 ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0); // ORCA match button style
774
775 ImGui::PushStyleColor(ImGuiCol_Button, {0.25f, 0.25f, 0.25f, 0.0f});
776 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, {0, 0, 0, 0}); // ORCA match button style
777 ImGui::PushStyleColor(ImGuiCol_ButtonActive, {0, 0, 0, 0}); // ORCA match button style
778
779 const bool revert = m_imgui->button(wxString(ImGui::RevertBtn) + "##" + wxString::FromUTF8(label_id));
780
781 ImGui::PopStyleColor(3);
782
783 if (ImGui::IsItemHovered())
784 m_imgui->tooltip(tooltip.c_str(), ImGui::GetFontSize() * 20.0f);
785
786 ImGui::PopStyleVar(2); // ORCA
787
788 return revert;
789}
std::map< wxColour, wxColour > revert(std::map< wxColour, wxColour > const &map)
Definition StateColor.cpp:204

References Slic3r::GUI::GLGizmoBase::m_imgui, revert(), and style.

Referenced by render_angle_input(), render_connectors_input_window(), render_cut_plane_input_window(), render_groove_float_input(), render_groove_int_input(), render_groove_two_float_input(), and render_snap_specific_input().

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

◆ render_rotation_snapping()

void Slic3r::GUI::GLGizmoCut3D::render_rotation_snapping ( GrabberID axis,
const ColorRGBA & color )
private
1177{
1178 GLShaderProgram* line_shader = wxGetApp().get_shader("flat");
1179 if (!line_shader)
1180 return;
1181
1182 const Camera& camera = wxGetApp().plater()->get_camera();
1183 Transform3d view_model_matrix = camera.get_view_matrix() * translation_transform(m_plane_center) * m_start_dragging_m;
1184
1185 if (axis == X)
1186 view_model_matrix = view_model_matrix * rotation_transform(0.5 * PI * Vec3d::UnitY()) * rotation_transform(-PI * Vec3d::UnitZ());
1187 else if (axis == Y)
1188 view_model_matrix = view_model_matrix * rotation_transform(-0.5 * PI * Vec3d::UnitZ()) * rotation_transform(-0.5 * PI * Vec3d::UnitY());
1189 else
1190 view_model_matrix = view_model_matrix * rotation_transform(-0.5 * PI * Vec3d::UnitZ());
1191
1192 line_shader->start_using();
1193 line_shader->set_uniform("projection_matrix", camera.get_projection_matrix());
1194 line_shader->set_uniform("view_model_matrix", view_model_matrix);
1195 line_shader->set_uniform("width", 0.25f);
1196
1197 m_circle.render();
1198 m_scale.render();
1199 m_snap_radii.render();
1200 m_reference_radius.render();
1201 if (m_dragging) {
1202 line_shader->set_uniform("width", 1.5f);
1203 m_angle_arc.set_color(color);
1204 m_angle_arc.render();
1205 }
1206
1207 line_shader->stop_using();
1208}

References Slic3r::GUI::Camera::get_projection_matrix(), Slic3r::GUI::Camera::get_view_matrix(), m_angle_arc, m_circle, Slic3r::GUI::GLGizmoBase::m_dragging, m_plane_center, m_reference_radius, m_scale, m_snap_radii, m_start_dragging_m, PI, Slic3r::Geometry::rotation_transform(), Slic3r::GLShaderProgram::set_uniform(), Slic3r::GLShaderProgram::start_using(), Slic3r::GLShaderProgram::stop_using(), Slic3r::Geometry::translation_transform(), X, and Y.

Referenced by render_cut_plane_grabbers().

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

◆ render_slider_input()

bool Slic3r::GUI::GLGizmoCut3D::render_slider_input ( const std::string & label,
float & value_in,
float min_val = -0.1f,
float max_val = 100.f )
private
675{
676 // -------- [ ]
677 // slider_with + input_width + slider_with + item_in_gap
678 double slider_with = 0.42 * m_editing_window_width; // m_control_width * 0.35;
679 double item_in_gap = 0.01 * m_editing_window_width;
680 double input_width = 0.29 * m_editing_window_width;
681
682 constexpr float UndefMinVal = -0.1f;
683 const float f_mm_to_in = static_cast<float>(GizmoObjectManipulation::mm_to_in);
684
685 ImGui::AlignTextToFramePadding();
686 m_imgui->text(label);
687 ImGui::SameLine(m_label_width);
688 ImGui::PushItemWidth(slider_with);
689
690 double left_width = m_label_width + slider_with + item_in_gap;
691
692 bool m_imperial_units = false;
693
694 float value = value_in;
695 float max_value = max_val;
696 if (m_imperial_units) {
697 value *= f_mm_to_in;
698 max_value *= f_mm_to_in;
699 }
700 float old_val = value;
701
702 const BoundingBoxf3 bbox = m_bounding_box;
703 //const float mean_size = float((bbox.size().x() + bbox.size().y() + bbox.size().z())) * (m_imperial_units ? f_mm_to_in : 1.f);
704 const float min_v = min_val > 0.f ? /*std::min(max_val, mean_size)*/ min_val : 1.f;
705
706 float min_size = value_in < 0.f ? UndefMinVal : min_v;
707 if (m_imperial_units) {
708 min_size *= f_mm_to_in;
709 }
710 std::string format = value_in < 0.f ? " " : m_imperial_units ? "%.4f " + _u8L_CONTEXT("in", "inches") : "%.2f " + _u8L("mm");
711
712 m_imgui->bbl_slider_float_style(("##" + label).c_str(), &value, min_size, max_value, format.c_str());
713
714 ImGui::SameLine(left_width);
715 ImGui::PushItemWidth(input_width);
716 ImGui::BBLDragFloat(("##input_" + label).c_str(), &value, 0.05f, min_size, max_value, format.c_str());
717
718 value_in = value * float(m_imperial_units ? GizmoObjectManipulation::in_to_mm : 1.0);
719
720 return !is_approx(old_val, value);
721}

References _u8L, _u8L_CONTEXT, Slic3r::GUI::GLGizmoBase::format(), Slic3r::GUI::GizmoObjectManipulation::in_to_mm, Slic3r::is_approx(), m_bounding_box, m_editing_window_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_imperial_units, m_label_width, and Slic3r::GUI::GizmoObjectManipulation::mm_to_in.

Referenced by render_groove_float_input().

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

◆ render_slider_two_input()

bool Slic3r::GUI::GLGizmoCut3D::render_slider_two_input ( const std::string & label,
float & value_in,
float & tolerance_in,
float min_val = -0.1f,
float max_tolerance = -0.1f )
private
605{
606 // -------- [ ] -------- [ ]
607 // slider_with + item_in_gap + first_input_width + item_out_gap + slider_with + item_in_gap + second_input_width
608 double slider_with = 0.24 * m_editing_window_width; // m_control_width * 0.35;
609 double item_in_gap = 0.01 * m_editing_window_width;
610 double item_out_gap = 0.01 * m_editing_window_width;
611 double first_input_width = 0.29 * m_editing_window_width;
612 double second_input_width = 0.29 * m_editing_window_width;
613
614 constexpr float UndefMinVal = -0.1f;
615 const float f_mm_to_in = static_cast<float>(GizmoObjectManipulation::mm_to_in);
616
617 ImGui::AlignTextToFramePadding();
618 m_imgui->text(label);
619 ImGui::SameLine(m_label_width);
620 ImGui::PushItemWidth(slider_with);
621
622 double left_width = m_label_width + slider_with + item_in_gap;
623
624 bool m_imperial_units = false;
625
626 float value = value_in;
628 value *= f_mm_to_in;
629 float old_val = value;
630
631 const BoundingBoxf3 bbox = m_bounding_box;
632 const float mean_size = float((bbox.size().x() + bbox.size().y() + bbox.size().z()) / 9.0) * (m_imperial_units ? f_mm_to_in : 1.f);
633 const float min_v = min_val > 0.f ? /*std::min(max_val, mean_size)*/min_val : 1.f;
634
635 float min_size = value_in < 0.f ? UndefMinVal : min_v;
636 if (m_imperial_units) {
637 min_size *= f_mm_to_in;
638 }
639 std::string format = value_in < 0.f ? " " : m_imperial_units ? "%.4f " + _u8L_CONTEXT("in", "inches") : "%.2f " + _u8L("mm");
640
641 m_imgui->bbl_slider_float_style(("##" + label).c_str(), &value, min_size, mean_size, format.c_str());
642
643 ImGui::SameLine(left_width);
644 ImGui::PushItemWidth(first_input_width);
645 ImGui::BBLDragFloat(("##input_" + label).c_str(), &value, 0.05f, min_size, mean_size, format.c_str());
646
647 value_in = value * float(m_imperial_units ? GizmoObjectManipulation::in_to_mm : 1.0);
648
649 left_width += (first_input_width + item_out_gap);
650 ImGui::SameLine(left_width);
651 ImGui::PushItemWidth(slider_with);
652
653 float tolerance = tolerance_in;
655 tolerance *= f_mm_to_in;
656 float old_tolerance = tolerance;
657 // std::string format_t = tolerance_in < 0.f ? " " : "%.f %%";
658 float min_tolerance = tolerance_in < 0.f ? UndefMinVal : 0.f;
659 const float max_tolerance_v = max_tolerance > 0.f ? std::min(max_tolerance, 0.5f * mean_size) : 0.5f * mean_size;
660
661 m_imgui->bbl_slider_float_style("##tolerance_" + label, &tolerance, min_tolerance, max_tolerance_v, format.c_str(), 1.f, true,
662 _L("Tolerance"));
663
664 left_width += (slider_with + item_in_gap);
665 ImGui::SameLine(left_width);
666 ImGui::PushItemWidth(second_input_width);
667 ImGui::BBLDragFloat(("##tolerance_input_" + label).c_str(), &tolerance, 0.05f, min_tolerance, max_tolerance_v, format.c_str());
668
669 tolerance_in = tolerance * float(m_imperial_units ? GizmoObjectManipulation::in_to_mm : 1.0);
670
671 return !is_approx(old_val, value) || !is_approx(old_tolerance, tolerance);
672}

References _L, _u8L, _u8L_CONTEXT, Slic3r::GUI::GLGizmoBase::format(), Slic3r::GUI::GizmoObjectManipulation::in_to_mm, Slic3r::is_approx(), m_bounding_box, m_editing_window_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_imperial_units, m_label_width, Slic3r::GUI::GizmoObjectManipulation::mm_to_in, and Slic3r::BoundingBox3Base< PointType >::size().

Referenced by render_connectors_input_window(), and render_groove_two_float_input().

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

◆ render_snap_specific_input()

void Slic3r::GUI::GLGizmoCut3D::render_snap_specific_input ( const std::string & label,
const wxString & tooltip,
float & in_val,
const float & init_val,
const float min_val,
const float max_val )
protected
2860{
2861 // -------- [ ]
2862 // slider_with + item_in_gap + input_width
2863 double slider_with = 0.24 * m_editing_window_width; // m_control_width * 0.35;
2864 double item_in_gap = 0.01 * m_editing_window_width;
2865 double input_width = 0.29 * m_editing_window_width;
2866
2867 ImGui::AlignTextToFramePadding();
2868 m_imgui->text(label);
2869 ImGui::SameLine(m_label_width);
2870 ImGui::PushItemWidth(slider_with);
2871
2872 double left_width = m_label_width + slider_with + item_in_gap;
2873
2874 bool is_changed = false;
2875 const std::string format = "%.0f %%";
2876
2877 float val = in_val * 100.f;
2878 const float old_val = val;
2879 m_imgui->bbl_slider_float_style("##snap_" + label, &val, min_val, max_val, format.c_str(), 1.f, true, tooltip);
2880
2881 ImGui::SameLine(left_width);
2882 ImGui::PushItemWidth(input_width);
2883 ImGui::BBLDragFloat(("##snap_input_" + label).c_str(), &val, 0.05f, min_val, max_val, format.c_str());
2884
2885 if (!is_approx(old_val, val)) {
2886 in_val = val * 0.01f;
2887 is_changed = true;
2888 }
2889
2890 ImGui::SameLine();
2891
2892 m_imgui->disabled_begin(is_approx(in_val, init_val));
2893 const std::string act_name = _u8L("Reset");
2894 if (render_reset_button("##snap_" + label + act_name, act_name)) {
2895 in_val = init_val;
2896 is_changed = true;
2897 }
2898 m_imgui->disabled_end();
2899
2900 if (is_changed) {
2903 }
2904}
void update_connector_shape()
Definition GLGizmoCut.cpp:3788

References _u8L, Slic3r::GUI::GLGizmoBase::format(), Slic3r::is_approx(), m_editing_window_width, Slic3r::GUI::GLGizmoBase::m_imgui, m_label_width, render_reset_button(), update_connector_shape(), and update_raycasters_for_picking().

Referenced by render_connectors_input_window().

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

◆ render_tooltip_button()

void Slic3r::GUI::GLGizmoCut3D::render_tooltip_button ( float x,
float y )
protected
3217{
3219
3221}
void render_tooltip_button(ImGuiWrapper *imgui_wrapper, const GLCanvas3D &canvas, const std::vector< std::pair< wxString, wxString > > &shortcuts, float x, float y)
Definition GLGizmoUtils.cpp:48

References m_connectors_editing, Slic3r::GUI::GLGizmoBase::m_imgui, Slic3r::GUI::GLGizmoBase::m_parent, m_shortcuts_connector, m_shortcuts_cut, and Slic3r::GUI::GLGizmoUtils::render_tooltip_button().

Referenced by render_connectors_input_window(), and render_cut_plane_input_window().

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

◆ reset_connectors()

void Slic3r::GUI::GLGizmoCut3D::reset_connectors ( )
private
3764{
3765 m_c->selection_info()->model_object()->cut_connectors.clear();
3769}

References check_and_update_connectors_state(), clear_selection(), Slic3r::GUI::GLGizmoBase::m_c, and update_raycasters_for_picking().

Referenced by render_connectors_input_window(), and render_cut_plane_input_window().

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

◆ reset_cut_by_contours()

void Slic3r::GUI::GLGizmoCut3D::reset_cut_by_contours ( )
protected
2589{
2591
2594 return;
2596 }
2597 else
2599}

References cutTongueAndGroove, has_valid_groove(), Slic3r::GUI::GLGizmoBase::m_dragging, m_groove_editing, m_mode, m_part_selection, process_contours(), and toggle_model_objects_visibility().

Referenced by dragging_grabber_move(), dragging_grabber_rotation(), flip_cut_plane(), on_dragging(), on_load(), on_set_state(), on_stop_dragging(), process_contours(), process_cut_line(), render_groove_angle_input(), render_groove_float_input(), render_groove_int_input(), render_groove_two_float_input(), render_move_center_input(), reset_cut_plane(), switch_to_mode(), and update_bb().

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

◆ reset_cut_plane()

void Slic3r::GUI::GLGizmoCut3D::reset_cut_plane ( )
protected
2539{
2540 m_angle_arc.reset();
2543 m_start_dragging_m = m_rotation_m = Transform3d::Identity();
2545
2547 m_parent.request_extra_frame();
2548}

References m_angle_arc, m_ar_plane_center, m_bb_center, Slic3r::GUI::GLGizmoBase::m_parent, m_plane_center, m_rotation_m, m_start_dragging_m, m_transformed_bounding_box, reset_cut_by_contours(), set_center(), and transformed_bounding_box().

Referenced by render_cut_plane_input_window().

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

◆ rotate_vec3d_around_plane_center()

void Slic3r::GUI::GLGizmoCut3D::rotate_vec3d_around_plane_center ( Vec3d & vec)
472{
473 vec = Transformation(translation_transform(m_plane_center) * m_rotation_m * translation_transform(-m_plane_center)).get_matrix() * vec;
474}

References Slic3r::Geometry::Transformation::get_matrix(), m_plane_center, m_rotation_m, and Slic3r::Geometry::translation_transform().

Referenced by update_clipper().

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

◆ save()

void Slic3r::GUI::GLGizmoBase::save ( cereal::BinaryOutputArchive & ar) const
inlineinherited
171{ on_save(ar); }
virtual void on_save(cereal::BinaryOutputArchive &ar) const
Definition GLGizmoBase.hpp:242

References on_save().

Here is the call graph for this function:

◆ select_all_connectors()

void Slic3r::GUI::GLGizmoCut3D::select_all_connectors ( )
protected
2408{
2409 std::fill(m_selected.begin(), m_selected.end(), true);
2410 m_selected_count = int(m_selected.size());
2411}

References m_selected, and m_selected_count.

Referenced by gizmo_event().

Here is the caller graph for this function:

◆ select_connector()

void Slic3r::GUI::GLGizmoCut3D::select_connector ( int idx,
bool select )
protected
3934{
3935 m_selected[idx] = select;
3936 if (select)
3938 else
3940}

References m_selected, and m_selected_count.

Referenced by gizmo_event(), is_selection_changed(), and process_selection_rectangle().

Here is the caller graph for this function:

◆ set_center()

void Slic3r::GUI::GLGizmoCut3D::set_center ( const Vec3d & center,
bool update_tbb = false )
private
546{
547 set_center_pos(center, update_tbb);
550}
void center(ExPolygonsWithIds &e)
Definition Emboss.cpp:1382

References Slic3r::center(), check_and_update_connectors_state(), set_center_pos(), and update_clipper().

Referenced by dragging_grabber_move(), process_cut_line(), render_move_center_input(), reset_cut_plane(), and shift_cut().

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

◆ set_center_pos()

void Slic3r::GUI::GLGizmoCut3D::set_center_pos ( const Vec3d & center_pos,
bool update_tbb = false )
private
1874{
1875 BoundingBoxf3 tbb = m_transformed_bounding_box;
1876 if (update_tbb) {
1877 Vec3d normal = m_rotation_m.inverse() * Vec3d(m_plane_center - center_pos);
1878 tbb.translate(normal.z() * Vec3d::UnitZ());
1879 }
1880
1881 bool can_set_center_pos = false;
1882 {
1883 double limit_val = /*CutMode(m_mode) == CutMode::cutTongueAndGroove ? 0.5 * double(m_groove.depth) : */0.5;
1884 if (tbb.max.z() > -limit_val && tbb.min.z() < limit_val)
1885 can_set_center_pos = true;
1886 else {
1887 const double old_dist = (m_bb_center - m_plane_center).norm();
1888 const double new_dist = (m_bb_center - center_pos).norm();
1889 // check if forcing is reasonable
1890 if (new_dist < old_dist)
1891 can_set_center_pos = true;
1892 }
1893 }
1894
1895 if (can_set_center_pos) {
1897 m_plane_center = center_pos;
1899 }
1900}
Point normal(Point pt, double scale)
Definition TreeSupport.cpp:112

References m_bb_center, m_center_offset, m_plane_center, m_rotation_m, m_transformed_bounding_box, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::max, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::min, Slic3r::normal(), and Slic3r::BoundingBox3Base< PointType >::translate().

Referenced by on_load(), set_center(), and update_bb().

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

◆ set_common_data_pool()

void Slic3r::GUI::GLGizmoBase::set_common_data_pool ( CommonGizmosDataPool * ptr)
inlineinherited
193{ m_c = ptr; }

References m_c.

◆ set_connectors_editing()

void Slic3r::GUI::GLGizmoCut3D::set_connectors_editing ( bool connectors_editing)
protected
2561{
2562 if (m_connectors_editing == connectors_editing)
2563 return;
2564
2565 m_connectors_editing = connectors_editing;
2567
2568 m_c->object_clipper()->set_behavior(m_connectors_editing, m_connectors_editing, double(m_contour_width));
2569
2570 m_parent.request_extra_frame();
2571}

References Slic3r::GUI::GLGizmoBase::m_c, m_connectors_editing, m_contour_width, Slic3r::GUI::GLGizmoBase::m_parent, and update_raycasters_for_picking().

Referenced by render_connectors_input_window(), and render_cut_plane_input_window().

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

◆ set_dirty()

void Slic3r::GUI::GLGizmoBase::set_dirty ( )
protectedinherited
524 {
525 m_dirty = true;
526}
bool m_dirty
Definition GLGizmoBase.hpp:293

References m_dirty.

Referenced by Slic3r::GUI::GLGizmoCut3D::process_cut_line(), and Slic3r::GUI::GLGizmoSimplify::request_rerender().

Here is the caller graph for this function:

◆ set_hover_id()

void Slic3r::GUI::GLGizmoBase::set_hover_id ( int id)
inherited
348{
349 // do not change hover id during dragging
350 assert(!m_dragging);
351
352 // allow empty grabbers when not using grabbers but use hover_id - flatten, rotate
353// if (!m_grabbers.empty() && id >= (int) m_grabbers.size())
354// return;
355
356 m_hover_id = id;
358}
virtual void on_set_hover_id()
Definition GLGizmoBase.hpp:245

References m_dragging, m_hover_id, and on_set_hover_id().

Referenced by Slic3r::GUI::GLGizmoRotate3D::on_set_hover_id().

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

◆ set_icon_filename()

void Slic3r::GUI::GLGizmoBase::set_icon_filename ( const std::string & filename)
inherited
343 {
344 m_icon_filename = filename;
345}

References m_icon_filename.

◆ set_state()

void Slic3r::GUI::GLGizmoBase::set_state ( EState state)
inlineinherited
176{ m_state = state; on_set_state(); }
virtual void on_set_state()
Definition GLGizmoBase.hpp:244

References m_state, and on_set_state().

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

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

◆ set_volumes_picking_state()

void Slic3r::GUI::GLGizmoCut3D::set_volumes_picking_state ( bool state)
protected
1548{
1549 std::vector<std::shared_ptr<SceneRaycasterItem>>* raycasters = m_parent.get_raycasters_for_picking(SceneRaycaster::EType::Volume);
1550 if (raycasters != nullptr) {
1551 const Selection& selection = m_parent.get_selection();
1552 const Selection::IndicesList ids = selection.get_volume_idxs();
1553 for (unsigned int id : ids) {
1554 const GLVolume* v = selection.get_volume(id);
1555 auto it = std::find_if(raycasters->begin(), raycasters->end(), [v](std::shared_ptr<SceneRaycasterItem> item) { return item->get_raycaster() == v->mesh_raycaster.get(); });
1556 if (it != raycasters->end())
1557 (*it)->set_active(state);
1558 }
1559 }
1560}
@ Volume
Definition SceneRaycaster.hpp:50

References Slic3r::GUI::Selection::get_volume(), Slic3r::GUI::Selection::get_volume_idxs(), Slic3r::GUI::GLGizmoBase::m_parent, and Slic3r::GUI::SceneRaycaster::Volume.

Here is the call graph for this function:

◆ shift_cut()

void Slic3r::GUI::GLGizmoCut3D::shift_cut ( double delta)
465{
466 Plater::TakeSnapshot snapshot(wxGetApp().plater(), _u8L("Move cut plane"), UndoRedo::SnapshotType::GizmoAction);
467 set_center(m_plane_center + m_cut_normal * delta, true);
469}

References _u8L, Slic3r::UndoRedo::GizmoAction, m_ar_plane_center, m_cut_normal, m_plane_center, Slic3r::GUI::plater(), and set_center().

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

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

◆ shortcut()

std::optional< Shortcut > Slic3r::GUI::GLGizmoBase::shortcut ( ) const
inlineinherited
178{ return m_shortcut; }

References m_shortcut.

Referenced by Slic3r::GUI::GLGizmoFdmSupports::on_tool_shortcut(), Slic3r::GUI::GLGizmoMmuSegmentation::on_tool_shortcut(), Slic3r::GUI::GLGizmoPainterBase::on_tool_shortcut(), and Slic3r::GUI::GLGizmoSeam::on_tool_shortcut().

Here is the caller graph for this function:

◆ switch_to_mode()

void Slic3r::GUI::GLGizmoCut3D::switch_to_mode ( size_t new_mode)
private
553{
554 m_mode = new_mode;
556
558 if (auto oc = m_c->object_clipper()) {
561 }
562
565}
void apply_color_clip_plane_colors()
Definition GLGizmoCut.cpp:1446

References apply_color_clip_plane_colors(), cutTongueAndGroove, Slic3r::GUI::GLGizmoBase::m_c, m_connectors_editing, m_contour_width, m_mode, reset_cut_by_contours(), update_plane_model(), and update_raycasters_for_picking().

Referenced by on_load(), and render_cut_mode_combo().

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

◆ toggle_model_objects_visibility()

void Slic3r::GUI::GLGizmoCut3D::toggle_model_objects_visibility ( )
private
3326{
3327 bool has_active_volume = false;
3328 std::vector<std::shared_ptr<SceneRaycasterItem>>* raycasters = m_parent.get_raycasters_for_picking(SceneRaycaster::EType::Volume);
3329 for (const std::shared_ptr<SceneRaycasterItem> &raycaster : *raycasters)
3330 if (raycaster->is_active()) {
3331 has_active_volume = true;
3332 break;
3333 }
3334
3335 if (m_part_selection.valid() && has_active_volume)
3336 m_parent.toggle_model_objects_visibility(false);
3337 else if (!m_part_selection.valid() && !has_active_volume) {
3338 const Selection& selection = m_parent.get_selection();
3339 const ModelObjectPtrs& model_objects = selection.get_model()->objects;
3340 m_parent.toggle_model_objects_visibility(true, model_objects[selection.get_object_idx()], selection.get_instance_idx());
3341 }
3342}

References Slic3r::GUI::Selection::get_instance_idx(), Slic3r::GUI::Selection::get_model(), Slic3r::GUI::Selection::get_object_idx(), Slic3r::GUI::GLGizmoBase::m_parent, m_part_selection, Slic3r::Model::objects, and Slic3r::GUI::SceneRaycaster::Volume.

Referenced by on_mouse(), on_render(), process_contours(), and reset_cut_by_contours().

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

◆ transformed_bounding_box()

BoundingBoxf3 Slic3r::GUI::GLGizmoCut3D::transformed_bounding_box ( const Vec3d & plane_center,
const Transform3d & rotation_m = Transform3d::Identity() ) const
1917{
1918 const Selection& selection = m_parent.get_selection();
1919
1920 const auto first_volume = selection.get_first_volume();
1921 Vec3d instance_offset = first_volume->get_instance_offset();
1922 instance_offset[Z] += first_volume->get_sla_shift_z();
1923
1924 const auto cut_matrix = Transform3d::Identity() * rotation_m.inverse() * translation_transform(instance_offset - plane_center);
1925
1926 const Selection::IndicesList& idxs = selection.get_volume_idxs();
1927 BoundingBoxf3 ret;
1928 for (unsigned int i : idxs) {
1929 const GLVolume* volume = selection.get_volume(i);
1930 // respect just to the solid parts for FFF and ignore pad and supports for SLA
1931 if (!volume->is_modifier && !volume->is_sla_pad() && !volume->is_sla_support()) {
1932
1933 const auto instance_matrix = volume->get_instance_transformation().get_matrix_no_offset();
1934 auto volume_trafo = instance_matrix * volume->get_volume_transformation().get_matrix();
1935 ret.merge(volume->transformed_convex_hull_bounding_box(cut_matrix * volume_trafo));
1936 }
1937 }
1938 return ret;
1939}

References Slic3r::GUI::Selection::get_first_volume(), Slic3r::GLVolume::get_instance_transformation(), Slic3r::Geometry::Transformation::get_matrix(), Slic3r::Geometry::Transformation::get_matrix_no_offset(), Slic3r::GUI::Selection::get_volume(), Slic3r::GUI::Selection::get_volume_idxs(), Slic3r::GLVolume::get_volume_transformation(), Slic3r::GLVolume::is_sla_pad(), Slic3r::GLVolume::is_sla_support(), Slic3r::GUI::GLGizmoBase::m_parent, Slic3r::BoundingBox3Base< PointType >::merge(), Slic3r::GLVolume::transformed_convex_hull_bounding_box(), Slic3r::Geometry::translation_transform(), and Z.

Referenced by dragging_grabber_rotation(), flip_cut_plane(), on_load(), on_set_state(), process_cut_line(), reset_cut_plane(), and update_bb().

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

◆ unproject_on_cut_plane()

bool Slic3r::GUI::GLGizmoCut3D::unproject_on_cut_plane ( const Vec2d & mouse_pos,
Vec3d & pos,
Vec3d & pos_world,
bool respect_contours = true )
3695{
3696 const float sla_shift = m_c->selection_info()->get_sla_shift();
3697
3698 const ModelObject* mo = m_c->selection_info()->model_object();
3699 const ModelInstance* mi = mo->instances[m_c->selection_info()->get_active_instance()];
3700 const Camera& camera = wxGetApp().plater()->get_camera();
3701
3702 // Calculate intersection with the clipping plane.
3703 const ClippingPlane* cp = m_c->object_clipper()->get_clipping_plane(true);
3704 Vec3d point;
3705 Vec3d direction;
3706 Vec3d hit;
3707 MeshRaycaster::line_from_mouse_pos(mouse_position, Transform3d::Identity(), camera, point, direction);
3708 Vec3d normal = -cp->get_normal().cast<double>();
3709 double den = normal.dot(direction);
3710 if (den != 0.) {
3711 double t = (-cp->get_offset() - normal.dot(point))/den;
3712 hit = (point + t * direction);
3713 } else
3714 return false;
3715
3716 // Now check if the hit is not obscured by a selected part on this side of the plane.
3717 // FIXME: This would be better solved by remembering which contours are active. We will
3718 // probably need that anyway because there is not other way to find out which contours
3719 // to render. If you want to uncomment it, fix it first. It does not work yet.
3720 /*for (size_t id = 0; id < m_part_selection.parts.size(); ++id) {
3721 if (! m_part_selection.parts[id].selected) {
3722 Vec3f pos, normal;
3723 const ModelObject* model_object = m_part_selection.model_object;
3724 const Vec3d volume_offset = m_part_selection.model_object->volumes[id]->get_offset();
3725 Transform3d tr = model_object->instances[m_part_selection.instance_idx]->get_matrix() * model_object->volumes[id]->get_matrix();
3726 if (m_part_selection.parts[id].raycaster.unproject_on_mesh(mouse_position, tr, camera, pos, normal))
3727 return false;
3728 }
3729 }*/
3730
3731 if (respect_contours)
3732 {
3733 // Do not react to clicks outside a contour (or inside a contour that is ignored)
3734 int cont_id = m_c->object_clipper()->is_projection_inside_cut(hit);
3735 if (cont_id == -1)
3736 return false;
3737 if (m_part_selection.valid()) {
3738 const std::vector<size_t>& ign = *m_part_selection.get_ignored_contours_ptr();
3739 if (std::find(ign.begin(), ign.end(), cont_id) != ign.end())
3740 return false;
3741 }
3742 }
3743
3744
3745 // recalculate hit to object's local position
3746 Vec3d hit_d = hit;
3747 hit_d -= mi->get_offset();
3748 hit_d[Z] -= sla_shift;
3749
3750 // Return both the point and the facet normal.
3751 pos = hit_d;
3752 pos_world = hit;
3753
3754 return true;
3755}

References Slic3r::GUI::ClippingPlane::get_normal(), Slic3r::GUI::ClippingPlane::get_offset(), Slic3r::ModelInstance::get_offset(), Slic3r::ModelObject::instances, Slic3r::GUI::MeshRaycaster::line_from_mouse_pos(), Slic3r::GUI::GLGizmoBase::m_c, m_part_selection, Slic3r::normal(), and Z.

Referenced by add_connector(), dragging_connector(), and on_mouse().

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

◆ unregister_grabbers_for_picking()

void Slic3r::GUI::GLGizmoBase::unregister_grabbers_for_picking ( )
protectedinherited
406{
407 for (size_t i = 0; i < m_grabbers.size(); ++i) {
408 m_grabbers[i].unregister_raycasters_for_picking();
409 }
410}

References m_grabbers.

Referenced by unregister_raycasters_for_picking().

Here is the caller graph for this function:

◆ unregister_raycasters_for_picking()

void Slic3r::GUI::GLGizmoBase::unregister_raycasters_for_picking ( )
inlineinherited
virtual void on_unregister_raycasters_for_picking()
Definition GLGizmoBase.hpp:268
void unregister_grabbers_for_picking()
Definition GLGizmoBase.cpp:405

References on_unregister_raycasters_for_picking(), and unregister_grabbers_for_picking().

Referenced by Slic3r::GUI::GLGizmosManager::activate_gizmo(), and Slic3r::GUI::GLCanvas3D::reload_scene().

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

◆ unselect_all_connectors()

void Slic3r::GUI::GLGizmoCut3D::unselect_all_connectors ( )
protected
2401{
2402 std::fill(m_selected.begin(), m_selected.end(), false);
2403 m_selected_count = 0;
2405}
void validate_connector_settings()
Definition GLGizmoCut.cpp:3061

References m_selected, m_selected_count, and validate_connector_settings().

Referenced by add_connector(), gizmo_event(), is_selection_changed(), on_mouse(), and render_connectors_input_window().

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

◆ update_bb()

void Slic3r::GUI::GLGizmoCut3D::update_bb ( )
private
1942{
1943 const BoundingBoxf3 box = bounding_box();
1944 if (!box.defined)
1945 return;
1946 if (!m_max_pos.isApprox(box.max) || !m_min_pos.isApprox(box.min)) {
1947
1948 m_bounding_box = box;
1949
1950 // check, if mode is set to Planar, when object has a connectors
1951 if (const int object_idx = m_parent.get_selection().get_object_idx();
1952 object_idx >= 0 && !wxGetApp().plater()->model().objects[object_idx]->cut_connectors.empty())
1953 m_mode = size_t(CutMode::cutPlanar);
1954
1958
1959 m_max_pos = box.max;
1960 m_min_pos = box.min;
1961 m_bb_center = box.center();
1963 if (box.contains(m_center_offset))
1965 else
1967
1969
1970 m_radius = box.radius();
1971 m_grabber_connection_len = 0.5 * m_radius;// std::min<double>(0.75 * m_radius, 35.0);
1973
1978
1979 // input params for cut with tongue and groove
1980 m_groove.depth = m_groove.depth_init = std::max(1.f , 0.5f * float(get_grabber_mean_size(m_bounding_box)));
1981 m_groove.width = m_groove.width_init = 4.0f * m_groove.depth;
1982 m_groove.flaps_angle = m_groove.flaps_angle_init = float(PI) / 3.f;
1983 m_groove.angle = m_groove.angle_init = 0.f;
1984 m_plane.reset();
1985 m_cone.reset();
1986 m_sphere.reset();
1987 m_cube.reset();
1988 m_grabber_connection.reset();
1989 m_circle.reset();
1990 m_scale.reset();
1991 m_snap_radii.reset();
1992 m_reference_radius.reset();
1993
1995
1997 if (CommonGizmosDataObjects::SelectionInfo* selection = m_c->selection_info();
1998 selection && selection->model_object())
1999 m_selected.resize(selection->model_object()->cut_connectors.size(), false);
2000 }
2001}
BoundingBoxf3 bounding_box() const
Definition GLGizmoCut.cpp:1902
void invalidate_cut_plane()
Definition GLGizmoCut.cpp:2550

References apply_color_clip_plane_colors(), bounding_box(), Slic3r::BoundingBox3Base< PointType >::center(), clear_selection(), Slic3r::BoundingBox3Base< PointType >::contains(), cutPlanar, cutTongueAndGroove, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::defined, Slic3r::GUI::get_grabber_mean_size(), invalidate_cut_plane(), m_bb_center, m_bounding_box, Slic3r::GUI::GLGizmoBase::m_c, m_center_offset, m_circle, m_cone, m_contour_width, m_cube, m_grabber_connection, m_grabber_connection_len, m_grabber_radius, m_groove, m_max_pos, m_min_pos, m_mode, Slic3r::GUI::GLGizmoBase::m_parent, m_plane, m_radius, m_reference_radius, m_scale, m_selected, m_snap_coarse_in_radius, m_snap_coarse_out_radius, m_snap_fine_in_radius, m_snap_fine_out_radius, m_snap_radii, m_sphere, m_transformed_bounding_box, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::max, Slic3r::BoundingBoxBase< PointType, std::vector< PointType > >::min, on_unregister_raycasters_for_picking(), PI, Slic3r::GUI::plater(), Slic3r::BoundingBox3Base< PointType >::radius(), reset_cut_by_contours(), set_center_pos(), and transformed_bounding_box().

Referenced by data_changed(), and on_set_state().

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

◆ update_clipper()

void Slic3r::GUI::GLGizmoCut3D::update_clipper ( )
504{
505 // update cut_normal
506 Vec3d normal = m_rotation_m * Vec3d::UnitZ();
507 normal.normalize();
509
510 // calculate normal and offset for clipping plane
511 Vec3d beg = m_bb_center;
512 beg[Z] -= m_radius;
514
516 double offset = normal.dot(m_plane_center);
517 double dist = normal.dot(beg);
518
519 m_parent.set_color_clip_plane(normal, offset);
520
521 if (!is_looking_forward()) {
522 // recalculate normal and offset for clipping plane, if camera is looking downward to cut plane
523 normal = m_rotation_m * (-1. * Vec3d::UnitZ());
524 normal.normalize();
525
526 beg = m_bb_center;
527 beg[Z] += m_radius;
529
532 dist = normal.dot(beg);
533 }
534
535 m_c->object_clipper()->set_range_and_pos(normal, offset, dist);
536
538
539 if (m_raycasters.empty())
541 else
543}
void rotate_vec3d_around_plane_center(Vec3d &vec)
Definition GLGizmoCut.cpp:471
void put_connectors_on_cut_plane(const Vec3d &cp_normal, double cp_offset)
Definition GLGizmoCut.cpp:476
virtual void on_register_raycasters_for_picking() override
Definition GLGizmoCut.cpp:1488
T dist(const boost::polygon::point_data< T > &p1, const boost::polygon::point_data< T > &p2)
Definition Geometry.cpp:298

References Slic3r::Geometry::dist(), is_looking_forward(), m_bb_center, Slic3r::GUI::GLGizmoBase::m_c, m_clp_normal, m_cut_normal, Slic3r::GUI::GLGizmoBase::m_parent, m_plane_center, m_radius, m_raycasters, m_rotation_m, Slic3r::normal(), Slic3r::offset(), on_register_raycasters_for_picking(), put_connectors_on_cut_plane(), rotate_vec3d_around_plane_center(), update_raycasters_for_picking_transform(), and Z.

Referenced by dragging_grabber_rotation(), flip_cut_plane(), on_render(), and set_center().

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

◆ update_connector_shape()

void Slic3r::GUI::GLGizmoCut3D::update_connector_shape ( )
private
3789{
3791
3793 indexed_triangle_set its = get_connector_mesh(attribs);
3794 m_shapes[attribs].reset();
3795 m_shapes[attribs].model.init_from(its);
3796 m_shapes[attribs].mesh_raycaster = std::make_unique<MeshRaycaster>(std::make_shared<const TriangleMesh>(std::move(its)));
3797
3798 //const indexed_triangle_set its = get_connector_mesh(attribs);
3799 //m_connector_mesh.clear();
3800 //m_connector_mesh = TriangleMesh(its);
3801 }
3802
3803
3804}

References get_connector_mesh(), m_connector_shape_id, m_connector_style, m_connector_type, m_shapes, and Slic3r::Snap.

Referenced by render_snap_specific_input().

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

◆ update_items_state()

bool Slic3r::GUI::GLGizmoBase::update_items_state ( )
inherited
361{
362 bool res = m_dirty;
363 m_dirty = false;
364 return res;
365}

References m_dirty.

◆ update_plane_model()

void Slic3r::GUI::GLGizmoCut3D::update_plane_model ( )
protected
1658{
1659 m_plane.reset();
1661
1663}

References init_picking_models(), m_plane, and on_unregister_raycasters_for_picking().

Referenced by on_load(), render_groove_angle_input(), render_groove_float_input(), render_groove_int_input(), render_groove_two_float_input(), and switch_to_mode().

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

◆ update_raycasters_for_picking()

void Slic3r::GUI::GLGizmoCut3D::update_raycasters_for_picking ( )
protected

References on_register_raycasters_for_picking(), and on_unregister_raycasters_for_picking().

Referenced by add_connector(), delete_selected_connectors(), render_snap_specific_input(), reset_connectors(), set_connectors_editing(), and switch_to_mode().

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

◆ update_raycasters_for_picking_transform()

void Slic3r::GUI::GLGizmoCut3D::update_raycasters_for_picking_transform ( )
protected
1563{
1565 CommonGizmosDataObjects::SelectionInfo* si = m_c->selection_info();
1566 if (!si)
1567 return;
1568 const ModelObject* mo = si->model_object();
1569 const CutConnectors& connectors = mo->cut_connectors;
1570 if (connectors.empty())
1571 return;
1572 auto inst_id = m_c->selection_info()->get_active_instance();
1573 if (inst_id < 0)
1574 return;
1575
1576 const Vec3d& instance_offset = mo->instances[inst_id]->get_offset();
1577 const double sla_shift = double(m_c->selection_info()->get_sla_shift());
1578
1579 const bool looking_forward = is_looking_forward();
1580
1581 for (size_t i = 0; i < connectors.size(); ++i) {
1582 const CutConnector& connector = connectors[i];
1583
1584 float height = connector.height;
1585 // recalculate connector position to world position
1586 Vec3d pos = connector.pos + instance_offset;
1587 if (connector.attribs.type == CutConnectorType::Dowel &&
1588 connector.attribs.style == CutConnectorStyle::Prism) {
1589 height = 0.05f;
1590 if (!looking_forward)
1591 pos += 0.05 * m_clp_normal;
1592 }
1593 pos[Z] += sla_shift;
1594
1595 const Transform3d scale_trafo = scale_transform(Vec3f(connector.radius, connector.radius, height).cast<double>());
1596 m_raycasters[i]->set_transform(translation_transform(pos) * m_rotation_m * scale_trafo);
1597 }
1598 }
1599 else if (!cut_line_processing()){
1601
1602 const BoundingBoxf3 box = m_bounding_box;
1603
1604 const double size = get_half_size(get_grabber_mean_size(box));
1605 Vec3d scale = Vec3d(0.75 * size, 0.75 * size, 1.8 * size);
1606
1607 int id = 0;
1608
1609 Vec3d offset = Vec3d(0.0, 1.25 * size, m_grabber_connection_len);
1610 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitX()) * scale_transform(scale));
1611 offset = Vec3d(0.0, -1.25 * size, m_grabber_connection_len);
1612 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitX()) * scale_transform(scale));
1613
1614 offset = Vec3d(1.25 * size, 0.0, m_grabber_connection_len);
1615 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitY()) * scale_transform(scale));
1616 offset = Vec3d(-1.25 * size, 0.0, m_grabber_connection_len);
1617 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitY()) * scale_transform(scale));
1618
1619 m_raycasters[id++]->set_transform(trafo * translation_transform(m_grabber_connection_len * Vec3d::UnitZ()) * scale_transform(size));
1620
1621 m_raycasters[id++]->set_transform(trafo);
1622
1624
1625 double grabber_y_shift = -1.75 * m_grabber_connection_len;
1626
1627 m_raycasters[id++]->set_transform(trafo * translation_transform(grabber_y_shift * Vec3d::UnitY()) * scale_transform(size));
1628
1629 offset = Vec3d(1.25 * size, grabber_y_shift, 0.0);
1630 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitY()) * scale_transform(scale));
1631 offset = Vec3d(-1.25 * size, grabber_y_shift, 0.0);
1632 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitY()) * scale_transform(scale));
1633
1634 const double xy_connection_len = 0.75 * m_grabber_connection_len;
1635 const Vec3d cone_scale = Vec3d(0.5 * size, 0.5 * size, 1.8 * size);
1636
1637 offset = xy_connection_len * Vec3d::UnitX() - 0.5 * size * Vec3d::Ones();
1638 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * scale_transform(size));
1639 offset = (size + xy_connection_len) * Vec3d::UnitX();
1640 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(0.5 * PI * Vec3d::UnitY()) * scale_transform(cone_scale));
1641
1642 if (m_groove.angle > 0.0f) {
1643 offset = xy_connection_len * Vec3d::UnitY() - 0.5 * size * Vec3d::Ones();
1644 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * scale_transform(size));
1645 offset = (size + xy_connection_len) * Vec3d::UnitY();
1646 m_raycasters[id++]->set_transform(trafo * translation_transform(offset) * rotation_transform(-0.5 * PI * Vec3d::UnitX()) * scale_transform(cone_scale));
1647 }
1648 else {
1649 // discard transformation for CutPlaneYMove grabbers
1650 m_raycasters[id++]->set_transform(Transform3d::Identity());
1651 m_raycasters[id++]->set_transform(Transform3d::Identity());
1652 }
1653 }
1654 }
1655}
int scale(const int val)
Definition WipeTowerDialog.cpp:58

References Slic3r::CutConnector::attribs, Slic3r::ModelObject::cut_connectors, cut_line_processing(), cutTongueAndGroove, Slic3r::Dowel, Slic3r::GUI::get_grabber_mean_size(), Slic3r::GUI::get_half_size(), Slic3r::CutConnector::height, Slic3r::ModelObject::instances, is_looking_forward(), m_bounding_box, Slic3r::GUI::GLGizmoBase::m_c, m_clp_normal, m_connectors_editing, m_grabber_connection_len, m_groove, m_mode, m_plane_center, m_raycasters, m_rotation_m, Slic3r::GUI::CommonGizmosDataObjects::SelectionInfo::model_object(), Slic3r::offset(), PI, Slic3r::CutConnector::pos, Slic3r::Prism, Slic3r::CutConnector::radius, Slic3r::Geometry::rotation_transform(), scale(), Slic3r::Geometry::scale_transform(), Slic3r::CutConnectorAttributes::style, Slic3r::Geometry::translation_transform(), Slic3r::CutConnectorAttributes::type, and Z.

Referenced by apply_selected_connectors(), dragging_connector(), on_register_raycasters_for_picking(), and update_clipper().

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

◆ update_render_colors()

void Slic3r::GUI::GLGizmoBase::update_render_colors ( )
staticinherited

References AXES_COLOR, Slic3r::RenderColor::colors, FLATTEN_COLOR, FLATTEN_HOVER_COLOR, Slic3r::GUI::ImGuiWrapper::from_ImVec4(), RenderCol_Flatten_Plane, RenderCol_Flatten_Plane_Hover, RenderCol_Grabber_X, RenderCol_Grabber_Y, and RenderCol_Grabber_Z.

Referenced by Slic3r::GUI::GLCanvas3D::_render_style_editor().

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

◆ use_grabbers()

bool Slic3r::GUI::GLGizmoBase::use_grabbers ( const wxMouseEvent & mouse_event)
protectedinherited

function which Set up m_dragging and call functions on_start_dragging / on_dragging / on_stop_dragging

Parameters
mouse_eventKeep information about mouse click
Returns
same as on_mouse
444 {
445 bool is_dragging_finished = false;
446 if (mouse_event.Moving()) {
447 // it should not happen but for sure
448 assert(!m_dragging);
449 if (m_dragging) is_dragging_finished = true;
450 else return false;
451 }
452
453 if (mouse_event.LeftDown()) {
454 Selection &selection = m_parent.get_selection();
455 if (!selection.is_empty() && m_hover_id != -1 /* &&
456 (m_grabbers.empty() || m_hover_id < static_cast<int>(m_grabbers.size()))*/) {
457 selection.setup_cache();
458
459 m_dragging = true;
460 for (auto &grabber : m_grabbers) grabber.dragging = false;
461// if (!m_grabbers.empty() && m_hover_id < int(m_grabbers.size()))
462// m_grabbers[m_hover_id].dragging = true;
463
465
466 // Let the plater know that the dragging started
467 m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_STARTED));
468 m_parent.set_as_dirty();
469 return true;
470 }
471 } else if (m_dragging) {
472 // when mouse cursor leave window than finish actual dragging operation
473 bool is_leaving = mouse_event.Leaving() && !m_parent.has_mouse_capture(); // ORCA keep tracking mouse position while drag active and cursor not in window bounds
474 if (mouse_event.Dragging()) {
475 Point mouse_coord(mouse_event.GetX(), mouse_event.GetY());
476 auto ray = m_parent.mouse_ray(mouse_coord);
477 UpdateData data(ray, mouse_coord);
478
479 on_dragging(data);
480
481 wxGetApp().obj_manipul()->set_dirty();
482 m_parent.set_as_dirty();
483 return true;
484 }
485 else if (mouse_event.LeftUp() || is_leaving || is_dragging_finished) {
486 do_stop_dragging(is_leaving);
487 return true;
488 }
489 }
490 return false;
491}
virtual void on_dragging(const UpdateData &data)
Definition GLGizmoBase.hpp:255
virtual void on_start_dragging()
Definition GLGizmoBase.hpp:253
void do_stop_dragging(bool perform_mouse_cleanup)
Definition GLGizmoBase.cpp:493
Kernel::Point_3 Point
Definition MeshRepair.cpp:81
Definition GLGizmoBase.hpp:133

References do_stop_dragging(), Slic3r::GUI::Selection::is_empty(), m_dragging, m_grabbers, m_hover_id, m_parent, on_dragging(), on_start_dragging(), Slic3r::GUI::Selection::setup_cache(), and Slic3r::GUI::wxMouseEvent.

Referenced by Slic3r::GUI::GLGizmoBrimEars::on_mouse(), Slic3r::GUI::GLGizmoCut3D::on_mouse(), Slic3r::GUI::GLGizmoMove3D::on_mouse(), Slic3r::GUI::GLGizmoRotate3D::on_mouse(), Slic3r::GUI::GLGizmoRotate::on_mouse(), Slic3r::GUI::GLGizmoScale3D::on_mouse(), Slic3r::GUI::GLGizmoEmboss::on_mouse_for_rotation(), and Slic3r::GUI::GLGizmoSVG::on_mouse_for_rotation().

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

◆ validate_connector_settings()

void Slic3r::GUI::GLGizmoCut3D::validate_connector_settings ( )
private

◆ wants_enter_leave_snapshots()

bool Slic3r::GUI::GLGizmoCut3D::wants_enter_leave_snapshots ( ) const
inlineoverrideprotectedvirtual

Reimplemented from Slic3r::GUI::GLGizmoBase.

348{ return true; }

Member Data Documentation

◆ AXES_COLOR

◆ AXES_HOVER_COLOR

std::array< ColorRGBA, 3 > Slic3r::GUI::GLGizmoBase::AXES_HOVER_COLOR
staticinherited
Initial value:
= {{
{ColorRGBA::X().r() * 1.2f, ColorRGBA::X().g() * 1.4f, ColorRGBA::X().b() * 1.4f, 1.0f},
{ColorRGBA::Y().r() * 1.2f, ColorRGBA::Y().g() * 1.2f, ColorRGBA::Y().b() * 1.2f, 1.0f},
{ColorRGBA::Z().r() * 1.2f, ColorRGBA::Z().g() * 1.2f, ColorRGBA::Z().b() * 1.2f, 1.0f},
}}
float b() const
Definition Color.hpp:107
float r() const
Definition Color.hpp:105
float g() const
Definition Color.hpp:106

Referenced by Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoRotate::on_render(), and Slic3r::GUI::GLGizmoScale3D::update_grabbers_data().

◆ BASE_ID

const unsigned int Slic3r::GUI::GLGizmoBase::BASE_ID = 255 * 255 * 254
staticinherited

◆ CONSTRAINED_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::CONSTRAINED_COLOR = {0.5f, 0.5f, 0.5f, 1.0f}
staticinherited

◆ count

◆ DEFAULT_BASE_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::DEFAULT_BASE_COLOR = { 0.625f, 0.625f, 0.625f, 1.0f }
staticinherited

◆ DEFAULT_DRAG_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::DEFAULT_DRAG_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }
staticinherited

◆ DEFAULT_HIGHLIGHT_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::DEFAULT_HIGHLIGHT_COLOR = {1.0f, 0.38f, 0.0f, 1.0f}
staticinherited

◆ FLATTEN_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::FLATTEN_COLOR = {0.96f, 0.93f, 0.93f, 0.5f}
staticinherited

◆ FLATTEN_HOVER_COLOR

ColorRGBA Slic3r::GUI::GLGizmoBase::FLATTEN_HOVER_COLOR = {1.0f, 1.0f, 1.0f, 0.75f}
staticinherited

◆ GRABBER_ELEMENTS_MAX_COUNT

const unsigned int Slic3r::GUI::GLGizmoBase::GRABBER_ELEMENTS_MAX_COUNT = 7
staticinherited

◆ GRABBER_HOVER_COL

ColorRGBA Slic3r::GUI::GLGizmoBase::GRABBER_HOVER_COL = {0.863f, 0.125f, 0.063f, 1.0f}
staticinherited

◆ GRABBER_NORMAL_COL

ColorRGBA Slic3r::GUI::GLGizmoBase::GRABBER_NORMAL_COL = {1.0f, 1.0f, 1.0f, 1.0f}
staticinherited

◆ GRABBER_UNIFORM_COL

ColorRGBA Slic3r::GUI::GLGizmoBase::GRABBER_UNIFORM_COL = {0, 1.0, 1.0, 1.0f}
staticinherited

◆ GRABBER_UNIFORM_HOVER_COL

ColorRGBA Slic3r::GUI::GLGizmoBase::GRABBER_UNIFORM_HOVER_COL = {0, 0.7, 0.7, 1.0f}
staticinherited

◆ INV_ZOOM

◆ last_input_window_width

float Slic3r::GUI::GLGizmoBase::last_input_window_width = 0
protectedinherited

◆ m_angle

double Slic3r::GUI::GLGizmoCut3D::m_angle { 0.0 }
private

◆ m_angle_arc

GLModel Slic3r::GUI::GLGizmoCut3D::m_angle_arc
private

◆ m_ar_plane_center

Vec3d Slic3r::GUI::GLGizmoCut3D::m_ar_plane_center { Vec3d::Zero() }
private

◆ m_axis_names

std::vector<std::string> Slic3r::GUI::GLGizmoCut3D::m_axis_names
private

◆ m_bb_center

Vec3d Slic3r::GUI::GLGizmoCut3D::m_bb_center { Vec3d::Zero() }
private

◆ m_bounding_box

◆ m_c

CommonGizmosDataPool* Slic3r::GUI::GLGizmoBase::m_c { nullptr }
protectedinherited
155{ nullptr };

Referenced by Slic3r::GUI::GLGizmoTextureDisplacement::apply_projection_frame(), Slic3r::GUI::GLGizmoTextureDisplacement::bake(), Slic3r::GUI::GLGizmoTextureDisplacement::capture_view_projection(), Slic3r::GUI::GLGizmoCut3D::check_and_update_connectors_state(), Slic3r::GUI::GLGizmoBrimEars::data_changed(), Slic3r::GUI::GLGizmoCut3D::data_changed(), Slic3r::GUI::GLGizmoMmuSegmentation::data_changed(), Slic3r::GUI::GLGizmoPainterBase::data_changed(), Slic3r::GUI::GLGizmoCut3D::dragging_connector(), Slic3r::GUI::GLGizmoMeshBoolean::generate_new_volume(), Slic3r::GUI::GLGizmoPainterBase::get_clipping_plane_data(), Slic3r::GUI::GLGizmoPainterBase::get_clipping_plane_in_volume_coordinates(), Slic3r::GUI::GLGizmoBrimEars::get_config_options(), Slic3r::GUI::GLGizmoPainterBase::get_projected_height_range(), Slic3r::GUI::GLGizmoPainterBase::get_projected_mouse_positions(), Slic3r::GUI::GLGizmoFdmSupports::get_selection_support_threshold_angle(), Slic3r::GUI::GLGizmoBrimEars::gizmo_event(), Slic3r::GUI::GLGizmoCut3D::gizmo_event(), Slic3r::GUI::GLGizmoMeshBoolean::gizmo_event(), Slic3r::GUI::GLGizmoPainterBase::gizmo_event(), Slic3r::GUI::GLGizmoCut3D::has_valid_contour(), Slic3r::GUI::GLGizmoSimplify::init_model(), Slic3r::GUI::GLGizmoMmuSegmentation::init_model_triangle_selectors(), Slic3r::GUI::GLGizmoFdmSupports::init_print_instance(), Slic3r::GUI::GLGizmoBrimEars::is_mesh_point_clipped(), Slic3r::GUI::GLGizmoPainterBase::is_mesh_point_clipped(), Slic3r::GUI::GLGizmoCut3D::is_outside_of_cut_contour(), Slic3r::GUI::GLGizmoFlatten::is_plane_update_necessary(), Slic3r::GUI::GLGizmoPainterBase::mesh_trafo_matrices(), Slic3r::GUI::GLGizmoFdmSupports::need_regenerate_support_volumes(), Slic3r::GUI::GLGizmoMeshBoolean::on_get_requirements(), Slic3r::GUI::GLGizmoMeshBoolean::on_load(), Slic3r::GUI::GLGizmoTextureDisplacement::on_mouse_adjust_texture(), Slic3r::GUI::GLGizmoCut3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoBrimEars::on_render(), Slic3r::GUI::GLGizmoMeshBoolean::on_render(), Slic3r::GUI::GLGizmoBrimEars::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_render_input_window(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_set_state(), Slic3r::GUI::GLGizmoFdmSupports::on_set_state(), Slic3r::GUI::GLGizmoMmuSegmentation::on_set_state(), Slic3r::GUI::GLGizmoSeam::on_set_state(), Slic3r::GUI::GLGizmoTextureDisplacement::preview_part(), Slic3r::GUI::GLGizmoCut3D::process_contours(), Slic3r::GUI::GLGizmoCut3D::process_selection_rectangle(), Slic3r::GUI::GLGizmoCut3D::put_connectors_on_cut_plane(), Slic3r::GUI::GLGizmoTextureDisplacement::queue_prepare(), Slic3r::GUI::GLGizmoBrimEars::reload_cache(), Slic3r::GUI::GLGizmoMmuSegmentation::remap_filament_assignments(), Slic3r::GUI::GLGizmoTextureDisplacement::render_adjust_texture_gizmo(), Slic3r::GUI::GLGizmoCut3D::render_clipper_cut(), Slic3r::GUI::GLGizmoCut3D::render_connectors(), Slic3r::GUI::GLGizmoCut3D::render_debug_input_window(), Slic3r::GUI::GLGizmoPainterBase::render_follows_cursor(), Slic3r::GUI::GLGizmoTextureDisplacement::render_island_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_paint_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painted_colors(), Slic3r::GUI::GLGizmoFdmSupports::render_painter_gizmo(), Slic3r::GUI::GLGizmoFuzzySkin::render_painter_gizmo(), Slic3r::GUI::GLGizmoMmuSegmentation::render_painter_gizmo(), Slic3r::GUI::GLGizmoSeam::render_painter_gizmo(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painter_gizmo(), Slic3r::GUI::GLGizmoBrimEars::render_points(), Slic3r::GUI::GLGizmoTextureDisplacement::render_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_seam_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_shaded_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_subdivide_preview(), Slic3r::GUI::GLGizmoPainterBase::render_triangles(), Slic3r::GUI::GLGizmoTextureDisplacement::render_uvcheck_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_wireframe_overlay(), Slic3r::GUI::GLGizmoCut3D::reset_connectors(), Slic3r::GUI::GLGizmoFdmSupports::run_thread(), Slic3r::GUI::GLGizmoTextureDisplacement::seam_edge_at(), Slic3r::GUI::GLGizmoTextureDisplacement::seam_vertex_at(), Slic3r::GUI::GLGizmoFdmSupports::select_facets_by_angle(), Slic3r::GUI::GLGizmoTextureDisplacement::select_visible_faces(), Slic3r::GUI::GLGizmoTextureDisplacement::select_whole_model(), Slic3r::GUI::GLGizmoBrimEars::set_brim_data(), set_common_data_pool(), Slic3r::GUI::GLGizmoCut3D::set_connectors_editing(), Slic3r::GUI::GLGizmoTextureDisplacement::shaded_preview_ready(), Slic3r::GUI::GLGizmoTextureDisplacement::smooth_model(), Slic3r::GUI::GLGizmoTextureDisplacement::subdivide_model(), Slic3r::GUI::GLGizmoTextureDisplacement::swap_layer_slots(), Slic3r::GUI::GLGizmoCut3D::switch_to_mode(), Slic3r::GUI::GLGizmoTextureDisplacement::texture_parts(), Slic3r::GUI::GLGizmoTextureDisplacement::texture_volume(), Slic3r::GUI::GLGizmoTextureDisplacement::texture_volume_raycaster_index(), Slic3r::GUI::GLGizmoCut3D::unproject_on_cut_plane(), Slic3r::GUI::GLGizmoBrimEars::unproject_on_mesh(), Slic3r::GUI::GLGizmoBrimEars::unproject_on_mesh2(), Slic3r::GUI::GLGizmoCut3D::update_bb(), Slic3r::GUI::GLGizmoCut3D::update_clipper(), Slic3r::GUI::GLGizmoFdmSupports::update_from_model_object(), Slic3r::GUI::GLGizmoFuzzySkin::update_from_model_object(), Slic3r::GUI::GLGizmoSeam::update_from_model_object(), Slic3r::GUI::GLGizmoTextureDisplacement::update_from_model_object(), Slic3r::GUI::GLGizmoBrimEars::update_model_object(), Slic3r::GUI::GLGizmoFdmSupports::update_model_object(), Slic3r::GUI::GLGizmoFuzzySkin::update_model_object(), Slic3r::GUI::GLGizmoMmuSegmentation::update_model_object(), Slic3r::GUI::GLGizmoSeam::update_model_object(), Slic3r::GUI::GLGizmoTextureDisplacement::update_model_object(), Slic3r::GUI::GLGizmoFlatten::update_planes(), Slic3r::GUI::GLGizmoPainterBase::update_raycast_cache(), and Slic3r::GUI::GLGizmoCut3D::update_raycasters_for_picking_transform().

◆ m_center_offset

Vec3d Slic3r::GUI::GLGizmoCut3D::m_center_offset { Vec3d::Zero() }
private
66{ Vec3d::Zero() };

Referenced by invalidate_cut_plane(), set_center_pos(), and update_bb().

◆ m_circle

GLModel Slic3r::GUI::GLGizmoCut3D::m_circle
private

◆ m_clp_normal

Vec3d Slic3r::GUI::GLGizmoCut3D::m_clp_normal { Vec3d::Ones() }
private

◆ m_cone

◆ m_connector_angle

float Slic3r::GUI::GLGizmoCut3D::m_connector_angle { 0.f }
private

◆ m_connector_depth_ratio

float Slic3r::GUI::GLGizmoCut3D::m_connector_depth_ratio { 3.f }
private

◆ m_connector_depth_ratio_tolerance

float Slic3r::GUI::GLGizmoCut3D::m_connector_depth_ratio_tolerance { 0.1f }
private

◆ m_connector_mesh

TriangleMesh Slic3r::GUI::GLGizmoCut3D::m_connector_mesh
private

◆ m_connector_mode

◆ m_connector_modes

std::vector<std::string> Slic3r::GUI::GLGizmoCut3D::m_connector_modes
private

◆ m_connector_shape_id

◆ m_connector_shapes

std::vector<std::string> Slic3r::GUI::GLGizmoCut3D::m_connector_shapes
private

◆ m_connector_size

float Slic3r::GUI::GLGizmoCut3D::m_connector_size { 2.5f }
private

◆ m_connector_size_tolerance

float Slic3r::GUI::GLGizmoCut3D::m_connector_size_tolerance { 0.f }
private

◆ m_connector_style

◆ m_connector_styles

std::vector<std::string> Slic3r::GUI::GLGizmoCut3D::m_connector_styles
private

◆ m_connector_type

◆ m_connector_types

std::vector<std::string> Slic3r::GUI::GLGizmoCut3D::m_connector_types
private

◆ m_connectors_editing

◆ m_connectors_group_id

◆ m_contour_width

float Slic3r::GUI::GLGizmoCut3D::m_contour_width { 0.4f }
private

◆ m_control_width

◆ m_cube

◆ m_cut_line

GLModel Slic3r::GUI::GLGizmoCut3D::m_cut_line
private

Referenced by render_cut_line().

◆ m_cut_normal

Vec3d Slic3r::GUI::GLGizmoCut3D::m_cut_normal
private

◆ m_cut_plane_as_circle

bool Slic3r::GUI::GLGizmoCut3D::m_cut_plane_as_circle { false }
private
151{ false };

Referenced by init_picking_models(), and render_debug_input_window().

◆ m_cut_plane_radius_koef

float Slic3r::GUI::GLGizmoCut3D::m_cut_plane_radius_koef { 1.5f }
private
166{ 1.5f };

Referenced by init_picking_models(), and render_debug_input_window().

◆ m_cut_plane_start_move_pos

Vec3d Slic3r::GUI::GLGizmoCut3D::m_cut_plane_start_move_pos {Vec3d::Zero()}
private
75{Vec3d::Zero()};

Referenced by dragging_grabber_move(), and on_mouse().

◆ m_dirty

bool Slic3r::GUI::GLGizmoBase::m_dirty { false }
privateinherited
293{ false };

Referenced by set_dirty(), and update_items_state().

◆ m_dragging

◆ m_editing_window_width

◆ m_first_input_window_render

bool Slic3r::GUI::GLGizmoBase::m_first_input_window_render { true }
protectedinherited
154{ true };

Referenced by render_input_window().

◆ m_grabber_connection

GLModel Slic3r::GUI::GLGizmoCut3D::m_grabber_connection
private

◆ m_grabber_connection_len

double Slic3r::GUI::GLGizmoCut3D::m_grabber_connection_len { 0.0 }
private

◆ m_grabber_radius

double Slic3r::GUI::GLGizmoCut3D::m_grabber_radius { 0.0 }
private
73{ 0.0 };

Referenced by init_rendering_items(), and update_bb().

◆ m_grabbers

◆ m_groove

◆ m_groove_count

int Slic3r::GUI::GLGizmoCut3D::m_groove_count { 1 }
private

◆ m_groove_count_init

int Slic3r::GUI::GLGizmoCut3D::m_groove_count_init { 1 }
private
140{ 1 };

Referenced by render_cut_plane_input_window().

◆ m_groove_editing

bool Slic3r::GUI::GLGizmoCut3D::m_groove_editing { false }
private

◆ m_groove_gap

float Slic3r::GUI::GLGizmoCut3D::m_groove_gap { 10.f }
private
142{ 10.f }; // distance between multiple dovetail cuts

Referenced by its_make_groove_plane(), perform_cut(), process_contours(), and render_cut_plane_input_window().

◆ m_groove_gap_init

float Slic3r::GUI::GLGizmoCut3D::m_groove_gap_init { 10.f }
private
143{ 10.f };

Referenced by render_cut_plane_input_window().

◆ m_groove_vertices

std::vector<Vec3d> Slic3r::GUI::GLGizmoCut3D::m_groove_vertices
private

◆ m_group_id

int Slic3r::GUI::GLGizmoBase::m_group_id
protectedinherited

◆ m_hide_cut_plane

bool Slic3r::GUI::GLGizmoCut3D::m_hide_cut_plane { false }
private
149{ false };

Referenced by init_picking_models(), on_load(), on_render(), and on_save().

◆ m_hover_id

int Slic3r::GUI::GLGizmoBase::m_hover_id { -1 }
protectedinherited
150{ -1 };

Referenced by Slic3r::GUI::GLGizmoScale3D::calc_ratio(), Slic3r::GUI::GLGizmoScale3D::do_scale_along_axis(), Slic3r::GUI::GLGizmoScale3D::do_scale_uniform(), Slic3r::GUI::GLGizmoCut3D::dragging_connector(), Slic3r::GUI::GLGizmoCut3D::dragging_grabber_move(), Slic3r::GUI::GLGizmoCut3D::dragging_grabber_rotation(), get_hover_id(), Slic3r::GUI::GLGizmoCut3D::get_tooltip(), Slic3r::GUI::GLGizmoMove3D::get_tooltip(), Slic3r::GUI::GLGizmoRotate::get_tooltip(), Slic3r::GUI::GLGizmoScale3D::get_tooltip(), Slic3r::GUI::GLGizmoBrimEars::gizmo_event(), Slic3r::GUI::GLGizmoCut3D::gizmo_event(), Slic3r::GUI::GLGizmoCut3D::is_selection_changed(), Slic3r::GUI::GLGizmoBrimEars::on_dragging(), Slic3r::GUI::GLGizmoCut3D::on_dragging(), Slic3r::GUI::GLGizmoMove3D::on_dragging(), Slic3r::GUI::GLGizmoRotate3D::on_dragging(), Slic3r::GUI::GLGizmoScale3D::on_dragging(), Slic3r::GUI::GLGizmoCut3D::on_mouse(), Slic3r::GUI::GLGizmoFlatten::on_mouse(), Slic3r::GUI::GLGizmoMeasure::on_mouse(), Slic3r::GUI::GLGizmoFlatten::on_render(), Slic3r::GUI::GLGizmoMeasure::on_render(), Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoRotate3D::on_render(), Slic3r::GUI::GLGizmoRotate::on_render(), Slic3r::GUI::GLGizmoScale3D::on_render(), Slic3r::GUI::GLGizmoBrimEars::on_set_hover_id(), Slic3r::GUI::GLGizmoEmboss::on_set_hover_id(), Slic3r::GUI::GLGizmoRotate3D::on_set_hover_id(), Slic3r::GUI::GLGizmoSVG::on_set_hover_id(), Slic3r::GUI::GLGizmoMeasure::on_set_state(), Slic3r::GUI::GLGizmoBrimEars::on_start_dragging(), Slic3r::GUI::GLGizmoCut3D::on_start_dragging(), Slic3r::GUI::GLGizmoMove3D::on_start_dragging(), Slic3r::GUI::GLGizmoRotate3D::on_start_dragging(), Slic3r::GUI::GLGizmoScale3D::on_start_dragging(), Slic3r::GUI::GLGizmoBrimEars::on_stop_dragging(), Slic3r::GUI::GLGizmoCut3D::on_stop_dragging(), Slic3r::GUI::GLGizmoRotate3D::on_stop_dragging(), Slic3r::GUI::GLGizmoCut3D::render_connectors(), Slic3r::GUI::GLGizmoCut3D::render_cut_plane_grabbers(), Slic3r::GUI::GLGizmoCut3D::render_flip_plane_button(), render_grabbers(), Slic3r::GUI::GLGizmoBrimEars::render_points(), set_hover_id(), Slic3r::GUI::GLGizmoMeasure::show_selection_ui(), Slic3r::GUI::GLGizmoScale3D::update_grabbers_data(), and use_grabbers().

◆ m_icon_filename

std::string Slic3r::GUI::GLGizmoBase::m_icon_filename
protectedinherited

◆ m_imgui

ImGuiWrapper* Slic3r::GUI::GLGizmoBase::m_imgui
protectedinherited

Referenced by GLGizmoBase(), Slic3r::GUI::GLGizmoEmboss::GLGizmoEmboss(), Slic3r::GUI::GLGizmoCut3D::add_horizontal_scaled_interval(), Slic3r::GUI::GLGizmoCut3D::add_vertical_scaled_interval(), Slic3r::GUI::GLGizmoSimplify::create_gui_cfg(), Slic3r::GUI::GLGizmoEmboss::draw_advanced(), Slic3r::GUI::GLGizmoEmboss::draw_bold_button(), Slic3r::GUI::GLGizmoEmboss::draw_delete_style_button(), Slic3r::GUI::GLGizmoSVG::draw_depth(), Slic3r::GUI::GLGizmoSVG::draw_distance(), Slic3r::GUI::GLGizmoSVG::draw_filename(), Slic3r::GUI::GLGizmoEmboss::draw_font_list(), Slic3r::GUI::GLGizmoEmboss::draw_font_list_line(), Slic3r::GUI::GLGizmoEmboss::draw_italic_button(), Slic3r::GUI::GLGizmoSVG::draw_mirroring(), Slic3r::GUI::GLGizmoEmboss::draw_model_type(), Slic3r::GUI::GLGizmoSVG::draw_model_type(), Slic3r::GUI::GLGizmoSVG::draw_rotation(), Slic3r::GUI::GLGizmoSVG::draw_size(), Slic3r::GUI::GLGizmoEmboss::draw_style_add_button(), Slic3r::GUI::GLGizmoEmboss::draw_style_list(), Slic3r::GUI::GLGizmoEmboss::draw_style_rename_button(), Slic3r::GUI::GLGizmoEmboss::draw_style_rename_popup(), Slic3r::GUI::GLGizmoEmboss::draw_style_save_as_popup(), Slic3r::GUI::GLGizmoEmboss::draw_style_save_button(), Slic3r::GUI::GLGizmoEmboss::draw_text_input(), Slic3r::GUI::GLGizmoSVG::draw_use_surface(), Slic3r::GUI::GLGizmoEmboss::draw_window(), GizmoImguiBegin(), GizmoImguiEnd(), GizmoImguiSetNextWIndowPos(), Slic3r::GUI::GLGizmoCut3D::init_input_window_data(), Slic3r::GUI::GLGizmoMeasure::on_mouse(), Slic3r::GUI::GLGizmoAssembly::on_render_input_window(), Slic3r::GUI::GLGizmoBrimEars::on_render_input_window(), Slic3r::GUI::GLGizmoEmboss::on_render_input_window(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMeasure::on_render_input_window(), Slic3r::GUI::GLGizmoMeshBoolean::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoMove3D::on_render_input_window(), Slic3r::GUI::GLGizmoRotate3D::on_render_input_window(), Slic3r::GUI::GLGizmoScale3D::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoSimplify::on_render_input_window(), Slic3r::GUI::GLGizmoSVG::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::panel_tooltip(), Slic3r::GUI::GLGizmoCut3D::render_angle_input(), Slic3r::GUI::GLGizmoCut3D::render_build_size(), Slic3r::GUI::GLGizmoCut3D::render_color_marker(), render_combo(), Slic3r::GUI::GLGizmoCut3D::render_connectors_input_window(), Slic3r::GUI::GLGizmoCut3D::render_cut_mode_combo(), Slic3r::GUI::GLGizmoCut3D::render_cut_plane_input_window(), Slic3r::GUI::GLGizmoCut3D::render_debug_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::render_debug_stage_panel(), Slic3r::GUI::GLGizmoMeasure::render_dimensioning(), Slic3r::GUI::GLGizmoCut3D::render_double_input(), Slic3r::GUI::GLGizmoMmuSegmentation::render_filament_remap_ui(), Slic3r::GUI::GLGizmoCut3D::render_flip_plane_button(), Slic3r::GUI::GLGizmoCut3D::render_groove_float_input(), Slic3r::GUI::GLGizmoCut3D::render_groove_int_input(), Slic3r::GUI::GLGizmoCut3D::render_groove_two_float_input(), Slic3r::GUI::GLGizmoTextureDisplacement::render_image_adjust_window(), Slic3r::GUI::GLGizmoAssembly::render_input_window_warning(), Slic3r::GUI::GLGizmoCut3D::render_input_window_warning(), Slic3r::GUI::GLGizmoCut3D::render_move_center_input(), Slic3r::GUI::GLGizmoCut3D::render_reset_button(), Slic3r::GUI::GLGizmoCut3D::render_slider_input(), Slic3r::GUI::GLGizmoCut3D::render_slider_two_input(), Slic3r::GUI::GLGizmoCut3D::render_snap_specific_input(), Slic3r::GUI::GLGizmoTextureDisplacement::render_texture_library_popup(), Slic3r::GUI::GLGizmoTextureDisplacement::render_tip_media(), Slic3r::GUI::GLGizmoCut3D::render_tooltip_button(), Slic3r::GUI::GLGizmoFdmSupports::render_tooltip_button(), Slic3r::GUI::GLGizmoFuzzySkin::render_tooltip_button(), Slic3r::GUI::GLGizmoMmuSegmentation::render_tooltip_button(), Slic3r::GUI::GLGizmoPainterBase::render_triangles(), Slic3r::GUI::GLGizmoEmboss::rev_checkbox(), Slic3r::GUI::GLGizmoEmboss::rev_input(), Slic3r::GUI::GLGizmoEmboss::rev_slider(), Slic3r::GUI::GLGizmoEmboss::rev_slider(), Slic3r::GUI::GLGizmoEmboss::rev_slider(), Slic3r::GUI::GLGizmoEmboss::revertible(), Slic3r::GUI::GLGizmoMeasure::show_distance_xyz_ui(), Slic3r::GUI::GLGizmoMeasure::show_face_face_assembly_common(), Slic3r::GUI::GLGizmoMeasure::show_face_face_assembly_senior(), and Slic3r::GUI::GLGizmoMeasure::show_selection_ui().

◆ m_imperial_units

bool Slic3r::GUI::GLGizmoCut3D::m_imperial_units { false }
private

◆ m_info_stats

◆ m_invalid_connectors_idxs

std::vector<size_t> Slic3r::GUI::GLGizmoCut3D::m_invalid_connectors_idxs
private

◆ m_is_dark_mode

◆ m_is_slider_editing_done

bool Slic3r::GUI::GLGizmoCut3D::m_is_slider_editing_done { false }
private

◆ m_keep_as_parts

bool Slic3r::GUI::GLGizmoCut3D::m_keep_as_parts { false }
private
127{ false };

Referenced by get_tooltip(), perform_cut(), and render_cut_plane_input_window().

◆ m_keep_lower

bool Slic3r::GUI::GLGizmoCut3D::m_keep_lower { true }
private

◆ m_keep_upper

bool Slic3r::GUI::GLGizmoCut3D::m_keep_upper { true }
private

◆ m_label_width

◆ m_labels_map

std::map<std::string, std::string> Slic3r::GUI::GLGizmoCut3D::m_labels_map
private

◆ m_ldown_mouse_position

Vec2d Slic3r::GUI::GLGizmoCut3D::m_ldown_mouse_position { Vec2d::Zero() }
private
92{ Vec2d::Zero() };

Referenced by gizmo_event().

◆ m_line_beg

Vec3d Slic3r::GUI::GLGizmoCut3D::m_line_beg { Vec3d::Zero() }
private

◆ m_line_end

Vec3d Slic3r::GUI::GLGizmoCut3D::m_line_end { Vec3d::Zero() }
private
90{ Vec3d::Zero() };

Referenced by discard_cut_line_processing(), process_cut_line(), and render_cut_line().

◆ m_max_pos

Vec3d Slic3r::GUI::GLGizmoCut3D::m_max_pos { Vec3d::Zero() }
private
64{ Vec3d::Zero() };

Referenced by invalidate_cut_plane(), and update_bb().

◆ m_min_pos

Vec3d Slic3r::GUI::GLGizmoCut3D::m_min_pos { Vec3d::Zero() }
private
63{ Vec3d::Zero() };

Referenced by invalidate_cut_plane(), and update_bb().

◆ m_mode

◆ m_modes

std::vector<std::string> Slic3r::GUI::GLGizmoCut3D::m_modes
private

◆ m_parent

GLCanvas3D& Slic3r::GUI::GLGizmoBase::m_parent
protectedinherited

Referenced by GLGizmoBase(), Slic3r::GUI::GLGizmoCut3D::add_connector(), Slic3r::GUI::GLGizmoTextureDisplacement::add_texture_layer(), Slic3r::GUI::GLGizmoCut3D::apply_color_clip_plane_colors(), Slic3r::GUI::GLGizmoTextureDisplacement::apply_projection_frame(), Slic3r::GUI::GLGizmoSimplify::apply_simplify(), Slic3r::GUI::GLGizmoTextureDisplacement::apply_view_mode(), Slic3r::GUI::GLGizmoBrimEars::auto_generate(), Slic3r::GUI::GLGizmoTextureDisplacement::bake(), Slic3r::GUI::GLGizmoCut3D::bounding_box(), Slic3r::GUI::GLGizmoPainterBase::bounding_box(), Slic3r::GUI::GLGizmoEmboss::calculate_scale(), Slic3r::GUI::GLGizmoSVG::calculate_scale(), Slic3r::GUI::GLGizmoTextureDisplacement::capture_view_projection(), Slic3r::GUI::GLGizmoMove3D::change_cs_by_selection(), Slic3r::GUI::GLGizmoScale3D::change_cs_by_selection(), Slic3r::GUI::GLGizmoEmboss::close(), Slic3r::GUI::GLGizmoSimplify::close(), Slic3r::GUI::GLGizmoSVG::close(), Slic3r::GUI::GLGizmoTextureDisplacement::close_image_adjust(), Slic3r::GUI::GLGizmoEmboss::create_volume(), Slic3r::GUI::GLGizmoEmboss::create_volume(), Slic3r::GUI::GLGizmoSVG::create_volume(), Slic3r::GUI::GLGizmoSVG::create_volume(), Slic3r::GUI::GLGizmoSVG::create_volume(), Slic3r::GUI::GLGizmoSVG::create_volume(), Slic3r::GUI::GLGizmoFlatten::data_changed(), Slic3r::GUI::GLGizmoMeasure::data_changed(), Slic3r::GUI::GLGizmoMove3D::data_changed(), Slic3r::GUI::GLGizmoPainterBase::data_changed(), Slic3r::GUI::GLGizmoRotate3D::data_changed(), Slic3r::GUI::GLGizmoScale3D::data_changed(), Slic3r::GUI::GLGizmoCut3D::delete_selected_connectors(), Slic3r::GUI::GLGizmoEmboss::do_mirror(), do_stop_dragging(), Slic3r::GUI::GLGizmoEmboss::draw_advanced(), Slic3r::GUI::GLGizmoSVG::draw_distance(), Slic3r::GUI::GLGizmoSVG::draw_face_the_camera(), Slic3r::GUI::GLGizmoSVG::draw_filename(), Slic3r::GUI::GLGizmoSVG::draw_mirroring(), Slic3r::GUI::GLGizmoEmboss::draw_model_type(), Slic3r::GUI::GLGizmoSVG::draw_model_type(), Slic3r::GUI::GLGizmoSVG::draw_rotation(), Slic3r::GUI::GLGizmoSVG::draw_size(), Slic3r::GUI::GLGizmoEmboss::draw_style_list(), Slic3r::GUI::GLGizmoEmboss::draw_window(), Slic3r::GUI::GLGizmoTextureDisplacement::ease_wheel_scroll(), Slic3r::GUI::GLGizmoBrimEars::find_single(), Slic3r::GUI::GLGizmoBrimEars::first_layer_slicer(), Slic3r::GUI::GLGizmoMeshBoolean::generate_new_volume(), Slic3r::GUI::GLGizmoPainterBase::get_projected_height_range(), Slic3r::GUI::GLGizmoMove3D::get_tooltip(), Slic3r::GUI::GLGizmoScale3D::get_tooltip(), Slic3r::GUI::GLGizmoBrimEars::gizmo_event(), Slic3r::GUI::GLGizmoMeasure::gizmo_event(), Slic3r::GUI::GLGizmoMeshBoolean::gizmo_event(), Slic3r::GUI::GLGizmoPainterBase::gizmo_event(), GizmoImguiSetNextWIndowPos(), Slic3r::GUI::GLGizmoCut3D::has_valid_groove(), Slic3r::GUI::GLGizmoSimplify::init_model(), Slic3r::GUI::GLGizmoMeasure::init_plane_glmodel(), Slic3r::GUI::GLGizmoFdmSupports::init_print_instance(), Slic3r::GUI::GLGizmoPainterBase::mesh_trafo_matrices(), Slic3r::GUI::GLGizmoTextureDisplacement::move_texture_layer(), Slic3r::GUI::GLGizmoMove3D::on_dragging(), Slic3r::GUI::GLGizmoAssembly::on_is_activable(), Slic3r::GUI::GLGizmoBrimEars::on_is_activable(), Slic3r::GUI::GLGizmoCut3D::on_is_activable(), Slic3r::GUI::GLGizmoFlatten::on_is_activable(), Slic3r::GUI::GLGizmoMeasure::on_is_activable(), Slic3r::GUI::GLGizmoMeshBoolean::on_is_activable(), Slic3r::GUI::GLGizmoMmuSegmentation::on_is_activable(), Slic3r::GUI::GLGizmoMove3D::on_is_activable(), Slic3r::GUI::GLGizmoPainterBase::on_is_activable(), Slic3r::GUI::GLGizmoRotate3D::on_is_activable(), Slic3r::GUI::GLGizmoScale3D::on_is_activable(), Slic3r::GUI::GLGizmoSimplify::on_is_activable(), Slic3r::GUI::GLGizmoTextureDisplacement::on_is_activable(), Slic3r::GUI::GLGizmoTextureDisplacement::on_island_edited(), Slic3r::GUI::GLGizmoCut3D::on_load(), Slic3r::GUI::GLGizmoBrimEars::on_mouse(), Slic3r::GUI::GLGizmoCut3D::on_mouse(), Slic3r::GUI::GLGizmoEmboss::on_mouse(), Slic3r::GUI::GLGizmoFlatten::on_mouse(), Slic3r::GUI::GLGizmoMeasure::on_mouse(), Slic3r::GUI::GLGizmoPainterBase::on_mouse(), Slic3r::GUI::GLGizmoRotate3D::on_mouse(), Slic3r::GUI::GLGizmoScale3D::on_mouse(), Slic3r::GUI::GLGizmoSVG::on_mouse(), Slic3r::GUI::GLGizmoTextureDisplacement::on_mouse_adjust_texture(), Slic3r::GUI::GLGizmoEmboss::on_mouse_change_selection(), Slic3r::GUI::GLGizmoEmboss::on_mouse_for_rotation(), Slic3r::GUI::GLGizmoSVG::on_mouse_for_rotation(), Slic3r::GUI::GLGizmoEmboss::on_mouse_for_translate(), Slic3r::GUI::GLGizmoSVG::on_mouse_for_translate(), Slic3r::GUI::GLGizmoTextureDisplacement::on_mouse_seam(), Slic3r::GUI::GLGizmoFdmSupports::on_opening(), Slic3r::GUI::GLGizmoCut3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoFlatten::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoMove3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoRotate3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoScale3D::on_register_raycasters_for_picking(), Slic3r::GUI::GLGizmoBrimEars::on_render(), Slic3r::GUI::GLGizmoCut3D::on_render(), Slic3r::GUI::GLGizmoEmboss::on_render(), Slic3r::GUI::GLGizmoFlatten::on_render(), Slic3r::GUI::GLGizmoMeasure::on_render(), Slic3r::GUI::GLGizmoMeshBoolean::on_render(), Slic3r::GUI::GLGizmoMove3D::on_render(), Slic3r::GUI::GLGizmoRotate::on_render(), Slic3r::GUI::GLGizmoSimplify::on_render(), Slic3r::GUI::GLGizmoSVG::on_render(), Slic3r::GUI::GLGizmoAssembly::on_render_input_window(), Slic3r::GUI::GLGizmoBrimEars::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_render_input_window(), Slic3r::GUI::GLGizmoEmboss::on_render_input_window(), Slic3r::GUI::GLGizmoFdmSupports::on_render_input_window(), Slic3r::GUI::GLGizmoFuzzySkin::on_render_input_window(), Slic3r::GUI::GLGizmoMeasure::on_render_input_window(), Slic3r::GUI::GLGizmoMeshBoolean::on_render_input_window(), Slic3r::GUI::GLGizmoMmuSegmentation::on_render_input_window(), Slic3r::GUI::GLGizmoSeam::on_render_input_window(), Slic3r::GUI::GLGizmoSimplify::on_render_input_window(), Slic3r::GUI::GLGizmoSVG::on_render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::on_render_input_window(), Slic3r::GUI::GLGizmoCut3D::on_set_state(), Slic3r::GUI::GLGizmoEmboss::on_set_state(), Slic3r::GUI::GLGizmoMeasure::on_set_state(), Slic3r::GUI::GLGizmoMmuSegmentation::on_set_state(), Slic3r::GUI::GLGizmoPainterBase::on_set_state(), Slic3r::GUI::GLGizmoSimplify::on_set_state(), Slic3r::GUI::GLGizmoSVG::on_set_state(), Slic3r::GUI::GLGizmoEmboss::on_shortcut_key(), Slic3r::GUI::GLGizmoFdmSupports::on_shutdown(), Slic3r::GUI::GLGizmoFuzzySkin::on_shutdown(), Slic3r::GUI::GLGizmoMmuSegmentation::on_shutdown(), Slic3r::GUI::GLGizmoSeam::on_shutdown(), Slic3r::GUI::GLGizmoTextureDisplacement::on_shutdown(), Slic3r::GUI::GLGizmoMove3D::on_start_dragging(), Slic3r::GUI::GLGizmoRotate::on_start_dragging(), Slic3r::GUI::GLGizmoEmboss::on_stop_dragging(), Slic3r::GUI::GLGizmoMove3D::on_stop_dragging(), Slic3r::GUI::GLGizmoRotate3D::on_stop_dragging(), Slic3r::GUI::GLGizmoScale3D::on_stop_dragging(), Slic3r::GUI::GLGizmoSVG::on_stop_dragging(), Slic3r::GUI::GLGizmoBrimEars::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoCut3D::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoFlatten::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoMove3D::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoRotate3D::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoScale3D::on_unregister_raycasters_for_picking(), Slic3r::GUI::GLGizmoTextureDisplacement::on_uv_command(), Slic3r::GUI::GLGizmoTextureDisplacement::panel_tooltip(), Slic3r::GUI::GLGizmoCut3D::perform_cut(), Slic3r::GUI::GLGizmoEmboss::process(), Slic3r::GUI::GLGizmoSVG::process(), Slic3r::GUI::GLGizmoCut3D::process_contours(), Slic3r::GUI::GLGizmoCut3D::process_cut_line(), Slic3r::GUI::GLGizmoTextureDisplacement::queue_prepare(), Slic3r::GUI::GLGizmoTextureDisplacement::queue_preview_job(), Slic3r::GUI::GLGizmoBrimEars::register_single_mesh_pick(), Slic3r::GUI::GLGizmoMeasure::register_single_mesh_pick(), Slic3r::GUI::GLGizmoEmboss::reinit_text_lines(), Slic3r::GUI::GLGizmoMmuSegmentation::remap_filament_assignments(), Slic3r::GUI::GLGizmoTextureDisplacement::remove_texture_layer(), Slic3r::GUI::GLGizmoTextureDisplacement::render_adjust_texture_gizmo(), Slic3r::GUI::GLGizmoMove3D::render_align_preview(), Slic3r::GUI::GLGizmoAssembly::render_assembly_mode_combo(), render_combo(), Slic3r::GUI::GLGizmoCut3D::render_connectors_input_window(), Slic3r::GUI::GLGizmoPainterBase::render_cursor(), Slic3r::GUI::GLGizmoPainterBase::render_cursor_circle(), Slic3r::GUI::GLGizmoPainterBase::render_cursor_height_range(), Slic3r::GUI::GLGizmoCut3D::render_cut_mode_combo(), Slic3r::GUI::GLGizmoCut3D::render_cut_plane_input_window(), Slic3r::GUI::GLGizmoMeasure::render_dimensioning(), Slic3r::GUI::GLGizmoMeasure::render_follows_cursor(), Slic3r::GUI::GLGizmoPainterBase::render_follows_cursor(), Slic3r::GUI::GLGizmoTextureDisplacement::render_image_adjust_window(), render_input_window(), Slic3r::GUI::GLGizmoTextureDisplacement::render_island_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_paint_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painted_colors(), Slic3r::GUI::GLGizmoFdmSupports::render_painter_gizmo(), Slic3r::GUI::GLGizmoFuzzySkin::render_painter_gizmo(), Slic3r::GUI::GLGizmoMmuSegmentation::render_painter_gizmo(), Slic3r::GUI::GLGizmoSeam::render_painter_gizmo(), Slic3r::GUI::GLGizmoTextureDisplacement::render_painter_gizmo(), Slic3r::GUI::GLGizmoTextureDisplacement::render_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_seam_overlay(), Slic3r::GUI::GLGizmoTextureDisplacement::render_shaded_preview_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_subdivide_preview(), Slic3r::GUI::GLGizmoTextureDisplacement::render_texture_library_popup(), Slic3r::GUI::GLGizmoTextureDisplacement::render_tip_media(), Slic3r::GUI::GLGizmoCut3D::render_tooltip_button(), Slic3r::GUI::GLGizmoFdmSupports::render_tooltip_button(), Slic3r::GUI::GLGizmoFuzzySkin::render_tooltip_button(), Slic3r::GUI::GLGizmoMmuSegmentation::render_tooltip_button(), Slic3r::GUI::GLGizmoPainterBase::render_triangles(), Slic3r::GUI::GLGizmoTextureDisplacement::render_uvcheck_mesh(), Slic3r::GUI::GLGizmoTextureDisplacement::render_wireframe_overlay(), Slic3r::GUI::GLGizmoSimplify::request_rerender(), Slic3r::GUI::GLGizmoCut3D::reset_cut_plane(), Slic3r::GUI::GLGizmoEmboss::reset_to_default_style(), Slic3r::GUI::GLGizmoTextureDisplacement::run_stage_debug(), Slic3r::GUI::GLGizmoFdmSupports::run_thread(), Slic3r::GUI::GLGizmoTextureDisplacement::run_uv_command(), Slic3r::GUI::GLGizmoTextureDisplacement::seam_edge_at(), Slic3r::GUI::GLGizmoTextureDisplacement::seam_vertex_at(), Slic3r::GUI::GLGizmoFdmSupports::select_facets_by_angle(), Slic3r::GUI::GLGizmoTextureDisplacement::select_visible_faces(), Slic3r::GUI::GLGizmoTextureDisplacement::select_whole_model(), Slic3r::GUI::GLGizmoCut3D::set_connectors_editing(), Slic3r::GUI::GLGizmoMeasure::set_distance(), Slic3r::GUI::GLGizmoTextureDisplacement::set_layer_texture(), Slic3r::GUI::GLGizmoMeasure::set_parallel_distance(), Slic3r::GUI::GLGizmoMeasure::set_to_around_center_of_faces(), Slic3r::GUI::GLGizmoMeasure::set_to_parallel(), Slic3r::GUI::GLGizmoMeasure::set_to_reverse_rotation(), Slic3r::GUI::GLGizmoEmboss::set_volume_by_selection(), Slic3r::GUI::GLGizmoSVG::set_volume_by_selection(), Slic3r::GUI::GLGizmoCut3D::set_volumes_picking_state(), Slic3r::GUI::GLGizmoTextureDisplacement::show_debug_stage(), Slic3r::GUI::GLGizmoTextureDisplacement::show_projector(), Slic3r::GUI::GLGizmoTextureDisplacement::smooth_model(), Slic3r::GUI::GLGizmoTextureDisplacement::subdivide_model(), Slic3r::GUI::GLGizmoCut3D::toggle_model_objects_visibility(), Slic3r::GUI::GLGizmoCut3D::transformed_bounding_box(), Slic3r::GUI::GLGizmoBrimEars::unproject_on_mesh(), Slic3r::GUI::GLGizmoCut3D::update_bb(), Slic3r::GUI::GLGizmoBrimEars::update_cache_radius(), Slic3r::GUI::GLGizmoCut3D::update_clipper(), Slic3r::GUI::GLGizmoPainterBase::update_contours(), Slic3r::GUI::GLGizmoScale3D::update_grabbers_data(), Slic3r::GUI::GLGizmoTextureDisplacement::update_image_adjust_preview(), Slic3r::GUI::GLGizmoBrimEars::update_model_object(), Slic3r::GUI::GLGizmoFdmSupports::update_model_object(), Slic3r::GUI::GLGizmoFuzzySkin::update_model_object(), Slic3r::GUI::GLGizmoMmuSegmentation::update_model_object(), Slic3r::GUI::GLGizmoSeam::update_model_object(), Slic3r::GUI::GLGizmoTextureDisplacement::update_model_object(), Slic3r::GUI::GLGizmoPainterBase::update_raycast_cache(), Slic3r::GUI::GLGizmoBrimEars::update_raycasters(), use_grabbers(), Slic3r::GUI::GLGizmoEmboss::volume_transformation_changed(), Slic3r::GUI::GLGizmoSVG::volume_transformation_changed(), and Slic3r::GUI::GLGizmoEmboss::volume_transformation_changing().

◆ m_part_orientation_names

std::map<std::string, wxString> Slic3r::GUI::GLGizmoCut3D::m_part_orientation_names
private

Referenced by GLGizmoCut3D().

◆ m_part_selection

◆ m_place_on_cut_lower

bool Slic3r::GUI::GLGizmoCut3D::m_place_on_cut_lower { false }
private
129{ false };

Referenced by perform_cut(), and render_cut_plane_input_window().

◆ m_place_on_cut_upper

bool Slic3r::GUI::GLGizmoCut3D::m_place_on_cut_upper { true }
private
128{ true };

Referenced by perform_cut(), and render_cut_plane_input_window().

◆ m_plane

◆ m_plane_center

◆ m_radius

double Slic3r::GUI::GLGizmoCut3D::m_radius { 0.0 }
private

◆ m_raycasters

std::vector<std::shared_ptr<SceneRaycasterItem> > Slic3r::GUI::GLGizmoCut3D::m_raycasters
private

◆ m_reference_radius

GLModel Slic3r::GUI::GLGizmoCut3D::m_reference_radius
private

◆ m_rotate_lower

bool Slic3r::GUI::GLGizmoCut3D::m_rotate_lower { false }
private

◆ m_rotate_upper

bool Slic3r::GUI::GLGizmoCut3D::m_rotate_upper { false }
private

◆ m_rotation_m

◆ m_scale

GLModel Slic3r::GUI::GLGizmoCut3D::m_scale
private

◆ m_selected

◆ m_selected_count

int Slic3r::GUI::GLGizmoCut3D::m_selected_count { 0 }
private

◆ m_selection_rectangle

GLSelectionRectangle Slic3r::GUI::GLGizmoCut3D::m_selection_rectangle
private

◆ m_shapes

◆ m_shortcut

◆ m_shortcuts_connector

std::vector<std::pair<wxString, wxString> > Slic3r::GUI::GLGizmoCut3D::m_shortcuts_connector
private

Referenced by on_init(), and render_tooltip_button().

◆ m_shortcuts_cut

std::vector<std::pair<wxString, wxString> > Slic3r::GUI::GLGizmoCut3D::m_shortcuts_cut
private

Referenced by on_init(), and render_tooltip_button().

◆ m_snap_bulge_proportion

float Slic3r::GUI::GLGizmoCut3D::m_snap_bulge_proportion { 0.15f }
private
146{ 0.15f };

Referenced by get_connector_mesh(), and render_connectors_input_window().

◆ m_snap_coarse_in_radius

double Slic3r::GUI::GLGizmoCut3D::m_snap_coarse_in_radius { 0.0 }
private
77{ 0.0 };

Referenced by dragging_grabber_rotation(), and update_bb().

◆ m_snap_coarse_out_radius

double Slic3r::GUI::GLGizmoCut3D::m_snap_coarse_out_radius { 0.0 }
private
78{ 0.0 };

Referenced by dragging_grabber_rotation(), and update_bb().

◆ m_snap_fine_in_radius

double Slic3r::GUI::GLGizmoCut3D::m_snap_fine_in_radius { 0.0 }
private
79{ 0.0 };

Referenced by dragging_grabber_rotation(), and update_bb().

◆ m_snap_fine_out_radius

double Slic3r::GUI::GLGizmoCut3D::m_snap_fine_out_radius { 0.0 }
private
80{ 0.0 };

Referenced by dragging_grabber_rotation(), and update_bb().

◆ m_snap_radii

GLModel Slic3r::GUI::GLGizmoCut3D::m_snap_radii
private

◆ m_snap_space_proportion

float Slic3r::GUI::GLGizmoCut3D::m_snap_space_proportion { 0.3f }
private
147{ 0.3f };

Referenced by get_connector_mesh(), and render_connectors_input_window().

◆ m_snap_step

double Slic3r::GUI::GLGizmoCut3D::m_snap_step { 1.0 }
private
54{ 1.0 };

Referenced by dragging_grabber_move().

◆ m_sphere

◆ m_sprite_id

unsigned int Slic3r::GUI::GLGizmoBase::m_sprite_id
protectedinherited

Referenced by GLGizmoBase(), and get_sprite_id().

◆ m_start_dragging_m

Transform3d Slic3r::GUI::GLGizmoCut3D::m_start_dragging_m { Transform3d::Identity() }
private

◆ m_state

◆ m_transformed_bounding_box

◆ m_was_contour_selected

bool Slic3r::GUI::GLGizmoCut3D::m_was_contour_selected { false }
private
175{ false };

Referenced by on_mouse().

◆ m_was_cut_plane_dragged

bool Slic3r::GUI::GLGizmoCut3D::m_was_cut_plane_dragged { false }
private
174{ false };

Referenced by dragging_grabber_move(), on_mouse(), and on_stop_dragging().


The documentation for this class was generated from the following files:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp