OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::FlushDistanceEvaluator Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/FilamentGroup.hpp>

Collaboration diagram for Slic3r::FlushDistanceEvaluator:

Public Member Functions

 FlushDistanceEvaluator (const std::vector< FlushMatrix > &flush_matrix, const std::vector< unsigned int > &used_filaments, const std::vector< std::vector< unsigned int > > &layer_filaments, double p=0.65)
 ~FlushDistanceEvaluator ()=default
double get_distance (int idx_a, int idx_b, int extruder_id) const

Private Attributes

std::vector< std::vector< std::vector< float > > > m_distance_matrix

Detailed Description

Constructor & Destructor Documentation

◆ FlushDistanceEvaluator()

Slic3r::FlushDistanceEvaluator::FlushDistanceEvaluator ( const std::vector< FlushMatrix > & flush_matrix,
const std::vector< unsigned int > & used_filaments,
const std::vector< std::vector< unsigned int > > & layer_filaments,
double p = 0.65 )
575 {
576 //calc pair counts
577 std::vector<std::vector<int>>count_matrix(used_filaments.size(), std::vector<int>(used_filaments.size()));
578 for (const auto& lf : layer_filaments) {
579 for (auto iter = lf.begin(); iter != lf.end(); ++iter) {
580 auto id_iter1 = std::find(used_filaments.begin(), used_filaments.end(), *iter);
581 if (id_iter1 == used_filaments.end())
582 continue;
583 auto idx1 = id_iter1 - used_filaments.begin();
584 for (auto niter = std::next(iter); niter != lf.end(); ++niter) {
585 auto id_iter2 = std::find(used_filaments.begin(), used_filaments.end(), *niter);
586 if (id_iter2 == used_filaments.end())
587 continue;
588 auto idx2 = id_iter2 - used_filaments.begin();
589 count_matrix[idx1][idx2] += 1;
590 count_matrix[idx2][idx1] += 1;
591 }
592 }
593 }
594
595 m_distance_matrix.resize(flush_matrix.size(), std::vector<std::vector<float>>(used_filaments.size(), std::vector<float>(used_filaments.size())));
596
597 for (size_t i = 0; i < used_filaments.size(); ++i) {
598 for (size_t j = 0; j < used_filaments.size(); ++j) {
599 for (size_t k = 0; k < flush_matrix.size(); k++) {
600 if (i == j)
601 m_distance_matrix[k][i][j] = 0;
602 else {
603 //TODO: check m_flush_matrix
604 float max_val = std::max(flush_matrix[k][used_filaments[i]][used_filaments[j]], flush_matrix[k][used_filaments[j]][used_filaments[i]]);
605 float min_val = std::min(flush_matrix[k][used_filaments[i]][used_filaments[j]], flush_matrix[k][used_filaments[j]][used_filaments[i]]);
606 m_distance_matrix[k][i][j] = (max_val * p + min_val * (1 - p)) * (std::max(count_matrix[i][j], 1));
607 }
608 }
609 }
610 }
611 }
std::vector< std::vector< std::vector< float > > > m_distance_matrix
Definition FilamentGroup.hpp:138

References m_distance_matrix.

◆ ~FlushDistanceEvaluator()

Slic3r::FlushDistanceEvaluator::~FlushDistanceEvaluator ( )
default

Member Function Documentation

◆ get_distance()

double Slic3r::FlushDistanceEvaluator::get_distance ( int idx_a,
int idx_b,
int extruder_id ) const
614 {
615 assert(0 <= idx_a && idx_a < m_distance_matrix[extruder_id].size());
616 assert(0 <= idx_b && idx_b < m_distance_matrix[extruder_id].size());
617
618 return m_distance_matrix[extruder_id][idx_a][idx_b];
619 }

References m_distance_matrix.

Member Data Documentation

◆ m_distance_matrix

std::vector<std::vector<std::vector<float> > > Slic3r::FlushDistanceEvaluator::m_distance_matrix
private

The documentation for this class was generated from the following files: