hardcode overhang angles, remove volumetric filtering (does not work correctly)

This commit is contained in:
PavelMikus 2022-08-16 16:14:22 +02:00
parent 6114b04594
commit 3773de2957
4 changed files with 23 additions and 14 deletions

View file

@ -423,7 +423,7 @@ void PrintObject::generate_support_spots()
std::all_of(this->model_object()->volumes.begin(), this->model_object()->volumes.end(),
[](const ModelVolume* mv){return mv->supported_facets.empty();})
) {
SupportSpotsGenerator::Params params{90.001f - this->m_config.support_material_threshold, this->print()->m_config.filament_type.values};
SupportSpotsGenerator::Params params{this->print()->m_config.filament_type.values};
SupportSpotsGenerator::Issues issues = SupportSpotsGenerator::full_search(this, params);
auto obj_transform = this->trafo_centered();
for (ModelVolume *model_volume : this->model_object()->volumes) {

View file

@ -364,6 +364,8 @@ void check_extrusion_entity_stability(const ExtrusionEntity *entity,
return Vec3f(point.x(), point.y(), layer_z);
};
float overhang_dist = tan(params.overhang_angle_deg * PI / 180.0f)*layer_region->layer()->height;
float min_malformation_dist = tan(params.malformation_angle_span_deg.first * PI / 180.0f)*layer_region->layer()->height;
float max_malformation_dist = tan(params.malformation_angle_span_deg.second * PI / 180.0f)*layer_region->layer()->height;
Points points { };
entity->collect_points(points);
@ -387,8 +389,7 @@ void check_extrusion_entity_stability(const ExtrusionEntity *entity,
ExtrusionPropertiesAccumulator bridging_acc { };
ExtrusionPropertiesAccumulator malformation_acc { };
bridging_acc.add_distance(params.bridge_distance + 1.0f); // Initialise unsupported distance with larger than tolerable distance ->
// -> it prevents extruding perimeter starts and short loops into air.
bridging_acc.add_distance(params.bridge_distance);
const float flow_width = get_flow_width(layer_region, entity->role());
for (size_t line_idx = 0; line_idx < lines.size(); ++line_idx) {
@ -430,7 +431,7 @@ void check_extrusion_entity_stability(const ExtrusionEntity *entity,
const ExtrusionLine &nearest_line = prev_layer_lines.get_line(nearest_line_idx);
current_line.malformation += 0.9 * nearest_line.malformation;
}
if (dist_from_prev_layer > overhang_dist) {
if (dist_from_prev_layer > min_malformation_dist && dist_from_prev_layer < max_malformation_dist) {
malformation_acc.add_distance(current_line.len);
current_line.malformation += layer_region->layer()->height * (0.5f +
1.5f * (malformation_acc.max_curvature / PI) * gauss(malformation_acc.distance, 5.0f, 1.0f, 0.2f));
@ -652,6 +653,10 @@ public:
island.sticking_second_moment_of_area_covariance_accumulator;
}
float get_volume() const {
return volume;
}
void add(const ObjectPart &other) {
this->volume_centroid_accumulator += other.volume_centroid_accumulator;
this->volume += other.volume;

View file

@ -9,15 +9,16 @@ namespace Slic3r {
namespace SupportSpotsGenerator {
struct Params {
Params(float overhang_angle_deg, const std::vector<std::string>& filament_types) : overhang_angle_deg(overhang_angle_deg)
{
Params(const std::vector<std::string> &filament_types) {
if (filament_types.size() > 1) {
BOOST_LOG_TRIVIAL(warning) << "SupportSpotsGenerator does not currently handle different materials properly, only first will be used";
BOOST_LOG_TRIVIAL(warning)
<< "SupportSpotsGenerator does not currently handle different materials properly, only first will be used";
}
if (filament_types.empty() || filament_types[0].empty()) {
BOOST_LOG_TRIVIAL(error) << "SupportSpotsGenerator error: empty filament_type";
BOOST_LOG_TRIVIAL(error)
<< "SupportSpotsGenerator error: empty filament_type";
filament_type = std::string("PLA");
}else {
} else {
filament_type = filament_types[0];
}
}
@ -25,22 +26,23 @@ struct Params {
// the algorithm should use the following units for all computations: distance [mm], mass [g], time [s], force [g*mm/s^2]
const float bridge_distance = 15.0f; //mm
const float bridge_distance_decrease_by_curvature_factor = 5.0f; // allowed bridge distance = bridge_distance / (this factor * (curvature / PI) )
const float overhang_angle_deg = 50.0f;
const float overhang_angle_deg = 80.0f;
const std::pair<float,float> malformation_angle_span_deg = std::pair<float, float> { 45.0f, 80.0f };
const float min_distance_between_support_points = 3.0f; //mm
const float support_points_interface_radius = 1.5f; // mm
std::string filament_type;
const float gravity_constant = 9806.65f; // mm/s^2; gravity acceleration on Earth's surface, algorithm assumes that printer is in upwards position.
const float max_acceleration = 9*1000.0f; // mm/s^2 ; max acceleration of object (bed) in XY (NOTE: The max hit is received by the object in the jerk phase, so the usual machine limits are too low)
const float filament_density = 1.25e-3f ; // g/mm^3 ; Common filaments are very lightweight, so precise number is not that important
const float max_acceleration = 9 * 1000.0f; // mm/s^2 ; max acceleration of object (bed) in XY (NOTE: The max hit is received by the object in the jerk phase, so the usual machine limits are too low)
const float filament_density = 1.25e-3f; // g/mm^3 ; Common filaments are very lightweight, so precise number is not that important
const float material_yield_strength = 33.0f * 1e6f; // (g*mm/s^2)/mm^2; 33 MPa is yield strength of ABS, which has the lowest yield strength from common materials.
const float standard_extruder_conflict_force = 20.0f * gravity_constant; // force that can occasionally push the model due to various factors (filament leaks, small curling, ... );
const float malformations_additive_conflict_extruder_force = 300.0f * gravity_constant; // for areas with possible high layered curled filaments
// MPa * 1e^6 = (g*mm/s^2)/mm^2 = g/(mm*s^2); yield strength of the bed surface
float get_bed_adhesion_yield_strength() const {
if (filament_type == "PLA"){
if (filament_type == "PLA") {
return 0.018f * 1e6f;
} else if (filament_type == "PET" || filament_type == "PETG") {
return 0.3f * 1e6f;
@ -51,7 +53,7 @@ struct Params {
};
struct SupportPoint {
SupportPoint(const Vec3f &position, float force, const Vec3f& direction);
SupportPoint(const Vec3f &position, float force, const Vec3f &direction);
Vec3f position;
float force;
Vec3f direction;

View file

@ -332,6 +332,7 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l
}
update_model_object();
this->waiting_for_autogenerated_supports = false;
m_parent.set_as_dirty();
}
@ -379,6 +380,7 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block)
Plater::TakeSnapshot snapshot(wxGetApp().plater(), block ? _L("Block supports by angle")
: _L("Add supports by angle"));
update_model_object();
this->waiting_for_autogenerated_supports = false;
m_parent.set_as_dirty();
}