OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult Class Reference

Layer-aware nozzle-grouping result. Used by the back-end slicing code; supports per-layer nozzle mapping. More...

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

Inheritance diagram for Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult:
Collaboration diagram for Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult:

Public Member Functions

 LayeredNozzleGroupResult (bool support_dynamic_map=false)
bool are_filaments_same_extruder (int filament_id1, int filament_id2, int layer_id=-1) const
bool are_filaments_same_nozzle (int filament_id1, int filament_id2, int layer_id=-1) const
int get_extruder_count () const override
std::vector< NozzleInfo > get_used_nozzles_in_extruder (int target_extruder_id=-1) const override
std::vector< NozzleInfo > get_used_nozzles_in_extruder (int target_extruder_id, int layer_id) const
std::vector< int > get_used_extruders () const override
std::vector< int > get_used_extruders (int layer_id) const
std::vector< int > get_extruder_map (bool zero_based=true, int layer_id=-1) const
std::vector< int > get_nozzle_map (int layer_id=-1) const
std::vector< int > get_volume_map (int layer_id=-1) const
std::vector< unsigned int > get_used_filaments () const override
std::vector< unsigned int > get_used_filaments (int layer_id) const
std::optional< NozzleInfo > get_nozzle_for_filament (int filament_id, int layer_id=-1) const
std::vector< NozzleInfo > get_nozzles_for_filament (int filament_id) const override
std::optional< NozzleInfo > get_nozzle_from_id (int nozzle_id) const override
std::optional< NozzleInfo > get_first_nozzle_for_filament (int filament_id) const override
int get_extruder_id (int filament_id, int layer_id=-1) const
int get_nozzle_id (int filament_id, int layer_id=-1) const
size_t get_layer_count () const
const std::vector< int > & get_layer_filament_nozzle_map (int layer_id) const
const std::vector< std::vector< int > > & get_layer_filament_nozzle_maps () const
const std::vector< std::vector< unsigned int > > & get_layer_filament_sequences () const
int estimate_seq_flush_weight (const std::vector< std::vector< std::vector< float > > > &flush_matrix, const std::vector< int > &filament_change_seq) const
bool is_support_dynamic_nozzle_map () const

Static Public Member Functions

static std::optional< LayeredNozzleGroupResult > create (const std::vector< int > &filament_nozzle_map, const std::vector< NozzleInfo > &nozzle_list, const std::vector< unsigned int > &used_filaments)
static std::optional< LayeredNozzleGroupResult > create (const std::vector< std::vector< int > > &layer_filament_nozzle_maps, const std::vector< NozzleInfo > &nozzle_list, const std::vector< unsigned int > &used_filaments, const std::vector< std::vector< unsigned int > > &layer_filament_sequences)
static std::optional< LayeredNozzleGroupResult > create (const std::vector< unsigned int > &used_filaments, const std::vector< int > &filament_map, const std::vector< int > &filament_volume_map, const std::vector< int > &filament_nozzle_map, const std::vector< std::map< NozzleVolumeType, int > > &nozzle_count, float diameter)

Protected Attributes

bool support_dynamic_nozzle_map {false}

Private Attributes

std::vector< std::vector< int > > _layer_filament_nozzle_maps
std::vector< std::vector< unsigned int > > _layer_filament_sequences
std::vector< int > _default_filament_nozzle_map
std::vector< unsigned int > _used_filaments
std::vector< NozzleInfo > _nozzle_list

Detailed Description

Layer-aware nozzle-grouping result. Used by the back-end slicing code; supports per-layer nozzle mapping.

Constructor & Destructor Documentation

◆ LayeredNozzleGroupResult()

Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::LayeredNozzleGroupResult ( bool support_dynamic_map = false)
inline
134: NozzleGroupResultBase(support_dynamic_map) {}
NozzleGroupResultBase(bool support_dynamic_map=false)
Definition MultiNozzleUtils.hpp:103

