From 32d952587d9c28a9b340a77257aefdeb8dac8c8a Mon Sep 17 00:00:00 2001 From: SoftFever Date: Fri, 31 Mar 2023 18:01:05 +0800 Subject: [PATCH 01/16] use plate name in job name if set --- src/slic3r/GUI/PartPlate.hpp | 3 ++- src/slic3r/GUI/Plater.cpp | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index 422fd521ad..6bfb430305 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -256,7 +256,7 @@ public: // SoftFever //get the plate's name - std::string get_plate_name() { return m_name; } + std::string get_plate_name() const { return m_name; } void generate_plate_name_texture(); //set the plate's name void set_plate_name(const std::string& name); @@ -640,6 +640,7 @@ public: int get_curr_plate_index() const { return m_current_plate; } PartPlate* get_curr_plate() { return m_plate_list[m_current_plate]; } + const PartPlate* get_curr_plate() const { return m_plate_list[m_current_plate]; } std::vector& get_plate_list() { return m_plate_list; }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index eb523caa08..c2c5652bfa 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6568,8 +6568,12 @@ wxString Plater::priv::get_project_filename(const wxString& extension) const wxString Plater::priv::get_export_gcode_filename(const wxString& extension, bool only_filename, bool export_all) const { std::string plate_index_str; - if (partplate_list.get_plate_count() > 1) + auto plate_name = partplate_list.get_curr_plate()->get_plate_name(); + if (!plate_name.empty()) + plate_index_str = (boost::format("_%1%") % plate_name).str(); + else if (partplate_list.get_plate_count() > 1) plate_index_str = (boost::format("_plate_%1%") % std::to_string(partplate_list.get_curr_plate_index() + 1)).str(); + if (!m_project_folder.empty()) { if (!only_filename) { if (export_all) { @@ -6587,7 +6591,7 @@ wxString Plater::priv::get_export_gcode_filename(const wxString& extension, bool } } else { if (only_filename) { - if(m_project_name == L"Untitled") + if(m_project_name == _L("Untitled")) return fs::path(model.objects.front()->name).replace_extension().c_str() + wxString(plate_index_str) + extension; if (export_all) From 22a24168e6f7042dc2d73269811fa9ad32053b9b Mon Sep 17 00:00:00 2001 From: SoftFever Date: Sat, 1 Apr 2023 13:25:55 +0800 Subject: [PATCH 02/16] support Klipper `Exclude objects` natively. Also remove fake slicer info --- src/libslic3r/GCode.cpp | 91 ++++++++++++++++++++++----- src/libslic3r/GCode.hpp | 9 ++- src/libslic3r/Model.cpp | 23 ++++--- src/libslic3r/Model.hpp | 2 + src/libslic3r/Preset.cpp | 3 +- src/libslic3r/Print.cpp | 13 +++- src/libslic3r/Print.hpp | 21 ++++++- src/libslic3r/PrintConfig.cpp | 8 ++- src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/ConfigManipulation.cpp | 3 + src/slic3r/GUI/Tab.cpp | 1 + 11 files changed, 141 insertions(+), 34 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 66ec6e0d78..a5fc0d4fd4 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1530,12 +1530,6 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato print.config().nozzle_temperature_initial_layer.get_at(0)); file.write("; CONFIG_BLOCK_END\n\n"); } else { - file.write_format("; hack-fix: write fake slicer info here so that " - "preprocess_cancellation can process.\n"); - file.write_format("; %s\n\n", std::string(std::string("generated by SuperSlicer " SoftFever_VERSION " on ") + - Slic3r::Utils::local_timestamp()) - .c_str()); - DoExport::export_thumbnails_to_file( thumbnail_cb, print.get_plate_index(), print.full_print_config().option("thumbnails")->values, [&file](const char *sz) { file.write(sz); }, @@ -1563,6 +1557,10 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato } file.write_format("; EXECUTABLE_BLOCK_START\n"); + + // SoftFever + file.write(set_object_info(&print)); + // adds tags for time estimators file.write_format(";%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::First_Line_M73_Placeholder).c_str()); @@ -2474,7 +2472,7 @@ std::vector GCode::sort_print_object_instances( const PrintObject *print_object = layers[layer_id].original_object; //const PrintObject *print_object = layers[layer_id].object(); if (print_object) - out.emplace_back(object_by_extruder, layer_id, *print_object, single_object_instance_idx); + out.emplace_back(object_by_extruder, *print_object, single_object_instance_idx); } } else { // Create mapping from PrintObject* to ObjectByExtruder*. @@ -2502,7 +2500,7 @@ std::vector GCode::sort_print_object_instances( auto it = std::lower_bound(sorted.begin(), sorted.end(), key); if (it != sorted.end() && it->first == &print_object) // ObjectByExtruder for this PrintObject was found. - out.emplace_back(*it->second, it->second - objects_by_extruder.data(), print_object, instance - print_object.instances().data()); + out.emplace_back(*it->second, print_object, instance->id); } } } @@ -2670,6 +2668,14 @@ namespace Skirt { } // namespace Skirt +inline std::string get_instance_name(const PrintObject *object, const PrintInstance &inst) { + return (boost::format("%1%_id_%2%_copy_%3%") % object->model_object()->name % object->get_id() % inst.id).str(); +} + +inline std::string get_instance_name(const PrintObject *object, size_t inst_id) { + return (boost::format("%1%_id_%2%_copy_%3%") % object->model_object()->name % object->get_id() % inst_id).str(); +} + // In sequential mode, process_layer is called once per each object and its copy, // therefore layers will contain a single entry and single_object_instance_idx will point to the copy of the object. // In non-sequential mode, process_layer is called per each print_z height with all object and support layers accumulated. @@ -3172,7 +3178,7 @@ GCode::LayerResult GCode::process_layer( if (is_anything_overridden && print_wipe_extrusions == 0) gcode+="; PURGING FINISHED\n"; for (InstanceToPrint &instance_to_print : instances_to_print) { - const LayerToPrint &layer_to_print = layers[instance_to_print.layer_id]; + const LayerToPrint &layer_to_print = layers[instance_to_print.get_object_id()]; // To control print speed of the 1st object layer printed over raft interface. bool object_layer_over_raft = layer_to_print.object_layer && layer_to_print.object_layer->id() > 0 && instance_to_print.print_object.slicing_parameters().raft_layers() == layer_to_print.object_layer->id(); @@ -3181,11 +3187,19 @@ GCode::LayerResult GCode::process_layer( m_object_layer_over_raft = object_layer_over_raft; if (m_config.reduce_crossing_wall) m_avoid_crossing_perimeters.init_layer(*m_layer); + bool reset_e = false; if (this->config().gcode_label_objects) { - gcode += std::string("; printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.layer_id) + " copy " + std::to_string(instance_to_print.instance_id) + "\n"; - if (!m_config.use_relative_e_distances) - gcode += m_writer.reset_e(true); + gcode += std::string("; printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.print_object.get_id()) + " copy " + std::to_string(instance_to_print.instance_id) + "\n"; + reset_e = true; } + if (this->config().exclude_object && print.config().gcode_flavor.value == gcfKlipper) { + gcode += std::string("EXCLUDE_OBJECT_START NAME=") + + get_instance_name(&instance_to_print.print_object, instance_to_print.instance_id) + "\n"; + reset_e = true; + } + // ref to: https://github.com/SoftFever/OrcaSlicer/pull/205/commits/7f1fe0bd544077626080aa1a9a0576aa735da1a4#r1083470162 + if (reset_e && !m_config.use_relative_e_distances) + gcode += m_writer.reset_e(true); m_extrusion_quality_estimator.set_current_object(&instance_to_print.print_object); // When starting a new object, use the external motion planner for the first travel move. @@ -3196,7 +3210,7 @@ GCode::LayerResult GCode::process_layer( m_last_obj_copy = this_object_copy; this->set_origin(unscale(offset)); if (instance_to_print.object_by_extruder.support != nullptr) { - m_layer = layers[instance_to_print.layer_id].support_layer; + m_layer = layers[instance_to_print.get_object_id()].support_layer; m_object_layer_over_raft = false; //BBS: print supports' brims first @@ -3274,10 +3288,16 @@ GCode::LayerResult GCode::process_layer( gcode += this->extrude_infill(print,by_region_specific, true); } if (this->config().gcode_label_objects) { - gcode += std::string("; stop printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.layer_id) + " copy " + std::to_string(instance_to_print.instance_id) + "\n"; - if (!m_config.use_relative_e_distances) - gcode += m_writer.reset_e(true); + gcode += std::string("; stop printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.print_object.get_id()) + " copy " + std::to_string(instance_to_print.instance_id) + "\n"; + reset_e = true; } + if (this->config().exclude_object && print.config().gcode_flavor.value == gcfKlipper) { + gcode += std::string("EXCLUDE_OBJECT_END NAME=") + + get_instance_name(&instance_to_print.print_object, instance_to_print.instance_id) + "\n"; + reset_e = true; + } + if (reset_e && !m_config.use_relative_e_distances) + gcode += m_writer.reset_e(true); } } } @@ -4591,6 +4611,37 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z) return gcode; } +inline std::string polygon_to_string(const Polygon &polygon) { + std::ostringstream gcode; + gcode << "["; + for (const Point &p : polygon.points) { + gcode << "[" << unscaled(p.x()) << "," << unscaled(p.y()) << "],"; + } + gcode << "[" << unscaled(polygon.points.front().x()) << "," << unscaled(polygon.points.front().y()) << "]"; + gcode << "]"; + return gcode.str(); +} + // this function iterator PrintObject and assign a seqential id to each object. +// this id is used to generate unique object id for each object. +std::string GCode::set_object_info(Print* print) { + std::ostringstream gcode; + size_t object_id = 0; + for (PrintObject* object : print->objects()) { + object->set_id(object_id++); + size_t inst_id = 0; + for (PrintInstance &inst : object->instances()) { + inst.id = inst_id; + if (this->config().exclude_object && print->config().gcode_flavor.value == gcfKlipper) { + auto bbox = inst.get_bounding_box(); + gcode << "EXCLUDE_OBJECT_DEFINE NAME=" << get_instance_name(object, inst) + << " CENTER=" << bbox.center().x() << "," << bbox.center().y() + << " POLYGON=" << polygon_to_string(inst.get_convex_hull_2d()) << "\n"; + } + } + } + return gcode.str(); +} + // convert a model-space scaled point into G-code coordinates Vec2d GCode::point_to_gcode(const Point &point) const { @@ -4714,4 +4765,10 @@ void GCode::ObjectByExtruder::Island::Region::append(const Type type, const Extr } } -} // namespace Slic3r + +// Index into std::vector, which contains Object and Support layers for the current print_z, collected for +// a single object, or for possibly multiple objects with multiple instances. + +inline size_t GCode::InstanceToPrint::get_object_id() const { return print_object.get_id(); } + +} // namespace Slic3r diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 9c5716499e..0fc4271758 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -202,6 +202,9 @@ public: std::string unretract() { return m_writer.unlift() + m_writer.unretract(); } std::string set_extruder(unsigned int extruder_id, double print_z); + // SoftFever + std::string set_object_info(Print* print); + // append full config to the given string static void append_full_config(const Print& print, std::string& str); @@ -377,13 +380,13 @@ private: struct InstanceToPrint { - InstanceToPrint(ObjectByExtruder &object_by_extruder, size_t layer_id, const PrintObject &print_object, size_t instance_id) : - object_by_extruder(object_by_extruder), layer_id(layer_id), print_object(print_object), instance_id(instance_id) {} + InstanceToPrint(ObjectByExtruder &object_by_extruder, const PrintObject &print_object, size_t instance_id) : + object_by_extruder(object_by_extruder), print_object(print_object), instance_id(instance_id) {} // Repository ObjectByExtruder &object_by_extruder; // Index into std::vector, which contains Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances. - const size_t layer_id; + size_t get_object_id() const; const PrintObject &print_object; // Instance idx of the copy of a print object. const size_t instance_id; diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 3d4d26fb86..e26c136b18 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1286,18 +1286,21 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const } // This returns an accurate snug bounding box of the transformed object instance, without the translation applied. -BoundingBoxf3 ModelObject::instance_bounding_box(size_t instance_idx, bool dont_translate) const -{ - BoundingBoxf3 bb; - const Transform3d& inst_matrix = this->instances[instance_idx]->get_transformation().get_matrix(dont_translate); - for (ModelVolume *v : this->volumes) - { - if (v->is_model_part()) - bb.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); - } - return bb; +BoundingBoxf3 ModelObject::instance_bounding_box(size_t instance_idx, bool dont_translate) const { + return instance_bounding_box(*this->instances[instance_idx], dont_translate); } +BoundingBoxf3 ModelObject::instance_bounding_box(const ModelInstance &instance, bool dont_translate) const { + BoundingBoxf3 bbox; + const auto& inst_mat = instance.get_transformation().get_matrix(dont_translate); + for (auto vol : this->volumes) { + if (vol->is_model_part()) + bbox.merge(vol->mesh().transformed_bounding_box(inst_mat * vol->get_matrix())); + } + return bbox; +} + + //BBS: add convex bounding box BoundingBoxf3 ModelObject::instance_convex_hull_bounding_box(size_t instance_idx, bool dont_translate) const { diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 6b53a45af0..551a9072ee 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -345,6 +345,8 @@ public: const BoundingBoxf3& raw_bounding_box() const; // A snug bounding box around the transformed non-modifier object volumes. BoundingBoxf3 instance_bounding_box(size_t instance_idx, bool dont_translate = false) const; + BoundingBoxf3 instance_bounding_box(const ModelInstance& instance, bool dont_translate = false) const; + // A snug bounding box of non-transformed (non-rotated, non-scaled, non-translated) sum of non-modifier object volumes. const BoundingBoxf3& raw_mesh_bounding_box() const; // A snug bounding box of non-transformed (non-rotated, non-scaled, non-translated) sum of all object volumes. diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 3acc9530bb..d627479111 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -755,7 +755,8 @@ static std::vector s_Preset_print_options { "role_based_wipe_speed", "wipe_speed", "accel_to_decel_enable", "accel_to_decel_factor", "wipe_on_loops", "bridge_density", "precise_outer_wall", "overhang_speed_classic", "bridge_acceleration", "sparse_infill_acceleration", "internal_solid_infill_acceleration", "tree_support_adaptive_layer_height", "tree_support_auto_brim", - "tree_support_brim_width", "gcode_comments", "gcode_label_objects", "initial_layer_travel_speed" + "tree_support_brim_width", "gcode_comments", "gcode_label_objects", + "initial_layer_travel_speed", "exclude_object" }; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 2f3a32acfb..b509b35dca 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -159,7 +159,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "accel_to_decel_factor", "wipe_on_loops", "gcode_comments", - "gcode_label_objects" + "gcode_label_objects", + "exclude_object" }; static std::unordered_set steps_ignore; @@ -3329,4 +3330,14 @@ int Print::load_cached_data(const std::string& directory) return ret; } +BoundingBoxf3 PrintInstance::get_bounding_box() { + return print_object->model_object()->instance_bounding_box(*model_instance, false); +} + +Polygon PrintInstance::get_convex_hull_2d() { + Polygon poly = print_object->model_object()->convex_hull_2d(model_instance->get_matrix()); + poly.douglas_peucker(0.1); + return poly; +} + } // namespace Slic3r diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 60704e8a38..413be11f05 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -191,6 +191,13 @@ struct PrintInstance const ModelInstance *model_instance; // Shift of this instance's center into the world coordinates. Point shift; + + BoundingBoxf3 get_bounding_box(); + Polygon get_convex_hull_2d(); + // SoftFever + // + // instance id + size_t id; }; typedef std::vector PrintInstances; @@ -292,6 +299,7 @@ public: Transform3d trafo_centered() const { Transform3d t = this->trafo(); t.pretranslate(Vec3d(- unscale(m_center_offset.x()), - unscale(m_center_offset.y()), 0)); return t; } const PrintInstances& instances() const { return m_instances; } + PrintInstances &instances() { return m_instances; } // Whoever will get a non-const pointer to PrintObject will be able to modify its layers. LayerPtrs& layers() { return m_layers; } @@ -417,7 +425,12 @@ public: // BBS: Boundingbox of the first layer BoundingBox firstLayerObjectBrimBoundingBox; -private: + + // SoftFever + size_t get_id() const { return m_id; } + void set_id(size_t id) { m_id = id; } + + private: // to be called from Print only. friend class Print; @@ -501,6 +514,12 @@ private: PrintObject* m_shared_object{ nullptr }; + + // SoftFever + // + // object id + size_t m_id; + public: //BBS: When printing multi-material objects, this settings will make slicer to clip the overlapping object parts one by the other. //(2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc). diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index cbf7060f94..8a06bbe0a4 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1813,7 +1813,13 @@ void PrintConfigDef::init_fff_params() "Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."); def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(1)); - + + def = this->add("exclude_object", coBool); + def->label = L("Exclude objects"); + def->tooltip = L("Enable this option to add EXCLUDE OBJECT command in g-code"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(1)); + def = this->add("gcode_comments", coBool); def->label = L("Verbose G-code"); def->tooltip = L("Enable this to get a commented G-code file, with each line explained by a descriptive text. " diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 79a2dc4009..a7b4847f4d 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1003,6 +1003,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( // SoftFever ((ConfigOptionPercents, filament_shrink)) ((ConfigOptionBool, gcode_label_objects)) + ((ConfigOptionBool, exclude_object)) ((ConfigOptionBool, gcode_comments)) ) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index a970357337..3ba8806294 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -697,6 +697,9 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co toggle_line(el, gcflavor == gcfKlipper); if(gcflavor == gcfKlipper) toggle_field("accel_to_decel_factor", config->opt_bool("accel_to_decel_enable")); + + toggle_field("exclude_object", gcflavor == gcfKlipper); + } void ConfigManipulation::update_print_sla_config(DynamicPrintConfig* config, const bool is_global_config/* = false*/) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 40ba091a9d..0fd751dd7c 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2058,6 +2058,7 @@ void TabPrint::build() optgroup->append_single_option_line("gcode_add_line_number"); optgroup->append_single_option_line("gcode_comments"); optgroup->append_single_option_line("gcode_label_objects"); + optgroup->append_single_option_line("exclude_object"); Option option = optgroup->get_option("filename_format"); // option.opt.full_width = true; option.opt.is_code = true; From c3726d95c76a3ef297ea72c1d2adb62e60454bdb Mon Sep 17 00:00:00 2001 From: SoftFever Date: Sat, 1 Apr 2023 13:26:33 +0800 Subject: [PATCH 03/16] update locale file --- bbl/i18n/OrcaSlicer.pot | 8 +++++++- bbl/i18n/de/OrcaSlicer_de.po | 8 +++++++- bbl/i18n/en/OrcaSlicer_en.po | 8 +++++++- bbl/i18n/es/OrcaSlicer_es.po | 8 +++++++- bbl/i18n/fr/OrcaSlicer_fr.po | 8 +++++++- bbl/i18n/hu/OrcaSlicer_hu.po | 8 +++++++- bbl/i18n/it/OrcaSlicer_it.po | 8 +++++++- bbl/i18n/ja/OrcaSlicer_ja.po | 8 +++++++- bbl/i18n/nl/OrcaSlicer_nl.po | 8 +++++++- bbl/i18n/sv/OrcaSlicer_sv.po | 8 +++++++- bbl/i18n/zh_cn/OrcaSlicer_zh_CN.po | 10 ++++++++-- resources/i18n/zh_cn/OrcaSlicer.mo | Bin 199755 -> 199912 bytes 12 files changed, 78 insertions(+), 12 deletions(-) diff --git a/bbl/i18n/OrcaSlicer.pot b/bbl/i18n/OrcaSlicer.pot index e6b0e5ad25..02ca58dc69 100644 --- a/bbl/i18n/OrcaSlicer.pot +++ b/bbl/i18n/OrcaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -6832,6 +6832,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/de/OrcaSlicer_de.po b/bbl/i18n/de/OrcaSlicer_de.po index 484dd4141e..1a94ffcbb1 100644 --- a/bbl/i18n/de/OrcaSlicer_de.po +++ b/bbl/i18n/de/OrcaSlicer_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "PO-Revision-Date: \n" "Last-Translator: Heiko Liebscher \n" "Language-Team: \n" @@ -7659,6 +7659,12 @@ msgstr "" "kompatibel mit der Einzeldruckerdüsen-Mehrmaterial-Konfiguration und mit der " "Option zum Wischen in das Objekt / in den Innenfüllbereich." +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "ausführlicher G-Code" diff --git a/bbl/i18n/en/OrcaSlicer_en.po b/bbl/i18n/en/OrcaSlicer_en.po index b8fe6c9163..cfd429f7ee 100644 --- a/bbl/i18n/en/OrcaSlicer_en.po +++ b/bbl/i18n/en/OrcaSlicer_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -7130,6 +7130,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/es/OrcaSlicer_es.po b/bbl/i18n/es/OrcaSlicer_es.po index a6f32e778d..89733eb552 100644 --- a/bbl/i18n/es/OrcaSlicer_es.po +++ b/bbl/i18n/es/OrcaSlicer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -7230,6 +7230,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/fr/OrcaSlicer_fr.po b/bbl/i18n/fr/OrcaSlicer_fr.po index a998a0e945..53748196a1 100644 --- a/bbl/i18n/fr/OrcaSlicer_fr.po +++ b/bbl/i18n/fr/OrcaSlicer_fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "PO-Revision-Date: 2023-02-21 21:56+0200\n" "Last-Translator: 5axes <5axes@free.fr>\n" "Language-Team: 5axes\n" @@ -7556,6 +7556,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/hu/OrcaSlicer_hu.po b/bbl/i18n/hu/OrcaSlicer_hu.po index cecd118bc4..dd36f701fd 100644 --- a/bbl/i18n/hu/OrcaSlicer_hu.po +++ b/bbl/i18n/hu/OrcaSlicer_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -7194,6 +7194,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/it/OrcaSlicer_it.po b/bbl/i18n/it/OrcaSlicer_it.po index 39781f59a3..c4e2ac3a7e 100644 --- a/bbl/i18n/it/OrcaSlicer_it.po +++ b/bbl/i18n/it/OrcaSlicer_it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -7130,6 +7130,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/ja/OrcaSlicer_ja.po b/bbl/i18n/ja/OrcaSlicer_ja.po index ee9cb906b0..0d32fb4f46 100644 --- a/bbl/i18n/ja/OrcaSlicer_ja.po +++ b/bbl/i18n/ja/OrcaSlicer_ja.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -7117,6 +7117,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/nl/OrcaSlicer_nl.po b/bbl/i18n/nl/OrcaSlicer_nl.po index 50f167fbbd..9b07ca69d6 100644 --- a/bbl/i18n/nl/OrcaSlicer_nl.po +++ b/bbl/i18n/nl/OrcaSlicer_nl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -7241,6 +7241,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/sv/OrcaSlicer_sv.po b/bbl/i18n/sv/OrcaSlicer_sv.po index dd8a45ac8e..5fec619723 100644 --- a/bbl/i18n/sv/OrcaSlicer_sv.po +++ b/bbl/i18n/sv/OrcaSlicer_sv.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -7124,6 +7124,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "" + msgid "Verbose G-code" msgstr "" diff --git a/bbl/i18n/zh_cn/OrcaSlicer_zh_CN.po b/bbl/i18n/zh_cn/OrcaSlicer_zh_CN.po index c9cfed9c18..0781da59c2 100644 --- a/bbl/i18n/zh_cn/OrcaSlicer_zh_CN.po +++ b/bbl/i18n/zh_cn/OrcaSlicer_zh_CN.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-29 23:15+0800\n" -"PO-Revision-Date: 2023-01-16 11:26+0800\n" +"POT-Creation-Date: 2023-04-01 13:19+0800\n" +"PO-Revision-Date: 2023-04-01 13:21+0800\n" "Last-Translator: Jiang Yue \n" "Language-Team: \n" "Language: zh_CN\n" @@ -7001,6 +7001,12 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" +msgid "Exclude objects" +msgstr "对象排除" + +msgid "Enable this option to add EXCLUDE OBJECT command in g-code" +msgstr "开启此选项以支持对象排除" + msgid "Verbose G-code" msgstr "注释G-code" diff --git a/resources/i18n/zh_cn/OrcaSlicer.mo b/resources/i18n/zh_cn/OrcaSlicer.mo index 07ab946999e977a73ea1bf2f6dea0fe04d7d5b11..b2cb8bb2b1547db086a5358da9c8293c3525dbd4 100644 GIT binary patch delta 47891 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