mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-13 03:31:52 +08:00
make Random seams disaligned
This commit is contained in:
parent
15135ef2ed
commit
191e788aa0
@ -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";
|
||||||
|
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user