mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-15 11:45:56 +08:00
Refactoring.
This commit is contained in:
parent
49fbe98910
commit
99c7c2c8bf
@ -17,25 +17,20 @@ SupportMaterial::generate_toolpaths(PrintObject *object,
|
|||||||
map<int, Polygons> interface,
|
map<int, Polygons> interface,
|
||||||
map<int, Polygons> base)
|
map<int, Polygons> base)
|
||||||
{
|
{
|
||||||
int ll = 0;
|
// Assign the object to the supports class.
|
||||||
//cout << "Generate toolpaths " << ll++ << endl;
|
|
||||||
// Assig the object to the supports class.
|
|
||||||
this->object = object;
|
this->object = object;
|
||||||
|
|
||||||
// Shape of contact area.
|
// Shape of contact area.
|
||||||
toolpaths_params params;
|
toolpaths_params params;
|
||||||
params.contact_loops = 1;
|
params.contact_loops = 1;
|
||||||
//cout << "Generate toolpaths " << ll++ << endl;
|
|
||||||
|
|
||||||
params.circle_radius = 1.5 * interface_flow.scaled_width();
|
params.circle_radius = 1.5 * interface_flow.scaled_width();
|
||||||
//cout << "Generate toolpaths " << ll++ << endl;
|
|
||||||
|
|
||||||
params.circle_distance = 3 * params.circle_radius;
|
params.circle_distance = 3 * params.circle_radius;
|
||||||
//cout << "Generate toolpaths " << ll++ << endl;
|
|
||||||
|
|
||||||
params.circle = create_circle(params.circle_radius);
|
params.circle = create_circle(params.circle_radius);
|
||||||
//cout << "Generate toolpaths " << ll++ << endl;
|
|
||||||
// TODO Add Slic3r debug. "Generating patterns\n"
|
#ifdef SLIC3R_DEBUG
|
||||||
|
printf("Generating patterns\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
// Prepare fillers.
|
// Prepare fillers.
|
||||||
params.pattern = object_config->support_material_pattern.value;
|
params.pattern = object_config->support_material_pattern.value;
|
||||||
params.angles.push_back(object_config->support_material_angle.value);
|
params.angles.push_back(object_config->support_material_angle.value);
|
||||||
@ -47,7 +42,6 @@ SupportMaterial::generate_toolpaths(PrintObject *object,
|
|||||||
else if (params.pattern == smpPillars) {
|
else if (params.pattern == smpPillars) {
|
||||||
params.pattern = smpHoneycomb;
|
params.pattern = smpHoneycomb;
|
||||||
}
|
}
|
||||||
//cout << "Generate toolpaths " << ll++ << endl;
|
|
||||||
params.interface_angle = object_config->support_material_angle.value + 90;
|
params.interface_angle = object_config->support_material_angle.value + 90;
|
||||||
params.interface_spacing = object_config->support_material_interface_spacing.value + interface_flow.spacing();
|
params.interface_spacing = object_config->support_material_interface_spacing.value + interface_flow.spacing();
|
||||||
params.interface_density =
|
params.interface_density =
|
||||||
@ -61,7 +55,6 @@ SupportMaterial::generate_toolpaths(PrintObject *object,
|
|||||||
boost::bind(&SupportMaterial::process_layer, this, _1, params),
|
boost::bind(&SupportMaterial::process_layer, this, _1, params),
|
||||||
this->config->threads.value
|
this->config->threads.value
|
||||||
);
|
);
|
||||||
//cout << "Generate toolpaths finished" << ll++ << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -74,36 +67,28 @@ SupportMaterial::generate(PrintObject *object)
|
|||||||
// that it will be effective, regardless of how it's built below.
|
// that it will be effective, regardless of how it's built below.
|
||||||
pair<map<coordf_t, Polygons>, map<coordf_t, Polygons>> contact_overhang = contact_area(object);
|
pair<map<coordf_t, Polygons>, map<coordf_t, Polygons>> contact_overhang = contact_area(object);
|
||||||
map<coordf_t, Polygons> &contact = contact_overhang.first;
|
map<coordf_t, Polygons> &contact = contact_overhang.first;
|
||||||
//cout << "Contact size " << contact.size() << endl;
|
|
||||||
map<coordf_t, Polygons> &overhang = contact_overhang.second;
|
map<coordf_t, Polygons> &overhang = contact_overhang.second;
|
||||||
|
|
||||||
int ppp = 0;
|
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
|
|
||||||
// Determine the top surfaces of the object. We need these to determine
|
// Determine the top surfaces of the object. We need these to determine
|
||||||
// the layer heights of support material and to clip support to the object
|
// the layer heights of support material and to clip support to the object
|
||||||
// silhouette.
|
// silhouette.
|
||||||
map<coordf_t, Polygons> top = object_top(object, &contact);
|
map<coordf_t, Polygons> top = object_top(object, &contact);
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
// We now know the upper and lower boundaries for our support material object
|
// We now know the upper and lower boundaries for our support material object
|
||||||
// (@$contact_z and @$top_z), so we can generate intermediate layers.
|
// (@$contact_z and @$top_z), so we can generate intermediate layers.
|
||||||
vector<coordf_t> support_z = support_layers_z(get_keys_sorted(contact),
|
vector<coordf_t> support_z = support_layers_z(get_keys_sorted(contact),
|
||||||
get_keys_sorted(top),
|
get_keys_sorted(top),
|
||||||
get_max_layer_height(object));
|
get_max_layer_height(object));
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
// If we wanted to apply some special logic to the first support layers lying on
|
// If we wanted to apply some special logic to the first support layers lying on
|
||||||
// object's top surfaces this is the place to detect them.
|
// object's top surfaces this is the place to detect them.
|
||||||
map<int, Polygons> shape;
|
map<int, Polygons> shape;
|
||||||
if (object_config->support_material_pattern.value == smpPillars)
|
if (object_config->support_material_pattern.value == smpPillars)
|
||||||
this->generate_pillars_shape(contact, support_z, shape);
|
this->generate_pillars_shape(contact, support_z, shape);
|
||||||
|
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
// Propagate contact layers downwards to generate interface layers.
|
// Propagate contact layers downwards to generate interface layers.
|
||||||
map<int, Polygons> interface = generate_interface_layers(support_z, contact, top);
|
map<int, Polygons> interface = generate_interface_layers(support_z, contact, top);
|
||||||
clip_with_object(interface, support_z, *object);
|
clip_with_object(interface, support_z, *object);
|
||||||
if (!shape.empty())
|
if (!shape.empty())
|
||||||
clip_with_shape(interface, shape);
|
clip_with_shape(interface, shape);
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
// Propagate contact layers and interface layers downwards to generate
|
// Propagate contact layers and interface layers downwards to generate
|
||||||
// the main support layers.
|
// the main support layers.
|
||||||
map<int, Polygons> base = generate_base_layers(support_z, contact, interface, top);
|
map<int, Polygons> base = generate_base_layers(support_z, contact, interface, top);
|
||||||
@ -111,11 +96,9 @@ SupportMaterial::generate(PrintObject *object)
|
|||||||
if (!shape.empty())
|
if (!shape.empty())
|
||||||
clip_with_shape(base, shape);
|
clip_with_shape(base, shape);
|
||||||
|
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
// Detect what part of base support layers are "reverse interfaces" because they
|
// Detect what part of base support layers are "reverse interfaces" because they
|
||||||
// lie above object's top surfaces.
|
// lie above object's top surfaces.
|
||||||
generate_bottom_interface_layers(support_z, base, top, interface);
|
generate_bottom_interface_layers(support_z, base, top, interface);
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
// Install support layers into object.
|
// Install support layers into object.
|
||||||
for (int i = 0; i < int(support_z.size()); i++) {
|
for (int i = 0; i < int(support_z.size()); i++) {
|
||||||
object->add_support_layer(
|
object->add_support_layer(
|
||||||
@ -129,11 +112,8 @@ SupportMaterial::generate(PrintObject *object)
|
|||||||
object->support_layers.end()[-1]->lower_layer = object->support_layers.end()[-2];
|
object->support_layers.end()[-1]->lower_layer = object->support_layers.end()[-2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//cout << "Supports z count is " << support_z.size() << endl;
|
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
// Generate the actual toolpaths and save them into each layer.
|
// Generate the actual toolpaths and save them into each layer.
|
||||||
generate_toolpaths(object, overhang, contact, interface, base);
|
generate_toolpaths(object, overhang, contact, interface, base);
|
||||||
//cout << "Samir " << ppp++ << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<coordf_t>
|
vector<coordf_t>
|
||||||
@ -201,7 +181,7 @@ SupportMaterial::support_layers_z(vector<coordf_t> contact_z,
|
|||||||
{
|
{
|
||||||
set<coordf_t> s;
|
set<coordf_t> s;
|
||||||
for (coordf_t el : z)
|
for (coordf_t el : z)
|
||||||
s.insert(int(el * 100) / 100.0); // round it to 2 decimal places.
|
s.insert(int(el * 1000) / 1000.0); // round it to 2 decimal places.
|
||||||
z = vector<coordf_t>();
|
z = vector<coordf_t>();
|
||||||
for (coordf_t el : s)
|
for (coordf_t el : s)
|
||||||
z.push_back(el);
|
z.push_back(el);
|
||||||
@ -213,10 +193,7 @@ SupportMaterial::support_layers_z(vector<coordf_t> contact_z,
|
|||||||
pair<map<coordf_t, Polygons>, map<coordf_t, Polygons>>
|
pair<map<coordf_t, Polygons>, map<coordf_t, Polygons>>
|
||||||
SupportMaterial::contact_area(PrintObject *object)
|
SupportMaterial::contact_area(PrintObject *object)
|
||||||
{
|
{
|
||||||
//cout << "After " << this->object_config->support_material.value << " ," << (this->object_config->support_material ? " Support Material is enabled" : "Support Material is disabled") << endl;
|
|
||||||
|
|
||||||
PrintObjectConfig &conf = *this->object_config;
|
PrintObjectConfig &conf = *this->object_config;
|
||||||
//cout << conf.support_material.value << " " << (conf.support_material.value ? " Support Material is enabled" : "Support Material is disabled") << endl;
|
|
||||||
|
|
||||||
// If user specified a custom angle threshold, convert it to radians.
|
// If user specified a custom angle threshold, convert it to radians.
|
||||||
float threshold_rad = 0.0;
|
float threshold_rad = 0.0;
|
||||||
@ -247,11 +224,9 @@ SupportMaterial::contact_area(PrintObject *object)
|
|||||||
// and $layer->id == 0 means first print layer (including raft).
|
// and $layer->id == 0 means first print layer (including raft).
|
||||||
|
|
||||||
// If no raft, and we're at layer 0, skip to layer 1
|
// If no raft, and we're at layer 0, skip to layer 1
|
||||||
//cout << "LAYER ID " << layer_id << endl;
|
|
||||||
if (conf.raft_layers == 0 && layer_id == 0) {
|
if (conf.raft_layers == 0 && layer_id == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//cout << conf.support_material.value << " " << (conf.support_material.value ? " Support Material is enabled" : "Support Material is disabled") << endl;
|
|
||||||
// With or without raft, if we're above layer 1, we need to quit
|
// With or without raft, if we're above layer 1, we need to quit
|
||||||
// support generation if supports are disabled, or if we're at a high
|
// support generation if supports are disabled, or if we're at a high
|
||||||
// enough layer that enforce-supports no longer applies.
|
// enough layer that enforce-supports no longer applies.
|
||||||
@ -283,9 +258,7 @@ SupportMaterial::contact_area(PrintObject *object)
|
|||||||
// with the polygons collected before,
|
// with the polygons collected before,
|
||||||
// but don't apply the safety offset during the union operation as it would
|
// but don't apply the safety offset during the union operation as it would
|
||||||
// inflate the polygons over and over.
|
// inflate the polygons over and over.
|
||||||
//cout << "Old Build plate only surfaces " << buildplate_only_top_surfaces.size() << endl;
|
|
||||||
append_to(buildplate_only_top_surfaces, offset(projection_new, scale_(0.01)));
|
append_to(buildplate_only_top_surfaces, offset(projection_new, scale_(0.01)));
|
||||||
//cout << "New Build plate only surfaces " << buildplate_only_top_surfaces.size() << endl;
|
|
||||||
|
|
||||||
buildplate_only_top_surfaces = union_(buildplate_only_top_surfaces, 0);
|
buildplate_only_top_surfaces = union_(buildplate_only_top_surfaces, 0);
|
||||||
}
|
}
|
||||||
@ -531,7 +504,6 @@ SupportMaterial::contact_area(PrintObject *object)
|
|||||||
// Ignore this contact area if it's too low.
|
// Ignore this contact area if it's too low.
|
||||||
if (contact_z < conf.first_layer_height - EPSILON)
|
if (contact_z < conf.first_layer_height - EPSILON)
|
||||||
continue;
|
continue;
|
||||||
//cout << contact_z << " " << tmp_contact.size() << endl;
|
|
||||||
|
|
||||||
contact[contact_z] = tmp_contact;
|
contact[contact_z] = tmp_contact;
|
||||||
overhang[contact_z] = tmp_overhang;
|
overhang[contact_z] = tmp_overhang;
|
||||||
@ -599,13 +571,9 @@ SupportMaterial::generate_pillars_shape(const map<coordf_t, Polygons> &contact,
|
|||||||
// This prevents supplying an empty point set to BoundingBox constructor.
|
// This prevents supplying an empty point set to BoundingBox constructor.
|
||||||
if (contact.empty()) return;
|
if (contact.empty()) return;
|
||||||
|
|
||||||
int u = 0;
|
|
||||||
//cout << "Pillars generation " << contact.size() << endl;
|
|
||||||
|
|
||||||
coord_t pillar_size = scale_(object_config->support_material_pillar_size.value);
|
coord_t pillar_size = scale_(object_config->support_material_pillar_size.value);
|
||||||
coord_t pillar_spacing = scale_(object_config->support_material_pillar_spacing.value);
|
coord_t pillar_spacing = scale_(object_config->support_material_pillar_spacing.value);
|
||||||
|
|
||||||
//cout << "Samir U " << u++ << endl;
|
|
||||||
Polygons grid;
|
Polygons grid;
|
||||||
{
|
{
|
||||||
auto pillar = Polygon({
|
auto pillar = Polygon({
|
||||||
@ -634,28 +602,18 @@ SupportMaterial::generate_pillars_shape(const map<coordf_t, Polygons> &contact,
|
|||||||
|
|
||||||
grid = union_(pillars);
|
grid = union_(pillars);
|
||||||
}
|
}
|
||||||
//cout << "Samir U " << u++ << endl; //1
|
|
||||||
//cout << "Support z size " << support_z.size() << endl;
|
|
||||||
// Add pillars to every layer.
|
// Add pillars to every layer.
|
||||||
for (auto i = 0; i < support_z.size(); i++) {
|
for (auto i = 0; i < support_z.size(); i++) {
|
||||||
shape[i] = grid;
|
shape[i] = grid;
|
||||||
}
|
}
|
||||||
//cout << "Samir U " << u++ << endl;
|
|
||||||
// Build capitals.
|
// Build capitals.
|
||||||
//cout << "contacts START " << endl;
|
|
||||||
for (auto el : contact) {
|
|
||||||
//cout << el.first << endl;
|
|
||||||
}
|
|
||||||
//cout << "contacts END" << endl;
|
|
||||||
for (auto i = 0; i < support_z.size(); i++) {
|
for (auto i = 0; i < support_z.size(); i++) {
|
||||||
coordf_t z = support_z[i];
|
coordf_t z = support_z[i];
|
||||||
|
|
||||||
//cout << z << endl;
|
|
||||||
auto capitals = intersection(
|
auto capitals = intersection(
|
||||||
grid,
|
grid,
|
||||||
contact.count(z) > 0 ? contact.at(z) : Polygons()
|
contact.count(z) > 0 ? contact.at(z) : Polygons()
|
||||||
);
|
);
|
||||||
//cout << "Samir U " << u++ << endl;
|
|
||||||
// Work on one pillar at time (if any) to prevent the capitals from being merged
|
// Work on one pillar at time (if any) to prevent the capitals from being merged
|
||||||
// but store the contact area supported by the capital because we need to make
|
// but store the contact area supported by the capital because we need to make
|
||||||
// sure nothing is left.
|
// sure nothing is left.
|
||||||
@ -672,7 +630,6 @@ SupportMaterial::generate_pillars_shape(const map<coordf_t, Polygons> &contact,
|
|||||||
append_to(shape[i], capital_polygons);
|
append_to(shape[i], capital_polygons);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//cout << "Samir U " << u++ << endl;
|
|
||||||
// Work on one pillar at time (if any) to prevent the capitals from being merged
|
// Work on one pillar at time (if any) to prevent the capitals from being merged
|
||||||
// but store the contact area supported by the capital because we need to make
|
// but store the contact area supported by the capital because we need to make
|
||||||
// sure nothing is left.
|
// sure nothing is left.
|
||||||
@ -687,7 +644,6 @@ SupportMaterial::generate_pillars_shape(const map<coordf_t, Polygons> &contact,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//cout << "Samir U " << u++ << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
map<int, Polygons>
|
map<int, Polygons>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user