mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-02 03:00:42 +08:00
84 lines
3.0 KiB
C++
84 lines
3.0 KiB
C++
///|/ Copyright (c) Prusa Research 2020 - 2022 Lukáš Hejl @hejllukas, Vojtěch Bubník @bubnikv
|
|
///|/
|
|
///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher
|
|
///|/
|
|
#ifndef slic3r_AvoidCrossingPerimeters_hpp_
|
|
#define slic3r_AvoidCrossingPerimeters_hpp_
|
|
|
|
#include <vector>
|
|
|
|
#include "libslic3r/libslic3r.h"
|
|
#include "libslic3r/ExPolygon.hpp"
|
|
#include "libslic3r/EdgeGrid.hpp"
|
|
#include "libslic3r/BoundingBox.hpp"
|
|
#include "libslic3r/Layer.hpp"
|
|
#include "libslic3r/Polygon.hpp"
|
|
#include "libslic3r/Polyline.hpp"
|
|
|
|
namespace Slic3r {
|
|
|
|
// Forward declarations.
|
|
class GCodeGenerator;
|
|
class Layer;
|
|
class Point;
|
|
|
|
class AvoidCrossingPerimeters
|
|
{
|
|
public:
|
|
// Routing around the objects vs. inside a single object.
|
|
void use_external_mp(bool use = true) { m_use_external_mp = use; };
|
|
bool used_external_mp_once() { return use_external_mp_once; }
|
|
void disable_once() { m_disabled_once = true; }
|
|
bool disabled_once() const { return m_disabled_once; }
|
|
void reset_once_modifiers() { use_external_mp_once = false; m_disabled_once = false; }
|
|
|
|
void init_layer(const Layer &layer);
|
|
|
|
Polyline travel_to(const GCodeGenerator &gcodegen, const Point& point)
|
|
{
|
|
bool could_be_wipe_disabled;
|
|
return this->travel_to(gcodegen, point, &could_be_wipe_disabled);
|
|
}
|
|
|
|
Polyline travel_to(const GCodeGenerator &gcodegen, const Point& point, bool* could_be_wipe_disabled);
|
|
|
|
struct Boundary {
|
|
// Collection of boundaries used for detection of crossing perimeters for travels
|
|
Polygons boundaries;
|
|
// Bounding box of boundaries
|
|
BoundingBoxf bbox;
|
|
// Precomputed distances of all points in boundaries
|
|
std::vector<std::vector<float>> boundaries_params;
|
|
// Used for detection of intersection between line and any polygon from boundaries
|
|
EdgeGrid::Grid grid;
|
|
|
|
void clear()
|
|
{
|
|
boundaries.clear();
|
|
boundaries_params.clear();
|
|
}
|
|
};
|
|
|
|
// just for the next travel move
|
|
bool use_external_mp_once { false };
|
|
private:
|
|
bool m_use_external_mp { false };
|
|
// this flag disables avoid_crossing_perimeters just for the next travel move
|
|
// we enable it by default for the first travel move in print
|
|
bool m_disabled_once { true };
|
|
|
|
// Lslices offseted by half an external perimeter width. Used for detection if line or polyline is inside of any polygon.
|
|
ExPolygons m_lslices_offset;
|
|
std::vector<BoundingBox> m_lslices_offset_bboxes;
|
|
// Used for detection of line or polyline is inside of any polygon.
|
|
EdgeGrid::Grid m_grid_lslices_offset;
|
|
// Store all needed data for travels inside object
|
|
Boundary m_internal;
|
|
// Store all needed data for travels outside object
|
|
Boundary m_external;
|
|
};
|
|
|
|
} // namespace Slic3r
|
|
|
|
#endif // slic3r_AvoidCrossingPerimeters_hpp_
|