References Slic3r::MultiNozzleUtils::NozzleGroupResultBase::NozzleGroupResultBase().

Referenced by create(), and create().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Function Documentation

◆ are_filaments_same_extruder()

bool Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::are_filaments_same_extruder ( int filament_id1,
int filament_id2,
int layer_id = -1 ) const
239{
240 std::optional<NozzleInfo> nozzle_info1 = get_nozzle_for_filament(filament_id1, layer_id);
241 std::optional<NozzleInfo> nozzle_info2 = get_nozzle_for_filament(filament_id2, layer_id);
242
243 if (!nozzle_info1 || !nozzle_info2) return false;
244
245 return nozzle_info1->extruder_id == nozzle_info2->extruder_id;
246}
std::optional< NozzleInfo > get_nozzle_for_filament(int filament_id, int layer_id=-1) const
Definition MultiNozzleUtils.cpp:380

References get_nozzle_for_filament().

Here is the call graph for this function:

◆ are_filaments_same_nozzle()

bool Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::are_filaments_same_nozzle ( int filament_id1,
int filament_id2,
int layer_id = -1 ) const
249{
250 std::optional<NozzleInfo> nozzle_info1 = get_nozzle_for_filament(filament_id1, layer_id);
251 std::optional<NozzleInfo> nozzle_info2 = get_nozzle_for_filament(filament_id2, layer_id);
252 if (!nozzle_info1 || !nozzle_info2) return false;
253
254 return nozzle_info1->group_id == nozzle_info2->group_id;
255}

References get_nozzle_for_filament().

Here is the call graph for this function:

◆ create() [1/3]

