mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-05 17:00:42 +08:00
Porting generate_base_layers() function.
This commit is contained in:
parent
abea497a78
commit
93d81062af
@ -147,7 +147,7 @@ SupportMaterial::support_layers_z(vector<coordf_t> contact_z,
|
|||||||
}
|
}
|
||||||
|
|
||||||
vector<int>
|
vector<int>
|
||||||
SupportMaterial::overlapping_layers(int layer_idx, vector<coordf_t> support_z)
|
SupportMaterial::overlapping_layers(int layer_idx, const vector<coordf_t> &support_z)
|
||||||
{
|
{
|
||||||
vector<int> ret;
|
vector<int> ret;
|
||||||
|
|
||||||
@ -520,9 +520,9 @@ SupportMaterial::contact_area(PrintObject *object)
|
|||||||
// For bridges we can't assume width is larger than spacing because they
|
// For bridges we can't assume width is larger than spacing because they
|
||||||
// are positioned according to non-bridging perimeters spacing.
|
// are positioned according to non-bridging perimeters spacing.
|
||||||
coord_t widths[] = {bridge_flow.scaled_width(),
|
coord_t widths[] = {bridge_flow.scaled_width(),
|
||||||
bridge_flow.scaled_spacing(),
|
bridge_flow.scaled_spacing(),
|
||||||
fw,
|
fw,
|
||||||
layerm->flow(FlowRole::frPerimeter).scaled_width()};
|
layerm->flow(FlowRole::frPerimeter).scaled_width()};
|
||||||
|
|
||||||
auto w = *max_element(widths, widths + 4);
|
auto w = *max_element(widths, widths + 4);
|
||||||
|
|
||||||
@ -680,7 +680,10 @@ SupportMaterial::generate(PrintObject *object)
|
|||||||
// object's top surfaces this is the place to detect them. TODO
|
// object's top surfaces this is the place to detect them. TODO
|
||||||
|
|
||||||
|
|
||||||
// Propagate contact layers downwards to generate interface layers. TODO
|
// Propagate contact layers downwards to generate interface layers.
|
||||||
|
map<int, Polygons> interface = generate_interface_layers(support_z, contact, top);
|
||||||
|
clip_with_object(interface, support_z, *object);
|
||||||
|
// clip_with_shape(base, shape); // TODO
|
||||||
|
|
||||||
// Propagate contact layers and interface layers downwards to generate
|
// Propagate contact layers and interface layers downwards to generate
|
||||||
// the main support layers. TODO
|
// the main support layers. TODO
|
||||||
@ -709,16 +712,16 @@ SupportMaterial::generate(PrintObject *object)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
map<int, Polygons>
|
||||||
map<coordf_t, Polygons>
|
SupportMaterial::generate_interface_layers(vector<coordf_t> support_z,
|
||||||
SupportMaterial::generate_interface_layers(vector<coordf_t> support_z, map<coordf_t, Polygons> contact, map<coordf_t, Polygons> top)
|
map<coordf_t, Polygons> contact,
|
||||||
|
map<coordf_t, Polygons> top)
|
||||||
{
|
{
|
||||||
// let's now generate interface layers below contact areas.
|
// let's now generate interface layers below contact areas.
|
||||||
map<coordf_t, Polygons> interface;
|
map<int, Polygons> interface;
|
||||||
auto interface_layers_num = object_config->support_material_interface_layers.value;
|
auto interface_layers_num = object_config->support_material_interface_layers.value;
|
||||||
|
|
||||||
for (int layer_id = 0; layer_id < support_z.size(); layer_id++)
|
for (int layer_id = 0; layer_id < support_z.size(); layer_id++) {
|
||||||
{
|
|
||||||
// Todo Ask about how to port this line. "my $this = $contact->{$z} // next;"
|
// Todo Ask about how to port this line. "my $this = $contact->{$z} // next;"
|
||||||
auto z = support_z[layer_id];
|
auto z = support_z[layer_id];
|
||||||
if (contact.count(z) <= 0)
|
if (contact.count(z) <= 0)
|
||||||
@ -726,8 +729,7 @@ SupportMaterial::generate_interface_layers(vector<coordf_t> support_z, map<coord
|
|||||||
Polygons &_contact = contact[z];
|
Polygons &_contact = contact[z];
|
||||||
|
|
||||||
// Count contact layer as interface layer.
|
// Count contact layer as interface layer.
|
||||||
for (int i = layer_id - 1; i >= 0 && i > layer_id - interface_layers_num; i--)
|
for (int i = layer_id - 1; i >= 0 && i > layer_id - interface_layers_num; i--) {
|
||||||
{
|
|
||||||
auto _z = support_z[i];
|
auto _z = support_z[i];
|
||||||
auto overlapping_layers = this->overlapping_layers(i, support_z);
|
auto overlapping_layers = this->overlapping_layers(i, support_z);
|
||||||
vector<coordf_t> overlapping_z;
|
vector<coordf_t> overlapping_z;
|
||||||
@ -745,8 +747,7 @@ SupportMaterial::generate_interface_layers(vector<coordf_t> support_z, map<coord
|
|||||||
append_polygons(ps_1, interface[i]); // interface regions already applied to this layer.
|
append_polygons(ps_1, interface[i]); // interface regions already applied to this layer.
|
||||||
|
|
||||||
Polygons ps_2;
|
Polygons ps_2;
|
||||||
for (auto el : overlapping_z)
|
for (auto el : overlapping_z) {
|
||||||
{
|
|
||||||
if (top.count(el) > 0)
|
if (top.count(el) > 0)
|
||||||
append_polygons(ps_2, top[el]); // top slices on this layer.
|
append_polygons(ps_2, top[el]); // top slices on this layer.
|
||||||
if (contact.count(el))
|
if (contact.count(el))
|
||||||
|
@ -50,21 +50,67 @@ public:
|
|||||||
object(nullptr)
|
object(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void generate(PrintObject *object);
|
|
||||||
|
|
||||||
map<coordf_t, Polygons> generate_interface_layers(vector<coordf_t> support_z, map<coordf_t, Polygons> contact, map<coordf_t, Polygons> top);
|
|
||||||
|
|
||||||
void generate_bottom_interface_layers()
|
void generate_bottom_interface_layers()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void generate_base_layers()
|
map<int, Polygons> generate_base_layers(vector<coordf_t> support_z,
|
||||||
{}
|
map<coordf_t, Polygons> contact,
|
||||||
|
map<int, Polygons> interface,
|
||||||
|
map<coordf_t, Polygons> top)
|
||||||
|
{
|
||||||
|
// Let's now generate support layers under interface layers.
|
||||||
|
map<int, Polygons> base;
|
||||||
|
{
|
||||||
|
for (int i = static_cast<int>(support_z.size() - 1); i >= 0; i--) {
|
||||||
|
auto z = support_z[i];
|
||||||
|
auto overlapping_layers = this->overlapping_layers(i, support_z);
|
||||||
|
vector<coordf_t> overlapping_z;
|
||||||
|
for (auto el : overlapping_layers)
|
||||||
|
overlapping_z.push_back(support_z[el]);
|
||||||
|
|
||||||
|
// In case we have no interface layers, look at upper contact
|
||||||
|
// (1 interface layer means we only have contact layer, so $interface->{$i+1} is empty).
|
||||||
|
Polygons upper_contact;
|
||||||
|
if (object_config->support_material_interface_layers.value <= 1) {
|
||||||
|
append_polygons(upper_contact, contact[support_z[i + 1]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Polygons ps_1;
|
||||||
|
append_polygons(ps_1, base[i + 1]); // support regions on upper layer.
|
||||||
|
append_polygons(ps_1, interface[i + 1]); // interface regions on upper layer
|
||||||
|
append_polygons(ps_1, upper_contact); // contact regions on upper layer
|
||||||
|
|
||||||
|
Polygons ps_2;
|
||||||
|
for (auto el : overlapping_z) {
|
||||||
|
if (top.count(el) > 0)
|
||||||
|
append_polygons(ps_2, top[el]); // top slices on this layer.
|
||||||
|
if (interface.count(el))
|
||||||
|
append_polygons(ps_2, interface[el]); // interface regions on this layer.
|
||||||
|
if (contact.count(el))
|
||||||
|
append_polygons(ps_2, contact[el]); // contact regions on this layer.
|
||||||
|
}
|
||||||
|
|
||||||
|
base[i] = diff(
|
||||||
|
ps_1,
|
||||||
|
ps_2,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
void generate_pillars_shape()
|
void generate_pillars_shape()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
map<int, Polygons> generate_interface_layers(vector<coordf_t> support_z,
|
||||||
|
map<coordf_t, Polygons> contact,
|
||||||
|
map<coordf_t, Polygons> top);
|
||||||
|
|
||||||
pair<map<coordf_t, Polygons>, map<coordf_t, Polygons>> contact_area(PrintObject *object);
|
pair<map<coordf_t, Polygons>, map<coordf_t, Polygons>> contact_area(PrintObject *object);
|
||||||
|
|
||||||
|
void generate(PrintObject *object);
|
||||||
|
|
||||||
void generate_toolpaths(PrintObject *object,
|
void generate_toolpaths(PrintObject *object,
|
||||||
map<coordf_t, Polygons> overhang,
|
map<coordf_t, Polygons> overhang,
|
||||||
map<coordf_t, Polygons> contact,
|
map<coordf_t, Polygons> contact,
|
||||||
@ -82,7 +128,7 @@ public:
|
|||||||
void clip_with_shape(map<int, Polygons> &support, map<int, Polygons> &shape);
|
void clip_with_shape(map<int, Polygons> &support, map<int, Polygons> &shape);
|
||||||
|
|
||||||
/// This method returns the indices of the layers overlapping with the given one.
|
/// This method returns the indices of the layers overlapping with the given one.
|
||||||
vector<int> overlapping_layers(int layer_idx, vector<coordf_t> support_z);
|
vector<int> overlapping_layers(int layer_idx, const vector<coordf_t> &support_z);
|
||||||
|
|
||||||
vector<coordf_t> support_layers_z(vector<coordf_t> contact_z,
|
vector<coordf_t> support_layers_z(vector<coordf_t> contact_z,
|
||||||
vector<coordf_t> top_z,
|
vector<coordf_t> top_z,
|
||||||
@ -160,8 +206,8 @@ public:
|
|||||||
print.default_object_config.set_deserialize("layer_height", "0.2");
|
print.default_object_config.set_deserialize("layer_height", "0.2");
|
||||||
print.config.set_deserialize("first_layer_height", "0.3");
|
print.config.set_deserialize("first_layer_height", "0.3");
|
||||||
|
|
||||||
vector<coordf_t > contact_z;
|
vector<coordf_t> contact_z;
|
||||||
vector<coordf_t > top_z;
|
vector<coordf_t> top_z;
|
||||||
contact_z.push_back(1.9);
|
contact_z.push_back(1.9);
|
||||||
top_z.push_back(1.9);
|
top_z.push_back(1.9);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user