WIP SupportGeneratorLayerStorage refactoring.
This commit is contained in:
parent
1bbe0c5be3
commit
cc938e7549
@ -276,10 +276,12 @@ set(SLIC3R_SOURCES
|
|||||||
SlicingAdaptive.hpp
|
SlicingAdaptive.hpp
|
||||||
Subdivide.cpp
|
Subdivide.cpp
|
||||||
Subdivide.hpp
|
Subdivide.hpp
|
||||||
SupportSpotsGenerator.cpp
|
Support/SupportLayer.hpp
|
||||||
SupportSpotsGenerator.hpp
|
Support/SupportParameters.hpp
|
||||||
SupportMaterial.cpp
|
SupportMaterial.cpp
|
||||||
SupportMaterial.hpp
|
SupportMaterial.hpp
|
||||||
|
SupportSpotsGenerator.cpp
|
||||||
|
SupportSpotsGenerator.hpp
|
||||||
Surface.cpp
|
Surface.cpp
|
||||||
Surface.hpp
|
Surface.hpp
|
||||||
SurfaceCollection.cpp
|
SurfaceCollection.cpp
|
||||||
|
130
src/libslic3r/Support/SupportLayer.hpp
Normal file
130
src/libslic3r/Support/SupportLayer.hpp
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#ifndef slic3r_SupportLayer_hpp_
|
||||||
|
#define slic3r_SupportLayer_hpp_
|
||||||
|
|
||||||
|
#include <oneapi/tbb/scalable_allocator.h>
|
||||||
|
#include <oneapi/tbb/spin_mutex.h>
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
// Support layer type to be used by SupportGeneratorLayer. This type carries a much more detailed information
|
||||||
|
// about the support layer type than the final support layers stored in a PrintObject.
|
||||||
|
enum class SupporLayerType {
|
||||||
|
Unknown = 0,
|
||||||
|
// Ratft base layer, to be printed with the support material.
|
||||||
|
RaftBase,
|
||||||
|
// Raft interface layer, to be printed with the support interface material.
|
||||||
|
RaftInterface,
|
||||||
|
// Bottom contact layer placed over a top surface of an object. To be printed with a support interface material.
|
||||||
|
BottomContact,
|
||||||
|
// Dense interface layer, to be printed with the support interface material.
|
||||||
|
// This layer is separated from an object by an BottomContact layer.
|
||||||
|
BottomInterface,
|
||||||
|
// Sparse base support layer, to be printed with a support material.
|
||||||
|
Base,
|
||||||
|
// Dense interface layer, to be printed with the support interface material.
|
||||||
|
// This layer is separated from an object with TopContact layer.
|
||||||
|
TopInterface,
|
||||||
|
// Top contact layer directly supporting an overhang. To be printed with a support interface material.
|
||||||
|
TopContact,
|
||||||
|
// Some undecided type yet. It will turn into Base first, then it may turn into BottomInterface or TopInterface.
|
||||||
|
Intermediate,
|
||||||
|
};
|
||||||
|
|
||||||
|
// A support layer type used internally by the SupportMaterial class. This class carries a much more detailed
|
||||||
|
// information about the support layer than the layers stored in the PrintObject, mainly
|
||||||
|
// the SupportGeneratorLayer is aware of the bridging flow and the interface gaps between the object and the support.
|
||||||
|
class SupportGeneratorLayer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void reset() {
|
||||||
|
*this = SupportGeneratorLayer();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const SupportGeneratorLayer &layer2) const {
|
||||||
|
return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Order the layers by lexicographically by an increasing print_z and a decreasing layer height.
|
||||||
|
bool operator<(const SupportGeneratorLayer &layer2) const {
|
||||||
|
if (print_z < layer2.print_z) {
|
||||||
|
return true;
|
||||||
|
} else if (print_z == layer2.print_z) {
|
||||||
|
if (height > layer2.height)
|
||||||
|
return true;
|
||||||
|
else if (height == layer2.height) {
|
||||||
|
// Bridging layers first.
|
||||||
|
return bridging && ! layer2.bridging;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void merge(SupportGeneratorLayer &&rhs) {
|
||||||
|
// The union_() does not support move semantic yet, but maybe one day it will.
|
||||||
|
this->polygons = union_(this->polygons, std::move(rhs.polygons));
|
||||||
|
auto merge = [](std::unique_ptr<Polygons> &dst, std::unique_ptr<Polygons> &src) {
|
||||||
|
if (! dst || dst->empty())
|
||||||
|
dst = std::move(src);
|
||||||
|
else if (src && ! src->empty())
|
||||||
|
*dst = union_(*dst, std::move(*src));
|
||||||
|
};
|
||||||
|
merge(this->contact_polygons, rhs.contact_polygons);
|
||||||
|
merge(this->overhang_polygons, rhs.overhang_polygons);
|
||||||
|
merge(this->enforcer_polygons, rhs.enforcer_polygons);
|
||||||
|
rhs.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation.
|
||||||
|
// For the non-bridging flow, bottom_print_z will be equal to bottom_z.
|
||||||
|
coordf_t bottom_print_z() const { return print_z - height; }
|
||||||
|
|
||||||
|
// To sort the extremes of top / bottom interface layers.
|
||||||
|
coordf_t extreme_z() const { return (this->layer_type == SupporLayerType::TopContact) ? this->bottom_z : this->print_z; }
|
||||||
|
|
||||||
|
SupporLayerType layer_type { SupporLayerType::Unknown };
|
||||||
|
// Z used for printing, in unscaled coordinates.
|
||||||
|
coordf_t print_z { 0 };
|
||||||
|
// Bottom Z of this layer. For soluble layers, bottom_z + height = print_z,
|
||||||
|
// otherwise bottom_z + gap + height = print_z.
|
||||||
|
coordf_t bottom_z { 0 };
|
||||||
|
// Layer height in unscaled coordinates.
|
||||||
|
coordf_t height { 0 };
|
||||||
|
// Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers.
|
||||||
|
// If this is not a contact layer, it will be set to size_t(-1).
|
||||||
|
size_t idx_object_layer_above { size_t(-1) };
|
||||||
|
// Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers.
|
||||||
|
// If this is not a contact layer, it will be set to size_t(-1).
|
||||||
|
size_t idx_object_layer_below { size_t(-1) };
|
||||||
|
// Use a bridging flow when printing this support layer.
|
||||||
|
bool bridging { false };
|
||||||
|
|
||||||
|
// Polygons to be filled by the support pattern.
|
||||||
|
Polygons polygons;
|
||||||
|
// Currently for the contact layers only.
|
||||||
|
std::unique_ptr<Polygons> contact_polygons;
|
||||||
|
std::unique_ptr<Polygons> overhang_polygons;
|
||||||
|
// Enforcers need to be propagated independently in case the "support on build plate only" option is enabled.
|
||||||
|
std::unique_ptr<Polygons> enforcer_polygons;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained
|
||||||
|
// up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future,
|
||||||
|
// which would allocate layers by multiple chunks.
|
||||||
|
#if 0
|
||||||
|
class SupportGeneratorLayerStorage {
|
||||||
|
public:
|
||||||
|
private:
|
||||||
|
template<typename BaseType>
|
||||||
|
using Allocator = tbb::scalable_allocator<BaseType>;
|
||||||
|
Slic3r::deque<SupportGeneratorLayer, Allocator<SupportGeneratorLayer>> m_data;
|
||||||
|
tbb::spin_mutex m_mutex;
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
#endif
|
||||||
|
using SupportGeneratorLayerStorage = std::deque<SupportGeneratorLayer>;
|
||||||
|
using SupportGeneratorLayersPtr = std::vector<SupportGeneratorLayer*>;
|
||||||
|
|
||||||
|
} // namespace Slic3r
|
||||||
|
|
||||||
|
#endif /* slic3r_SupportLayer_hpp_ */
|
66
src/libslic3r/Support/SupportParameters.hpp
Normal file
66
src/libslic3r/Support/SupportParameters.hpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#ifndef slic3r_SupportParameters_hpp_
|
||||||
|
#define slic3r_SupportParameters_hpp_
|
||||||
|
|
||||||
|
#include "../libslic3r.h"
|
||||||
|
#include "../Flow.hpp"
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
class PrintObject;
|
||||||
|
enum InfillPattern : int;
|
||||||
|
|
||||||
|
struct SupportParameters {
|
||||||
|
SupportParameters(const PrintObject &object);
|
||||||
|
|
||||||
|
// Flow at the 1st print layer.
|
||||||
|
Flow first_layer_flow;
|
||||||
|
// Flow at the support base (neither top, nor bottom interface).
|
||||||
|
// Also flow at the raft base with the exception of raft interface and contact layers.
|
||||||
|
Flow support_material_flow;
|
||||||
|
// Flow at the top interface and contact layers.
|
||||||
|
Flow support_material_interface_flow;
|
||||||
|
// Flow at the bottom interfaces and contacts.
|
||||||
|
Flow support_material_bottom_interface_flow;
|
||||||
|
// Flow at raft inteface & contact layers.
|
||||||
|
Flow raft_interface_flow;
|
||||||
|
// Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder?
|
||||||
|
bool can_merge_support_regions;
|
||||||
|
|
||||||
|
coordf_t support_layer_height_min;
|
||||||
|
// coordf_t support_layer_height_max;
|
||||||
|
|
||||||
|
coordf_t gap_xy;
|
||||||
|
|
||||||
|
float base_angle;
|
||||||
|
float interface_angle;
|
||||||
|
|
||||||
|
// Density of the top / bottom interface and contact layers.
|
||||||
|
coordf_t interface_density;
|
||||||
|
// Density of the raft interface and contact layers.
|
||||||
|
coordf_t raft_interface_density;
|
||||||
|
// Density of the base support layers.
|
||||||
|
coordf_t support_density;
|
||||||
|
|
||||||
|
// Pattern of the sparse infill including sparse raft layers.
|
||||||
|
InfillPattern base_fill_pattern;
|
||||||
|
// Pattern of the top / bottom interface and contact layers.
|
||||||
|
InfillPattern interface_fill_pattern;
|
||||||
|
// Pattern of the raft interface and contact layers.
|
||||||
|
InfillPattern raft_interface_fill_pattern;
|
||||||
|
// Pattern of the contact layers.
|
||||||
|
InfillPattern contact_fill_pattern;
|
||||||
|
// Shall the sparse (base) layers be printed with a single perimeter line (sheath) for robustness?
|
||||||
|
bool with_sheath;
|
||||||
|
|
||||||
|
float raft_angle_1st_layer;
|
||||||
|
float raft_angle_base;
|
||||||
|
float raft_angle_interface;
|
||||||
|
|
||||||
|
// Produce a raft interface angle for a given SupportLayer::interface_id()
|
||||||
|
float raft_interface_angle(size_t interface_id) const
|
||||||
|
{ return this->raft_angle_interface + ((interface_id & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Slic3r
|
||||||
|
|
||||||
|
#endif /* slic3r_SupportParameters_hpp_ */
|
@ -5,171 +5,12 @@
|
|||||||
#include "PrintConfig.hpp"
|
#include "PrintConfig.hpp"
|
||||||
#include "Slicing.hpp"
|
#include "Slicing.hpp"
|
||||||
|
|
||||||
|
#include "Support/SupportLayer.hpp"
|
||||||
|
#include "Support/SupportParameters.hpp"
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
class PrintObject;
|
class PrintObject;
|
||||||
class PrintConfig;
|
|
||||||
class PrintObjectConfig;
|
|
||||||
|
|
||||||
// Support layer type to be used by SupportGeneratorLayer. This type carries a much more detailed information
|
|
||||||
// about the support layer type than the final support layers stored in a PrintObject.
|
|
||||||
enum class SupporLayerType {
|
|
||||||
Unknown = 0,
|
|
||||||
// Ratft base layer, to be printed with the support material.
|
|
||||||
RaftBase,
|
|
||||||
// Raft interface layer, to be printed with the support interface material.
|
|
||||||
RaftInterface,
|
|
||||||
// Bottom contact layer placed over a top surface of an object. To be printed with a support interface material.
|
|
||||||
BottomContact,
|
|
||||||
// Dense interface layer, to be printed with the support interface material.
|
|
||||||
// This layer is separated from an object by an BottomContact layer.
|
|
||||||
BottomInterface,
|
|
||||||
// Sparse base support layer, to be printed with a support material.
|
|
||||||
Base,
|
|
||||||
// Dense interface layer, to be printed with the support interface material.
|
|
||||||
// This layer is separated from an object with TopContact layer.
|
|
||||||
TopInterface,
|
|
||||||
// Top contact layer directly supporting an overhang. To be printed with a support interface material.
|
|
||||||
TopContact,
|
|
||||||
// Some undecided type yet. It will turn into Base first, then it may turn into BottomInterface or TopInterface.
|
|
||||||
Intermediate,
|
|
||||||
};
|
|
||||||
|
|
||||||
// A support layer type used internally by the SupportMaterial class. This class carries a much more detailed
|
|
||||||
// information about the support layer than the layers stored in the PrintObject, mainly
|
|
||||||
// the SupportGeneratorLayer is aware of the bridging flow and the interface gaps between the object and the support.
|
|
||||||
class SupportGeneratorLayer
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void reset() {
|
|
||||||
*this = SupportGeneratorLayer();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const SupportGeneratorLayer &layer2) const {
|
|
||||||
return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Order the layers by lexicographically by an increasing print_z and a decreasing layer height.
|
|
||||||
bool operator<(const SupportGeneratorLayer &layer2) const {
|
|
||||||
if (print_z < layer2.print_z) {
|
|
||||||
return true;
|
|
||||||
} else if (print_z == layer2.print_z) {
|
|
||||||
if (height > layer2.height)
|
|
||||||
return true;
|
|
||||||
else if (height == layer2.height) {
|
|
||||||
// Bridging layers first.
|
|
||||||
return bridging && ! layer2.bridging;
|
|
||||||
} else
|
|
||||||
return false;
|
|
||||||
} else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void merge(SupportGeneratorLayer &&rhs) {
|
|
||||||
// The union_() does not support move semantic yet, but maybe one day it will.
|
|
||||||
this->polygons = union_(this->polygons, std::move(rhs.polygons));
|
|
||||||
auto merge = [](std::unique_ptr<Polygons> &dst, std::unique_ptr<Polygons> &src) {
|
|
||||||
if (! dst || dst->empty())
|
|
||||||
dst = std::move(src);
|
|
||||||
else if (src && ! src->empty())
|
|
||||||
*dst = union_(*dst, std::move(*src));
|
|
||||||
};
|
|
||||||
merge(this->contact_polygons, rhs.contact_polygons);
|
|
||||||
merge(this->overhang_polygons, rhs.overhang_polygons);
|
|
||||||
merge(this->enforcer_polygons, rhs.enforcer_polygons);
|
|
||||||
rhs.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
// For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation.
|
|
||||||
// For the non-bridging flow, bottom_print_z will be equal to bottom_z.
|
|
||||||
coordf_t bottom_print_z() const { return print_z - height; }
|
|
||||||
|
|
||||||
// To sort the extremes of top / bottom interface layers.
|
|
||||||
coordf_t extreme_z() const { return (this->layer_type == SupporLayerType::TopContact) ? this->bottom_z : this->print_z; }
|
|
||||||
|
|
||||||
SupporLayerType layer_type { SupporLayerType::Unknown };
|
|
||||||
// Z used for printing, in unscaled coordinates.
|
|
||||||
coordf_t print_z { 0 };
|
|
||||||
// Bottom Z of this layer. For soluble layers, bottom_z + height = print_z,
|
|
||||||
// otherwise bottom_z + gap + height = print_z.
|
|
||||||
coordf_t bottom_z { 0 };
|
|
||||||
// Layer height in unscaled coordinates.
|
|
||||||
coordf_t height { 0 };
|
|
||||||
// Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers.
|
|
||||||
// If this is not a contact layer, it will be set to size_t(-1).
|
|
||||||
size_t idx_object_layer_above { size_t(-1) };
|
|
||||||
// Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers.
|
|
||||||
// If this is not a contact layer, it will be set to size_t(-1).
|
|
||||||
size_t idx_object_layer_below { size_t(-1) };
|
|
||||||
// Use a bridging flow when printing this support layer.
|
|
||||||
bool bridging { false };
|
|
||||||
|
|
||||||
// Polygons to be filled by the support pattern.
|
|
||||||
Polygons polygons;
|
|
||||||
// Currently for the contact layers only.
|
|
||||||
std::unique_ptr<Polygons> contact_polygons;
|
|
||||||
std::unique_ptr<Polygons> overhang_polygons;
|
|
||||||
// Enforcers need to be propagated independently in case the "support on build plate only" option is enabled.
|
|
||||||
std::unique_ptr<Polygons> enforcer_polygons;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained
|
|
||||||
// up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future,
|
|
||||||
// which would allocate layers by multiple chunks.
|
|
||||||
using SupportGeneratorLayerStorage = std::deque<SupportGeneratorLayer>;
|
|
||||||
using SupportGeneratorLayersPtr = std::vector<SupportGeneratorLayer*>;
|
|
||||||
|
|
||||||
struct SupportParameters {
|
|
||||||
SupportParameters(const PrintObject &object);
|
|
||||||
|
|
||||||
// Flow at the 1st print layer.
|
|
||||||
Flow first_layer_flow;
|
|
||||||
// Flow at the support base (neither top, nor bottom interface).
|
|
||||||
// Also flow at the raft base with the exception of raft interface and contact layers.
|
|
||||||
Flow support_material_flow;
|
|
||||||
// Flow at the top interface and contact layers.
|
|
||||||
Flow support_material_interface_flow;
|
|
||||||
// Flow at the bottom interfaces and contacts.
|
|
||||||
Flow support_material_bottom_interface_flow;
|
|
||||||
// Flow at raft inteface & contact layers.
|
|
||||||
Flow raft_interface_flow;
|
|
||||||
// Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder?
|
|
||||||
bool can_merge_support_regions;
|
|
||||||
|
|
||||||
coordf_t support_layer_height_min;
|
|
||||||
// coordf_t support_layer_height_max;
|
|
||||||
|
|
||||||
coordf_t gap_xy;
|
|
||||||
|
|
||||||
float base_angle;
|
|
||||||
float interface_angle;
|
|
||||||
|
|
||||||
// Density of the top / bottom interface and contact layers.
|
|
||||||
coordf_t interface_density;
|
|
||||||
// Density of the raft interface and contact layers.
|
|
||||||
coordf_t raft_interface_density;
|
|
||||||
// Density of the base support layers.
|
|
||||||
coordf_t support_density;
|
|
||||||
|
|
||||||
// Pattern of the sparse infill including sparse raft layers.
|
|
||||||
InfillPattern base_fill_pattern;
|
|
||||||
// Pattern of the top / bottom interface and contact layers.
|
|
||||||
InfillPattern interface_fill_pattern;
|
|
||||||
// Pattern of the raft interface and contact layers.
|
|
||||||
InfillPattern raft_interface_fill_pattern;
|
|
||||||
// Pattern of the contact layers.
|
|
||||||
InfillPattern contact_fill_pattern;
|
|
||||||
// Shall the sparse (base) layers be printed with a single perimeter line (sheath) for robustness?
|
|
||||||
bool with_sheath;
|
|
||||||
|
|
||||||
float raft_angle_1st_layer;
|
|
||||||
float raft_angle_base;
|
|
||||||
float raft_angle_interface;
|
|
||||||
|
|
||||||
// Produce a raft interface angle for a given SupportLayer::interface_id()
|
|
||||||
float raft_interface_angle(size_t interface_id) const
|
|
||||||
{ return this->raft_angle_interface + ((interface_id & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.)); }
|
|
||||||
};
|
|
||||||
|
|
||||||
// Remove bridges from support contact areas.
|
// Remove bridges from support contact areas.
|
||||||
// To be called if PrintObjectConfig::dont_support_bridges.
|
// To be called if PrintObjectConfig::dont_support_bridges.
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include "TreeModelVolumes.hpp"
|
#include "TreeModelVolumes.hpp"
|
||||||
#include "Point.hpp"
|
#include "Point.hpp"
|
||||||
|
#include "Support/SupportLayer.hpp"
|
||||||
|
|
||||||
#include <boost/container/small_vector.hpp>
|
#include <boost/container/small_vector.hpp>
|
||||||
|
|
||||||
@ -39,10 +40,7 @@ namespace Slic3r
|
|||||||
// Forward declarations
|
// Forward declarations
|
||||||
class Print;
|
class Print;
|
||||||
class PrintObject;
|
class PrintObject;
|
||||||
class SupportGeneratorLayer;
|
|
||||||
struct SlicingParameters;
|
struct SlicingParameters;
|
||||||
using SupportGeneratorLayerStorage = std::deque<SupportGeneratorLayer>;
|
|
||||||
using SupportGeneratorLayersPtr = std::vector<SupportGeneratorLayer*>;
|
|
||||||
|
|
||||||
namespace FFFTreeSupport
|
namespace FFFTreeSupport
|
||||||
{
|
{
|
||||||
|
@ -107,6 +107,7 @@
|
|||||||
#include <boost/version.hpp>
|
#include <boost/version.hpp>
|
||||||
|
|
||||||
#include <tbb/parallel_for.h>
|
#include <tbb/parallel_for.h>
|
||||||
|
#include <tbb/scalable_allocator.h>
|
||||||
#include <tbb/spin_mutex.h>
|
#include <tbb/spin_mutex.h>
|
||||||
#include <tbb/task_group.h>
|
#include <tbb/task_group.h>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user