///|/ Copyright (c) Prusa Research 2023 Oleksandra Iushchenko @YuSanka ///|/ ///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher ///|/ #ifndef slic3r_CutUtils_hpp_ #define slic3r_CutUtils_hpp_ #include "enum_bitmask.hpp" #include "Point.hpp" #include "Model.hpp" #include namespace Slic3r { using ModelObjectPtrs = std::vector; enum class ModelObjectCutAttribute : int { KeepUpper, KeepLower, KeepAsParts, FlipUpper, FlipLower, PlaceOnCutUpper, PlaceOnCutLower, CreateDowels, InvalidateCutInfo }; using ModelObjectCutAttributes = enum_bitmask; ENABLE_ENUM_BITMASK_OPERATORS(ModelObjectCutAttribute); class Cut { Model m_model; int m_instance; const Transform3d m_cut_matrix; ModelObjectCutAttributes m_attributes; void post_process(ModelObject* object, ModelObjectPtrs& objects, bool keep, bool place_on_cut, bool flip); void post_process(ModelObject* upper_object, ModelObject* lower_object, ModelObjectPtrs& objects); void finalize(const ModelObjectPtrs& objects); public: Cut(const ModelObject* object, int instance, const Transform3d& cut_matrix, ModelObjectCutAttributes attributes = ModelObjectCutAttribute::KeepUpper | ModelObjectCutAttribute::KeepLower | ModelObjectCutAttribute::KeepAsParts ); ~Cut() { m_model.clear_objects(); } struct Groove { float depth{ 0.f }; float width{ 0.f }; float flaps_angle{ 0.f }; float angle{ 0.f }; float depth_init{ 0.f }; float width_init{ 0.f }; float flaps_angle_init{ 0.f }; float angle_init{ 0.f }; float depth_tolerance{ 0.1f }; float width_tolerance{ 0.1f }; }; struct Part { bool selected; bool is_modifier; }; const ModelObjectPtrs& perform_with_plane(); const ModelObjectPtrs& perform_by_contour(std::vector parts, int dowels_count); const ModelObjectPtrs& perform_with_groove(const Groove& groove, const Transform3d& rotation_m, bool keep_as_parts = false); }; // namespace Cut } // namespace Slic3r #endif /* slic3r_CutUtils_hpp_ */