std::optional< LayeredNozzleGroupResult > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::create ( const std::vector< int > & filament_nozzle_map,
const std::vector< NozzleInfo > & nozzle_list,
const std::vector< unsigned int > & used_filaments )
static
146{
147 if (filament_nozzle_map.empty() || nozzle_list.empty()) {
148 return std::nullopt;
149 }
150
151 LayeredNozzleGroupResult result(false);
152 result._default_filament_nozzle_map = filament_nozzle_map;
153 result._nozzle_list = nozzle_list;
154 result._used_filaments = used_filaments;
155
156 return result;
157}
LayeredNozzleGroupResult(bool support_dynamic_map=false)
Definition MultiNozzleUtils.hpp:134
zaa_minimize_perimeter_height filament_nozzle_map((ConfigOptionInts, filament_map_2))((ConfigOptionStrings

References LayeredNozzleGroupResult(), _default_filament_nozzle_map, _nozzle_list, _used_filaments, and Slic3r::filament_nozzle_map().

Referenced by Slic3r::ToolOrdering::build_sequential_group_result(), create(), Slic3r::GCodeProcessor::ensure_nozzle_group_result(), Slic3r::full_evaluate(), and Slic3r::refine_groups_by_Nozzle_State().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create() [2/3]

std::optional< LayeredNozzleGroupResult > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::create ( const std::vector< std::vector< int > > & layer_filament_nozzle_maps,
const std::vector< NozzleInfo > & nozzle_list,
const std::vector< unsigned int > & used_filaments,
const std::vector< std::vector< unsigned int > > & layer_filament_sequences )
static
164{
165 if (layer_filament_nozzle_maps.empty() || nozzle_list.empty()) {
166 return std::nullopt;
167 }
168
169 bool support_dynamic_nozzle_map = has_filament_mapped_to_multiple_nozzles(layer_filament_nozzle_maps, used_filaments);
171 result._layer_filament_nozzle_maps = layer_filament_nozzle_maps;
172 result._layer_filament_sequences = layer_filament_sequences;
173 result._nozzle_list = nozzle_list;
174 result._used_filaments = used_filaments;
175
176 if (!layer_filament_nozzle_maps.empty()) {
177 result._default_filament_nozzle_map = layer_filament_nozzle_maps[0];
178 }
179
180 return result;
181}
bool support_dynamic_nozzle_map
Definition MultiNozzleUtils.hpp:100
static bool has_filament_mapped_to_multiple_nozzles(const std::vector< std::vector< int > > &layer_filament_nozzle_maps, const std::vector< unsigned int > &used_filaments)
Definition MultiNozzleUtils.cpp:114

References LayeredNozzleGroupResult(), _default_filament_nozzle_map, _layer_filament_nozzle_maps, _layer_filament_sequences, _nozzle_list, _used_filaments, Slic3r::MultiNozzleUtils::has_filament_mapped_to_multiple_nozzles(), and Slic3r::MultiNozzleUtils::NozzleGroupResultBase::support_dynamic_nozzle_map.

Here is the call graph for this function:

◆ create() [3/3]

std::optional< LayeredNozzleGroupResult > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::create ( const std::vector< unsigned int > & used_filaments,
const std::vector< int > & filament_map,
const std::vector< int > & filament_volume_map,
const std::vector< int > & filament_nozzle_map,
const std::vector< std::map< NozzleVolumeType, int > > & nozzle_count,
float diameter )
static
190{
191 std::vector<NozzleGroupInfo> nozzle_groups;
192 for (size_t extruder_id = 0; extruder_id < nozzle_count.size(); ++extruder_id) {
193 for (auto elem : nozzle_count[extruder_id]) {
194 NozzleGroupInfo group_info;
195 group_info.diameter = format_diameter_to_str(diameter);
196 group_info.volume_type = elem.first;
197 group_info.nozzle_count = elem.second;
198 group_info.extruder_id = static_cast<int>(extruder_id);
199 nozzle_groups.emplace_back(group_info);
200 }
201 }
202
203 auto nozzle_list = build_nozzle_list(nozzle_groups);
204 std::vector<bool> used_nozzle(nozzle_list.size(), false);
205 std::map<int, int> input_nozzle_id_to_output;
206 std::vector<int> output_nozzle_map(filament_nozzle_map.size(), 0);
207
208 for (auto filament_idx : used_filaments) {
209 NozzleVolumeType req_type = NozzleVolumeType(filament_volume_map[filament_idx]);
210 int req_extruder = filament_map[filament_idx];
211 int input_nozzle_idx = filament_nozzle_map[filament_idx];
212
213 if (input_nozzle_id_to_output.find(input_nozzle_idx) != input_nozzle_id_to_output.end()) {
214 output_nozzle_map[filament_idx] = input_nozzle_id_to_output[input_nozzle_idx];
215 continue;
216 }
217
218 int output_nozzle_idx = -1;
219 for (size_t nozzle_idx = 0; nozzle_idx < nozzle_list.size(); ++nozzle_idx) {
220 if (used_nozzle[nozzle_idx]) continue;
221
222 auto &nozzle_info = nozzle_list[nozzle_idx];
223 if (!(nozzle_info.extruder_id == req_extruder && nozzle_info.volume_type == req_type)) continue;
224
225 output_nozzle_idx = static_cast<int>(nozzle_idx);
226 input_nozzle_id_to_output[input_nozzle_idx] = output_nozzle_idx;
227 used_nozzle[nozzle_idx] = true;
228 break;
229 }
230
231 if (output_nozzle_idx == -1) { return std::nullopt; }
232 output_nozzle_map[filament_idx] = output_nozzle_idx;
233 }
234
235 return create(output_nozzle_map, nozzle_list, used_filaments);
236}
static std::optional< LayeredNozzleGroupResult > create(const std::vector< int > &filament_nozzle_map, const std::vector< NozzleInfo > &nozzle_list, const std::vector< unsigned int > &used_filaments)
Definition MultiNozzleUtils.cpp:142
std::vector< NozzleInfo > build_nozzle_list(std::vector< NozzleGroupInfo > nozzle_groups)
Definition MultiNozzleUtils.cpp:25
NozzleVolumeType
Definition PrintConfig.hpp:618
zaa_minimize_perimeter_height filament_map((ConfigOptionInts, filament_volume_map))((ConfigOptionInts
std::string format_diameter_to_str(double diameter, int precision)
Definition utils.cpp:1739

References Slic3r::MultiNozzleUtils::build_nozzle_list(), create(), Slic3r::MultiNozzleUtils::NozzleGroupInfo::diameter, Slic3r::MultiNozzleUtils::NozzleGroupInfo::extruder_id, Slic3r::filament_map(), Slic3r::filament_nozzle_map(), Slic3r::format_diameter_to_str(), Slic3r::MultiNozzleUtils::NozzleGroupInfo::nozzle_count, and Slic3r::MultiNozzleUtils::NozzleGroupInfo::volume_type.

Here is the call graph for this function:

◆ estimate_seq_flush_weight()

int Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::estimate_seq_flush_weight ( const std::vector< std::vector< std::vector< float > > > & flush_matrix,
const std::vector< int > & filament_change_seq ) const
702{
703 auto get_weight_from_volume = [](float volume){
704 return static_cast<int>(volume * 1.26 * 0.01);
705 };
706
707 float total_flush_volume = 0;
708 NozzleStatusRecorder recorder;
709 for(auto filament: filament_change_seq){
710 auto nozzle = get_nozzle_for_filament(filament, -1);
711 if(!nozzle)
712 continue;
713
714 int extruder_id = nozzle->extruder_id;
715 int nozzle_id = nozzle->group_id;
716 int last_filament = recorder.get_filament_in_nozzle(nozzle_id);
717
718 if(last_filament!= -1 && last_filament != filament){
719 // bounds check to avoid out-of-range access
720 if (extruder_id >= 0 && extruder_id < static_cast<int>(flush_matrix.size()) &&
721 last_filament >= 0 && last_filament < static_cast<int>(flush_matrix[extruder_id].size()) &&
722 filament >= 0 && filament < static_cast<int>(flush_matrix[extruder_id][last_filament].size())) {
723 float flush_volume = flush_matrix[extruder_id][last_filament][filament];
724 total_flush_volume += flush_volume;
725 }
726 }
727 recorder.set_nozzle_status(nozzle_id, filament);
728 }
729
730 return get_weight_from_volume(total_flush_volume);
731}

References Slic3r::MultiNozzleUtils::NozzleStatusRecorder::get_filament_in_nozzle(), get_nozzle_for_filament(), and Slic3r::MultiNozzleUtils::NozzleStatusRecorder::set_nozzle_status().

Here is the call graph for this function:

◆ get_extruder_count()

int Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_extruder_count ( ) const
overridevirtual

Implements Slic3r::MultiNozzleUtils::NozzleGroupResultBase.

258{
259 std::set<int> extruder_ids;
260 for (const auto &nozzle : _nozzle_list) { extruder_ids.insert(nozzle.extruder_id); }
261 return static_cast<int>(extruder_ids.size());
262}
std::vector< NozzleInfo > _nozzle_list
Definition MultiNozzleUtils.hpp:131

References _nozzle_list.

◆ get_extruder_id()

int Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_extruder_id ( int filament_id,
int layer_id = -1 ) const
449{
450 auto nozzle_info = get_nozzle_for_filament(filament_id, layer_id);
451 return nozzle_info ? nozzle_info->extruder_id : -1;
452}

References get_nozzle_for_filament().

Here is the call graph for this function:

◆ get_extruder_map()

std::vector< int > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_extruder_map ( bool zero_based = true,
int layer_id = -1 ) const
320{
321 const std::vector<int> &filament_nozzle_map = get_layer_filament_nozzle_map(layer_id);
322 std::vector<int> extruder_map(filament_nozzle_map.size());
323 for (size_t idx = 0; idx < filament_nozzle_map.size(); ++idx) {
324 int nozzle_id = filament_nozzle_map[idx];
325 if (nozzle_id >= 0 && nozzle_id < static_cast<int>(_nozzle_list.size())) {
326 extruder_map[idx] = _nozzle_list[nozzle_id].extruder_id;
327 } else {
328 extruder_map[idx] = -1;
329 }
330 }
331
332 if (zero_based) return extruder_map;
333
334 auto new_filament_map = extruder_map;
335 std::transform(new_filament_map.begin(), new_filament_map.end(), new_filament_map.begin(), [](int val) { return val + 1; });
336 return new_filament_map;
337}
const std::vector< int > & get_layer_filament_nozzle_map(int layer_id) const
Definition MultiNozzleUtils.cpp:460

References _nozzle_list, Slic3r::filament_nozzle_map(), and get_layer_filament_nozzle_map().

Referenced by Slic3r::Print::update_to_config_by_nozzle_group_result().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_first_nozzle_for_filament()

std::optional< NozzleInfo > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_first_nozzle_for_filament ( int filament_id) const
overridevirtual

Implements Slic3r::MultiNozzleUtils::NozzleGroupResultBase.

418{
419 if (filament_id < 0) return std::nullopt;
420
422 if (filament_id >= static_cast<int>(_default_filament_nozzle_map.size())) return std::nullopt;
424 }
425
426 for (size_t layer = 0; layer < _layer_filament_nozzle_maps.size(); ++layer) {
427 auto layer_used_filaments = get_used_filaments(layer);
428 if (std::find(layer_used_filaments.begin(), layer_used_filaments.end(), static_cast<unsigned int>(filament_id)) == layer_used_filaments.end()){
429 continue;
430 }
431 const auto &map = _layer_filament_nozzle_maps[layer];
432 if (filament_id >= 0 && filament_id < static_cast<int>(map.size())) {
433 int nozzle_id = map[filament_id];
434 auto nozzle = get_nozzle_from_id(nozzle_id);
435 if (nozzle) return nozzle;
436 }
437 }
438
439 return std::nullopt;
440}
std::vector< std::vector< int > > _layer_filament_nozzle_maps
Definition MultiNozzleUtils.hpp:127
std::vector< unsigned int > get_used_filaments() const override
Definition MultiNozzleUtils.hpp:171
std::optional< NozzleInfo > get_nozzle_from_id(int nozzle_id) const override
Definition MultiNozzleUtils.cpp:442
std::vector< int > _default_filament_nozzle_map
Definition MultiNozzleUtils.hpp:129

References _default_filament_nozzle_map, _layer_filament_nozzle_maps, get_nozzle_from_id(), get_used_filaments(), and Slic3r::MultiNozzleUtils::NozzleGroupResultBase::support_dynamic_nozzle_map.

Here is the call graph for this function:

◆ get_layer_count()

size_t Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_layer_count ( ) const
inline
182{ return _layer_filament_nozzle_maps.size(); }

References _layer_filament_nozzle_maps.

◆ get_layer_filament_nozzle_map()

const std::vector< int > & Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_layer_filament_nozzle_map ( int layer_id) const
461{
462 if (layer_id >= 0 && layer_id < static_cast<int>(_layer_filament_nozzle_maps.size())) { return _layer_filament_nozzle_maps[layer_id]; }
464}

References _default_filament_nozzle_map, and _layer_filament_nozzle_maps.

Referenced by get_extruder_map(), get_nozzle_for_filament(), get_nozzle_map(), get_volume_map(), and Slic3r::refine_groups_by_Nozzle_State().

Here is the caller graph for this function:

◆ get_layer_filament_nozzle_maps()

const std::vector< std::vector< int > > & Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_layer_filament_nozzle_maps ( ) const
inline

◆ get_layer_filament_sequences()

const std::vector< std::vector< unsigned int > > & Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_layer_filament_sequences ( ) const
inline
std::vector< std::vector< unsigned int > > _layer_filament_sequences
Definition MultiNozzleUtils.hpp:128

References _layer_filament_sequences.

Referenced by Slic3r::FilamentGroupUtils::get_estimate_extruder_filament_change_count().

Here is the caller graph for this function:

◆ get_nozzle_for_filament()

std::optional< NozzleInfo > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_nozzle_for_filament ( int filament_id,
int layer_id = -1 ) const
381{
382 const std::vector<int> &filament_nozzle_map = get_layer_filament_nozzle_map(layer_id);
383
384 if (filament_id < 0 || filament_id >= static_cast<int>(filament_nozzle_map.size())) { return std::nullopt; }
385
386 int nozzle_id = filament_nozzle_map[filament_id];
387 return get_nozzle_from_id(nozzle_id);
388}

References Slic3r::filament_nozzle_map(), get_layer_filament_nozzle_map(), and get_nozzle_from_id().

Referenced by Slic3r::Print::_make_wipe_tower(), are_filaments_same_extruder(), are_filaments_same_nozzle(), Slic3r::calc_filament_change_info_by_toolorder(), Slic3r::Print::collect_filament_variant_uses(), estimate_seq_flush_weight(), Slic3r::Print::get_config_index(), Slic3r::Print::get_config_index(), get_extruder_id(), get_nozzle_id(), get_used_extruders(), get_used_nozzles_in_extruder(), and Slic3r::reorder_filaments_for_multi_nozzle_extruder().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_nozzle_from_id()

std::optional< NozzleInfo > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_nozzle_from_id ( int nozzle_id) const
overridevirtual

Implements Slic3r::MultiNozzleUtils::NozzleGroupResultBase.

443{
444 if (nozzle_id < 0 || nozzle_id >= static_cast<int>(_nozzle_list.size())) { return std::nullopt; }
445 return _nozzle_list[nozzle_id];
446}

References _nozzle_list.

Referenced by get_first_nozzle_for_filament(), and get_nozzle_for_filament().

Here is the caller graph for this function:

◆ get_nozzle_id()

int Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_nozzle_id ( int filament_id,
int layer_id = -1 ) const
455{
456 auto nozzle_info = get_nozzle_for_filament(filament_id, layer_id);
457 return nozzle_info ? nozzle_info->group_id : -1;
458}

References get_nozzle_for_filament().

Here is the call graph for this function:

◆ get_nozzle_map()

std::vector< int > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_nozzle_map ( int layer_id = -1) const
340{
341 const std::vector<int> &filament_nozzle_map = get_layer_filament_nozzle_map(layer_id);
342 std::vector<int> nozzle_map(filament_nozzle_map.size());
343 for (size_t idx = 0; idx < filament_nozzle_map.size(); ++idx) {
344 int nozzle_id = filament_nozzle_map[idx];
345 if (nozzle_id >= 0 && nozzle_id < static_cast<int>(_nozzle_list.size())) {
346 nozzle_map[idx] = _nozzle_list[nozzle_id].group_id;
347 } else {
348 nozzle_map[idx] = -1;
349 }
350 }
351 return nozzle_map;
352}

References _nozzle_list, Slic3r::filament_nozzle_map(), and get_layer_filament_nozzle_map().

Referenced by Slic3r::Print::update_to_config_by_nozzle_group_result().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_nozzles_for_filament()

std::vector< NozzleInfo > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_nozzles_for_filament ( int filament_id) const
overridevirtual

Implements Slic3r::MultiNozzleUtils::NozzleGroupResultBase.

391{
392 std::set<int> nozzle_ids;
393
395 if (filament_id >= 0 && filament_id < static_cast<int>(_default_filament_nozzle_map.size())) {
396 nozzle_ids.insert(_default_filament_nozzle_map[filament_id]);
397 }
398 } else {
399 int start_layer = 0;
400 int end_layer = static_cast<int>(_layer_filament_nozzle_maps.size());
401
402 for (int i = start_layer; i < end_layer; ++i) {
403 const auto &map = _layer_filament_nozzle_maps[i];
404 if (filament_id >= 0 && filament_id < static_cast<int>(map.size())) {
405 nozzle_ids.insert(map[filament_id]);
406 }
407 }
408 }
409
410 std::vector<NozzleInfo> result;
411 for (int id : nozzle_ids) {
412 if (id >= 0 && id < static_cast<int>(_nozzle_list.size())) { result.push_back(_nozzle_list[id]); }
413 }
414 return result;
415}

References _default_filament_nozzle_map, _layer_filament_nozzle_maps, _nozzle_list, and Slic3r::MultiNozzleUtils::NozzleGroupResultBase::support_dynamic_nozzle_map.

Referenced by Slic3r::Print::collect_filament_variant_uses(), get_used_extruders(), and get_used_nozzles_in_extruder().

Here is the caller graph for this function:

◆ get_used_extruders() [1/2]

std::vector< int > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_used_extruders ( ) const
overridevirtual

Implements Slic3r::MultiNozzleUtils::NozzleGroupResultBase.

296{
297 return get_used_extruders(-1);
298}
std::vector< int > get_used_extruders() const override
Definition MultiNozzleUtils.cpp:295

References get_used_extruders().

Referenced by Slic3r::FilamentGroupUtils::get_estimate_extruder_change_count(), Slic3r::FilamentGroupUtils::get_estimate_extruder_filament_change_count(), Slic3r::FilamentGroupUtils::get_estimate_nozzle_change_count(), and get_used_extruders().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_used_extruders() [2/2]

std::vector< int > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_used_extruders ( int layer_id) const
301{
302 std::set<int> used_extruders;
303 // used filaments on the given layer (or globally)
304 std::vector<unsigned int> target_filaments = get_used_filaments(layer_id);
305 for (auto filament_id : target_filaments) {
306 if (layer_id != -1) {
307 // single-layer: nozzle used by this filament on this layer
308 auto nozzle_opt = get_nozzle_for_filament(static_cast<int>(filament_id), layer_id);
309 if (nozzle_opt) { used_extruders.insert(nozzle_opt->extruder_id); }
310 } else {
311 // global: every nozzle this filament uses across all layers
312 auto nozzles = get_nozzles_for_filament(static_cast<int>(filament_id));
313 for (const auto &nozzle : nozzles) { used_extruders.insert(nozzle.extruder_id); }
314 }
315 }
316 return std::vector<int>(used_extruders.begin(), used_extruders.end());
317}
std::vector< NozzleInfo > get_nozzles_for_filament(int filament_id) const override
Definition MultiNozzleUtils.cpp:390

References get_nozzle_for_filament(), get_nozzles_for_filament(), and get_used_filaments().

Here is the call graph for this function:

◆ get_used_filaments() [1/2]

std::vector< unsigned int > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_used_filaments ( ) const
inlineoverridevirtual

Implements Slic3r::MultiNozzleUtils::NozzleGroupResultBase.

171{ return _used_filaments; }
std::vector< unsigned int > _used_filaments
Definition MultiNozzleUtils.hpp:130

References _used_filaments.

Referenced by get_first_nozzle_for_filament(), get_used_extruders(), get_used_nozzles_in_extruder(), Slic3r::refine_groups_by_Nozzle_State(), and Slic3r::Print::update_to_config_by_nozzle_group_result().

Here is the caller graph for this function:

◆ get_used_filaments() [2/2]

std::vector< unsigned int > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_used_filaments ( int layer_id) const
370{
371 if (layer_id < 0) { return _used_filaments; }
372 if (layer_id >= static_cast<int>(_layer_filament_nozzle_maps.size())) { return _used_filaments; }
373
374 if (!_layer_filament_sequences.empty() && layer_id < static_cast<int>(_layer_filament_sequences.size())) {
375 return _layer_filament_sequences[layer_id];
376 }
377 return {};
378}

References _layer_filament_nozzle_maps, _layer_filament_sequences, and _used_filaments.

◆ get_used_nozzles_in_extruder() [1/2]

std::vector< NozzleInfo > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_used_nozzles_in_extruder ( int target_extruder_id,
int layer_id ) const
270{
271 std::set<int> nozzle_ids;
272 std::vector<NozzleInfo> result;
273
274 std::vector<unsigned int> target_filaments = get_used_filaments(layer_id);
275
276 for (unsigned int filament_id : target_filaments) {
277 if (layer_id != -1) {
278 auto nozzle_opt = get_nozzle_for_filament(static_cast<int>(filament_id), layer_id);
279 if (nozzle_opt) {
280 if (target_extruder_id == -1 || nozzle_opt->extruder_id == target_extruder_id) { nozzle_ids.insert(nozzle_opt->group_id); }
281 }
282 } else {
283 auto nozzles = get_nozzles_for_filament(static_cast<int>(filament_id));
284 for (const auto &nozzle : nozzles) {
285 if (target_extruder_id == -1 || nozzle.extruder_id == target_extruder_id) { nozzle_ids.insert(nozzle.group_id); }
286 }
287 }
288 }
289 for (int nozzle_id : nozzle_ids) {
290 if (nozzle_id >= 0 && nozzle_id < static_cast<int>(_nozzle_list.size())) { result.push_back(_nozzle_list[nozzle_id]); }
291 }
292 return result;
293}

References _nozzle_list, get_nozzle_for_filament(), get_nozzles_for_filament(), and get_used_filaments().

Here is the call graph for this function:

◆ get_used_nozzles_in_extruder() [2/2]

std::vector< NozzleInfo > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_used_nozzles_in_extruder ( int target_extruder_id = -1) const
overridevirtual

Implements Slic3r::MultiNozzleUtils::NozzleGroupResultBase.

265{
266 return get_used_nozzles_in_extruder(target_extruder_id, -1);
267}
std::vector< NozzleInfo > get_used_nozzles_in_extruder(int target_extruder_id=-1) const override
Definition MultiNozzleUtils.cpp:264

References get_used_nozzles_in_extruder().

Referenced by Slic3r::FilamentGroupUtils::get_estimate_extruder_filament_change_count(), Slic3r::FilamentGroupUtils::get_estimate_nozzle_change_count(), and get_used_nozzles_in_extruder().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_volume_map()

std::vector< int > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::get_volume_map ( int layer_id = -1) const
355{
356 const std::vector<int> &filament_nozzle_map = get_layer_filament_nozzle_map(layer_id);
357 std::vector<int> volume_map(filament_nozzle_map.size());
358 for (size_t idx = 0; idx < filament_nozzle_map.size(); ++idx) {
359 int nozzle_id = filament_nozzle_map[idx];
360 if (nozzle_id >= 0 && nozzle_id < static_cast<int>(_nozzle_list.size())) {
361 volume_map[idx] = _nozzle_list[nozzle_id].volume_type;
362 } else {
363 volume_map[idx] = -1;
364 }
365 }
366 return volume_map;
367}

References _nozzle_list, Slic3r::filament_nozzle_map(), and get_layer_filament_nozzle_map().

Referenced by Slic3r::Print::update_to_config_by_nozzle_group_result().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_support_dynamic_nozzle_map()

bool Slic3r::MultiNozzleUtils::NozzleGroupResultBase::is_support_dynamic_nozzle_map ( ) const
inlineinherited

References support_dynamic_nozzle_map.

Referenced by Slic3r::Print::update_to_config_by_nozzle_group_result().

Here is the caller graph for this function:

Member Data Documentation

◆ _default_filament_nozzle_map

std::vector<int> Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::_default_filament_nozzle_map
private

◆ _layer_filament_nozzle_maps

std::vector<std::vector<int> > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::_layer_filament_nozzle_maps
private

◆ _layer_filament_sequences

std::vector<std::vector<unsigned int> > Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::_layer_filament_sequences
private

◆ _nozzle_list

std::vector<NozzleInfo> Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::_nozzle_list
private

◆ _used_filaments

std::vector<unsigned int> Slic3r::MultiNozzleUtils::LayeredNozzleGroupResult::_used_filaments
private

◆ support_dynamic_nozzle_map


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