mirror of
https://github.com/FULU-Foundation/OrcaSlicer-bambulab.git
synced 2026-06-06 13:53:05 -04:00
The strategy for the avoid crossing perimeters algorithm has been redesigned. But external travels (travel between objects or supports) have not been solved yet. For these travels is used a direct path between two points. Much of the code has been reworked, which leads to significant speedup compared to the previous implementation. Also, several potential bugs have been fixed.
67 lines
2.2 KiB
C++
67 lines
2.2 KiB
C++
#ifndef slic3r_AvoidCrossingPerimeters_hpp_
|
|
#define slic3r_AvoidCrossingPerimeters_hpp_
|
|
|
|
#include "../libslic3r.h"
|
|
#include "../ExPolygon.hpp"
|
|
#include "../EdgeGrid.hpp"
|
|
|
|
namespace Slic3r {
|
|
|
|
// Forward declarations.
|
|
class GCode;
|
|
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; };
|
|
void use_external_mp_once() { m_use_external_mp_once = true; }
|
|
void disable_once() { m_disabled_once = true; }
|
|
bool disabled_once() const { return m_disabled_once; }
|
|
void reset_once_modifiers() { m_use_external_mp_once = false; m_disabled_once = false; }
|
|
|
|
void init_layer(const Layer &layer);
|
|
|
|
Polyline travel_to(const GCode& gcodegen, const Point& point)
|
|
{
|
|
bool could_be_wipe_disabled;
|
|
return this->travel_to(gcodegen, point, &could_be_wipe_disabled);
|
|
}
|
|
|
|
Polyline travel_to(const GCode& 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;
|
|
};
|
|
|
|
private:
|
|
bool m_use_external_mp { false };
|
|
// just for the next travel move
|
|
bool m_use_external_mp_once { 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 };
|
|
|
|
// Used for detection of line or polyline is inside of any polygon.
|
|
EdgeGrid::Grid m_grid_lslice;
|
|
// Store all needed data for travels inside object
|
|
Boundary m_internal;
|
|
#if 0
|
|
// Store all needed data for travels outside object
|
|
Boundary m_external;
|
|
#endif
|
|
};
|
|
|
|
} // namespace Slic3r
|
|
|
|
#endif // slic3r_AvoidCrossingPerimeters_hpp_
|