make Random seams disaligned

This commit is contained in:
PavelMikus 2022-03-18 10:10:51 +01:00
parent 15135ef2ed
commit 191e788aa0
2 changed files with 14 additions and 11 deletions

View File

@ -19,7 +19,7 @@
#include "libslic3r/Geometry/Curves.hpp" #include "libslic3r/Geometry/Curves.hpp"
#define DEBUG_FILES //#define DEBUG_FILES
#ifdef DEBUG_FILES #ifdef DEBUG_FILES
#include <boost/nowide/cstdio.hpp> #include <boost/nowide/cstdio.hpp>
@ -344,13 +344,15 @@ struct GlobalModelInfo {
; ;
//Extract perimeter polygons of the given layer //Extract perimeter polygons of the given layer
Polygons extract_perimeter_polygons(const Layer *layer) { Polygons extract_perimeter_polygons(const Layer *layer, const SeamPosition configured_seam_preference) {
Polygons polygons; Polygons polygons;
for (const LayerRegion *layer_region : layer->regions()) { for (const LayerRegion *layer_region : layer->regions()) {
for (const ExtrusionEntity *ex_entity : layer_region->perimeters.entities) { for (const ExtrusionEntity *ex_entity : layer_region->perimeters.entities) {
if (ex_entity->is_collection()) { //collection of inner, outer, and overhang perimeters if (ex_entity->is_collection()) { //collection of inner, outer, and overhang perimeters
for (const ExtrusionEntity *perimeter : static_cast<const ExtrusionEntityCollection*>(ex_entity)->entities) { for (const ExtrusionEntity *perimeter : static_cast<const ExtrusionEntityCollection*>(ex_entity)->entities) {
if (perimeter->role() == ExtrusionRole::erExternalPerimeter) { if (perimeter->role() == ExtrusionRole::erExternalPerimeter
|| (perimeter->role() == ExtrusionRole::erPerimeter
&& configured_seam_preference == spRandom)) {
Points p; Points p;
perimeter->collect_points(p); perimeter->collect_points(p);
polygons.emplace_back(p); polygons.emplace_back(p);
@ -903,7 +905,7 @@ void pick_random_seam_point(std::vector<SeamCandidate> &perimeter_points, size_t
// Gather SeamCandidates of each layer into vector and build KDtree over them // Gather SeamCandidates of each layer into vector and build KDtree over them
// Store results in the SeamPlacer varaibles m_perimeter_points_per_object and m_perimeter_points_trees_per_object // Store results in the SeamPlacer varaibles m_perimeter_points_per_object and m_perimeter_points_trees_per_object
void SeamPlacer::gather_seam_candidates(const PrintObject *po, void SeamPlacer::gather_seam_candidates(const PrintObject *po,
const SeamPlacerImpl::GlobalModelInfo &global_model_info) { const SeamPlacerImpl::GlobalModelInfo &global_model_info, const SeamPosition configured_seam_preference) {
using namespace SeamPlacerImpl; using namespace SeamPlacerImpl;
m_perimeter_points_per_object.emplace(po, po->layer_count()); m_perimeter_points_per_object.emplace(po, po->layer_count());
@ -916,7 +918,7 @@ void SeamPlacer::gather_seam_candidates(const PrintObject *po,
m_perimeter_points_per_object[po][layer_idx]; m_perimeter_points_per_object[po][layer_idx];
const Layer *layer = po->get_layer(layer_idx); const Layer *layer = po->get_layer(layer_idx);
auto unscaled_z = layer->slice_z; auto unscaled_z = layer->slice_z;
Polygons polygons = extract_perimeter_polygons(layer); Polygons polygons = extract_perimeter_polygons(layer, configured_seam_preference);
for (const auto &poly : polygons) { for (const auto &poly : polygons) {
process_perimeter_polygon(poly, unscaled_z, layer_candidates, process_perimeter_polygon(poly, unscaled_z, layer_candidates,
global_model_info); global_model_info);
@ -1228,7 +1230,7 @@ void SeamPlacer::init(const Print &print) {
BOOST_LOG_TRIVIAL(debug) BOOST_LOG_TRIVIAL(debug)
<< "SeamPlacer: gather_seam_candidates: start"; << "SeamPlacer: gather_seam_candidates: start";
gather_seam_candidates(po, global_model_info); gather_seam_candidates(po, global_model_info, configured_seam_preference);
BOOST_LOG_TRIVIAL(debug) BOOST_LOG_TRIVIAL(debug)
<< "SeamPlacer: gather_seam_candidates: end"; << "SeamPlacer: gather_seam_candidates: end";

View File

@ -56,7 +56,7 @@ struct SeamCandidate {
float local_ccw_angle, float local_ccw_angle,
EnforcedBlockedSeamPoint type) : EnforcedBlockedSeamPoint type) :
position(pos), perimeter(perimeter), visibility(0.0f), overhang(0.0f), local_ccw_angle( position(pos), perimeter(perimeter), visibility(0.0f), overhang(0.0f), local_ccw_angle(
local_ccw_angle), type(type), central_enforcer(false){ local_ccw_angle), type(type), central_enforcer(false) {
} }
const Vec3f position; const Vec3f position;
// pointer to Perimter loop of this point. It is shared across all points of the loop // pointer to Perimter loop of this point. It is shared across all points of the loop
@ -124,17 +124,18 @@ public:
void init(const Print &print); void init(const Print &print);
void place_seam(const Layer *layer, ExtrusionLoop &loop, bool external_first, const Point& last_pos) const; void place_seam(const Layer *layer, ExtrusionLoop &loop, bool external_first, const Point &last_pos) const;
private: private:
void gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info); void gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info,
const SeamPosition configured_seam_preference);
void calculate_candidates_visibility(const PrintObject *po, void calculate_candidates_visibility(const PrintObject *po,
const SeamPlacerImpl::GlobalModelInfo &global_model_info); const SeamPlacerImpl::GlobalModelInfo &global_model_info);
void calculate_overhangs(const PrintObject *po); void calculate_overhangs(const PrintObject *po);
void align_seam_points(const PrintObject *po, const SeamPlacerImpl::SeamComparator &comparator); void align_seam_points(const PrintObject *po, const SeamPlacerImpl::SeamComparator &comparator);
bool find_next_seam_in_layer(const PrintObject *po, bool find_next_seam_in_layer(const PrintObject *po,
std::pair<size_t, size_t> &last_point_indexes, std::pair<size_t, size_t> &last_point_indexes,
size_t layer_idx,const SeamPlacerImpl::SeamComparator &comparator, size_t layer_idx, const SeamPlacerImpl::SeamComparator &comparator,
std::vector<std::pair<size_t, size_t>> &seam_string); std::vector<std::pair<size_t, size_t>> &seam_string);
}; };