mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-14 10:17:55 -06:00

When was set use_external_mp_once to true then after first calling the avoid crossing perimeters this flag was reset which cases that on the second call of the avoid crossing perimeters the travel move didn't process as external.
71 lines
2.4 KiB
C++
71 lines
2.4 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; }
|
|
bool used_external_mp_once() { return m_use_external_mp_once; }
|
|
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;
|
|
|
|
void clear()
|
|
{
|
|
boundaries.clear();
|
|
boundaries_params.clear();
|
|
}
|
|
};
|
|
|
|
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;
|
|
// Store all needed data for travels outside object
|
|
Boundary m_external;
|
|
};
|
|
|
|
} // namespace Slic3r
|
|
|
|
#endif // slic3r_AvoidCrossingPerimeters_hpp_
|