From 2a2bdaa0e05e068f7185cbd5a3bcd718bb6c904f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 27 Feb 2018 10:49:51 +0100 Subject: [PATCH 01/47] 3mf I/O - Added import and export of object's and volume's config data --- xs/src/libslic3r/Format/3mf.cpp | 778 +++++++++++++++++++++++++------- 1 file changed, 617 insertions(+), 161 deletions(-) diff --git a/xs/src/libslic3r/Format/3mf.cpp b/xs/src/libslic3r/Format/3mf.cpp index 029debf72..51433c58d 100644 --- a/xs/src/libslic3r/Format/3mf.cpp +++ b/xs/src/libslic3r/Format/3mf.cpp @@ -21,7 +21,8 @@ const std::string MODEL_EXTENSION = ".model"; const std::string MODEL_FILE = "3D/3dmodel.model"; // << this is the only format of the string which works with CURA const std::string CONTENT_TYPES_FILE = "[Content_Types].xml"; const std::string RELATIONSHIPS_FILE = "_rels/.rels"; -const std::string CONFIG_FILE = "Metadata/Slic3r_PE.config"; +const std::string PRINT_CONFIG_FILE = "Metadata/Slic3r_PE.config"; +const std::string MODEL_CONFIG_FILE = "Metadata/Slic3r_PE_model.config"; const char* MODEL_TAG = "model"; const char* RESOURCES_TAG = "resources"; @@ -36,6 +37,10 @@ const char* COMPONENT_TAG = "component"; const char* BUILD_TAG = "build"; const char* ITEM_TAG = "item"; +const char* CONFIG_TAG = "config"; +const char* METADATA_TAG = "metadata"; +const char* VOLUME_TAG = "volume"; + const char* UNIT_ATTR = "unit"; const char* NAME_ATTR = "name"; const char* TYPE_ATTR = "type"; @@ -49,6 +54,14 @@ const char* V3_ATTR = "v3"; const char* OBJECTID_ATTR = "objectid"; const char* TRANSFORM_ATTR = "transform"; +const char* KEY_ATTR = "key"; +const char* VALUE_ATTR = "value"; +const char* FIRST_TRIANGLE_ID_ATTR = "firstid"; +const char* LAST_TRIANGLE_ID_ATTR = "lastid"; + +const char* OBJECT_TYPE = "object"; +const char* VOLUME_TYPE = "volume"; + const unsigned int VALID_OBJECT_TYPES_COUNT = 1; const char* VALID_OBJECT_TYPES[] = { @@ -188,32 +201,63 @@ namespace Slic3r { int object_id; Matrix4x4 matrix; - explicit Component(int object_id); - Component(int object_id, const Matrix4x4& matrix); + explicit Component(int object_id) + : object_id(object_id) + , matrix(Matrix4x4::Identity()) + { + } + + Component(int object_id, const Matrix4x4& matrix) + : object_id(object_id) + , matrix(matrix) + { + } }; typedef std::vector ComponentsList; + struct Geometry + { + std::vector vertices; + std::vector triangles; + + bool empty() + { + return vertices.empty() || triangles.empty(); + } + + void reset() + { + vertices.clear(); + triangles.clear(); + } + }; + struct CurrentObject { - struct Geometry - { - std::vector vertices; - std::vector triangles; - - bool empty(); - void reset(); - }; - int id; Geometry geometry; ModelObject* object; - TriangleMesh mesh; ComponentsList components; - CurrentObject(); + CurrentObject() + { + reset(); + } - void reset(); + void reset() + { + id = -1; + geometry.reset(); + object = nullptr; + components.clear(); + } + }; + + struct CurrentConfig + { + int object_id; + int volume_id; }; struct Instance @@ -221,12 +265,53 @@ namespace Slic3r { ModelInstance* instance; Matrix4x4 matrix; - Instance(ModelInstance* instance, const Matrix4x4& matrix); + Instance(ModelInstance* instance, const Matrix4x4& matrix) + : instance(instance) + , matrix(matrix) + { + } + }; + + struct Metadata + { + std::string key; + std::string value; + + Metadata(const std::string& key, const std::string& value) + : key(key) + , value(value) + { + } + }; + + typedef std::vector MetadataList; + + struct ObjectMetadata + { + struct VolumeMetadata + { + unsigned int first_triangle_id; + unsigned int last_triangle_id; + MetadataList metadata; + + VolumeMetadata(unsigned int first_triangle_id, unsigned int last_triangle_id) + : first_triangle_id(first_triangle_id) + , last_triangle_id(last_triangle_id) + { + } + }; + + typedef std::vector VolumeMetadataList; + + MetadataList metadata; + VolumeMetadataList volumes; }; typedef std::map IdToModelObjectMap; typedef std::map IdToAliasesMap; typedef std::vector InstancesList; + typedef std::map IdToMetadataMap; + typedef std::map IdToGeometryMap; XML_Parser m_xml_parser; Model* m_model; @@ -235,6 +320,9 @@ namespace Slic3r { IdToModelObjectMap m_objects; IdToAliasesMap m_objects_aliases; InstancesList m_instances; + IdToGeometryMap m_geometries; + CurrentConfig m_curr_config; + IdToMetadataMap m_objects_metadata; public: _3MF_Importer(); @@ -248,10 +336,16 @@ namespace Slic3r { bool _load_model_from_file(const std::string& filename, Model& model, PresetBundle& bundle); bool _extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); - bool _extract_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, PresetBundle& bundle, const std::string& archive_filename); + bool _extract_print_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, PresetBundle& bundle, const std::string& archive_filename); + bool _extract_model_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, Model& model); - void _handle_start_xml_element(const char* name, const char** attributes); - void _handle_end_xml_element(const char* name); + // handlers to parse the .model file + void _handle_start_model_xml_element(const char* name, const char** attributes); + void _handle_end_model_xml_element(const char* name); + + // handlers to parse the MODEL_CONFIG_FILE file + void _handle_start_config_xml_element(const char* name, const char** attributes); + void _handle_end_config_xml_element(const char* name); bool _handle_start_model(const char** attributes, unsigned int num_attributes); bool _handle_end_model(); @@ -294,53 +388,29 @@ namespace Slic3r { void _apply_transform(ModelObject& object, const Matrix4x4& matrix); void _apply_transform(ModelInstance& instance, const Matrix4x4& matrix); - static void XMLCALL _handle_start_xml_element(void* userData, const char* name, const char** attributes); - static void XMLCALL _handle_end_xml_element(void* userData, const char* name); + bool _handle_start_config(const char** attributes, unsigned int num_attributes); + bool _handle_end_config(); + + bool _handle_start_config_object(const char** attributes, unsigned int num_attributes); + bool _handle_end_config_object(); + + bool _handle_start_config_volume(const char** attributes, unsigned int num_attributes); + bool _handle_end_config_volume(); + + bool _handle_start_config_metadata(const char** attributes, unsigned int num_attributes); + bool _handle_end_config_metadata(); + + bool _generate_volumes(ModelObject& object, const Geometry& geometry, const ObjectMetadata::VolumeMetadataList& volumes); + + // callbacks to parse the .model file + static void XMLCALL _handle_start_model_xml_element(void* userData, const char* name, const char** attributes); + static void XMLCALL _handle_end_model_xml_element(void* userData, const char* name); + + // callbacks to parse the MODEL_CONFIG_FILE file + static void XMLCALL _handle_start_config_xml_element(void* userData, const char* name, const char** attributes); + static void XMLCALL _handle_end_config_xml_element(void* userData, const char* name); }; - _3MF_Importer::Component::Component(int object_id) - : object_id(object_id) - , matrix(Matrix4x4::Identity()) - { - } - - _3MF_Importer::Component::Component(int object_id, const Matrix4x4& matrix) - : object_id(object_id) - , matrix(matrix) - { - } - - bool _3MF_Importer::CurrentObject::Geometry::empty() - { - return vertices.empty() || triangles.empty(); - } - - void _3MF_Importer::CurrentObject::Geometry::reset() - { - vertices.clear(); - triangles.clear(); - } - - _3MF_Importer::CurrentObject::CurrentObject() - { - reset(); - } - - void _3MF_Importer::CurrentObject::reset() - { - id = -1; - geometry.reset(); - object = nullptr; - mesh = TriangleMesh(); - components.clear(); - } - - _3MF_Importer::Instance::Instance(ModelInstance* instance, const Matrix4x4& matrix) - : instance(instance) - , matrix(matrix) - { - } - _3MF_Importer::_3MF_Importer() : m_xml_parser(nullptr) , m_model(nullptr) @@ -361,6 +431,10 @@ namespace Slic3r { m_objects.clear(); m_objects_aliases.clear(); m_instances.clear(); + m_geometries.clear(); + m_curr_config.object_id = -1; + m_curr_config.volume_id = -1; + m_objects_metadata.clear(); clear_errors(); return _load_model_from_file(filename, model, bundle); @@ -413,13 +487,23 @@ namespace Slic3r { return false; } } - else if (boost::algorithm::iequals(name, CONFIG_FILE)) + else if (boost::algorithm::iequals(name, PRINT_CONFIG_FILE)) { - // extract slic3r config file - if (!_extract_config_from_archive(archive, stat, bundle, filename)) + // extract slic3r print config file + if (!_extract_print_config_from_archive(archive, stat, bundle, filename)) { mz_zip_reader_end(&archive); - add_error("Archive does not contain a valid config"); + add_error("Archive does not contain a valid print config"); + return false; + } + } + else if (boost::algorithm::iequals(name, MODEL_CONFIG_FILE)) + { + // extract slic3r model config file + if (!_extract_model_config_from_archive(archive, stat, model)) + { + mz_zip_reader_end(&archive); + add_error("Archive does not contain a valid model config"); return false; } } @@ -427,6 +511,61 @@ namespace Slic3r { } mz_zip_reader_end(&archive); + + for (const IdToModelObjectMap::value_type& object : m_objects) + { + ObjectMetadata::VolumeMetadataList volumes; + ObjectMetadata::VolumeMetadataList* volumes_ptr = nullptr; + + IdToGeometryMap::const_iterator obj_geometry = m_geometries.find(object.first); + if (obj_geometry == m_geometries.end()) + { + add_error("Unable to find object geometry"); + return false; + } + + IdToMetadataMap::iterator obj_metadata = m_objects_metadata.find(object.first); + if (obj_metadata != m_objects_metadata.end()) + { + // config data has been found, this model was saved using slic3r pe + + // apply object's config data + for (const Metadata& metadata : obj_metadata->second.metadata) + { + object.second->config.set_deserialize(metadata.key, metadata.value); + } + + // select object's detected volumes + volumes_ptr = &obj_metadata->second.volumes; + } + else + { + // config data not found, this model was not saved using slic3r pe + + // add the entire geometry as the single volume to generate + volumes.emplace_back(0, (int)obj_geometry->second.triangles.size() / 3 - 1); + + // select as volumes + volumes_ptr = &volumes; + } + + if (!_generate_volumes(*object.second, obj_geometry->second, *volumes_ptr)) + return false; + + // apply transformation if the object contains a single instance + if (object.second->instances.size() == 1) + { + for (const Instance& instance : m_instances) + { + if (object.second->instances[0] == instance.instance) + { + _apply_transform(*object.second, instance.matrix); + break; + } + } + } + } + return true; } @@ -448,7 +587,7 @@ namespace Slic3r { } XML_SetUserData(m_xml_parser, (void*)this); - XML_SetElementHandler(m_xml_parser, _3MF_Importer::_handle_start_xml_element, _3MF_Importer::_handle_end_xml_element); + XML_SetElementHandler(m_xml_parser, _3MF_Importer::_handle_start_model_xml_element, _3MF_Importer::_handle_end_model_xml_element); void* parser_buffer = XML_GetBuffer(m_xml_parser, (int)stat.m_uncomp_size); if (parser_buffer == nullptr) @@ -475,7 +614,7 @@ namespace Slic3r { return true; } - bool _3MF_Importer::_extract_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, PresetBundle& bundle, const std::string& archive_filename) + bool _3MF_Importer::_extract_print_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, PresetBundle& bundle, const std::string& archive_filename) { if (stat.m_uncomp_size > 0) { @@ -494,7 +633,52 @@ namespace Slic3r { return true; } - void _3MF_Importer::_handle_start_xml_element(const char* name, const char** attributes) + bool _3MF_Importer::_extract_model_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, Model& model) + { + if (stat.m_uncomp_size == 0) + { + add_error("Found invalid size"); + return false; + } + + _destroy_xml_parser(); + + m_xml_parser = XML_ParserCreate(nullptr); + if (m_xml_parser == nullptr) + { + add_error("Unable to create parser"); + return false; + } + + XML_SetUserData(m_xml_parser, (void*)this); + XML_SetElementHandler(m_xml_parser, _3MF_Importer::_handle_start_config_xml_element, _3MF_Importer::_handle_end_config_xml_element); + + void* parser_buffer = XML_GetBuffer(m_xml_parser, (int)stat.m_uncomp_size); + if (parser_buffer == nullptr) + { + add_error("Unable to create buffer"); + return false; + } + + mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, (size_t)stat.m_uncomp_size, 0); + if (res == 0) + { + add_error("Error while reading config data to buffer"); + return false; + } + + if (!XML_ParseBuffer(m_xml_parser, (int)stat.m_uncomp_size, 1)) + { + char error_buf[1024]; + ::sprintf(error_buf, "Error (%s) while parsing xml file at line %d", XML_ErrorString(XML_GetErrorCode(m_xml_parser)), XML_GetCurrentLineNumber(m_xml_parser)); + add_error(error_buf); + return false; + } + + return true; + } + + void _3MF_Importer::_handle_start_model_xml_element(const char* name, const char** attributes) { if (m_xml_parser == nullptr) return; @@ -531,7 +715,7 @@ namespace Slic3r { _stop_xml_parser(); } - void _3MF_Importer::_handle_end_xml_element(const char* name) + void _3MF_Importer::_handle_end_model_xml_element(const char* name) { if (m_xml_parser == nullptr) return; @@ -567,6 +751,47 @@ namespace Slic3r { _stop_xml_parser(); } + void _3MF_Importer::_handle_start_config_xml_element(const char* name, const char** attributes) + { + if (m_xml_parser == nullptr) + return; + + bool res = true; + unsigned int num_attributes = (unsigned int)XML_GetSpecifiedAttributeCount(m_xml_parser); + + if (::strcmp(CONFIG_TAG, name) == 0) + res = _handle_start_config(attributes, num_attributes); + else if (::strcmp(OBJECT_TAG, name) == 0) + res = _handle_start_config_object(attributes, num_attributes); + else if (::strcmp(VOLUME_TAG, name) == 0) + res = _handle_start_config_volume(attributes, num_attributes); + else if (::strcmp(METADATA_TAG, name) == 0) + res = _handle_start_config_metadata(attributes, num_attributes); + + if (!res) + _stop_xml_parser(); + } + + void _3MF_Importer::_handle_end_config_xml_element(const char* name) + { + if (m_xml_parser == nullptr) + return; + + bool res = true; + + if (::strcmp(CONFIG_TAG, name) == 0) + res = _handle_end_config(); + else if (::strcmp(OBJECT_TAG, name) == 0) + res = _handle_end_config_object(); + else if (::strcmp(VOLUME_TAG, name) == 0) + res = _handle_end_config_volume(); + else if (::strcmp(METADATA_TAG, name) == 0) + res = _handle_end_config_metadata(); + + if (!res) + _stop_xml_parser(); + } + bool _3MF_Importer::_handle_start_model(const char** attributes, unsigned int num_attributes) { m_unit_factor = get_unit_factor(get_attribute_value_string(attributes, num_attributes, UNIT_ATTR)); @@ -588,18 +813,11 @@ namespace Slic3r { if (instance.instance != nullptr) { ModelObject* object = instance.instance->get_object(); - if (object != nullptr) + if ((object != nullptr) && (object->instances.size() > 1)) { - if (object->instances.size() == 1) - { - // single instance -> apply the matrix to object geometry - _apply_transform(*object, instance.matrix); - } - else - { - // multiple instances -> apply the matrix to the instance - _apply_transform(*instance.instance, instance.matrix); - } + // multiple instances -> apply the matrix to the instance + // (for single instance the transformation can be applied only after the volumes have been generated) + _apply_transform(*instance.instance, instance.matrix); } } } @@ -669,30 +887,8 @@ namespace Slic3r { } else { - // geometry defined, add it to the object - - ModelVolume* volume = m_curr_object.object->add_volume(m_curr_object.mesh); - if (volume == nullptr) - { - add_error("Unable to add volume"); - return false; - } - - stl_file& stl = volume->mesh.stl; - stl.stats.type = inmemory; - stl.stats.number_of_facets = (uint32_t)m_curr_object.geometry.triangles.size() / 3; - stl.stats.original_num_facets = (int)stl.stats.number_of_facets; - stl_allocate(&stl); - for (size_t i = 0; i < m_curr_object.geometry.triangles.size(); /*nothing*/) - { - stl_facet& facet = stl.facet_start[i / 3]; - for (unsigned int v = 0; v < 3; ++v) - { - ::memcpy((void*)&facet.vertex[v].x, (const void*)&m_curr_object.geometry.vertices[m_curr_object.geometry.triangles[i++] * 3], 3 * sizeof(float)); - } - } - stl_get_size(&stl); - volume->mesh.repair(); + // geometry defined, store it for later use + m_geometries.insert(IdToGeometryMap::value_type(m_curr_object.id, std::move(m_curr_object.geometry))); // stores the object for later use if (m_objects.find(m_curr_object.id) == m_objects.end()) @@ -1014,18 +1210,176 @@ namespace Slic3r { instance.rotation = angle_z; } - void XMLCALL _3MF_Importer::_handle_start_xml_element(void* userData, const char* name, const char** attributes) + bool _3MF_Importer::_handle_start_config(const char** attributes, unsigned int num_attributes) { - _3MF_Importer* importer = (_3MF_Importer*)userData; - if (importer != nullptr) - importer->_handle_start_xml_element(name, attributes); + // do nothing + return true; } - void XMLCALL _3MF_Importer::_handle_end_xml_element(void* userData, const char* name) + bool _3MF_Importer::_handle_end_config() + { + // do nothing + return true; + } + + bool _3MF_Importer::_handle_start_config_object(const char** attributes, unsigned int num_attributes) + { + int object_id = get_attribute_value_int(attributes, num_attributes, ID_ATTR); + IdToMetadataMap::iterator object_item = m_objects_metadata.find(object_id); + if (object_item != m_objects_metadata.end()) + { + add_error("Found duplicated object id"); + return false; + } + + m_objects_metadata.insert(IdToMetadataMap::value_type(object_id, ObjectMetadata())); + m_curr_config.object_id = object_id; + return true; + } + + bool _3MF_Importer::_handle_end_config_object() + { + // do nothing + return true; + } + + bool _3MF_Importer::_handle_start_config_volume(const char** attributes, unsigned int num_attributes) + { + IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); + if (object == m_objects_metadata.end()) + { + add_error("Cannot assign volume to a valid object"); + return false; + } + + m_curr_config.volume_id = object->second.volumes.size(); + + unsigned int first_triangle_id = (unsigned int)get_attribute_value_int(attributes, num_attributes, FIRST_TRIANGLE_ID_ATTR); + unsigned int last_triangle_id = (unsigned int)get_attribute_value_int(attributes, num_attributes, LAST_TRIANGLE_ID_ATTR); + + object->second.volumes.emplace_back(first_triangle_id, last_triangle_id); + return true; + } + + bool _3MF_Importer::_handle_end_config_volume() + { + // do nothing + return true; + } + + bool _3MF_Importer::_handle_start_config_metadata(const char** attributes, unsigned int num_attributes) + { + IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); + if (object == m_objects_metadata.end()) + { + add_error("Cannot assign metadata to valid object id"); + return false; + } + + std::string type = get_attribute_value_string(attributes, num_attributes, TYPE_ATTR); + std::string key = get_attribute_value_string(attributes, num_attributes, KEY_ATTR); + std::string value = get_attribute_value_string(attributes, num_attributes, VALUE_ATTR); + + if (type == OBJECT_TYPE) + object->second.metadata.emplace_back(key, value); + else if (type == VOLUME_TYPE) + { + if (m_curr_config.volume_id < object->second.volumes.size()) + object->second.volumes[m_curr_config.volume_id].metadata.emplace_back(key, value); + } + else + { + add_error("Found invalid metadata type"); + return false; + } + + return true; + } + + bool _3MF_Importer::_handle_end_config_metadata() + { + // do nothing + return true; + } + + bool _3MF_Importer::_generate_volumes(ModelObject& object, const Geometry& geometry, const ObjectMetadata::VolumeMetadataList& volumes) + { + if (!object.volumes.empty()) + { + add_error("Found invalid volumes count"); + return false; + } + + unsigned int geo_tri_count = geometry.triangles.size() / 3; + + for (const ObjectMetadata::VolumeMetadata& volume_data : volumes) + { + if ((geo_tri_count <= volume_data.first_triangle_id) || (geo_tri_count <= volume_data.last_triangle_id) || (volume_data.last_triangle_id < volume_data.first_triangle_id)) + { + add_error("Found invalid triangle id"); + return false; + } + + // splits volume out of imported geometry + unsigned int triangles_count = volume_data.last_triangle_id - volume_data.first_triangle_id + 1; + ModelVolume* volume = object.add_volume(TriangleMesh()); + stl_file& stl = volume->mesh.stl; + stl.stats.type = inmemory; + stl.stats.number_of_facets = (uint32_t)triangles_count; + stl.stats.original_num_facets = (int)stl.stats.number_of_facets; + stl_allocate(&stl); + + unsigned int src_start_id = volume_data.first_triangle_id * 3; + + for (size_t i = 0; i < triangles_count; ++i) + { + unsigned int ii = i * 3; + stl_facet& facet = stl.facet_start[i]; + for (unsigned int v = 0; v < 3; ++v) + { + ::memcpy((void*)&facet.vertex[v].x, (const void*)&geometry.vertices[geometry.triangles[src_start_id + ii + v] * 3], 3 * sizeof(float)); + } + } + + stl_get_size(&stl); + volume->mesh.repair(); + + // apply volume's config data + for (const Metadata& metadata : volume_data.metadata) + { + volume->config.set_deserialize(metadata.key, metadata.value); + } + } + + return true; + } + + void XMLCALL _3MF_Importer::_handle_start_model_xml_element(void* userData, const char* name, const char** attributes) { _3MF_Importer* importer = (_3MF_Importer*)userData; if (importer != nullptr) - importer->_handle_end_xml_element(name); + importer->_handle_start_model_xml_element(name, attributes); + } + + void XMLCALL _3MF_Importer::_handle_end_model_xml_element(void* userData, const char* name) + { + _3MF_Importer* importer = (_3MF_Importer*)userData; + if (importer != nullptr) + importer->_handle_end_model_xml_element(name); + } + + void XMLCALL _3MF_Importer::_handle_start_config_xml_element(void* userData, const char* name, const char** attributes) + { + _3MF_Importer* importer = (_3MF_Importer*)userData; + if (importer != nullptr) + importer->_handle_start_config_xml_element(name, attributes); + } + + void XMLCALL _3MF_Importer::_handle_end_config_xml_element(void* userData, const char* name) + { + _3MF_Importer* importer = (_3MF_Importer*)userData; + if (importer != nullptr) + importer->_handle_end_config_xml_element(name); } class _3MF_Exporter : public _3MF_Base @@ -1035,10 +1389,44 @@ namespace Slic3r { unsigned int id; Matrix4x4 matrix; - BuildItem(unsigned int id, const Matrix4x4& matrix); + BuildItem(unsigned int id, const Matrix4x4& matrix) + : id(id) + , matrix(matrix) + { + } + }; + + struct Offsets + { + unsigned int first_vertex_id; + unsigned int first_triangle_id; + unsigned int last_triangle_id; + + Offsets(unsigned int first_vertex_id) + : first_vertex_id(first_vertex_id) + , first_triangle_id(-1) + , last_triangle_id(-1) + { + } + }; + + typedef std::map VolumeToOffsetsMap; + + struct ObjectData + { + ModelObject* object; + VolumeToOffsetsMap volumes_offsets; + + explicit ObjectData(ModelObject* object) + : object(object) + { + } }; typedef std::vector BuildItemsList; + typedef std::map IdToObjectDataMap; + + IdToObjectDataMap m_objects_data; public: bool save_model_to_file(const std::string& filename, Model& model, const Print& print); @@ -1048,18 +1436,13 @@ namespace Slic3r { bool _add_content_types_file_to_archive(mz_zip_archive& archive); bool _add_relationships_file_to_archive(mz_zip_archive& archive); bool _add_model_file_to_archive(mz_zip_archive& archive, Model& model); - bool _add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items); - bool _add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object); + bool _add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets); + bool _add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); bool _add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items); - bool _add_config_file_to_archive(mz_zip_archive& archive, const Print& print); + bool _add_print_config_file_to_archive(mz_zip_archive& archive, const Print& print); + bool _add_model_config_file_to_archive(mz_zip_archive& archive, const Model& model); }; - _3MF_Exporter::BuildItem::BuildItem(unsigned int id, const Matrix4x4& matrix) - : id(id) - , matrix(matrix) - { - } - bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const Print& print) { clear_errors(); @@ -1071,6 +1454,8 @@ namespace Slic3r { mz_zip_archive archive; mz_zip_zero_struct(&archive); + m_objects_data.clear(); + mz_bool res = mz_zip_writer_init_file(&archive, filename.c_str(), 0); if (res == 0) { @@ -1102,8 +1487,16 @@ namespace Slic3r { return false; } - // adds slic3r config file - if (!_add_config_file_to_archive(archive, print)) + // adds slic3r print config file + if (!_add_print_config_file_to_archive(archive, print)) + { + mz_zip_writer_end(&archive); + boost::filesystem::remove(filename); + return false; + } + + // adds slic3r model config file + if (!_add_model_config_file_to_archive(archive, model)) { mz_zip_writer_end(&archive); boost::filesystem::remove(filename); @@ -1166,8 +1559,8 @@ namespace Slic3r { { std::stringstream stream; stream << "\n"; - stream << "\n"; - stream << " \n"; + stream << "<" << MODEL_TAG << " unit=\"millimeter\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\">\n"; + stream << " <" << RESOURCES_TAG << ">\n"; BuildItemsList build_items; @@ -1177,15 +1570,17 @@ namespace Slic3r { if (obj == nullptr) continue; - if (!_add_object_to_model_stream(stream, object_id, *obj, build_items)) + unsigned int curr_id = object_id; + IdToObjectDataMap::iterator object_it = m_objects_data.insert(IdToObjectDataMap::value_type(curr_id, ObjectData(obj))).first; + + if (!_add_object_to_model_stream(stream, object_id, *obj, build_items, object_it->second.volumes_offsets)) { add_error("Unable to add object to archive"); return false; } } - - stream << " \n"; + stream << " \n"; if (!_add_build_to_model_stream(stream, build_items)) { @@ -1193,7 +1588,7 @@ namespace Slic3r { return false; } - stream << "\n"; + stream << "\n"; std::string out = stream.str(); @@ -1206,7 +1601,7 @@ namespace Slic3r { return true; } - bool _3MF_Exporter::_add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items) + bool _3MF_Exporter::_add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets) { unsigned int id = 0; for (const ModelInstance* instance : object.instances) @@ -1215,11 +1610,11 @@ namespace Slic3r { continue; unsigned int instance_id = object_id + id; - stream << " \n"; + stream << " <" << OBJECT_TAG << " id=\"" << instance_id << "\" type=\"model\">\n"; if (id == 0) { - if (!_add_mesh_to_object_stream(stream, object)) + if (!_add_mesh_to_object_stream(stream, object, volumes_offsets)) { add_error("Unable to add mesh to archive"); return false; @@ -1227,9 +1622,9 @@ namespace Slic3r { } else { - stream << " \n"; - stream << " \n"; - stream << " \n"; + stream << " <" << COMPONENTS_TAG << ">\n"; + stream << " <" << COMPONENT_TAG << " objectid=\"" << object_id << "\" />\n"; + stream << " \n"; } Eigen::Affine3f transform; @@ -1238,7 +1633,7 @@ namespace Slic3r { * Eigen::Scaling((float)instance->scaling_factor); build_items.emplace_back(instance_id, transform.matrix()); - stream << " \n"; + stream << " \n"; ++id; } @@ -1247,20 +1642,18 @@ namespace Slic3r { return true; } - bool _3MF_Exporter::_add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object) + bool _3MF_Exporter::_add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets) { - stream << " \n"; - stream << " \n"; + stream << " <" << MESH_TAG << ">\n"; + stream << " <" << VERTICES_TAG << ">\n"; - typedef std::map VolumeToOffsetMap; - VolumeToOffsetMap volumes_offset; unsigned int vertices_count = 0; for (ModelVolume* volume : object.volumes) { if (volume == nullptr) continue; - volumes_offset.insert(VolumeToOffsetMap::value_type(volume, vertices_count)); + VolumeToOffsetsMap::iterator volume_it = volumes_offsets.insert(VolumeToOffsetsMap::value_type(volume, Offsets(vertices_count))).first; if (!volume->mesh.repaired) volume->mesh.repair(); @@ -1279,7 +1672,7 @@ namespace Slic3r { for (int i = 0; i < stl.stats.shared_vertices; ++i) { - stream << " \n"; - stream << " \n"; + stream << " \n"; + stream << " <" << TRIANGLES_TAG << ">\n"; + unsigned int triangles_count = 0; for (ModelVolume* volume : object.volumes) { if (volume == nullptr) continue; - VolumeToOffsetMap::const_iterator offset_it = volumes_offset.find(volume); - assert(offset_it != volumes_offset.end()); + VolumeToOffsetsMap::iterator volume_it = volumes_offsets.find(volume); + assert(volume_it != volumes_offsets.end()); stl_file& stl = volume->mesh.stl; + // updates triangle offsets + volume_it->second.first_triangle_id = triangles_count; + triangles_count += stl.stats.number_of_facets; + volume_it->second.last_triangle_id = triangles_count - 1; + for (uint32_t i = 0; i < stl.stats.number_of_facets; ++i) { - stream << " second << "\" "; + stream << "v" << j + 1 << "=\"" << stl.v_indices[i].vertex[j] + volume_it->second.first_vertex_id << "\" "; } stream << "/>\n"; } - } - stream << " \n"; - stream << " \n"; + stream << " \n"; + stream << " \n"; return true; } @@ -1326,11 +1724,11 @@ namespace Slic3r { return false; } - stream << " \n"; + stream << " <" << BUILD_TAG << ">\n"; for (const BuildItem& item : build_items) { - stream << " \n"; } - stream << " \n"; + stream << " \n"; return true; } - bool _3MF_Exporter::_add_config_file_to_archive(mz_zip_archive& archive, const Print& print) + bool _3MF_Exporter::_add_print_config_file_to_archive(mz_zip_archive& archive, const Print& print) { char buffer[1024]; sprintf(buffer, "; %s\n\n", header_slic3r_generated().c_str()); @@ -1356,9 +1754,68 @@ namespace Slic3r { GCode::append_full_config(print, out); - if (!mz_zip_writer_add_mem(&archive, CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) + if (!mz_zip_writer_add_mem(&archive, PRINT_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { - add_error("Unable to add config file to archive"); + add_error("Unable to add print config file to archive"); + return false; + } + + return true; + } + + bool _3MF_Exporter::_add_model_config_file_to_archive(mz_zip_archive& archive, const Model& model) + { + std::stringstream stream; + stream << "\n"; + stream << "<" << CONFIG_TAG << ">\n"; + + for (const IdToObjectDataMap::value_type& obj_metadata : m_objects_data) + { + const ModelObject* obj = obj_metadata.second.object; + if (obj != nullptr) + { + stream << " <" << OBJECT_TAG << " id=\"" << obj_metadata.first << "\">\n"; + + // stores object's config data + for (const std::string& key : obj->config.keys()) + { + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << OBJECT_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << obj->config.serialize(key) << "\"/>\n"; + } + + for (const ModelVolume* volume : obj_metadata.second.object->volumes) + { + if (volume != nullptr) + { + const VolumeToOffsetsMap& offsets = obj_metadata.second.volumes_offsets; + VolumeToOffsetsMap::const_iterator it = offsets.find(volume); + if (it != offsets.end()) + { + // stores volume's offsets + stream << " <" << VOLUME_TAG << " "; + stream << FIRST_TRIANGLE_ID_ATTR << "=\"" << it->second.first_triangle_id << "\" "; + stream << LAST_TRIANGLE_ID_ATTR << "=\"" << it->second.last_triangle_id << "\">\n"; + + // stores volume's config data + for (const std::string& key : volume->config.keys()) + { + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << volume->config.serialize(key) << "\"/>\n"; + } + stream << " \n"; + } + } + } + + stream << " \n"; + } + } + + stream << "\n"; + + std::string out = stream.str(); + + if (!mz_zip_writer_add_mem(&archive, MODEL_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) + { + add_error("Unable to add model config file to archive"); return false; } @@ -1392,5 +1849,4 @@ namespace Slic3r { return res; } - } // namespace Slic3r From ecac4ab17545b97b301f197a857b2acdaa519064 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 27 Feb 2018 15:46:54 +0100 Subject: [PATCH 02/47] 3mf I/O - Added import and export of object's and volume's name --- xs/src/libslic3r/Format/3mf.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/xs/src/libslic3r/Format/3mf.cpp b/xs/src/libslic3r/Format/3mf.cpp index 51433c58d..9be8cba7e 100644 --- a/xs/src/libslic3r/Format/3mf.cpp +++ b/xs/src/libslic3r/Format/3mf.cpp @@ -529,10 +529,13 @@ namespace Slic3r { { // config data has been found, this model was saved using slic3r pe - // apply object's config data + // apply object's name and config data for (const Metadata& metadata : obj_metadata->second.metadata) { - object.second->config.set_deserialize(metadata.key, metadata.value); + if (metadata.key == "name") + object.second->name = metadata.value; + else + object.second->config.set_deserialize(metadata.key, metadata.value); } // select object's detected volumes @@ -1344,10 +1347,13 @@ namespace Slic3r { stl_get_size(&stl); volume->mesh.repair(); - // apply volume's config data + // apply volume's name and config data for (const Metadata& metadata : volume_data.metadata) { - volume->config.set_deserialize(metadata.key, metadata.value); + if (metadata.key == "name") + volume->name = metadata.value; + else + volume->config.set_deserialize(metadata.key, metadata.value); } } @@ -1776,6 +1782,10 @@ namespace Slic3r { { stream << " <" << OBJECT_TAG << " id=\"" << obj_metadata.first << "\">\n"; + // stores object's name + if (!obj->name.empty()) + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << OBJECT_TYPE << "\" " << KEY_ATTR << "=\"name\" " << VALUE_ATTR << "=\"" << obj->name << "\"/>\n"; + // stores object's config data for (const std::string& key : obj->config.keys()) { @@ -1795,11 +1805,16 @@ namespace Slic3r { stream << FIRST_TRIANGLE_ID_ATTR << "=\"" << it->second.first_triangle_id << "\" "; stream << LAST_TRIANGLE_ID_ATTR << "=\"" << it->second.last_triangle_id << "\">\n"; + // stores volume's name + if (!volume->name.empty()) + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"name\" " << VALUE_ATTR << "=\"" << volume->name << "\"/>\n"; + // stores volume's config data for (const std::string& key : volume->config.keys()) { stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << volume->config.serialize(key) << "\"/>\n"; } + stream << " \n"; } } From 0e896e48e43ad95bbea989f0b37b852843816106 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 28 Feb 2018 12:11:41 +0100 Subject: [PATCH 03/47] 3mf I/O - Added import and export of modifiers --- xs/src/libslic3r/Format/3mf.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/xs/src/libslic3r/Format/3mf.cpp b/xs/src/libslic3r/Format/3mf.cpp index 9be8cba7e..b92d969df 100644 --- a/xs/src/libslic3r/Format/3mf.cpp +++ b/xs/src/libslic3r/Format/3mf.cpp @@ -62,6 +62,9 @@ const char* LAST_TRIANGLE_ID_ATTR = "lastid"; const char* OBJECT_TYPE = "object"; const char* VOLUME_TYPE = "volume"; +const char* NAME_KEY = "name"; +const char* MODIFIER_KEY = "modifier"; + const unsigned int VALID_OBJECT_TYPES_COUNT = 1; const char* VALID_OBJECT_TYPES[] = { @@ -1350,8 +1353,10 @@ namespace Slic3r { // apply volume's name and config data for (const Metadata& metadata : volume_data.metadata) { - if (metadata.key == "name") + if (metadata.key == NAME_KEY) volume->name = metadata.value; + else if ((metadata.key == MODIFIER_KEY) && (metadata.value == "1")) + volume->modifier = true; else volume->config.set_deserialize(metadata.key, metadata.value); } @@ -1807,7 +1812,11 @@ namespace Slic3r { // stores volume's name if (!volume->name.empty()) - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"name\" " << VALUE_ATTR << "=\"" << volume->name << "\"/>\n"; + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << NAME_KEY << "\" " << VALUE_ATTR << "=\"" << volume->name << "\"/>\n"; + + // stores volume's modifier field + if (volume->modifier) + stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MODIFIER_KEY << "\" " << VALUE_ATTR << "=\"1\"/>\n"; // stores volume's config data for (const std::string& key : volume->config.keys()) From 222368f7e8d9c2ae8e04a9c20075ca83e790244d Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 2 Mar 2018 09:08:11 +0100 Subject: [PATCH 04/47] Start of realization UI to visualize changes --- xs/src/slic3r/GUI/Field.hpp | 4 +++- xs/src/slic3r/GUI/GUI.cpp | 5 +++++ xs/src/slic3r/GUI/GUI.hpp | 4 +++- xs/src/slic3r/GUI/OptionsGroup.cpp | 30 ++++++++++++++++++------------ xs/src/slic3r/GUI/OptionsGroup.hpp | 9 ++++++--- xs/src/slic3r/GUI/Tab.cpp | 8 ++++++++ xs/src/slic3r/GUI/Tab.hpp | 1 + 7 files changed, 44 insertions(+), 17 deletions(-) diff --git a/xs/src/slic3r/GUI/Field.hpp b/xs/src/slic3r/GUI/Field.hpp index 492629b41..0d8c237d2 100644 --- a/xs/src/slic3r/GUI/Field.hpp +++ b/xs/src/slic3r/GUI/Field.hpp @@ -72,6 +72,8 @@ public: virtual void enable() = 0; virtual void disable() = 0; + wxStaticText* m_Label = nullptr; + /// Fires the enable or disable function, based on the input. inline void toggle(bool en) { en ? enable() : disable(); } @@ -85,7 +87,7 @@ public: virtual wxWindow* getWindow() { return nullptr; } bool is_matched(std::string string, std::string pattern); - boost::any get_value_by_opt_type(wxString str); + boost::any get_value_by_opt_type(wxString str); /// Factory method for generating new derived classes. template diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index 4cdafed5a..f9561d7b6 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -505,6 +505,11 @@ wxApp* get_app(){ return g_wxApp; } +wxColour* get_modified_label_clr() +{ + return new wxColour(254, 189, 101); +} + void create_combochecklist(wxComboCtrl* comboCtrl, std::string text, std::string items, bool initial_value) { if (comboCtrl == nullptr) diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp index c6922cebc..7a8039e64 100644 --- a/xs/src/slic3r/GUI/GUI.hpp +++ b/xs/src/slic3r/GUI/GUI.hpp @@ -14,6 +14,7 @@ class wxComboCtrl; class wxString; class wxArrayString; class wxArrayLong; +class wxColour; namespace Slic3r { @@ -35,7 +36,7 @@ class TabIface; #define _CHB(s) wxGetTranslation(wxString(s, wxConvUTF8)).utf8_str() // Minimal buffer length for translated string (char buf[MIN_BUF_LENGTH_FOR_L]) -#define MIN_BUF_LENGTH_FOR_L 128 +#define MIN_BUF_LENGTH_FOR_L 512 namespace GUI { @@ -72,6 +73,7 @@ void set_app_config(AppConfig *app_config); AppConfig* get_app_config(); wxApp* get_app(); +wxColour* get_modified_label_clr(); void add_debug_menu(wxMenuBar *menu, int event_language_change); diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index f88b3f8c0..14142d207 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -6,15 +6,15 @@ namespace Slic3r { namespace GUI { -const t_field& OptionsGroup::build_field(const Option& opt) { - return build_field(opt.opt_id, opt.opt); +const t_field& OptionsGroup::build_field(const Option& opt, wxStaticText* label/* = nullptr*/) { + return build_field(opt.opt_id, opt.opt, label); } -const t_field& OptionsGroup::build_field(const t_config_option_key& id) { +const t_field& OptionsGroup::build_field(const t_config_option_key& id, wxStaticText* label/* = nullptr*/) { const ConfigOptionDef& opt = m_options.at(id).opt; - return build_field(id, opt); + return build_field(id, opt, label); } -const t_field& OptionsGroup::build_field(const t_config_option_key& id, const ConfigOptionDef& opt) { +const t_field& OptionsGroup::build_field(const t_config_option_key& id, const ConfigOptionDef& opt, wxStaticText* label/* = nullptr*/) { // Check the gui_type field first, fall through // is the normal type. if (opt.gui_type.compare("select") == 0) { @@ -72,7 +72,11 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co this->on_kill_focus(); }; field->m_parent = parent(); - // assign function objects for callbacks, etc. + + //! Label to change background color, when option is modified + field->m_Label = label; + + // assign function objects for callbacks, etc. return field; } @@ -110,9 +114,11 @@ void OptionsGroup::append_line(const Line& line) { auto grid_sizer = m_grid_sizer; // Build a label if we have it + wxStaticText* label=nullptr; if (label_width != 0) { - auto label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ":"), + /*auto*/ label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ":"), wxDefaultPosition, wxSize(label_width, -1)); +// label->SetBackgroundColour(*new wxColour(254, 189, 101)); label->SetFont(label_font); label->Wrap(label_width); // avoid a Linux/GTK bug grid_sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL,0); @@ -131,7 +137,7 @@ void OptionsGroup::append_line(const Line& line) { if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) { const auto& option = option_set.front(); - const auto& field = build_field(option); + const auto& field = build_field(option, label); //! std::cerr << "single option, no sidetext.\n"; //! std::cerr << "field parent is not null?: " << (field->parent != nullptr) << "\n"; @@ -156,14 +162,14 @@ void OptionsGroup::append_line(const Line& line) { // wxString str_label = (option.label == "Top" || option.label == "Bottom") ? // wxGETTEXT_IN_CONTEXT("Layers", wxString(option.label.c_str()): // L_str(option.label); - auto field_label = new wxStaticText(parent(), wxID_ANY, str_label + ":", wxDefaultPosition, wxDefaultSize); - field_label->SetFont(label_font); - sizer->Add(field_label, 0, wxALIGN_CENTER_VERTICAL, 0); + /*auto field_*/label = new wxStaticText(parent(), wxID_ANY, str_label + ":", wxDefaultPosition, wxDefaultSize); + /*field_*/label->SetFont(label_font); + sizer->Add(/*field_*/label, 0, wxALIGN_CENTER_VERTICAL, 0); } // add field const Option& opt_ref = opt; - auto& field = build_field(opt_ref); + auto& field = build_field(opt_ref, label); is_sizer_field(field) ? sizer->Add(field->getSizer(), 0, wxALIGN_CENTER_VERTICAL, 0) : sizer->Add(field->getWindow(), 0, wxALIGN_CENTER_VERTICAL, 0); diff --git a/xs/src/slic3r/GUI/OptionsGroup.hpp b/xs/src/slic3r/GUI/OptionsGroup.hpp index 6e88d1d88..6819a1174 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.hpp +++ b/xs/src/slic3r/GUI/OptionsGroup.hpp @@ -27,6 +27,9 @@ namespace Slic3r { namespace GUI { using widget_t = std::function;//!std::function; using column_t = std::function; +//auto default_label_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); //GetSystemColour +//auto modified_label_clr = *new wxColour(254, 189, 101); + /// Wraps a ConfigOptionDef and adds function object for creating a side_widget. struct Option { ConfigOptionDef opt { ConfigOptionDef() }; @@ -136,9 +139,9 @@ protected: /// Generate a wxSizer or wxWindow from a configuration option /// Precondition: opt resolves to a known ConfigOption /// Postcondition: fields contains a wx gui object. - const t_field& build_field(const t_config_option_key& id, const ConfigOptionDef& opt); - const t_field& build_field(const t_config_option_key& id); - const t_field& build_field(const Option& opt); + const t_field& build_field(const t_config_option_key& id, const ConfigOptionDef& opt, wxStaticText* label = nullptr); + const t_field& build_field(const t_config_option_key& id, wxStaticText* label = nullptr); + const t_field& build_field(const Option& opt, wxStaticText* label = nullptr); virtual void on_kill_focus (){}; virtual void on_change_OG(t_config_option_key opt_id, boost::any value); diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 946719356..15fc5f006 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -139,6 +139,13 @@ PageShp Tab::add_options_page(wxString title, std::string icon, bool is_extruder void Tab::update_dirty(){ m_presets->update_dirty_ui(m_presets_choice); on_presets_changed(); + auto dirty_options = m_presets->current_dirty_options(); + for (auto opt_key : dirty_options){ + if (find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){ + get_field(opt_key)->m_Label->SetBackgroundColour(*get_modified_label_clr()); + m_dirty_options.push_back(opt_key); + } + } } void Tab::update_tab_ui() @@ -211,6 +218,7 @@ void Tab::load_config(DynamicPrintConfig config) } change_opt_value(*m_config, opt_key, value); modified = 1; +// get_field(opt_key)->m_Label->SetBackgroundColour(*get_modified_label_clr()); } if (modified) { update_dirty(); diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index 208f99fec..345559c7e 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -99,6 +99,7 @@ protected: bool m_no_controller; std::vector m_reload_dependent_tabs = {}; + std::vector m_dirty_options = {}; // The two following two event IDs are generated at Plater.pm by calling Wx::NewEventType. wxEventType m_event_value_change = 0; From 4547755221e0ccce8527d838a00a8dff3b3023ed Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 6 Mar 2018 09:44:53 +0100 Subject: [PATCH 05/47] Update UI for visualize changes: * Added changing of text color and inserted undo_button when some option is modified. * Call wxSetlocale(LC_NUMERIC, "C") when do language changing. --- resources/icons/action_undo.png | Bin 0 -> 616 bytes resources/icons/arrow_undo.png | Bin 0 -> 631 bytes resources/localization/uk/Slic3rPE_.mo | Bin 0 -> 140066 bytes slic3r.pl | 4 +-- xs/src/slic3r/GUI/Field.hpp | 12 +++++++- xs/src/slic3r/GUI/GUI.cpp | 8 +++-- xs/src/slic3r/GUI/GUI.hpp | 4 +-- xs/src/slic3r/GUI/OptionsGroup.cpp | 39 +++++++++++++------------ xs/src/slic3r/GUI/PresetHints.cpp | 7 +++-- xs/src/slic3r/GUI/Tab.cpp | 34 ++++++++++++++++++--- 10 files changed, 74 insertions(+), 34 deletions(-) create mode 100644 resources/icons/action_undo.png create mode 100644 resources/icons/arrow_undo.png create mode 100644 resources/localization/uk/Slic3rPE_.mo diff --git a/resources/icons/action_undo.png b/resources/icons/action_undo.png new file mode 100644 index 0000000000000000000000000000000000000000..866ae9773bf144069986bf74e5524fe7b387ff48 GIT binary patch literal 616 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 - setlocale(LC_NUMERIC, 'C'); + #setlocale(LC_NUMERIC, 'C'); $gui->{mainframe}->load_config_file($_) for @{$opt{load}}; $gui->{mainframe}->load_config($cli_config); my @input_files = @ARGV; diff --git a/xs/src/slic3r/GUI/Field.hpp b/xs/src/slic3r/GUI/Field.hpp index 0d8c237d2..56de333cf 100644 --- a/xs/src/slic3r/GUI/Field.hpp +++ b/xs/src/slic3r/GUI/Field.hpp @@ -18,6 +18,7 @@ //#include "slic3r_gui.hpp" #include "GUI.hpp" +#include "Utils.hpp" namespace Slic3r { namespace GUI { @@ -31,7 +32,15 @@ wxString double_to_string(double const value); class Field { protected: // factory function to defer and enforce creation of derived type. - virtual void PostInitialize() { BUILD(); } + virtual void PostInitialize(){ + m_Undo_btn = new wxButton(m_parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT|wxNO_BORDER); + // use bouth of temporary_icons till don't have "undo_icon" + m_Undo_btn->SetBitmap(wxBitmap(from_u8(__WXMSW__ ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG)); + auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); + m_Undo_btn->SetBackgroundColour(color); + m_Undo_btn->Hide(); + BUILD(); + } /// Finish constructing the Field's wxWidget-related properties, including setting its own sizer, etc. virtual void BUILD() = 0; @@ -73,6 +82,7 @@ public: virtual void disable() = 0; wxStaticText* m_Label = nullptr; + wxButton* m_Undo_btn = nullptr; /// Fires the enable or disable function, based on the input. inline void toggle(bool en) { en ? enable() : disable(); } diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index f9561d7b6..1ccf80365 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -240,6 +240,7 @@ bool select_language(wxArrayString & names, g_wxLocale->Init(identifiers[index]); g_wxLocale->AddCatalogLookupPathPrefix(wxPathOnly(localization_dir())); g_wxLocale->AddCatalog(g_wxApp->GetAppName()); + wxSetlocale(LC_NUMERIC, "C"); return true; } return false; @@ -268,6 +269,7 @@ bool load_language() g_wxLocale->Init(identifiers[i]); g_wxLocale->AddCatalogLookupPathPrefix(wxPathOnly(localization_dir())); g_wxLocale->AddCatalog(g_wxApp->GetAppName()); + wxSetlocale(LC_NUMERIC, "C"); return true; } } @@ -507,7 +509,7 @@ wxApp* get_app(){ wxColour* get_modified_label_clr() { - return new wxColour(254, 189, 101); + return new wxColour(253, 88, 0); } void create_combochecklist(wxComboCtrl* comboCtrl, std::string text, std::string items, bool initial_value) @@ -567,13 +569,13 @@ AppConfig* get_app_config() return g_AppConfig; } -wxString L_str(std::string str) +wxString L_str(const std::string &str) { //! Explicitly specify that the source string is already in UTF-8 encoding return wxGetTranslation(wxString(str.c_str(), wxConvUTF8)); } -wxString from_u8(std::string str) +wxString from_u8(const std::string &str) { return wxString::FromUTF8(str.c_str()); } diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp index 7a8039e64..b7e67af92 100644 --- a/xs/src/slic3r/GUI/GUI.hpp +++ b/xs/src/slic3r/GUI/GUI.hpp @@ -119,9 +119,9 @@ void create_combochecklist(wxComboCtrl* comboCtrl, std::string text, std::string int combochecklist_get_flags(wxComboCtrl* comboCtrl); // Return translated std::string as a wxString -wxString L_str(std::string str); +wxString L_str(const std::string &str); // Return wxString from std::string in UTF8 -wxString from_u8(std::string str); +wxString from_u8(const std::string &str); } } diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index 14142d207..138496b2e 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -3,6 +3,7 @@ #include #include +#include "Utils.hpp" namespace Slic3r { namespace GUI { @@ -104,6 +105,7 @@ void OptionsGroup::append_line(const Line& line) { const auto& option = option_set.front(); const auto& field = build_field(option); + sizer->Add(field->m_Undo_btn); if (is_window_field(field)) sizer->Add(field->getWindow(), 0, wxEXPAND | wxALL, wxOSX ? 0 : 5); if (is_sizer_field(field)) @@ -116,9 +118,8 @@ void OptionsGroup::append_line(const Line& line) { // Build a label if we have it wxStaticText* label=nullptr; if (label_width != 0) { - /*auto*/ label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ":"), + label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ":"), wxDefaultPosition, wxSize(label_width, -1)); -// label->SetBackgroundColour(*new wxColour(254, 189, 101)); label->SetFont(label_font); label->Wrap(label_width); // avoid a Linux/GTK bug grid_sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL,0); @@ -134,25 +135,24 @@ void OptionsGroup::append_line(const Line& line) { } // if we have a single option with no sidetext just add it directly to the grid sizer - if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 && - option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) { - const auto& option = option_set.front(); - const auto& field = build_field(option, label); -//! std::cerr << "single option, no sidetext.\n"; -//! std::cerr << "field parent is not null?: " << (field->parent != nullptr) << "\n"; + auto sizer = new wxBoxSizer(wxHORIZONTAL); + grid_sizer->Add(sizer, 0, wxEXPAND | wxALL, 0); + if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 && + option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) { + const auto& option = option_set.front(); + const auto& field = build_field(option, label); - if (is_window_field(field)) - grid_sizer->Add(field->getWindow(), 0, (option.opt.full_width ? wxEXPAND : 0) | + sizer->Add(field->m_Undo_btn, 0, wxALIGN_CENTER_VERTICAL); + if (is_window_field(field)) + sizer->Add(field->getWindow(), 0, (option.opt.full_width ? wxEXPAND : 0) | wxBOTTOM | wxTOP | wxALIGN_CENTER_VERTICAL, wxOSX ? 0 : 2); - if (is_sizer_field(field)) - grid_sizer->Add(field->getSizer(), 0, (option.opt.full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0); - return; - } + if (is_sizer_field(field)) + sizer->Add(field->getSizer(), 0, (option.opt.full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0); + return; + } // if we're here, we have more than one option or a single option with sidetext // so we need a horizontal sizer to arrange these things - auto sizer = new wxBoxSizer(wxHORIZONTAL); - grid_sizer->Add(sizer, 0, wxEXPAND | wxALL, 0); for (auto opt : option_set) { ConfigOptionDef option = opt.opt; // add label if any @@ -162,14 +162,15 @@ void OptionsGroup::append_line(const Line& line) { // wxString str_label = (option.label == "Top" || option.label == "Bottom") ? // wxGETTEXT_IN_CONTEXT("Layers", wxString(option.label.c_str()): // L_str(option.label); - /*auto field_*/label = new wxStaticText(parent(), wxID_ANY, str_label + ":", wxDefaultPosition, wxDefaultSize); - /*field_*/label->SetFont(label_font); - sizer->Add(/*field_*/label, 0, wxALIGN_CENTER_VERTICAL, 0); + label = new wxStaticText(parent(), wxID_ANY, str_label + ":", wxDefaultPosition, wxDefaultSize); + label->SetFont(label_font); + sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL, 0); } // add field const Option& opt_ref = opt; auto& field = build_field(opt_ref, label); + sizer->Add(field->m_Undo_btn, 0, wxALIGN_CENTER_VERTICAL, 0); is_sizer_field(field) ? sizer->Add(field->getSizer(), 0, wxALIGN_CENTER_VERTICAL, 0) : sizer->Add(field->getWindow(), 0, wxALIGN_CENTER_VERTICAL, 0); diff --git a/xs/src/slic3r/GUI/PresetHints.cpp b/xs/src/slic3r/GUI/PresetHints.cpp index 07c8e3b07..d4c929c1c 100644 --- a/xs/src/slic3r/GUI/PresetHints.cpp +++ b/xs/src/slic3r/GUI/PresetHints.cpp @@ -13,10 +13,11 @@ namespace Slic3r { +#define MIN_BUF_LENGTH 4096 std::string PresetHints::cooling_description(const Preset &preset) { std::string out; - char buf[4096]; + char buf[MIN_BUF_LENGTH/*4096*/]; if (preset.config.opt_bool("cooling", 0)) { int slowdown_below_layer_time = preset.config.opt_int("slowdown_below_layer_time", 0); int min_fan_speed = preset.config.opt_int("min_fan_speed", 0); @@ -220,7 +221,7 @@ std::string PresetHints::maximum_volumetric_flow_description(const PresetBundle + _CHB(L(" with a volumetric rate ")); if (limited_by_max_volumetric_speed) max_flow = max_volumetric_speed; - char buf[2048]; + char buf[MIN_BUF_LENGTH/*2048*/]; sprintf(buf, _CHB(L("%3.2f mm³/s")), max_flow); out += buf; sprintf(buf, _CHB(L(" at filament speed %3.2f mm/s.")), max_flow / filament_crossection); @@ -258,7 +259,7 @@ std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle &pre if (num_perimeters > 0) { int num_lines = std::min(num_perimeters * 2, 10); - char buf[256]; + char buf[MIN_BUF_LENGTH/*256*/]; sprintf(buf, _CHB(L("Recommended object thin wall thickness for layer height %.2f and ")), layer_height); out += buf; // Start with the width of two closely spaced diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 15fc5f006..aa30a655c 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -33,19 +33,23 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) // preset chooser m_presets_choice = new wxBitmapComboBox(panel, wxID_ANY, "", wxDefaultPosition, wxSize(270, -1), 0, 0,wxCB_READONLY); - const wxBitmap* bmp = new wxBitmap(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG); + + auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); //buttons wxBitmap bmpMenu; bmpMenu = wxBitmap(from_u8(Slic3r::var("disk.png")), wxBITMAP_TYPE_PNG); m_btn_save_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_save_preset->SetBackgroundColour(color); bmpMenu = wxBitmap(from_u8(Slic3r::var("delete.png")), wxBITMAP_TYPE_PNG); m_btn_delete_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_delete_preset->SetBackgroundColour(color); m_show_incompatible_presets = false; m_bmp_show_incompatible_presets = new wxBitmap(from_u8(Slic3r::var("flag-red-icon.png")), wxBITMAP_TYPE_PNG); m_bmp_hide_incompatible_presets = new wxBitmap(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG); m_btn_hide_incompatible_presets = new wxBitmapButton(panel, wxID_ANY, *m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_hide_incompatible_presets->SetBackgroundColour(color); m_btn_save_preset->SetToolTip(_(L("Save current ")) + m_title); m_btn_delete_preset->SetToolTip(_(L("Delete this preset"))); @@ -140,12 +144,34 @@ void Tab::update_dirty(){ m_presets->update_dirty_ui(m_presets_choice); on_presets_changed(); auto dirty_options = m_presets->current_dirty_options(); + // Add new dirty options to m_dirty_options for (auto opt_key : dirty_options){ - if (find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){ - get_field(opt_key)->m_Label->SetBackgroundColour(*get_modified_label_clr()); + Field* field = get_field(opt_key/*, opt_index*/); + if (field != nullptr && find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){ + field->m_Label->SetForegroundColour(*get_modified_label_clr()); + field->m_Undo_btn->Show(); + m_dirty_options.push_back(opt_key); } } + + // Delete undirty options from m_dirty_options + size_t cnt = m_dirty_options.size(); + for (auto i = 0; i < /*cnt*/m_dirty_options.size(); ++i) + { + const std::string &opt_key = m_dirty_options[i]; + Field* field = get_field(opt_key/*, opt_index*/); + if (field != nullptr && find(dirty_options.begin(), dirty_options.end(), opt_key) == dirty_options.end()) + { + field->m_Undo_btn->Hide(); + field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); + std::vector::iterator itr = find(m_dirty_options.begin(), m_dirty_options.end(), opt_key); + if (itr != m_dirty_options.end()){ + m_dirty_options.erase(itr); + --i; + } + } + } } void Tab::update_tab_ui() @@ -947,7 +973,7 @@ void TabPrinter::build() Line line{ _(L("Bed shape")), "" }; line.widget = [this](wxWindow* parent){ - auto btn = new wxButton(parent, wxID_ANY, _(L(" Set "))+"\u2026", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT); + auto btn = new wxButton(parent, wxID_ANY, _(L(" Set "))+"\u2026", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT); // btn->SetFont(Slic3r::GUI::small_font); btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("printer_empty.png")), wxBITMAP_TYPE_PNG)); From 9f7607c064b9473a9599f9d01947a0d52db03d95 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 6 Mar 2018 10:26:39 +0100 Subject: [PATCH 06/47] 3mf I/O - Fixed object sinking into bed after import --- xs/src/libslic3r/Format/3mf.cpp | 3 +++ xs/src/libslic3r/Model.cpp | 24 +++++++++++++++++++++++- xs/src/libslic3r/Model.hpp | 3 +++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/xs/src/libslic3r/Format/3mf.cpp b/xs/src/libslic3r/Format/3mf.cpp index b92d969df..b34b8989e 100644 --- a/xs/src/libslic3r/Format/3mf.cpp +++ b/xs/src/libslic3r/Format/3mf.cpp @@ -572,6 +572,9 @@ namespace Slic3r { } } + // fixes the min z of the model if negative + model.adjust_min_z(); + return true; } diff --git a/xs/src/libslic3r/Model.cpp b/xs/src/libslic3r/Model.cpp index 1de99bbf8..f394e553c 100644 --- a/xs/src/libslic3r/Model.cpp +++ b/xs/src/libslic3r/Model.cpp @@ -409,6 +409,25 @@ void Model::convert_multipart_object() this->objects.push_back(object); } +void Model::adjust_min_z() +{ + if (objects.empty()) + return; + + if (bounding_box().min.z < 0.0) + { + for (ModelObject* obj : objects) + { + if (obj != nullptr) + { + coordf_t obj_min_z = obj->bounding_box().min.z; + if (obj_min_z < 0.0) + obj->translate(0.0, 0.0, -obj_min_z); + } + } + } +} + ModelObject::ModelObject(Model *model, const ModelObject &other, bool copy_volumes) : name(other.name), input_file(other.input_file), @@ -671,7 +690,10 @@ void ModelObject::transform(const float* matrix3x4) v->mesh.transform(matrix3x4); } - origin_translation = Pointf3(0.0f, 0.0f, 0.0f); +//##################################################################################################### + origin_translation = Pointf3(0.0, 0.0, 0.0); +// origin_translation = Pointf3(0.0f, 0.0f, 0.0f); +//##################################################################################################### invalidate_bounding_box(); } diff --git a/xs/src/libslic3r/Model.hpp b/xs/src/libslic3r/Model.hpp index cf9bfd85a..d3faf38ef 100644 --- a/xs/src/libslic3r/Model.hpp +++ b/xs/src/libslic3r/Model.hpp @@ -273,6 +273,9 @@ public: bool looks_like_multipart_object() const; void convert_multipart_object(); + // Ensures that the min z of the model is not negative + void adjust_min_z(); + void print_info() const { for (const ModelObject *o : this->objects) o->print_info(); } }; From 3caf54c359e4cb1c6b30c370b4661b102f4c45c9 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 6 Mar 2018 12:34:20 +0100 Subject: [PATCH 07/47] Undo buttons work --- xs/src/slic3r/GUI/Field.cpp | 17 +++++++++++++++++ xs/src/slic3r/GUI/Field.hpp | 16 +++++++--------- xs/src/slic3r/GUI/OptionsGroup.cpp | 16 +++++++++++++++- xs/src/slic3r/GUI/OptionsGroup.hpp | 14 ++++++++++---- xs/src/slic3r/GUI/Tab.cpp | 13 +++++++++---- 5 files changed, 58 insertions(+), 18 deletions(-) diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index 045c55d96..d64ae876b 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -18,6 +18,17 @@ namespace Slic3r { namespace GUI { wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None); } + void Field::PostInitialize(){ + m_Undo_btn = new wxButton(m_parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); + // use bouth of temporary_icons till don't have "undo_icon" + auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); + m_Undo_btn->SetBackgroundColour(color); + m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG)); + m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent){ on_back_to_initial_value(); })); + + BUILD(); + } + void Field::on_kill_focus(wxEvent& event) { // Without this, there will be nasty focus bugs on Windows. // Also, docs for wxEvent::Skip() say "In general, it is recommended to skip all @@ -34,6 +45,12 @@ namespace Slic3r { namespace GUI { m_on_change(m_opt_id, get_value()); } + void Field::on_back_to_initial_value() + { + if (m_back_to_initial_value != nullptr) + m_back_to_initial_value(m_opt_id); + } + wxString Field::get_tooltip_text(const wxString& default_string) { wxString tooltip_text(""); diff --git a/xs/src/slic3r/GUI/Field.hpp b/xs/src/slic3r/GUI/Field.hpp index 56de333cf..454cd1430 100644 --- a/xs/src/slic3r/GUI/Field.hpp +++ b/xs/src/slic3r/GUI/Field.hpp @@ -26,21 +26,14 @@ class Field; using t_field = std::unique_ptr; using t_kill_focus = std::function; using t_change = std::function; +using t_back_to_init = std::function; wxString double_to_string(double const value); class Field { protected: // factory function to defer and enforce creation of derived type. - virtual void PostInitialize(){ - m_Undo_btn = new wxButton(m_parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT|wxNO_BORDER); - // use bouth of temporary_icons till don't have "undo_icon" - m_Undo_btn->SetBitmap(wxBitmap(from_u8(__WXMSW__ ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG)); - auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); - m_Undo_btn->SetBackgroundColour(color); - m_Undo_btn->Hide(); - BUILD(); - } + virtual void PostInitialize(); /// Finish constructing the Field's wxWidget-related properties, including setting its own sizer, etc. virtual void BUILD() = 0; @@ -51,6 +44,8 @@ protected: void on_kill_focus(wxEvent& event); /// Call the attached on_change method. void on_change_field(); + /// Call the attached m_back_to_initial_value method. + void on_back_to_initial_value(); public: /// parent wx item, opportunity to refactor (probably not necessary - data duplication) @@ -62,6 +57,9 @@ public: /// Function object to store callback passed in from owning object. t_change m_on_change {nullptr}; + /// Function object to store callback passed in from owning object. + t_back_to_init m_back_to_initial_value{ nullptr }; + // This is used to avoid recursive invocation of the field change/update by wxWidgets. bool m_disable_change_event {false}; diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index 138496b2e..d19d9b548 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -75,7 +75,11 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co field->m_parent = parent(); //! Label to change background color, when option is modified - field->m_Label = label; + field->m_Label = label; + field->m_back_to_initial_value = [this](std::string opt_id){ + if (!this->m_disabled) + this->back_to_initial_value(opt_id); + }; // assign function objects for callbacks, etc. return field; @@ -270,6 +274,16 @@ void ConfigOptionsGroup::on_change_OG(t_config_option_key opt_id, boost::any val OptionsGroup::on_change_OG(opt_id, value); //!? Why doing this } +void ConfigOptionsGroup::back_to_initial_value(const std::string opt_key) +{ + if (m_get_initial_config == nullptr) + return; + DynamicPrintConfig config = m_get_initial_config(); + boost::any value = get_config_value(config, opt_key); + set_value(opt_key, value); + on_change_OG(opt_key, get_value(opt_key)/*value*/); +} + void ConfigOptionsGroup::reload_config(){ for (std::map< std::string, std::pair >::iterator it = m_opt_map.begin(); it != m_opt_map.end(); ++it) { auto opt_id = it->first; diff --git a/xs/src/slic3r/GUI/OptionsGroup.hpp b/xs/src/slic3r/GUI/OptionsGroup.hpp index 6819a1174..56755595b 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.hpp +++ b/xs/src/slic3r/GUI/OptionsGroup.hpp @@ -19,6 +19,12 @@ #define wxOSX false #endif +#ifdef __WXMSW__ +#define wxMSW true +#else +#define wxMSW false +#endif + #define BORDER(a, b) ((wxOSX ? a : b)) namespace Slic3r { namespace GUI { @@ -78,6 +84,7 @@ public: wxSizer* sizer {nullptr}; column_t extra_column {nullptr}; t_change m_on_change {nullptr}; + std::function m_get_initial_config{ nullptr }; wxFont sidetext_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) }; wxFont label_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) }; @@ -145,6 +152,7 @@ protected: virtual void on_kill_focus (){}; virtual void on_change_OG(t_config_option_key opt_id, boost::any value); + virtual void back_to_initial_value(const std::string opt_key){}; }; class ConfigOptionsGroup: public OptionsGroup { @@ -172,10 +180,8 @@ public: } void on_change_OG(t_config_option_key opt_id, boost::any value) override; - void on_kill_focus() override - { - reload_config(); - } + void back_to_initial_value(const std::string opt_key) override; + void on_kill_focus() override{ reload_config();} void reload_config(); boost::any config_value(std::string opt_key, int opt_index, bool deserialize); // return option value from config diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index aa30a655c..1995d409a 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -148,8 +148,8 @@ void Tab::update_dirty(){ for (auto opt_key : dirty_options){ Field* field = get_field(opt_key/*, opt_index*/); if (field != nullptr && find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){ - field->m_Label->SetForegroundColour(*get_modified_label_clr()); - field->m_Undo_btn->Show(); + field->m_Label->SetForegroundColour(*get_modified_label_clr()); + field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(wxMSW ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG)); m_dirty_options.push_back(opt_key); } @@ -157,13 +157,13 @@ void Tab::update_dirty(){ // Delete undirty options from m_dirty_options size_t cnt = m_dirty_options.size(); - for (auto i = 0; i < /*cnt*/m_dirty_options.size(); ++i) + for (auto i = 0; i < m_dirty_options.size(); ++i) { const std::string &opt_key = m_dirty_options[i]; Field* field = get_field(opt_key/*, opt_index*/); if (field != nullptr && find(dirty_options.begin(), dirty_options.end(), opt_key) == dirty_options.end()) { - field->m_Undo_btn->Hide(); + field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG)); field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); std::vector::iterator itr = find(m_dirty_options.begin(), m_dirty_options.end(), opt_key); if (itr != m_dirty_options.end()){ @@ -1774,6 +1774,11 @@ ConfigOptionsGroupShp Page::new_optgroup(wxString title, int noncommon_label_wid //! }); }; + optgroup->m_get_initial_config = [this](){ + DynamicPrintConfig config = static_cast(GetParent())->m_presets->get_selected_preset().config; + return config; + }; + vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10); m_optgroups.push_back(optgroup); From 254e311593f4c5a70e5f6aab9f082c2109295328 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 6 Mar 2018 13:34:39 +0100 Subject: [PATCH 08/47] Delete background color changing (except of MSW) --- xs/src/slic3r/GUI/Field.cpp | 2 +- xs/src/slic3r/GUI/Field.hpp | 6 ++++++ xs/src/slic3r/GUI/OptionsGroup.hpp | 6 ------ xs/src/slic3r/GUI/Tab.cpp | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index d64ae876b..13b3fde66 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -22,7 +22,7 @@ namespace Slic3r { namespace GUI { m_Undo_btn = new wxButton(m_parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); // use bouth of temporary_icons till don't have "undo_icon" auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); - m_Undo_btn->SetBackgroundColour(color); + if (wxMSW) m_Undo_btn->SetBackgroundColour(color); m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG)); m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent){ on_back_to_initial_value(); })); diff --git a/xs/src/slic3r/GUI/Field.hpp b/xs/src/slic3r/GUI/Field.hpp index 454cd1430..662636796 100644 --- a/xs/src/slic3r/GUI/Field.hpp +++ b/xs/src/slic3r/GUI/Field.hpp @@ -20,6 +20,12 @@ #include "GUI.hpp" #include "Utils.hpp" +#ifdef __WXMSW__ +#define wxMSW true +#else +#define wxMSW false +#endif + namespace Slic3r { namespace GUI { class Field; diff --git a/xs/src/slic3r/GUI/OptionsGroup.hpp b/xs/src/slic3r/GUI/OptionsGroup.hpp index 56755595b..bf096809f 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.hpp +++ b/xs/src/slic3r/GUI/OptionsGroup.hpp @@ -19,12 +19,6 @@ #define wxOSX false #endif -#ifdef __WXMSW__ -#define wxMSW true -#else -#define wxMSW false -#endif - #define BORDER(a, b) ((wxOSX ? a : b)) namespace Slic3r { namespace GUI { diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 36cfc0cb1..f61e4a78c 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -40,16 +40,16 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) wxBitmap bmpMenu; bmpMenu = wxBitmap(from_u8(Slic3r::var("disk.png")), wxBITMAP_TYPE_PNG); m_btn_save_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); - m_btn_save_preset->SetBackgroundColour(color); + if (wxMSW) m_btn_save_preset->SetBackgroundColour(color); bmpMenu = wxBitmap(from_u8(Slic3r::var("delete.png")), wxBITMAP_TYPE_PNG); m_btn_delete_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); - m_btn_delete_preset->SetBackgroundColour(color); + if (wxMSW) m_btn_delete_preset->SetBackgroundColour(color); m_show_incompatible_presets = false; m_bmp_show_incompatible_presets = new wxBitmap(from_u8(Slic3r::var("flag-red-icon.png")), wxBITMAP_TYPE_PNG); m_bmp_hide_incompatible_presets = new wxBitmap(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG); m_btn_hide_incompatible_presets = new wxBitmapButton(panel, wxID_ANY, *m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); - m_btn_hide_incompatible_presets->SetBackgroundColour(color); + if (wxMSW) m_btn_hide_incompatible_presets->SetBackgroundColour(color); m_btn_save_preset->SetToolTip(_(L("Save current ")) + m_title); m_btn_delete_preset->SetToolTip(_(L("Delete this preset"))); From c52f51b1e47c53be32ab44263908cbc535fa3791 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 6 Mar 2018 14:45:03 +0100 Subject: [PATCH 09/47] Fixed bug with resizing 3DScene --- lib/Slic3r/GUI/3DScene.pm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index f9e9e668d..db05860da 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -400,6 +400,10 @@ sub mouse_event { $self->Refresh; $self->Update; } else { + # The mouse_to_3d gets the Z coordinate from the Z buffer at the screen coordinate $pos->x,y, + # an converts the screen space coordinate to unscaled object space. + my $pos3d = ($volume_idx == -1) ? undef : $self->mouse_to_3d(@$pos); + # Select volume in this 3D canvas. # Don't deselect a volume if layer editing is enabled. We want the object to stay selected # during the scene manipulation. @@ -427,9 +431,6 @@ sub mouse_event { if ($volume_idx != -1) { if ($e->LeftDown && $self->enable_moving) { - # The mouse_to_3d gets the Z coordinate from the Z buffer at the screen coordinate $pos->x,y, - # an converts the screen space coordinate to unscaled object space. - my $pos3d = $self->mouse_to_3d(@$pos); # Only accept the initial position, if it is inside the volume bounding box. my $volume_bbox = $self->volumes->[$volume_idx]->transformed_bounding_box; $volume_bbox->offset(1.); @@ -948,6 +949,9 @@ sub mulquats { sub mouse_to_3d { my ($self, $x, $y, $z) = @_; + return unless $self->GetContext; + $self->SetCurrent($self->GetContext); + my @viewport = glGetIntegerv_p(GL_VIEWPORT); # 4 items my @mview = glGetDoublev_p(GL_MODELVIEW_MATRIX); # 16 items my @proj = glGetDoublev_p(GL_PROJECTION_MATRIX); # 16 items From dd7712d4d3d1939804e6ad5ad8d89def1b2fdf9c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 6 Mar 2018 14:58:51 +0100 Subject: [PATCH 10/47] Fixed bug with case-sensitive name of icon (for Linux build) --- xs/src/slic3r/GUI/Field.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index 13b3fde66..7bee68d95 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -23,7 +23,7 @@ namespace Slic3r { namespace GUI { // use bouth of temporary_icons till don't have "undo_icon" auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); if (wxMSW) m_Undo_btn->SetBackgroundColour(color); - m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG)); + m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("bullet_white.png")), wxBITMAP_TYPE_PNG)); m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent){ on_back_to_initial_value(); })); BUILD(); From 38dca8396fccdea1095ffc46b0874e637ff92296 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 7 Mar 2018 15:05:41 +0100 Subject: [PATCH 11/47] Updated back_to_initial_value and fixed some bugs for Extruders --- xs/src/slic3r/GUI/Field.cpp | 2 +- xs/src/slic3r/GUI/Field.hpp | 2 ++ xs/src/slic3r/GUI/GUI.cpp | 8 +++++-- xs/src/slic3r/GUI/OptionsGroup.cpp | 29 +++++++++++++++++++++++-- xs/src/slic3r/GUI/OptionsGroup.hpp | 10 +++++---- xs/src/slic3r/GUI/Tab.cpp | 34 +++++++++++++++++++++++------- xs/src/slic3r/GUI/Tab.hpp | 1 + 7 files changed, 69 insertions(+), 17 deletions(-) diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index 7bee68d95..890ce51ce 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -47,7 +47,7 @@ namespace Slic3r { namespace GUI { void Field::on_back_to_initial_value() { - if (m_back_to_initial_value != nullptr) + if (m_back_to_initial_value != nullptr && m_is_modified_value) m_back_to_initial_value(m_opt_id); } diff --git a/xs/src/slic3r/GUI/Field.hpp b/xs/src/slic3r/GUI/Field.hpp index 662636796..b711052b5 100644 --- a/xs/src/slic3r/GUI/Field.hpp +++ b/xs/src/slic3r/GUI/Field.hpp @@ -68,6 +68,8 @@ public: // This is used to avoid recursive invocation of the field change/update by wxWidgets. bool m_disable_change_event {false}; + // This is used to avoid recursive invocation of the field change/update by wxWidgets. + bool m_is_modified_value {false}; /// Copy of ConfigOption for deduction purposes const ConfigOptionDef m_opt {ConfigOptionDef()}; diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index 92d810bab..1079aa9b0 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -421,9 +421,13 @@ void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, b config.set_key_value(opt_key, new ConfigOptionString(boost::any_cast(value))); break; case coStrings:{ - if (opt_key.compare("compatible_printers") == 0){ + if (opt_key.compare("compatible_printers") == 0 || + config.def()->get(opt_key)->gui_flags.compare("serialized") == 0){ config.option(opt_key)->values.resize(0); - for (auto el : boost::any_cast>(value)) + std::vector values = boost::any_cast>(value); + if (values.size() == 1 && values[0] == "") + break; + for (auto el : values) config.option(opt_key)->values.push_back(el); } else{ diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index d19d9b548..dfa3ba3b2 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -3,6 +3,8 @@ #include #include +#include +#include #include "Utils.hpp" namespace Slic3r { namespace GUI { @@ -80,6 +82,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co if (!this->m_disabled) this->back_to_initial_value(opt_id); }; + if (!m_is_tab_opt) field->m_Undo_btn->Hide(); // assign function objects for callbacks, etc. return field; @@ -255,6 +258,12 @@ void ConfigOptionsGroup::on_change_OG(t_config_option_key opt_id, boost::any val // # Currently used for the post_process config value only. // my @values = split / ; / , $field_value; // $self->config->set($opt_key, \@values); + std::string str = boost::any_cast(value); + if (str.back() == ';') + str.pop_back(); + std::vector values; + boost::split(values, str, boost::is_any_of(";")); + change_opt_value(*m_config, opt_key, values); } else { if (opt_index == -1) { @@ -279,9 +288,16 @@ void ConfigOptionsGroup::back_to_initial_value(const std::string opt_key) if (m_get_initial_config == nullptr) return; DynamicPrintConfig config = m_get_initial_config(); - boost::any value = get_config_value(config, opt_key); + boost::any value; + if (opt_key == "extruders_count"){ + auto *nozzle_diameter = dynamic_cast(config.option("nozzle_diameter")); + value = int(nozzle_diameter->values.size()); + } + else + value = get_config_value(config, opt_key); + set_value(opt_key, value); - on_change_OG(opt_key, get_value(opt_key)/*value*/); + on_change_OG(opt_key, get_value(opt_key)); } void ConfigOptionsGroup::reload_config(){ @@ -354,6 +370,12 @@ boost::any ConfigOptionsGroup::get_config_value(DynamicPrintConfig& config, std: case coStrings: if (config.option(opt_key)->values.empty()) ret = text_value; + else if (opt->gui_flags.compare("serialized") == 0){ + std::vector values = config.option(opt_key)->values; + for (auto el : values) + text_value += el + ";"; + ret = text_value; + } else ret = static_cast(config.opt_string(opt_key, static_cast(idx))); break; @@ -397,6 +419,9 @@ boost::any ConfigOptionsGroup::get_config_value(DynamicPrintConfig& config, std: } Field* ConfigOptionsGroup::get_fieldc(t_config_option_key opt_key, int opt_index){ + Field* field = get_field(opt_key); + if (field != nullptr) + return field; std::string opt_id = ""; for (std::map< std::string, std::pair >::iterator it = m_opt_map.begin(); it != m_opt_map.end(); ++it) { if (opt_key == m_opt_map.at(it->first).first && opt_index == m_opt_map.at(it->first).second){ diff --git a/xs/src/slic3r/GUI/OptionsGroup.hpp b/xs/src/slic3r/GUI/OptionsGroup.hpp index bf096809f..63ba91e6c 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.hpp +++ b/xs/src/slic3r/GUI/OptionsGroup.hpp @@ -113,8 +113,8 @@ public: inline void enable() { for (auto& field : m_fields) field.second->enable(); } inline void disable() { for (auto& field : m_fields) field.second->disable(); } - OptionsGroup(wxWindow* _parent, wxString title) : - m_parent(_parent), title(title) { + OptionsGroup(wxWindow* _parent, wxString title, bool is_tab_opt=false) : + m_parent(_parent), title(title), m_is_tab_opt(is_tab_opt) { sizer = (staticbox ? new wxStaticBoxSizer(new wxStaticBox(_parent, wxID_ANY, title), wxVERTICAL) : new wxBoxSizer(wxVERTICAL)); auto num_columns = 1U; if (label_width != 0) num_columns++; @@ -136,6 +136,8 @@ protected: t_optionfield_map m_fields; bool m_disabled {false}; wxGridSizer* m_grid_sizer {nullptr}; + // "true" if option is created in preset tabs + bool m_is_tab_opt{ false }; /// Generate a wxSizer or wxWindow from a configuration option /// Precondition: opt resolves to a known ConfigOption @@ -151,8 +153,8 @@ protected: class ConfigOptionsGroup: public OptionsGroup { public: - ConfigOptionsGroup(wxWindow* parent, wxString title, DynamicPrintConfig* _config = nullptr) : - OptionsGroup(parent, title), m_config(_config) {} + ConfigOptionsGroup(wxWindow* parent, wxString title, DynamicPrintConfig* _config = nullptr, bool is_tab_opt = false) : + OptionsGroup(parent, title, is_tab_opt), m_config(_config) {} /// reference to libslic3r config, non-owning pointer (?). DynamicPrintConfig* m_config {nullptr}; diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index f61e4a78c..d9f64f120 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -144,12 +144,24 @@ void Tab::update_dirty(){ m_presets->update_dirty_ui(m_presets_choice); on_presets_changed(); auto dirty_options = m_presets->current_dirty_options(); + + bool change_extruder_data = false; + + if (name() == "printer"){ + TabPrinter* tab_printer = static_cast(this); + if (tab_printer->m_initial_extruders_count != tab_printer->m_extruders_count){ + dirty_options.emplace_back("extruders_count"); + change_extruder_data = true; + } + } // Add new dirty options to m_dirty_options for (auto opt_key : dirty_options){ Field* field = get_field(opt_key/*, opt_index*/); if (field != nullptr && find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){ - field->m_Label->SetForegroundColour(*get_modified_label_clr()); + if (field->m_Label != nullptr) + field->m_Label->SetForegroundColour(*get_modified_label_clr()); field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(wxMSW ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG)); + field->m_is_modified_value = true; m_dirty_options.push_back(opt_key); } @@ -164,7 +176,9 @@ void Tab::update_dirty(){ if (field != nullptr && find(dirty_options.begin(), dirty_options.end(), opt_key) == dirty_options.end()) { field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG)); - field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); + if (field->m_Label != nullptr) + field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); + field->m_is_modified_value = false; std::vector::iterator itr = find(m_dirty_options.begin(), m_dirty_options.end(), opt_key); if (itr != m_dirty_options.end()){ m_dirty_options.erase(itr); @@ -200,11 +214,13 @@ void Tab::load_config(DynamicPrintConfig config) int opt_index = 0; for(auto opt_key : m_config->diff(config)) { switch ( config.def()->get(opt_key)->type ){ - case coFloatOrPercent: - value = config.option(opt_key)->value; + case coFloatOrPercent:{ + const auto &conf_val = *config.option(opt_key); + value = conf_val.percent ? std::to_string(int(conf_val.value)) + "%" : std::to_string(conf_val.value); + } break; case coPercent: - value = config.option(opt_key)->value; + value = std::to_string(int(config.option(opt_key)->value)); break; case coFloat: value = config.opt_float(opt_key); @@ -610,7 +626,8 @@ void TabPrint::update() DynamicPrintConfig new_conf = *m_config; if (dialog->ShowModal() == wxID_YES) { const auto &val = *m_config->option("first_layer_height"); - new_conf.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.2, val.percent)); + auto percent = val.percent; + new_conf.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.2, percent)); if (m_config->opt_float("layer_height") < 0.15) new_conf.set_key_value("layer_height", new ConfigOptionFloat(0.15)); if (m_config->opt_float("layer_height") > 0.35) new_conf.set_key_value("layer_height", new ConfigOptionFloat(0.35)); @@ -977,7 +994,7 @@ void TabPrinter::build() auto default_config = m_preset_bundle->full_config(); auto *nozzle_diameter = dynamic_cast(m_config->option("nozzle_diameter")); - m_extruders_count = nozzle_diameter->values.size(); + m_initial_extruders_count = m_extruders_count = nozzle_diameter->values.size(); auto page = add_options_page(_(L("General")), "printer_empty.png"); auto optgroup = page->new_optgroup(_(L("Size and coordinates"))); @@ -1222,6 +1239,7 @@ void TabPrinter::extruders_count_changed(size_t extruders_count){ m_preset_bundle->printers.get_edited_preset().set_num_extruders(extruders_count); m_preset_bundle->update_multi_material_filament_presets(); build_extruder_pages(); + reload_config(); on_value_change("extruders_count", extruders_count); } @@ -1771,7 +1789,7 @@ bool Page::set_value(t_config_option_key opt_key, boost::any value){ ConfigOptionsGroupShp Page::new_optgroup(wxString title, int noncommon_label_width /*= -1*/) { //! config_ have to be "right" - ConfigOptionsGroupShp optgroup = std::make_shared(this, title, m_config); + ConfigOptionsGroupShp optgroup = std::make_shared(this, title, m_config, true); if (noncommon_label_width >= 0) optgroup->label_width = noncommon_label_width; diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index 345559c7e..f1a9e58ee 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -222,6 +222,7 @@ public: wxButton* m_octoprint_host_test_btn; size_t m_extruders_count; + size_t m_initial_extruders_count; std::vector m_extruder_pages; TabPrinter() {} From 986ee5043717d286a04616dbe119c0d585bde826 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 8 Mar 2018 11:58:06 +0100 Subject: [PATCH 12/47] Completed UI to visualize changes and to reset to initial value --- xs/src/slic3r/GUI/GUI.cpp | 5 ++- xs/src/slic3r/GUI/OptionsGroup.cpp | 15 +++++--- xs/src/slic3r/GUI/Tab.cpp | 56 ++++++++++++++++++++++++------ 3 files changed, 57 insertions(+), 19 deletions(-) diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index 1079aa9b0..a0b1bbd09 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -464,9 +464,8 @@ void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, b } break; case coPoints:{ - ConfigOptionPoints points; - points.values = boost::any_cast>(value); - config.set_key_value(opt_key, new ConfigOptionPoints(points)); + ConfigOptionPoints* vec_new = new ConfigOptionPoints{ boost::any_cast(value) }; + config.option(opt_key)->set_at(vec_new, opt_index, 0); } break; case coNone: diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index dfa3ba3b2..0be24824c 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -293,6 +293,13 @@ void ConfigOptionsGroup::back_to_initial_value(const std::string opt_key) auto *nozzle_diameter = dynamic_cast(config.option("nozzle_diameter")); value = int(nozzle_diameter->values.size()); } + else if (m_opt_map.find(opt_key) != m_opt_map.end()) + { + auto opt_id = m_opt_map.find(opt_key)->first; + std::string opt_short_key = m_opt_map.at(opt_id).first; + int opt_index = m_opt_map.at(opt_id).second; + value = get_config_value(config, opt_short_key, opt_index); + } else value = get_config_value(config, opt_key); @@ -360,7 +367,7 @@ boost::any ConfigOptionsGroup::get_config_value(DynamicPrintConfig& config, std: double val = opt->type == coFloats ? config.opt_float(opt_key, idx) : opt->type == coFloat ? config.opt_float(opt_key) : - config.option(opt_key)->values.at(idx); + config.option(opt_key)->get_at(idx); ret = double_to_string(val); } break; @@ -406,10 +413,8 @@ boost::any ConfigOptionsGroup::get_config_value(DynamicPrintConfig& config, std: ret = static_cast(config.option>(opt_key)->value); } break; - case coPoints:{ - const auto &value = *config.option(opt_key); - ret = value.values.at(idx); - } + case coPoints: + ret = config.option(opt_key)->get_at(idx); break; case coNone: default: diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index d9f64f120..1a4dadd72 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -138,28 +138,62 @@ PageShp Tab::add_options_page(wxString title, std::string icon, bool is_extruder return page; } +template +void add_correct_opts_to_dirty_options(const std::string &opt_key, std::vector *vec, TabPrinter *tab) +{ + auto opt_init = static_cast(tab->m_presets->get_selected_preset().config.option(opt_key)); + auto opt_cur = static_cast(tab->m_config->option(opt_key)); + int opt_init_max_id = opt_init->values.size()-1; + for (int i = 0; i < opt_cur->values.size(); i++) + { + int init_id = i <= opt_init_max_id ? i : 0; + if (opt_cur->values[i] != opt_init->values[init_id]) + vec->emplace_back(opt_key + "#" + std::to_string(i)); + } +} + // Update the combo box label of the selected preset based on its "dirty" state, // comparing the selected preset config with $self->{config}. void Tab::update_dirty(){ m_presets->update_dirty_ui(m_presets_choice); on_presets_changed(); + + // Update UI according to changes auto dirty_options = m_presets->current_dirty_options(); - bool change_extruder_data = false; - if (name() == "printer"){ - TabPrinter* tab_printer = static_cast(this); - if (tab_printer->m_initial_extruders_count != tab_printer->m_extruders_count){ + // Update dirty_options in case changes of Extruder's options + TabPrinter* tab = static_cast(this); + std::vector new_dirty; + for (auto opt_key : dirty_options) + { + switch (m_config->option(opt_key)->type()) + { + case coInts: add_correct_opts_to_dirty_options(opt_key, &new_dirty, tab); break; + case coBools: add_correct_opts_to_dirty_options(opt_key, &new_dirty, tab); break; + case coFloats: add_correct_opts_to_dirty_options(opt_key, &new_dirty, tab); break; + case coStrings: add_correct_opts_to_dirty_options(opt_key, &new_dirty, tab); break; + case coPercents:add_correct_opts_to_dirty_options(opt_key, &new_dirty, tab); break; + case coPoints: add_correct_opts_to_dirty_options(opt_key, &new_dirty, tab); break; + default: new_dirty.emplace_back(opt_key); break; + } + } + + dirty_options.resize(0); + dirty_options = new_dirty; + if (tab->m_initial_extruders_count != tab->m_extruders_count){ dirty_options.emplace_back("extruders_count"); - change_extruder_data = true; } } + // Add new dirty options to m_dirty_options for (auto opt_key : dirty_options){ - Field* field = get_field(opt_key/*, opt_index*/); + Field* field = get_field(opt_key); if (field != nullptr && find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){ - if (field->m_Label != nullptr) + if (field->m_Label != nullptr){ field->m_Label->SetForegroundColour(*get_modified_label_clr()); + field->m_Label->Refresh(true); + } field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(wxMSW ? var("action_undo.png") : var("arrow_undo.png")), wxBITMAP_TYPE_PNG)); field->m_is_modified_value = true; @@ -168,16 +202,17 @@ void Tab::update_dirty(){ } // Delete undirty options from m_dirty_options - size_t cnt = m_dirty_options.size(); for (auto i = 0; i < m_dirty_options.size(); ++i) { const std::string &opt_key = m_dirty_options[i]; - Field* field = get_field(opt_key/*, opt_index*/); + Field* field = get_field(opt_key); if (field != nullptr && find(dirty_options.begin(), dirty_options.end(), opt_key) == dirty_options.end()) { field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG)); - if (field->m_Label != nullptr) + if (field->m_Label != nullptr){ field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); + field->m_Label->Refresh(true); + } field->m_is_modified_value = false; std::vector::iterator itr = find(m_dirty_options.begin(), m_dirty_options.end(), opt_key); if (itr != m_dirty_options.end()){ @@ -271,7 +306,6 @@ void Tab::load_config(DynamicPrintConfig config) } change_opt_value(*m_config, opt_key, value, opt_index); modified = 1; -// get_field(opt_key)->m_Label->SetBackgroundColour(*get_modified_label_clr()); } if (modified) { update_dirty(); From 418e083781d78d9247b28244bbee5a85050e398e Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 8 Mar 2018 14:01:14 +0100 Subject: [PATCH 13/47] Fixed Linux build --- xs/src/slic3r/GUI/Tab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 1a4dadd72..dc55a5a31 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -208,7 +208,7 @@ void Tab::update_dirty(){ Field* field = get_field(opt_key); if (field != nullptr && find(dirty_options.begin(), dirty_options.end(), opt_key) == dirty_options.end()) { - field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("Bullet_white.png")), wxBITMAP_TYPE_PNG)); + field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("bullet_white.png")), wxBITMAP_TYPE_PNG)); if (field->m_Label != nullptr){ field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); field->m_Label->Refresh(true); From 9ebb0f27c1422ecce2c72035641d299a9dd895a1 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 8 Mar 2018 16:33:38 +0100 Subject: [PATCH 14/47] Fixed bugs with spiral_vase and standby_temperature_delta --- xs/src/slic3r/GUI/Field.cpp | 7 ++++++- xs/src/slic3r/GUI/Tab.cpp | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index 890ce51ce..8fe70479f 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -234,8 +234,13 @@ void SpinCtrl::BUILD() { break; } + const int min_val = m_opt_id == "standby_temperature_delta" ? + -500 : m_opt.min > 0 ? + m_opt.min : 0; + const int max_val = m_opt.max < 2147483647 ? m_opt.max : 2147483647; + auto temp = new wxSpinCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, - 0, m_opt.min >0 ? m_opt.min : 0, m_opt.max < 2147483647 ? m_opt.max : 2147483647, default_value); + 0, min_val, max_val, default_value); temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { tmp_value = undef_spin_val; on_change_field(); }), temp->GetId()); temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e) { tmp_value = undef_spin_val; on_kill_focus(e); }), temp->GetId()); diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index dc55a5a31..5af9a033d 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -255,7 +255,7 @@ void Tab::load_config(DynamicPrintConfig config) } break; case coPercent: - value = std::to_string(int(config.option(opt_key)->value)); + value = config.option(opt_key)->value;// std::to_string(int(config.option(opt_key)->value)); break; case coFloat: value = config.opt_float(opt_key); From 419721ce22d2456477ae7b45c48759ca00c93036 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 9 Mar 2018 08:34:32 +0100 Subject: [PATCH 15/47] Fixed bug with highlighting of modified parameters after changing the profile --- xs/src/slic3r/GUI/Tab.cpp | 25 +++++++++++++++---------- xs/src/slic3r/GUI/Tab.hpp | 1 + 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 5af9a033d..aef85c78d 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -97,6 +97,7 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) if (selected_item >= 0){ std::string selected_string = m_presets_choice->GetString(selected_item).ToUTF8().data(); select_preset(selected_string); + update_changed_ui(); } })); @@ -152,13 +153,9 @@ void add_correct_opts_to_dirty_options(const std::string &opt_key, std::vector{config}. -void Tab::update_dirty(){ - m_presets->update_dirty_ui(m_presets_choice); - on_presets_changed(); - - // Update UI according to changes +// Update UI according to changes +void Tab::update_changed_ui() +{ auto dirty_options = m_presets->current_dirty_options(); if (name() == "printer"){ @@ -178,7 +175,7 @@ void Tab::update_dirty(){ default: new_dirty.emplace_back(opt_key); break; } } - + dirty_options.resize(0); dirty_options = new_dirty; if (tab->m_initial_extruders_count != tab->m_extruders_count){ @@ -201,13 +198,13 @@ void Tab::update_dirty(){ } } - // Delete undirty options from m_dirty_options + // Delete clear options from m_dirty_options for (auto i = 0; i < m_dirty_options.size(); ++i) { const std::string &opt_key = m_dirty_options[i]; Field* field = get_field(opt_key); if (field != nullptr && find(dirty_options.begin(), dirty_options.end(), opt_key) == dirty_options.end()) - { + { field->m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("bullet_white.png")), wxBITMAP_TYPE_PNG)); if (field->m_Label != nullptr){ field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); @@ -223,6 +220,14 @@ void Tab::update_dirty(){ } } +// Update the combo box label of the selected preset based on its "dirty" state, +// comparing the selected preset config with $self->{config}. +void Tab::update_dirty(){ + m_presets->update_dirty_ui(m_presets_choice); + on_presets_changed(); + update_changed_ui(); +} + void Tab::update_tab_ui() { m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets); diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index f1a9e58ee..4745aa732 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -146,6 +146,7 @@ public: void toggle_show_hide_incompatible(); void update_show_hide_incompatible_button(); void update_ui_from_settings(); + void update_changed_ui(); PageShp add_options_page(wxString title, std::string icon, bool is_extruder_pages = false); From bdd2d725c83fca0d3a84f19cf9ae25ce2525cbb9 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 9 Mar 2018 10:40:42 +0100 Subject: [PATCH 16/47] Out of bed detection - 1st installment --- lib/Slic3r/GUI/3DScene.pm | 175 ++++++++++---- lib/Slic3r/GUI/Plater.pm | 4 + lib/Slic3r/GUI/Plater/3D.pm | 16 ++ xs/src/libslic3r/BoundingBox.hpp | 32 +++ xs/src/libslic3r/Model.cpp | 72 +++++- xs/src/libslic3r/Model.hpp | 8 +- xs/src/libslic3r/Print.cpp | 1 + xs/src/libslic3r/PrintConfig.cpp | 7 + xs/src/libslic3r/PrintConfig.hpp | 2 + xs/src/slic3r/GUI/3DScene.cpp | 387 ++++++++++++++++++++++++------- xs/src/slic3r/GUI/3DScene.hpp | 118 ++++++---- xs/src/slic3r/GUI/Preset.cpp | 2 +- xs/src/slic3r/GUI/Tab.cpp | 3 +- xs/xsp/GUI_3DScene.xsp | 43 +++- xs/xsp/Model.xsp | 7 +- 15 files changed, 689 insertions(+), 188 deletions(-) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index f9e9e668d..f8e31eeb7 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -68,6 +68,7 @@ __PACKAGE__->mk_accessors( qw(_quat _dirty init _zoom _legend_enabled + _warning_enabled _apply_zoom_to_volumes_filter ) ); @@ -142,6 +143,7 @@ sub new { $self->_sphi(45); $self->_zoom(1); $self->_legend_enabled(0); + $self->_warning_enabled(0); $self->use_plain_shader(0); $self->_apply_zoom_to_volumes_filter(0); @@ -217,7 +219,12 @@ sub new { sub set_legend_enabled { my ($self, $value) = @_; - $self->_legend_enabled($value); + $self->_legend_enabled($value); +} + +sub set_warning_enabled { + my ($self, $value) = @_; + $self->_warning_enabled($value); } sub Destroy { @@ -1296,11 +1303,14 @@ sub Render { } glEnable(GL_LIGHTING); - + # draw objects if (! $self->use_plain_shader) { $self->draw_volumes; } elsif ($self->UseVBOs) { + if ($self->enable_picking) { + $self->volumes->set_print_box($self->bed_bounding_box->x_min, $self->bed_bounding_box->y_min, 0.0, $self->bed_bounding_box->x_max, $self->bed_bounding_box->y_max, $self->{config}->get('max_print_height')); + } $self->{plain_shader}->enable if $self->{plain_shader}; $self->volumes->render_VBOs; $self->{plain_shader}->disable; @@ -1327,6 +1337,9 @@ sub Render { glDisable(GL_BLEND); } + # draw warning message + $self->draw_warning; + # draw gcode preview legend $self->draw_legend; @@ -1599,31 +1612,65 @@ sub draw_active_object_annotations { sub draw_legend { my ($self) = @_; - if ($self->_legend_enabled) - { - # If the legend texture has not been loaded into the GPU, do it now. - my $tex_id = Slic3r::GUI::_3DScene::finalize_legend_texture; - if ($tex_id > 0) - { - my $tex_w = Slic3r::GUI::_3DScene::get_legend_texture_width; - my $tex_h = Slic3r::GUI::_3DScene::get_legend_texture_height; - if (($tex_w > 0) && ($tex_h > 0)) - { - glDisable(GL_DEPTH_TEST); - glPushMatrix(); - glLoadIdentity(); - - my ($cw, $ch) = $self->GetSizeWH; - - my $l = (-0.5 * $cw) / $self->_zoom; - my $t = (0.5 * $ch) / $self->_zoom; - my $r = $l + $tex_w / $self->_zoom; - my $b = $t - $tex_h / $self->_zoom; - $self->_render_texture($tex_id, $l, $r, $b, $t); + if (!$self->_legend_enabled) { + return; + } - glPopMatrix(); - glEnable(GL_DEPTH_TEST); - } + # If the legend texture has not been loaded into the GPU, do it now. + my $tex_id = Slic3r::GUI::_3DScene::finalize_legend_texture; + if ($tex_id > 0) + { + my $tex_w = Slic3r::GUI::_3DScene::get_legend_texture_width; + my $tex_h = Slic3r::GUI::_3DScene::get_legend_texture_height; + if (($tex_w > 0) && ($tex_h > 0)) + { + glDisable(GL_DEPTH_TEST); + glPushMatrix(); + glLoadIdentity(); + + my ($cw, $ch) = $self->GetSizeWH; + + my $l = (-0.5 * $cw) / $self->_zoom; + my $t = (0.5 * $ch) / $self->_zoom; + my $r = $l + $tex_w / $self->_zoom; + my $b = $t - $tex_h / $self->_zoom; + $self->_render_texture($tex_id, $l, $r, $b, $t); + + glPopMatrix(); + glEnable(GL_DEPTH_TEST); + } + } +} + +sub draw_warning { + my ($self) = @_; + + if (!$self->_warning_enabled) { + return; + } + + # If the warning texture has not been loaded into the GPU, do it now. + my $tex_id = Slic3r::GUI::_3DScene::finalize_warning_texture; + if ($tex_id > 0) + { + my $tex_w = Slic3r::GUI::_3DScene::get_warning_texture_width; + my $tex_h = Slic3r::GUI::_3DScene::get_warning_texture_height; + if (($tex_w > 0) && ($tex_h > 0)) + { + glDisable(GL_DEPTH_TEST); + glPushMatrix(); + glLoadIdentity(); + + my ($cw, $ch) = $self->GetSizeWH; + + my $l = (-0.5 * $tex_w) / $self->_zoom; + my $t = (-0.5 * $ch + $tex_h) / $self->_zoom; + my $r = $l + $tex_w / $self->_zoom; + my $b = $t - $tex_h / $self->_zoom; + $self->_render_texture($tex_id, $l, $r, $b, $t); + + glPopMatrix(); + glEnable(GL_DEPTH_TEST); } } } @@ -1694,39 +1741,55 @@ sub _vertex_shader_Gouraud { #define INTENSITY_CORRECTION 0.7 -#define LIGHT_TOP_DIR -0.6/1.31, 0.6/1.31, 1./1.31 +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +#define LIGHT_TOP_DIR vec3(-0.4574957, 0.4574957, 0.7624929) #define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) #define LIGHT_TOP_SPECULAR (0.5 * INTENSITY_CORRECTION) #define LIGHT_TOP_SHININESS 50. -#define LIGHT_FRONT_DIR 1./1.43, 0.2/1.43, 1./1.43 +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +#define LIGHT_FRONT_DIR vec3(0.6985074, 0.1397015, 0.6985074) #define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) #define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) #define LIGHT_FRONT_SHININESS 50. #define INTENSITY_AMBIENT 0.3 +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +struct PrintBoxDetection +{ + vec3 min; + vec3 max; + // xyz contains the offset, if w == 1.0 detection needs to be performed + vec4 volume_origin; +}; + +uniform PrintBoxDetection print_box; + varying float intensity_specular; varying float intensity_tainted; +varying vec3 delta_box_min; +varying vec3 delta_box_max; + void main() { - vec3 eye, normal, lightDir, viewVector, halfVector; + vec3 normal, viewVector, halfVector; float NdotL, NdotHV; - eye = vec3(0., 0., 1.); + vec3 eye = -(gl_ModelViewMatrix * gl_Vertex).xyz; // First transform the normal into eye space and normalize the result. normal = normalize(gl_NormalMatrix * gl_Normal); // Now normalize the light's direction. Note that according to the OpenGL specification, the light is stored in eye space. // Also since we're talking about a directional light, the position field is actually direction. - lightDir = vec3(LIGHT_TOP_DIR); - halfVector = normalize(lightDir + eye); + halfVector = normalize(LIGHT_TOP_DIR + eye); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - NdotL = max(dot(normal, lightDir), 0.0); + NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); intensity_tainted = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; intensity_specular = 0.; @@ -1735,15 +1798,27 @@ void main() intensity_specular = LIGHT_TOP_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source. - lightDir = vec3(LIGHT_FRONT_DIR); -// halfVector = normalize(lightDir + eye); - NdotL = max(dot(normal, lightDir), 0.0); +// halfVector = normalize(LIGHT_FRONT_DIR + eye); + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); intensity_tainted += NdotL * LIGHT_FRONT_DIFFUSE; // compute the specular term if NdotL is larger than zero // if (NdotL > 0.0) // intensity_specular += LIGHT_FRONT_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_FRONT_SHININESS); + // compute deltas for out of print volume detection (world coordinates) + if (print_box.volume_origin.w == 1.0) + { + vec3 v = gl_Vertex.xyz + print_box.volume_origin.xyz; + delta_box_min = v - print_box.min; + delta_box_max = v - print_box.max; + } + else + { + delta_box_min = ZERO; + delta_box_max = ZERO; + } + gl_Position = ftransform(); } @@ -1756,14 +1831,23 @@ sub _fragment_shader_Gouraud { varying float intensity_specular; varying float intensity_tainted; +varying vec3 delta_box_min; +varying vec3 delta_box_max; uniform vec4 uniform_color; +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + void main() { gl_FragColor = vec4(intensity_specular, intensity_specular, intensity_specular, 0.) + uniform_color * intensity_tainted; - gl_FragColor.a = uniform_color.a; + + // if the fragment is outside the print volume darken it and set it as transparent + if (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) + gl_FragColor = vec4(mix(gl_FragColor.xyz, ZERO, 0.5), 0.5 * uniform_color.a); + else + gl_FragColor.a = uniform_color.a; } FRAGMENT @@ -1828,6 +1912,7 @@ void main() { // compute the specular term into spec // intensity_specular += LIGHT_FRONT_SPECULAR * pow(max(dot(h,normal), 0.0), LIGHT_FRONT_SHININESS); } + gl_FragColor = max( vec4(intensity_specular, intensity_specular, intensity_specular, 0.) + uniform_color * intensity_tainted, INTENSITY_AMBIENT * uniform_color); @@ -1840,12 +1925,12 @@ sub _vertex_shader_variable_layer_height { return <<'VERTEX'; #version 110 -#define LIGHT_TOP_DIR 0., 1., 0. +const vec3 LIGHT_TOP_DIR = vec3(0.0, 1.0, 0.0); #define LIGHT_TOP_DIFFUSE 0.2 #define LIGHT_TOP_SPECULAR 0.3 #define LIGHT_TOP_SHININESS 50. -#define LIGHT_FRONT_DIR 0., 0., 1. +const vec3 LIGHT_FRONT_DIR = vec3(0.0, 0.0, 1.0); #define LIGHT_FRONT_DIFFUSE 0.5 #define LIGHT_FRONT_SPECULAR 0.3 #define LIGHT_FRONT_SHININESS 50. @@ -1859,7 +1944,7 @@ varying float object_z; void main() { - vec3 eye, normal, lightDir, viewVector, halfVector; + vec3 eye, normal, viewVector, halfVector; float NdotL, NdotHV; // eye = gl_ModelViewMatrixInverse[3].xyz; @@ -1870,12 +1955,11 @@ void main() // Now normalize the light's direction. Note that according to the OpenGL specification, the light is stored in eye space. // Also since we're talking about a directional light, the position field is actually direction. - lightDir = vec3(LIGHT_TOP_DIR); - halfVector = normalize(lightDir + eye); + halfVector = normalize(LIGHT_TOP_DIR + eye); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - NdotL = max(dot(normal, lightDir), 0.0); + NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); intensity_tainted = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; intensity_specular = 0.; @@ -1884,9 +1968,8 @@ void main() // intensity_specular = LIGHT_TOP_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_TOP_SHININESS); // Perform the same lighting calculation for the 2nd light source. - lightDir = vec3(LIGHT_FRONT_DIR); - halfVector = normalize(lightDir + eye); - NdotL = max(dot(normal, lightDir), 0.0); + halfVector = normalize(LIGHT_FRONT_DIR + eye); + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); intensity_tainted += NdotL * LIGHT_FRONT_DIFFUSE; // compute the specular term if NdotL is larger than zero diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index d48e31462..0e498ee8b 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -55,6 +55,7 @@ sub new { serial_port serial_speed octoprint_host octoprint_apikey octoprint_cafile nozzle_diameter single_extruder_multi_material wipe_tower wipe_tower_x wipe_tower_y wipe_tower_width wipe_tower_per_color_wipe extruder_colour filament_colour + max_print_height )]); # C++ Slic3r::Model with Perl extensions in Slic3r/Model.pm $self->{model} = Slic3r::Model->new; @@ -113,6 +114,7 @@ sub new { $self->{canvas3D}->set_on_decrease_objects(sub { $self->decrease() }); $self->{canvas3D}->set_on_remove_object(sub { $self->remove() }); $self->{canvas3D}->set_on_instances_moved($on_instances_moved); + $self->{canvas3D}->use_plain_shader(1); $self->{canvas3D}->set_on_wipe_tower_moved(sub { my ($new_pos_3f) = @_; my $cfg = Slic3r::Config->new; @@ -1737,6 +1739,8 @@ sub on_config_change { $update_scheduled = 1; my $extruder_colors = $config->get('extruder_colour'); $self->{preview3D}->set_number_extruders(scalar(@{$extruder_colors})); + } elsif ($opt_key eq 'max_print_height') { + $update_scheduled = 1; } } diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index 1c123e741..8f95a92f4 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -8,6 +8,8 @@ use Wx qw(:misc :pen :brush :sizer :font :cursor :keycode wxTAB_TRAVERSAL); use Wx::Event qw(EVT_KEY_DOWN EVT_CHAR); use base qw(Slic3r::GUI::3DScene Class::Accessor); +use Wx::Locale gettext => 'L'; + __PACKAGE__->mk_accessors(qw( on_arrange on_rotate_object_left on_rotate_object_right on_scale_object_uniformly on_remove_object on_increase_objects on_decrease_objects)); @@ -208,6 +210,20 @@ sub reload_scene { $self->{model}->bounding_box->z_max, $self->UseVBOs); } } + + # checks for geometry outside the print volume to render it accordingly + if (scalar @{$self->volumes} > 0) + { + if (!$self->{model}->fits_print_volume($self->{config})) { + $self->set_warning_enabled(1); + $self->volumes->update_outside_state($self->{config}, 0); + Slic3r::GUI::_3DScene::generate_warning_texture(L("Detected object outside print volume")); + } else { + $self->set_warning_enabled(0); + $self->volumes->update_outside_state($self->{config}, 1); + Slic3r::GUI::_3DScene::reset_warning_texture(); + } + } } sub update_bed_size { diff --git a/xs/src/libslic3r/BoundingBox.hpp b/xs/src/libslic3r/BoundingBox.hpp index a7334308c..b425a4e3c 100644 --- a/xs/src/libslic3r/BoundingBox.hpp +++ b/xs/src/libslic3r/BoundingBox.hpp @@ -94,6 +94,38 @@ public: void translate(const Pointf3 &pos) { this->translate(pos.x, pos.y, pos.z); } void offset(coordf_t delta); PointClass center() const; + + bool contains(const PointClass &point) const { + return BoundingBoxBase::contains(point) && point.z >= this->min.z && point.z <= this->max.z; + } + + bool contains(const BoundingBox3Base& other) const { + if (!contains(other.min)) + return false; + + if (!contains(PointClass(other.max.x, other.min.y, other.min.z))) + return false; + + if (!contains(PointClass(other.max.x, other.max.y, other.min.z))) + return false; + + if (!contains(PointClass(other.min.x, other.max.y, other.min.z))) + return false; + + if (!contains(PointClass(other.min.x, other.min.y, other.max.z))) + return false; + + if (!contains(PointClass(other.max.x, other.min.y, other.max.z))) + return false; + + if (!contains(other.max)) + return false; + + if (!contains(PointClass(other.min.x, other.max.y, other.max.z))) + return false; + + return true; + } }; class BoundingBox : public BoundingBoxBase diff --git a/xs/src/libslic3r/Model.cpp b/xs/src/libslic3r/Model.cpp index 1de99bbf8..944bf7743 100644 --- a/xs/src/libslic3r/Model.cpp +++ b/xs/src/libslic3r/Model.cpp @@ -222,7 +222,7 @@ bool Model::add_default_instances() } // this returns the bounding box of the *transformed* instances -BoundingBoxf3 Model::bounding_box() +BoundingBoxf3 Model::bounding_box() const { BoundingBoxf3 bb; for (ModelObject *o : this->objects) @@ -230,6 +230,57 @@ BoundingBoxf3 Model::bounding_box() return bb; } +BoundingBoxf3 Model::transformed_bounding_box() const +{ + BoundingBoxf3 bb; + + for (const ModelObject* obj : this->objects) + { + for (const ModelVolume* vol : obj->volumes) + { + if (!vol->modifier) + { + for (const ModelInstance* inst : obj->instances) + { + double c = cos(inst->rotation); + double s = sin(inst->rotation); + + for (int f = 0; f < vol->mesh.stl.stats.number_of_facets; ++f) + { + const stl_facet& facet = vol->mesh.stl.facet_start[f]; + + for (int i = 0; i < 3; ++i) + { + // original point + const stl_vertex& v = facet.vertex[i]; + Pointf3 p((double)v.x, (double)v.y, (double)v.z); + + // scale + p.x *= inst->scaling_factor; + p.y *= inst->scaling_factor; + p.z *= inst->scaling_factor; + + // rotate Z + double x = p.x; + double y = p.y; + p.x = c * x - s * y; + p.y = s * x + c * y; + + // translate + p.x += inst->offset.x; + p.y += inst->offset.y; + + bb.merge(p); + } + } + } + } + } + } + + return bb; +} + void Model::center_instances_around_point(const Pointf &point) { // BoundingBoxf3 bb = this->bounding_box(); @@ -409,6 +460,23 @@ void Model::convert_multipart_object() this->objects.push_back(object); } +bool Model::fits_print_volume(const DynamicPrintConfig* config) const +{ + if (config == nullptr) + return false; + + if (objects.empty()) + return true; + + const ConfigOptionPoints* opt = dynamic_cast(config->option("bed_shape")); + if (opt == nullptr) + return false; + + BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values)); + BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config->opt_float("max_print_height"))); + return print_volume.contains(transformed_bounding_box()); +} + ModelObject::ModelObject(Model *model, const ModelObject &other, bool copy_volumes) : name(other.name), input_file(other.input_file), @@ -671,7 +739,7 @@ void ModelObject::transform(const float* matrix3x4) v->mesh.transform(matrix3x4); } - origin_translation = Pointf3(0.0f, 0.0f, 0.0f); + origin_translation = Pointf3(0.0, 0.0, 0.0); invalidate_bounding_box(); } diff --git a/xs/src/libslic3r/Model.hpp b/xs/src/libslic3r/Model.hpp index cf9bfd85a..7ef1803ac 100644 --- a/xs/src/libslic3r/Model.hpp +++ b/xs/src/libslic3r/Model.hpp @@ -260,7 +260,10 @@ public: void delete_material(t_model_material_id material_id); void clear_materials(); bool add_default_instances(); - BoundingBoxf3 bounding_box(); + // Returns approximate axis aligned bounding box of this model + BoundingBoxf3 bounding_box() const; + // Returns tight axis aligned bounding box of this model + BoundingBoxf3 transformed_bounding_box() const; void center_instances_around_point(const Pointf &point); void translate(coordf_t x, coordf_t y, coordf_t z) { for (ModelObject *o : this->objects) o->translate(x, y, z); } TriangleMesh mesh() const; @@ -273,6 +276,9 @@ public: bool looks_like_multipart_object() const; void convert_multipart_object(); + // Returs true if this model is contained into the print volume defined inside the given config + bool fits_print_volume(const DynamicPrintConfig* config) const; + void print_info() const { for (const ModelObject *o : this->objects) o->print_info(); } }; diff --git a/xs/src/libslic3r/Print.cpp b/xs/src/libslic3r/Print.cpp index c689929c6..1ff764e4a 100644 --- a/xs/src/libslic3r/Print.cpp +++ b/xs/src/libslic3r/Print.cpp @@ -120,6 +120,7 @@ bool Print::invalidate_state_by_config_options(const std::vectormin = 0; def->default_value = new ConfigOptionFloats { 0. }; + def = this->add("max_print_height", coFloat); + def->label = L("Max print height"); + def->tooltip = L("Set this to the maximum height that can be reached by your extruder while printing."); + def->sidetext = L("mm"); + def->cli = "max-print-height=f"; + def->default_value = new ConfigOptionFloat(200.0); + def = this->add("max_print_speed", coFloat); def->label = L("Max print speed"); def->tooltip = L("When setting other speed settings to 0 Slic3r will autocalculate the optimal speed " diff --git a/xs/src/libslic3r/PrintConfig.hpp b/xs/src/libslic3r/PrintConfig.hpp index c589d917a..e87ea11bf 100644 --- a/xs/src/libslic3r/PrintConfig.hpp +++ b/xs/src/libslic3r/PrintConfig.hpp @@ -583,6 +583,7 @@ public: ConfigOptionFloats max_layer_height; ConfigOptionInts min_fan_speed; ConfigOptionFloats min_layer_height; + ConfigOptionFloat max_print_height; ConfigOptionFloats min_print_speed; ConfigOptionFloat min_skirt_length; ConfigOptionString notes; @@ -647,6 +648,7 @@ protected: OPT_PTR(max_layer_height); OPT_PTR(min_fan_speed); OPT_PTR(min_layer_height); + OPT_PTR(max_print_height); OPT_PTR(min_print_speed); OPT_PTR(min_skirt_length); OPT_PTR(notes); diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 04e7f7dc6..e49314013 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -46,6 +46,25 @@ void GLIndexedVertexArray::load_mesh_flat_shading(const TriangleMesh &mesh) } } +void GLIndexedVertexArray::load_mesh_full_shading(const TriangleMesh &mesh) +{ + assert(triangle_indices.empty() && vertices_and_normals_interleaved_size == 0); + assert(quad_indices.empty() && triangle_indices_size == 0); + assert(vertices_and_normals_interleaved.size() % 6 == 0 && quad_indices_size == vertices_and_normals_interleaved.size()); + + this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * mesh.facets_count()); + + unsigned int vertices_count = 0; + for (int i = 0; i < mesh.stl.stats.number_of_facets; ++i) { + const stl_facet &facet = mesh.stl.facet_start[i]; + for (int j = 0; j < 3; ++j) + this->push_geometry(facet.vertex[j].x, facet.vertex[j].y, facet.vertex[j].z, facet.normal.x, facet.normal.y, facet.normal.z); + + this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2); + vertices_count += 3; + } +} + void GLIndexedVertexArray::finalize_geometry(bool use_VBOs) { assert(this->vertices_and_normals_interleaved_VBO_id == 0); @@ -173,6 +192,45 @@ void GLIndexedVertexArray::render( glDisableClientState(GL_NORMAL_ARRAY); } +const float GLVolume::SELECTED_COLOR[4] = { 0.0f, 1.0f, 0.0f, 1.0f }; +const float GLVolume::HOVER_COLOR[4] = { 0.4f, 0.9f, 0.1f, 1.0f }; +const float GLVolume::OUTSIDE_COLOR[4] = { 0.75f, 0.0f, 0.75f, 1.0f }; +const float GLVolume::SELECTED_OUTSIDE_COLOR[4] = { 1.0f, 0.0f, 1.0f, 1.0f }; + +void GLVolume::set_render_color(float r, float g, float b, float a) +{ + render_color[0] = r; + render_color[1] = g; + render_color[2] = b; + render_color[3] = a; +} + +void GLVolume::set_render_color(const float* rgba, unsigned int size) +{ + size = std::min((unsigned int)4, size); + for (int i = 0; i < size; ++i) + { + render_color[i] = rgba[i]; + } +} + +void GLVolume::set_render_color() +{ + if (selected) + { + if (is_outside) + set_render_color(SELECTED_OUTSIDE_COLOR, 4); + else + set_render_color(SELECTED_COLOR, 4); + } + else if (hover) + set_render_color(HOVER_COLOR, 4); + else if (is_outside) + set_render_color(OUTSIDE_COLOR, 4); + else + set_render_color(color, 4); +} + void GLVolume::set_range(double min_z, double max_z) { this->qverts_range.first = 0; @@ -288,7 +346,11 @@ std::vector GLVolumeCollection::load_object( color[3] = model_volume->modifier ? 0.5f : 1.f; this->volumes.emplace_back(new GLVolume(color)); GLVolume &v = *this->volumes.back(); - v.indexed_vertex_array.load_mesh_flat_shading(mesh); + if (use_VBOs) + v.indexed_vertex_array.load_mesh_full_shading(mesh); + else + v.indexed_vertex_array.load_mesh_flat_shading(mesh); + // finalize_geometry() clears the vertex arrays, therefore the bounding box has to be computed before finalize_geometry(). v.bounding_box = v.indexed_vertex_array.bounding_box(); v.indexed_vertex_array.finalize_geometry(use_VBOs); @@ -319,7 +381,11 @@ int GLVolumeCollection::load_wipe_tower_preview( this->volumes.emplace_back(new GLVolume(color)); GLVolume &v = *this->volumes.back(); auto mesh = make_cube(width, depth, height); - v.indexed_vertex_array.load_mesh_flat_shading(mesh); + if (use_VBOs) + v.indexed_vertex_array.load_mesh_full_shading(mesh); + else + v.indexed_vertex_array.load_mesh_flat_shading(mesh); + v.origin = Pointf3(pos_x, pos_y, 0.); // finalize_geometry() clears the vertex arrays, therefore the bounding box has to be computed before finalize_geometry(). v.bounding_box = v.indexed_vertex_array.bounding_box(); @@ -332,8 +398,9 @@ int GLVolumeCollection::load_wipe_tower_preview( void GLVolumeCollection::render_VBOs() const { -// glEnable(GL_BLEND); -// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glCullFace(GL_BACK); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); @@ -341,6 +408,9 @@ void GLVolumeCollection::render_VBOs() const GLint current_program_id; glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_id); GLint color_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "uniform_color") : -1; + GLint print_box_min_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "print_box.min") : -1; + GLint print_box_max_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "print_box.max") : -1; + GLint print_box_origin_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "print_box.volume_origin") : -1; for (GLVolume *volume : this->volumes) { if (!volume->is_active) @@ -348,42 +418,72 @@ void GLVolumeCollection::render_VBOs() const if (!volume->indexed_vertex_array.vertices_and_normals_interleaved_VBO_id) continue; + + volume->set_render_color(); + GLsizei n_triangles = GLsizei(std::min(volume->indexed_vertex_array.triangle_indices_size, volume->tverts_range.second - volume->tverts_range.first)); GLsizei n_quads = GLsizei(std::min(volume->indexed_vertex_array.quad_indices_size, volume->qverts_range.second - volume->qverts_range.first)); if (n_triangles + n_quads == 0) { - if (_render_interleaved_only_volumes.enabled) + ::glDisableClientState(GL_VERTEX_ARRAY); + ::glDisableClientState(GL_NORMAL_ARRAY); + + if (color_id >= 0) { - ::glDisableClientState(GL_VERTEX_ARRAY); - ::glDisableClientState(GL_NORMAL_ARRAY); - ::glEnable(GL_BLEND); - ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - if (color_id >= 0) - { - float color[4]; - ::memcpy((void*)color, (const void*)volume->color, 3 * sizeof(float)); - color[3] = _render_interleaved_only_volumes.alpha; - ::glUniform4fv(color_id, 1, (const GLfloat*)color); - } - else - ::glColor4f(volume->color[0], volume->color[1], volume->color[2], _render_interleaved_only_volumes.alpha); - - volume->render(); - - ::glDisable(GL_BLEND); - ::glEnableClientState(GL_VERTEX_ARRAY); - ::glEnableClientState(GL_NORMAL_ARRAY); + float color[4]; + ::memcpy((void*)color, (const void*)volume->render_color, 4 * sizeof(float)); + ::glUniform4fv(color_id, 1, (const GLfloat*)color); } + else + ::glColor4f(volume->render_color[0], volume->render_color[1], volume->render_color[2], volume->render_color[3]); + + if (print_box_min_id != -1) + ::glUniform3fv(print_box_min_id, 1, (const GLfloat*)print_box_min); + + if (print_box_max_id != -1) + ::glUniform3fv(print_box_max_id, 1, (const GLfloat*)print_box_max); + + if (print_box_origin_id != -1) + { + float origin[4] = { volume->origin.x, volume->origin.y, volume->origin.z, volume->outside_printer_detection_enabled ? 1.0f : 0.0f }; + ::glUniform4fv(print_box_origin_id, 1, (const GLfloat*)origin); + } + + volume->render(); + + ::glEnableClientState(GL_VERTEX_ARRAY); + ::glEnableClientState(GL_NORMAL_ARRAY); + continue; } + if (color_id >= 0) - glUniform4fv(color_id, 1, (const GLfloat*)volume->color); + glUniform4fv(color_id, 1, (const GLfloat*)volume->render_color); else - glColor4f(volume->color[0], volume->color[1], volume->color[2], volume->color[3]); + glColor4f(volume->render_color[0], volume->render_color[1], volume->render_color[2], volume->render_color[3]); + + if (print_box_min_id != -1) + ::glUniform3fv(print_box_min_id, 1, (const GLfloat*)print_box_min); + + if (print_box_max_id != -1) + ::glUniform3fv(print_box_max_id, 1, (const GLfloat*)print_box_max); + + if (print_box_origin_id != -1) + { + float origin[4] = { volume->origin.x, volume->origin.y, volume->origin.z, volume->outside_printer_detection_enabled ? 1.0f : 0.0f }; + ::glUniform4fv(print_box_origin_id, 1, (const GLfloat*)origin); + } + glBindBuffer(GL_ARRAY_BUFFER, volume->indexed_vertex_array.vertices_and_normals_interleaved_VBO_id); glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (const void*)(3 * sizeof(float))); glNormalPointer(GL_FLOAT, 6 * sizeof(float), nullptr); + + bool has_offset = (volume->origin.x != 0) || (volume->origin.y != 0) || (volume->origin.z != 0); + if (has_offset) { + glPushMatrix(); + glTranslated(volume->origin.x, volume->origin.y, volume->origin.z); + } + if (n_triangles > 0) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, volume->indexed_vertex_array.triangle_indices_VBO_id); glDrawElements(GL_TRIANGLES, n_triangles, GL_UNSIGNED_INT, (const void*)(volume->tverts_range.first * 4)); @@ -392,17 +492,25 @@ void GLVolumeCollection::render_VBOs() const glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, volume->indexed_vertex_array.quad_indices_VBO_id); glDrawElements(GL_QUADS, n_quads, GL_UNSIGNED_INT, (const void*)(volume->qverts_range.first * 4)); } + + if (has_offset) + glPopMatrix(); } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); -// glDisable(GL_BLEND); + + glDisable(GL_BLEND); } void GLVolumeCollection::render_legacy() const { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glCullFace(GL_BACK); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); @@ -412,27 +520,25 @@ void GLVolumeCollection::render_legacy() const if (!volume->is_active) continue; + volume->set_render_color(); + GLsizei n_triangles = GLsizei(std::min(volume->indexed_vertex_array.triangle_indices_size, volume->tverts_range.second - volume->tverts_range.first)); GLsizei n_quads = GLsizei(std::min(volume->indexed_vertex_array.quad_indices_size, volume->qverts_range.second - volume->qverts_range.first)); if (n_triangles + n_quads == 0) { - if (_render_interleaved_only_volumes.enabled) - { - ::glDisableClientState(GL_VERTEX_ARRAY); - ::glDisableClientState(GL_NORMAL_ARRAY); - ::glEnable(GL_BLEND); - ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + ::glDisableClientState(GL_VERTEX_ARRAY); + ::glDisableClientState(GL_NORMAL_ARRAY); - ::glColor4f(volume->color[0], volume->color[1], volume->color[2], _render_interleaved_only_volumes.alpha); - volume->render(); + ::glColor4f(volume->render_color[0], volume->render_color[1], volume->render_color[2], volume->render_color[3]); + volume->render(); + + ::glEnableClientState(GL_VERTEX_ARRAY); + ::glEnableClientState(GL_NORMAL_ARRAY); - ::glDisable(GL_BLEND); - ::glEnableClientState(GL_VERTEX_ARRAY); - ::glEnableClientState(GL_NORMAL_ARRAY); - } continue; } - glColor4f(volume->color[0], volume->color[1], volume->color[2], volume->color[3]); + + glColor4f(volume->render_color[0], volume->render_color[1], volume->render_color[2], volume->render_color[3]); glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), volume->indexed_vertex_array.vertices_and_normals_interleaved.data() + 3); glNormalPointer(GL_FLOAT, 6 * sizeof(float), volume->indexed_vertex_array.vertices_and_normals_interleaved.data()); bool has_offset = volume->origin.x != 0 || volume->origin.y != 0 || volume->origin.z != 0; @@ -445,11 +551,37 @@ void GLVolumeCollection::render_legacy() const if (n_quads > 0) glDrawElements(GL_QUADS, n_quads, GL_UNSIGNED_INT, volume->indexed_vertex_array.quad_indices.data() + volume->qverts_range.first); if (has_offset) - glPushMatrix(); + glPopMatrix(); } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); + + glDisable(GL_BLEND); +} + +void GLVolumeCollection::update_outside_state(const DynamicPrintConfig* config, bool all_inside) +{ + if (config == nullptr) + return; + + const ConfigOptionPoints* opt = dynamic_cast(config->option("bed_shape")); + if (opt == nullptr) + return; + + BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values)); + BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config->opt_float("max_print_height"))); + + for (GLVolume* volume : this->volumes) + { + if (all_inside) + { + volume->is_outside = false; + continue; + } + + volume->is_outside = !print_volume.contains(volume->transformed_bounding_box()); + } } std::vector GLVolumeCollection::get_current_print_zs() const @@ -1133,6 +1265,100 @@ static void point3_to_verts(const Point3& point, double width, double height, GL _3DScene::GCodePreviewVolumeIndex _3DScene::s_gcode_preview_volume_index; _3DScene::LegendTexture _3DScene::s_legend_texture; +_3DScene::WarningTexture _3DScene::s_warning_texture; + +unsigned int _3DScene::TextureBase::finalize() +{ + if (!m_data.empty()) { + // sends buffer to gpu + ::glGenTextures(1, &m_tex_id); + ::glBindTexture(GL_TEXTURE_2D, m_tex_id); + ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)m_tex_width, (GLsizei)m_tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const GLvoid*)m_data.data()); + ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); + ::glBindTexture(GL_TEXTURE_2D, 0); + m_data.clear(); + } + return (m_tex_width > 0 && m_tex_height > 0) ? m_tex_id : 0; +} + +void _3DScene::TextureBase::_destroy_texture() +{ + if (m_tex_id > 0) + { + ::glDeleteTextures(1, &m_tex_id); + m_tex_id = 0; + m_tex_height = 0; + m_tex_width = 0; + } + m_data.clear(); +} + + +const unsigned char _3DScene::WarningTexture::Background_Color[3] = { 9, 91, 134 }; +const unsigned char _3DScene::WarningTexture::Opacity = 255; + +// Generate a texture data, but don't load it into the GPU yet, as the GPU context may not yet be valid. +bool _3DScene::WarningTexture::generate(const std::string& msg) +{ + // Mark the texture as released, but don't release the texture from the GPU yet. + m_tex_width = m_tex_height = 0; + m_data.clear(); + + if (msg.empty()) + return false; + + wxMemoryDC memDC; + // select default font + memDC.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + + // calculates texture size + wxCoord w, h; + memDC.GetTextExtent(msg, &w, &h); + m_tex_width = (unsigned int)w; + m_tex_height = (unsigned int)h; + + // generates bitmap + wxBitmap bitmap(m_tex_width, m_tex_height); + +#if defined(__APPLE__) || defined(_MSC_VER) + bitmap.UseAlpha(); +#endif + + memDC.SelectObject(bitmap); + memDC.SetBackground(wxBrush(wxColour(Background_Color[0], Background_Color[1], Background_Color[2]))); + memDC.Clear(); + + memDC.SetTextForeground(*wxWHITE); + + // draw message + memDC.DrawText(msg, 0, 0); + + memDC.SelectObject(wxNullBitmap); + + // Convert the bitmap into a linear data ready to be loaded into the GPU. + { + wxImage image = bitmap.ConvertToImage(); + image.SetMaskColour(Background_Color[0], Background_Color[1], Background_Color[2]); + + // prepare buffer + m_data.assign(4 * m_tex_width * m_tex_height, 0); + for (unsigned int h = 0; h < m_tex_height; ++h) + { + unsigned int hh = h * m_tex_width; + unsigned char* px_ptr = m_data.data() + 4 * hh; + for (unsigned int w = 0; w < m_tex_width; ++w) + { + *px_ptr++ = image.GetRed(w, h); + *px_ptr++ = image.GetGreen(w, h); + *px_ptr++ = image.GetBlue(w, h); + *px_ptr++ = image.IsTransparent(w, h) ? 0 : Opacity; + } + } + } + return true; +} const unsigned char _3DScene::LegendTexture::Squares_Border_Color[3] = { 64, 64, 64 }; const unsigned char _3DScene::LegendTexture::Background_Color[3] = { 9, 91, 134 }; @@ -1276,34 +1502,6 @@ bool _3DScene::LegendTexture::generate(const GCodePreviewData& preview_data, con return true; } -unsigned int _3DScene::LegendTexture::finalize() -{ - if (! m_data.empty()) { - // sends buffer to gpu - ::glGenTextures(1, &m_tex_id); - ::glBindTexture(GL_TEXTURE_2D, m_tex_id); - ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)m_tex_width, (GLsizei)m_tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const GLvoid*)m_data.data()); - ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); - ::glBindTexture(GL_TEXTURE_2D, 0); - m_data.clear(); - } - return (m_tex_width > 0 && m_tex_height > 0) ? m_tex_id : 0; -} - -void _3DScene::LegendTexture::_destroy_texture() -{ - if (m_tex_id > 0) - { - ::glDeleteTextures(1, &m_tex_id); - m_tex_id = 0; - m_tex_height = 0; - m_tex_width = 0; - } - m_data.clear(); -} - void _3DScene::_glew_init() { glewInit(); @@ -1353,27 +1551,17 @@ void _3DScene::load_gcode_preview(const Print* print, const GCodePreviewData* pr _load_gcode_unretractions(*preview_data, *volumes, use_VBOs); if (volumes->empty()) - { reset_legend_texture(); - volumes->set_render_interleaved_only_volumes(GLVolumeCollection::RenderInterleavedOnlyVolumes(false, 0.0f)); - } else { _generate_legend_texture(*preview_data, tool_colors); - _load_shells(*print, *volumes, use_VBOs); - volumes->set_render_interleaved_only_volumes(GLVolumeCollection::RenderInterleavedOnlyVolumes(true, 0.25f)); } } _update_gcode_volumes_visibility(*preview_data, *volumes); } -unsigned int _3DScene::get_legend_texture_id() -{ - return s_legend_texture.get_texture_id(); -} - unsigned int _3DScene::get_legend_texture_width() { return s_legend_texture.get_texture_width(); @@ -1389,6 +1577,36 @@ void _3DScene::reset_legend_texture() s_legend_texture.reset_texture(); } +unsigned int _3DScene::finalize_legend_texture() +{ + return s_legend_texture.finalize(); +} + +unsigned int _3DScene::get_warning_texture_width() +{ + return s_warning_texture.get_texture_width(); +} + +unsigned int _3DScene::get_warning_texture_height() +{ + return s_warning_texture.get_texture_height(); +} + +void _3DScene::generate_warning_texture(const std::string& msg) +{ + s_warning_texture.generate(msg); +} + +void _3DScene::reset_warning_texture() +{ + s_warning_texture.reset_texture(); +} + +unsigned int _3DScene::finalize_warning_texture() +{ + return s_warning_texture.finalize(); +} + // Create 3D thick extrusion lines for a skirt and brim. // Adds a new Slic3r::GUI::3DScene::Volume to volumes. void _3DScene::_load_print_toolpaths( @@ -1501,6 +1719,7 @@ void _3DScene::_load_print_object_toolpaths( auto new_volume = [volumes, &new_volume_mutex](const float *color) -> GLVolume* { auto *volume = new GLVolume(color); new_volume_mutex.lock(); + volume->outside_printer_detection_enabled = false; volumes->volumes.emplace_back(volume); new_volume_mutex.unlock(); return volume; @@ -1651,6 +1870,7 @@ void _3DScene::_load_wipe_tower_toolpaths( auto new_volume = [volumes, &new_volume_mutex](const float *color) -> GLVolume* { auto *volume = new GLVolume(color); new_volume_mutex.lock(); + volume->outside_printer_detection_enabled = false; volumes->volumes.emplace_back(volume); new_volume_mutex.unlock(); return volume; @@ -2221,6 +2441,7 @@ void _3DScene::_update_gcode_volumes_visibility(const GCodePreviewData& preview_ for (std::vector::iterator it = begin; it != end; ++it) { GLVolume* volume = *it; + volume->outside_printer_detection_enabled = false; switch (s_gcode_preview_volume_index.first_volumes[i].type) { @@ -2253,6 +2474,7 @@ void _3DScene::_update_gcode_volumes_visibility(const GCodePreviewData& preview_ case GCodePreviewVolumeIndex::Shell: { volume->is_active = preview_data.shell.is_visible; + volume->color[3] = 0.25f; volume->zoom_to_volumes = false; break; } @@ -2272,11 +2494,6 @@ void _3DScene::_generate_legend_texture(const GCodePreviewData& preview_data, co s_legend_texture.generate(preview_data, tool_colors); } -unsigned int _3DScene::finalize_legend_texture() -{ - return s_legend_texture.finalize(); -} - void _3DScene::_load_shells(const Print& print, GLVolumeCollection& volumes, bool use_VBOs) { size_t initial_volumes_count = volumes.volumes.size(); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index 3e26bf6d3..e1e711bfe 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -16,6 +16,7 @@ class PrintObject; class Model; class ModelObject; class GCodePreviewData; +class DynamicPrintConfig; // A container for interleaved arrays of 3D vertices and normals, // possibly indexed by triangles and / or quads. @@ -85,6 +86,7 @@ public: unsigned int quad_indices_VBO_id; void load_mesh_flat_shading(const TriangleMesh &mesh); + void load_mesh_full_shading(const TriangleMesh &mesh); inline bool has_VBOs() const { return vertices_and_normals_interleaved_VBO_id != 0; } @@ -209,6 +211,11 @@ public: class GLVolume { public: + static const float SELECTED_COLOR[4]; + static const float HOVER_COLOR[4]; + static const float OUTSIDE_COLOR[4]; + static const float SELECTED_OUTSIDE_COLOR[4]; + GLVolume(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f) : composite_id(-1), select_group_id(-1), @@ -216,6 +223,8 @@ public: selected(false), is_active(true), zoom_to_volumes(true), + outside_printer_detection_enabled(true), + is_outside(false), hover(false), tverts_range(0, size_t(-1)), qverts_range(0, size_t(-1)) @@ -224,6 +233,7 @@ public: color[1] = g; color[2] = b; color[3] = a; + set_render_color(r, g, b, a); } GLVolume(const float *rgba) : GLVolume(rgba[0], rgba[1], rgba[2], rgba[3]) {} @@ -243,7 +253,8 @@ public: Pointf3 origin; // Color of the triangles / quads held by this volume. float color[4]; - + // Color used to render this volume. + float render_color[4]; // An ID containing the object ID, volume ID and instance ID. int composite_id; // An ID for group selection. It may be the same for all meshes of all object instances, or for just a single object instance. @@ -256,6 +267,10 @@ public: bool is_active; // Whether or not to use this volume when applying zoom_to_volumes() bool zoom_to_volumes; + // Wheter or not this volume is enabled for outside print volume detection. + bool outside_printer_detection_enabled; + // Wheter or not this volume is outside print volume. + bool is_outside; // Boolean: Is mouse over this object? bool hover; @@ -271,6 +286,10 @@ public: // Offset into qverts & tverts, or offsets into indices stored into an OpenGL name_index_buffer. std::vector offsets; + void set_render_color(float r, float g, float b, float a); + void set_render_color(const float* rgba, unsigned int size); + // Sets render color in dependence of current state + void set_render_color(); int object_idx() const { return this->composite_id / 1000000; } int volume_idx() const { return (this->composite_id / 1000) % 1000; } @@ -313,27 +332,9 @@ public: class GLVolumeCollection { -public: - struct RenderInterleavedOnlyVolumes - { - bool enabled; - float alpha; // [0..1] - - RenderInterleavedOnlyVolumes() - : enabled(false) - , alpha(0.0f) - { - } - - RenderInterleavedOnlyVolumes(bool enabled, float alpha) - : enabled(enabled) - , alpha(alpha) - { - } - }; - -private: - RenderInterleavedOnlyVolumes _render_interleaved_only_volumes; + // min and max vertex of the print box volume + float print_box_min[3]; + float print_box_max[3]; public: std::vector volumes; @@ -370,7 +371,12 @@ public: bool empty() const { return volumes.empty(); } void set_range(double low, double high) { for (GLVolume *vol : this->volumes) vol->set_range(low, high); } - void set_render_interleaved_only_volumes(const RenderInterleavedOnlyVolumes& render_interleaved_only_volumes) { _render_interleaved_only_volumes = render_interleaved_only_volumes; } + void set_print_box(float min_x, float min_y, float min_z, float max_x, float max_y, float max_z) { + print_box_min[0] = min_x; print_box_min[1] = min_y; print_box_min[2] = min_z; + print_box_max[0] = max_x; print_box_max[1] = max_y; print_box_max[2] = max_z; + } + + void update_outside_state(const DynamicPrintConfig* config, bool all_inside); // Returns a vector containing the sorted list of all the print_zs of the volumes contained in this collection std::vector get_current_print_zs() const; @@ -411,27 +417,20 @@ class _3DScene static GCodePreviewVolumeIndex s_gcode_preview_volume_index; - class LegendTexture + class TextureBase { - static const unsigned int Px_Title_Offset = 5; - static const unsigned int Px_Text_Offset = 5; - static const unsigned int Px_Square = 20; - static const unsigned int Px_Square_Contour = 1; - static const unsigned int Px_Border = Px_Square / 2; - static const unsigned char Squares_Border_Color[3]; - static const unsigned char Background_Color[3]; - static const unsigned char Opacity; - + protected: unsigned int m_tex_id; unsigned int m_tex_width; unsigned int m_tex_height; + // generate() fills in m_data with the pixels, while finalize() moves the data to the GPU before rendering. + std::vector m_data; + public: - LegendTexture() : m_tex_id(0), m_tex_width(0), m_tex_height(0) {} - ~LegendTexture() { _destroy_texture(); } - - // Generate a texture data, but don't load it into the GPU yet, as the glcontext may not be valid yet. - bool generate(const GCodePreviewData& preview_data, const std::vector& tool_colors); + TextureBase() : m_tex_id(0), m_tex_width(0), m_tex_height(0) {} + virtual ~TextureBase() { _destroy_texture(); } + // If not loaded, load the texture data into the GPU. Return a texture ID or 0 if the texture has zero size. unsigned int finalize(); @@ -442,26 +441,61 @@ class _3DScene void reset_texture() { _destroy_texture(); } private: - bool _create_texture(const GCodePreviewData& preview_data, const wxBitmap& bitmap); void _destroy_texture(); - // generate() fills in m_data with the pixels, while finalize() moves the data to the GPU before rendering. - std::vector m_data; + }; + + class WarningTexture : public TextureBase + { + static const unsigned char Background_Color[3]; + static const unsigned char Opacity; + + public: + WarningTexture() : TextureBase() {} + + // Generate a texture data, but don't load it into the GPU yet, as the glcontext may not be valid yet. + bool generate(const std::string& msg); + }; + + class LegendTexture : public TextureBase + { + static const unsigned int Px_Title_Offset = 5; + static const unsigned int Px_Text_Offset = 5; + static const unsigned int Px_Square = 20; + static const unsigned int Px_Square_Contour = 1; + static const unsigned int Px_Border = Px_Square / 2; + static const unsigned char Squares_Border_Color[3]; + static const unsigned char Background_Color[3]; + static const unsigned char Opacity; + + public: + LegendTexture() : TextureBase() {} + + // Generate a texture data, but don't load it into the GPU yet, as the glcontext may not be valid yet. + bool generate(const GCodePreviewData& preview_data, const std::vector& tool_colors); }; static LegendTexture s_legend_texture; + static WarningTexture s_warning_texture; public: static void _glew_init(); static void load_gcode_preview(const Print* print, const GCodePreviewData* preview_data, GLVolumeCollection* volumes, const std::vector& str_tool_colors, bool use_VBOs); - static unsigned int get_legend_texture_id(); static unsigned int get_legend_texture_width(); static unsigned int get_legend_texture_height(); static void reset_legend_texture(); static unsigned int finalize_legend_texture(); + static unsigned int get_warning_texture_width(); + static unsigned int get_warning_texture_height(); + + // generates a warning texture containing the given message + static void generate_warning_texture(const std::string& msg); + static void reset_warning_texture(); + static unsigned int finalize_warning_texture(); + static void _load_print_toolpaths( const Print *print, GLVolumeCollection *volumes, diff --git a/xs/src/slic3r/GUI/Preset.cpp b/xs/src/slic3r/GUI/Preset.cpp index 52717e1fc..aa1917bd5 100644 --- a/xs/src/slic3r/GUI/Preset.cpp +++ b/xs/src/slic3r/GUI/Preset.cpp @@ -226,7 +226,7 @@ const std::vector& Preset::printer_options() "bed_shape", "z_offset", "gcode_flavor", "use_relative_e_distances", "serial_port", "serial_speed", "octoprint_host", "octoprint_apikey", "octoprint_cafile", "use_firmware_retraction", "use_volumetric_e", "variable_layer_height", "single_extruder_multi_material", "start_gcode", "end_gcode", "before_layer_gcode", "layer_gcode", "toolchange_gcode", - "between_objects_gcode", "printer_notes" + "between_objects_gcode", "printer_notes", "max_print_height" }; s_opts.insert(s_opts.end(), Preset::nozzle_options().begin(), Preset::nozzle_options().end()); } diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 7ce6790a1..82a14ce87 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -968,7 +968,8 @@ void TabPrinter::build() return sizer; }; optgroup->append_line(line); - optgroup->append_single_option_line("z_offset"); + optgroup->append_single_option_line("max_print_height"); + optgroup->append_single_option_line("z_offset"); optgroup = page->new_optgroup(_(L("Capabilities"))); ConfigOptionDef def; diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index 4670c5c7e..6324f933e 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -97,6 +97,9 @@ void finalize_geometry(bool use_VBOs); void release_geometry(); + void set_print_box(float min_x, float min_y, float min_z, float max_x, float max_y, float max_z); + void update_outside_state(DynamicPrintConfig* config, bool all_inside); + bool move_volume_up(int idx) %code%{ if (idx > 0 && idx < int(THIS->volumes.size())) { @@ -154,13 +157,6 @@ finalize_legend_texture() OUTPUT: RETVAL -unsigned int -get_legend_texture_id() - CODE: - RETVAL = _3DScene::get_legend_texture_id(); - OUTPUT: - RETVAL - unsigned int get_legend_texture_width() CODE: @@ -179,7 +175,38 @@ void reset_legend_texture() CODE: _3DScene::reset_legend_texture(); - + +void +generate_warning_texture(std::string msg) + CODE: + _3DScene::generate_warning_texture(msg); + +unsigned int +finalize_warning_texture() + CODE: + RETVAL = _3DScene::finalize_warning_texture(); + OUTPUT: + RETVAL + +unsigned int +get_warning_texture_width() + CODE: + RETVAL = _3DScene::get_warning_texture_width(); + OUTPUT: + RETVAL + +unsigned int +get_warning_texture_height() + CODE: + RETVAL = _3DScene::get_warning_texture_height(); + OUTPUT: + RETVAL + +void +reset_warning_texture() + CODE: + _3DScene::reset_warning_texture(); + void _load_print_toolpaths(print, volumes, tool_colors, use_VBOs) Print *print; diff --git a/xs/xsp/Model.xsp b/xs/xsp/Model.xsp index c0271ae75..78c94661e 100644 --- a/xs/xsp/Model.xsp +++ b/xs/xsp/Model.xsp @@ -99,6 +99,9 @@ void print_info() const; + bool fits_print_volume(DynamicPrintConfig* config) const + %code%{ RETVAL = THIS->fits_print_volume(config); %}; + bool store_stl(char *path, bool binary) %code%{ TriangleMesh mesh = THIS->mesh(); RETVAL = Slic3r::store_stl(path, &mesh, binary); %}; bool store_amf(char *path, Print* print) @@ -361,9 +364,9 @@ ModelMaterial::attributes() %code%{ RETVAL = &THIS->offset; %}; void set_rotation(double val) - %code%{ THIS->rotation = val; %}; + %code%{ THIS->rotation = val; THIS->get_object()->invalidate_bounding_box(); %}; void set_scaling_factor(double val) - %code%{ THIS->scaling_factor = val; %}; + %code%{ THIS->scaling_factor = val; THIS->get_object()->invalidate_bounding_box(); %}; void set_offset(Pointf *offset) %code%{ THIS->offset = *offset; %}; From 7a2df9f54ff6408f630406e3bc97b7fe6bcac755 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 9 Mar 2018 14:33:44 +0100 Subject: [PATCH 17/47] Out of bed detection - Volumes' layer texture rendering moved to cpp --- lib/Slic3r/GUI/3DScene.pm | 50 ++++++----------- xs/src/slic3r/GUI/3DScene.cpp | 102 ++++++++++++++++++++++++++-------- xs/src/slic3r/GUI/3DScene.hpp | 44 ++++++++++++++- xs/xsp/GUI_3DScene.xsp | 6 ++ 4 files changed, 145 insertions(+), 57 deletions(-) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index f8e31eeb7..fe19007e0 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -1309,6 +1309,7 @@ sub Render { $self->draw_volumes; } elsif ($self->UseVBOs) { if ($self->enable_picking) { + $self->mark_volumes_for_layer_height; $self->volumes->set_print_box($self->bed_bounding_box->x_min, $self->bed_bounding_box->y_min, 0.0, $self->bed_bounding_box->x_max, $self->bed_bounding_box->y_max, $self->{config}->get('max_print_height')); } $self->{plain_shader}->enable if $self->{plain_shader}; @@ -1358,36 +1359,10 @@ sub draw_volumes { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); - my $z_cursor_relative = $self->_variable_layer_thickness_bar_mouse_cursor_z_relative; foreach my $volume_idx (0..$#{$self->volumes}) { my $volume = $self->volumes->[$volume_idx]; - my $shader_active = 0; - my $object_id = int($volume->select_group_id / 1000000); - if ($self->layer_editing_enabled && ! $fakecolor && $volume->selected && $self->{layer_height_edit_shader} && - $volume->has_layer_height_texture && $object_id < $self->{print}->object_count) { - # Update the height texture if the ModelObject::layer_height_texture is invalid. - $volume->generate_layer_height_texture($self->{print}->get_object($object_id), 0); - $self->{layer_height_edit_shader}->enable; - $self->{layer_height_edit_shader}->set_uniform('z_to_texture_row', $volume->layer_height_texture_z_to_row_id); - $self->{layer_height_edit_shader}->set_uniform('z_texture_row_to_normalized', 1. / $volume->layer_height_texture_height); - $self->{layer_height_edit_shader}->set_uniform('z_cursor', $volume->bounding_box->z_max * $z_cursor_relative); - $self->{layer_height_edit_shader}->set_uniform('z_cursor_band_width', $self->{layer_height_edit_band_width}); - glBindTexture(GL_TEXTURE_2D, $self->{layer_preview_z_texture_id}); -# glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LEVEL, 0); -# glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); - glTexImage2D_c(GL_TEXTURE_2D, 0, GL_RGBA8, $volume->layer_height_texture_width, $volume->layer_height_texture_height, - 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glTexImage2D_c(GL_TEXTURE_2D, 1, GL_RGBA8, $volume->layer_height_texture_width / 2, $volume->layer_height_texture_height / 2, - 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); -# glPixelStorei(GL_UNPACK_ALIGNMENT, 1); -# glPixelStorei(GL_UNPACK_ROW_LENGTH, $self->{layer_preview_z_texture_width}); - glTexSubImage2D_c(GL_TEXTURE_2D, 0, 0, 0, $volume->layer_height_texture_width, $volume->layer_height_texture_height, - GL_RGBA, GL_UNSIGNED_BYTE, $volume->layer_height_texture_data_ptr_level0); - glTexSubImage2D_c(GL_TEXTURE_2D, 1, 0, 0, $volume->layer_height_texture_width / 2, $volume->layer_height_texture_height / 2, - GL_RGBA, GL_UNSIGNED_BYTE, $volume->layer_height_texture_data_ptr_level1); - $shader_active = 1; - } elsif ($fakecolor) { + if ($fakecolor) { # Object picking mode. Render the object with a color encoding the object index. my $r = ($volume_idx & 0x000000FF) >> 0; my $g = ($volume_idx & 0x0000FF00) >> 8; @@ -1402,11 +1377,6 @@ sub draw_volumes { } $volume->render; - - if ($shader_active) { - glBindTexture(GL_TEXTURE_2D, 0); - $self->{layer_height_edit_shader}->disable; - } } glDisableClientState(GL_NORMAL_ARRAY); glDisable(GL_BLEND); @@ -1421,6 +1391,22 @@ sub draw_volumes { glDisableClientState(GL_VERTEX_ARRAY); } +sub mark_volumes_for_layer_height { + my ($self) = @_; + + foreach my $volume_idx (0..$#{$self->volumes}) { + my $volume = $self->volumes->[$volume_idx]; + my $object_id = int($volume->select_group_id / 1000000); + if ($self->layer_editing_enabled && $volume->selected && $self->{layer_height_edit_shader} && + $volume->has_layer_height_texture && $object_id < $self->{print}->object_count) { + $volume->set_layer_height_texture_data($self->{layer_preview_z_texture_id}, $self->{layer_height_edit_shader}->shader_program_id, + $self->{print}->get_object($object_id), $self->_variable_layer_thickness_bar_mouse_cursor_z_relative, $self->{layer_height_edit_band_width}); + } else { + $volume->reset_layer_height_texture_data(); + } + } +} + sub _load_image_set_texture { my ($self, $file_name) = @_; # Load a PNG with an alpha channel. diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index e49314013..0824e6cd0 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -281,6 +281,51 @@ void GLVolume::render() const glPopMatrix(); } +void GLVolume::render_using_layer_height() const +{ + if (!is_active) + return; + + GLint current_program_id; + glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_id); + + if ((layer_height_texture_data.shader_id > 0) && (layer_height_texture_data.shader_id != current_program_id)) + glUseProgram(layer_height_texture_data.shader_id); + + GLint z_to_texture_row_id = (layer_height_texture_data.shader_id > 0) ? glGetUniformLocation(layer_height_texture_data.shader_id, "z_to_texture_row") : -1; + GLint z_texture_row_to_normalized_id = (layer_height_texture_data.shader_id > 0) ? glGetUniformLocation(layer_height_texture_data.shader_id, "z_texture_row_to_normalized") : -1; + GLint z_cursor_id = (layer_height_texture_data.shader_id > 0) ? glGetUniformLocation(layer_height_texture_data.shader_id, "z_cursor") : -1; + GLint z_cursor_band_width_id = (layer_height_texture_data.shader_id > 0) ? glGetUniformLocation(layer_height_texture_data.shader_id, "z_cursor_band_width") : -1; + + if (z_to_texture_row_id >= 0) + glUniform1f(z_to_texture_row_id, (GLfloat)layer_height_texture_z_to_row_id()); + + if (z_texture_row_to_normalized_id >= 0) + glUniform1f(z_texture_row_to_normalized_id, (GLfloat)(1.0f / layer_height_texture_height())); + + if (z_cursor_id >= 0) + glUniform1f(z_cursor_id, (GLfloat)(bounding_box.max.z * layer_height_texture_data.z_cursor_relative)); + + if (z_cursor_band_width_id >= 0) + glUniform1f(z_cursor_band_width_id, (GLfloat)layer_height_texture_data.edit_band_width); + + unsigned int w = layer_height_texture_width(); + unsigned int h = layer_height_texture_height(); + + glBindTexture(GL_TEXTURE_2D, layer_height_texture_data.texture_id); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, w / 2, h / 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, layer_height_texture_data_ptr_level0()); + glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, w / 2, h / 2, GL_RGBA, GL_UNSIGNED_BYTE, layer_height_texture_data_ptr_level1()); + + render(); + + glBindTexture(GL_TEXTURE_2D, 0); + + if ((current_program_id > 0) && (layer_height_texture_data.shader_id != current_program_id)) + glUseProgram(current_program_id); +} + void GLVolume::generate_layer_height_texture(PrintObject *print_object, bool force) { GLTexture *tex = this->layer_height_texture.get(); @@ -398,15 +443,15 @@ int GLVolumeCollection::load_wipe_tower_preview( void GLVolumeCollection::render_VBOs() const { - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + ::glEnable(GL_BLEND); + ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glCullFace(GL_BACK); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); + ::glCullFace(GL_BACK); + ::glEnableClientState(GL_VERTEX_ARRAY); + ::glEnableClientState(GL_NORMAL_ARRAY); GLint current_program_id; - glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_id); + ::glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_id); GLint color_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "uniform_color") : -1; GLint print_box_min_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "print_box.min") : -1; GLint print_box_max_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "print_box.max") : -1; @@ -419,6 +464,17 @@ void GLVolumeCollection::render_VBOs() const if (!volume->indexed_vertex_array.vertices_and_normals_interleaved_VBO_id) continue; + if (volume->layer_height_texture_data.can_use()) + { + ::glDisableClientState(GL_VERTEX_ARRAY); + ::glDisableClientState(GL_NORMAL_ARRAY); + volume->generate_layer_height_texture(volume->layer_height_texture_data.print_object, false); + volume->render_using_layer_height(); + ::glEnableClientState(GL_VERTEX_ARRAY); + ::glEnableClientState(GL_NORMAL_ARRAY); + continue; + } + volume->set_render_color(); GLsizei n_triangles = GLsizei(std::min(volume->indexed_vertex_array.triangle_indices_size, volume->tverts_range.second - volume->tverts_range.first)); @@ -458,9 +514,9 @@ void GLVolumeCollection::render_VBOs() const } if (color_id >= 0) - glUniform4fv(color_id, 1, (const GLfloat*)volume->render_color); + ::glUniform4fv(color_id, 1, (const GLfloat*)volume->render_color); else - glColor4f(volume->render_color[0], volume->render_color[1], volume->render_color[2], volume->render_color[3]); + ::glColor4f(volume->render_color[0], volume->render_color[1], volume->render_color[2], volume->render_color[3]); if (print_box_min_id != -1) ::glUniform3fv(print_box_min_id, 1, (const GLfloat*)print_box_min); @@ -474,36 +530,36 @@ void GLVolumeCollection::render_VBOs() const ::glUniform4fv(print_box_origin_id, 1, (const GLfloat*)origin); } - glBindBuffer(GL_ARRAY_BUFFER, volume->indexed_vertex_array.vertices_and_normals_interleaved_VBO_id); - glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (const void*)(3 * sizeof(float))); - glNormalPointer(GL_FLOAT, 6 * sizeof(float), nullptr); + ::glBindBuffer(GL_ARRAY_BUFFER, volume->indexed_vertex_array.vertices_and_normals_interleaved_VBO_id); + ::glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (const void*)(3 * sizeof(float))); + ::glNormalPointer(GL_FLOAT, 6 * sizeof(float), nullptr); bool has_offset = (volume->origin.x != 0) || (volume->origin.y != 0) || (volume->origin.z != 0); if (has_offset) { - glPushMatrix(); - glTranslated(volume->origin.x, volume->origin.y, volume->origin.z); + ::glPushMatrix(); + ::glTranslated(volume->origin.x, volume->origin.y, volume->origin.z); } if (n_triangles > 0) { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, volume->indexed_vertex_array.triangle_indices_VBO_id); - glDrawElements(GL_TRIANGLES, n_triangles, GL_UNSIGNED_INT, (const void*)(volume->tverts_range.first * 4)); + ::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, volume->indexed_vertex_array.triangle_indices_VBO_id); + ::glDrawElements(GL_TRIANGLES, n_triangles, GL_UNSIGNED_INT, (const void*)(volume->tverts_range.first * 4)); } if (n_quads > 0) { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, volume->indexed_vertex_array.quad_indices_VBO_id); - glDrawElements(GL_QUADS, n_quads, GL_UNSIGNED_INT, (const void*)(volume->qverts_range.first * 4)); + ::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, volume->indexed_vertex_array.quad_indices_VBO_id); + ::glDrawElements(GL_QUADS, n_quads, GL_UNSIGNED_INT, (const void*)(volume->qverts_range.first * 4)); } if (has_offset) - glPopMatrix(); + ::glPopMatrix(); } - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + ::glBindBuffer(GL_ARRAY_BUFFER, 0); + ::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); + ::glDisableClientState(GL_VERTEX_ARRAY); + ::glDisableClientState(GL_NORMAL_ARRAY); - glDisable(GL_BLEND); + ::glDisable(GL_BLEND); } void GLVolumeCollection::render_legacy() const diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index e1e711bfe..0fd31d8d6 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -210,6 +210,32 @@ public: }; class GLVolume { + struct LayerHeightTextureData + { + // ID of the layer height texture + unsigned int texture_id; + // ID of the shader used to render with the layer height texture + unsigned int shader_id; + // The print object to update when generating the layer height texture + PrintObject* print_object; + + float z_cursor_relative; + float edit_band_width; + + LayerHeightTextureData() { reset(); } + + void reset() + { + texture_id = 0; + shader_id = 0; + print_object = nullptr; + z_cursor_relative = 0.0f; + edit_band_width = 0.0f; + } + + bool can_use() { return (texture_id > 0) && (shader_id > 0) && (print_object != nullptr); } + }; + public: static const float SELECTED_COLOR[4]; static const float HOVER_COLOR[4]; @@ -301,11 +327,14 @@ public: void set_range(coordf_t low, coordf_t high); void render() const; + void render_using_layer_height() const; void finalize_geometry(bool use_VBOs) { this->indexed_vertex_array.finalize_geometry(use_VBOs); } void release_geometry() { this->indexed_vertex_array.release_geometry(); } /************************************************ Layer height texture ****************************************************/ std::shared_ptr layer_height_texture; + // Data to render this volume using the layer height texture + LayerHeightTextureData layer_height_texture_data; bool has_layer_height_texture() const { return this->layer_height_texture.get() != nullptr; } @@ -315,11 +344,11 @@ public: { return (this->layer_height_texture.get() == nullptr) ? 0 : this->layer_height_texture->height; } size_t layer_height_texture_cells() const { return (this->layer_height_texture.get() == nullptr) ? 0 : this->layer_height_texture->cells; } - void* layer_height_texture_data_ptr_level0() { + void* layer_height_texture_data_ptr_level0() const { return (layer_height_texture.get() == nullptr) ? 0 : (void*)layer_height_texture->data.data(); } - void* layer_height_texture_data_ptr_level1() { + void* layer_height_texture_data_ptr_level1() const { return (layer_height_texture.get() == nullptr) ? 0 : (void*)(layer_height_texture->data.data() + layer_height_texture->width * layer_height_texture->height * 4); } @@ -328,6 +357,17 @@ public: double(this->layer_height_texture->cells - 1) / (double(this->layer_height_texture->width) * bounding_box.max.z); } void generate_layer_height_texture(PrintObject *print_object, bool force); + + void set_layer_height_texture_data(unsigned int texture_id, unsigned int shader_id, PrintObject* print_object, float z_cursor_relative, float edit_band_width) + { + layer_height_texture_data.texture_id = texture_id; + layer_height_texture_data.shader_id = shader_id; + layer_height_texture_data.print_object = print_object; + layer_height_texture_data.z_cursor_relative = z_cursor_relative; + layer_height_texture_data.edit_band_width = edit_band_width; + } + + void reset_layer_height_texture_data() { layer_height_texture_data.reset(); } }; class GLVolumeCollection diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index 6324f933e..25aa6b81a 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -19,6 +19,9 @@ void enable() const; void disable() const; + int shader_program_id() const + %code%{ RETVAL = THIS->shader_program_id; %}; + std::string last_error() const %code%{ RETVAL = THIS->last_error; %}; }; @@ -45,6 +48,9 @@ int zoom_to_volumes() %code%{ RETVAL = THIS->zoom_to_volumes; %}; + void set_layer_height_texture_data(unsigned int texture_id, unsigned int shader_id, PrintObject* print_object, float z_cursor_relative, float edit_band_width); + void reset_layer_height_texture_data(); + int object_idx() const; int volume_idx() const; int instance_idx() const; From 50d74dfd20eb6f30bfb5999d54339b0becaff15c Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 9 Mar 2018 14:50:25 +0100 Subject: [PATCH 18/47] Out of bed detection - Fixed compile on MacOS --- xs/src/slic3r/GUI/3DScene.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 0824e6cd0..f6be96a78 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -501,7 +501,7 @@ void GLVolumeCollection::render_VBOs() const if (print_box_origin_id != -1) { - float origin[4] = { volume->origin.x, volume->origin.y, volume->origin.z, volume->outside_printer_detection_enabled ? 1.0f : 0.0f }; + float origin[4] = { (float)volume->origin.x, (float)volume->origin.y, (float)volume->origin.z, volume->outside_printer_detection_enabled ? 1.0f : 0.0f }; ::glUniform4fv(print_box_origin_id, 1, (const GLfloat*)origin); } @@ -526,7 +526,7 @@ void GLVolumeCollection::render_VBOs() const if (print_box_origin_id != -1) { - float origin[4] = { volume->origin.x, volume->origin.y, volume->origin.z, volume->outside_printer_detection_enabled ? 1.0f : 0.0f }; + float origin[4] = { (float)volume->origin.x, (float)volume->origin.y, (float)volume->origin.z, volume->outside_printer_detection_enabled ? 1.0f : 0.0f }; ::glUniform4fv(print_box_origin_id, 1, (const GLfloat*)origin); } From d5e136a6d548f02160f34065dfa2bdb93d36d10b Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 9 Mar 2018 17:17:51 +0100 Subject: [PATCH 19/47] Fixed bug with updating of the value of "Wipe while retracting" CheckBox. --- lib/Slic3r/GUI.pm | 2 ++ lib/Slic3r/GUI/MainFrame.pm | 2 +- lib/Slic3r/GUI/Plater.pm | 5 ++++- xs/src/slic3r/GUI/Field.cpp | 11 +++++++++++ xs/src/slic3r/GUI/Field.hpp | 4 +--- xs/src/slic3r/GUI/GUI.cpp | 25 ++++++++++++++++--------- xs/src/slic3r/GUI/GUI.hpp | 7 ++++--- xs/src/slic3r/GUI/OptionsGroup.hpp | 2 +- xs/src/slic3r/GUI/Tab.cpp | 4 ++-- xs/xsp/GUI.xsp | 9 +++++---- 10 files changed, 47 insertions(+), 24 deletions(-) diff --git a/lib/Slic3r/GUI.pm b/lib/Slic3r/GUI.pm index 7a3b30a6b..1aa6ba955 100644 --- a/lib/Slic3r/GUI.pm +++ b/lib/Slic3r/GUI.pm @@ -117,6 +117,8 @@ sub OnInit { } eval { $self->{preset_bundle}->load_selections($self->{app_config}) }; $run_wizard = 1 if $self->{preset_bundle}->has_defauls_only; + + Slic3r::GUI::set_preset_bundle($self->{preset_bundle}); # application frame Wx::Image::FindHandlerType(wxBITMAP_TYPE_PNG) || Wx::Image::AddHandler(Wx::PNGHandler->new); diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index 442d0abc9..f5a9021c0 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -217,7 +217,7 @@ sub _init_tabpanel { $self->{is_disabled_button_browse} = (!eval "use Net::Bonjour; 1") ? 1 : 0 ; # A variable to inform C++ Tab implementation about user_agent $self->{is_user_agent} = (eval "use LWP::UserAgent; 1") ? 1 : 0 ; - Slic3r::GUI::create_preset_tabs(wxTheApp->{preset_bundle}, $self->{no_controller}, + Slic3r::GUI::create_preset_tabs($self->{no_controller}, $self->{is_disabled_button_browse}, $self->{is_user_agent}, $VALUE_CHANGE_EVENT, $PRESETS_CHANGED_EVENT, diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index d48e31462..f9321daba 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -389,9 +389,11 @@ sub new { }); }); $presets->Add($text, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 4); - $presets->Add($choice, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxBOTTOM, 0); + $presets->Add($choice, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxBOTTOM, 1); } } + + my $frequently_changed_parameters_sizer = Wx::BoxSizer->new(wxHORIZONTAL); my $object_info_sizer; { @@ -473,6 +475,7 @@ sub new { my $right_sizer = Wx::BoxSizer->new(wxVERTICAL); $right_sizer->Add($presets, 0, wxEXPAND | wxTOP, 10) if defined $presets; + $right_sizer->Add($frequently_changed_parameters_sizer, 0, wxEXPAND | wxTOP, 10) if defined $frequently_changed_parameters_sizer; $right_sizer->Add($buttons_sizer, 0, wxEXPAND | wxBOTTOM, 5); $right_sizer->Add($self->{list}, 1, wxEXPAND, 5); $right_sizer->Add($object_info_sizer, 0, wxEXPAND, 0); diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index 8fe70479f..2161e8ec6 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -204,6 +204,17 @@ void CheckBox::BUILD() { window = dynamic_cast(temp); } +boost::any CheckBox::get_value() +{ + boost::any ret_val; + bool value = dynamic_cast(window)->GetValue(); + if (m_opt.type == coBool) + ret_val = static_cast(value); + else + ret_val = static_cast(value); + return ret_val; +} + int undef_spin_val = -9999; //! Probably, It's not necessary void SpinCtrl::BUILD() { diff --git a/xs/src/slic3r/GUI/Field.hpp b/xs/src/slic3r/GUI/Field.hpp index b711052b5..db8ad4c9f 100644 --- a/xs/src/slic3r/GUI/Field.hpp +++ b/xs/src/slic3r/GUI/Field.hpp @@ -171,9 +171,7 @@ public: dynamic_cast(window)->SetValue(boost::any_cast(value)); m_disable_change_event = false; } - boost::any get_value() override { - return boost::any(dynamic_cast(window)->GetValue()); - } + boost::any get_value() override; void enable() override { dynamic_cast(window)->Enable(); } void disable() override { dynamic_cast(window)->Disable(); } diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index a0b1bbd09..a615081ae 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -45,6 +45,7 @@ #include "AppConfig.hpp" #include "Utils.hpp" #include "Preferences.hpp" +#include "PresetBundle.hpp" namespace Slic3r { namespace GUI { @@ -172,11 +173,14 @@ wxApp *g_wxApp = nullptr; wxFrame *g_wxMainFrame = nullptr; wxNotebook *g_wxTabPanel = nullptr; AppConfig *g_AppConfig = nullptr; +PresetBundle *g_PresetBundle= nullptr; std::vector g_tabs_list; wxLocale* g_wxLocale; +std::shared_ptr m_optgroup; + void set_wxapp(wxApp *app) { g_wxApp = app; @@ -197,6 +201,11 @@ void set_app_config(AppConfig *app_config) g_AppConfig = app_config; } +void set_preset_bundle(PresetBundle *preset_bundle) +{ + g_PresetBundle = preset_bundle; +} + std::vector& get_tabs_list() { return g_tabs_list; @@ -348,15 +357,13 @@ void open_preferences_dialog(int event_preferences) dlg->ShowModal(); } -void create_preset_tabs(PresetBundle *preset_bundle, - bool no_controller, bool is_disabled_button_browse, bool is_user_agent, +void create_preset_tabs(bool no_controller, bool is_disabled_button_browse, bool is_user_agent, int event_value_change, int event_presets_changed, int event_button_browse, int event_button_test) { - add_created_tab(new TabPrint (g_wxTabPanel, no_controller), preset_bundle); - add_created_tab(new TabFilament (g_wxTabPanel, no_controller), preset_bundle); - add_created_tab(new TabPrinter (g_wxTabPanel, no_controller, is_disabled_button_browse, is_user_agent), - preset_bundle); + add_created_tab(new TabPrint (g_wxTabPanel, no_controller)); + add_created_tab(new TabFilament (g_wxTabPanel, no_controller)); + add_created_tab(new TabPrinter (g_wxTabPanel, no_controller, is_disabled_button_browse, is_user_agent)); for (size_t i = 0; i < g_wxTabPanel->GetPageCount(); ++ i) { Tab *tab = dynamic_cast(g_wxTabPanel->GetPage(i)); if (! tab) @@ -440,7 +447,7 @@ void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, b config.set_key_value(opt_key, new ConfigOptionBool(boost::any_cast(value))); break; case coBools:{ - ConfigOptionBools* vec_new = new ConfigOptionBools{ boost::any_cast(value) }; + ConfigOptionBools* vec_new = new ConfigOptionBools{ (bool)boost::any_cast(value) }; config.option(opt_key)->set_at(vec_new, opt_index, 0); break;} case coInt: @@ -480,9 +487,9 @@ void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, b } } -void add_created_tab(Tab* panel, PresetBundle *preset_bundle) +void add_created_tab(Tab* panel) { - panel->create_preset_tab(preset_bundle); + panel->create_preset_tab(g_PresetBundle); // Load the currently selected preset into the GUI, update the preset selection box. panel->load_current_preset(); diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp index 889d31318..a0e03a768 100644 --- a/xs/src/slic3r/GUI/GUI.hpp +++ b/xs/src/slic3r/GUI/GUI.hpp @@ -16,6 +16,7 @@ class wxString; class wxArrayString; class wxArrayLong; class wxColour; +class wxBoxSizer; namespace Slic3r { @@ -71,6 +72,7 @@ void set_wxapp(wxApp *app); void set_main_frame(wxFrame *main_frame); void set_tab_panel(wxNotebook *tab_panel); void set_app_config(AppConfig *app_config); +void set_preset_bundle(PresetBundle *preset_bundle); AppConfig* get_app_config(); wxApp* get_app(); @@ -82,14 +84,13 @@ void add_debug_menu(wxMenuBar *menu, int event_language_change); void open_preferences_dialog(int event_preferences); // Create a new preset tab (print, filament and printer), -void create_preset_tabs(PresetBundle *preset_bundle, - bool no_controller, bool is_disabled_button_browse, bool is_user_agent, +void create_preset_tabs(bool no_controller, bool is_disabled_button_browse, bool is_user_agent, int event_value_change, int event_presets_changed, int event_button_browse, int event_button_test); TabIface* get_preset_tab_iface(char *name); // add it at the end of the tab panel. -void add_created_tab(Tab* panel, PresetBundle *preset_bundle); +void add_created_tab(Tab* panel); // Change option value in config void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, boost::any value, int opt_index = 0); diff --git a/xs/src/slic3r/GUI/OptionsGroup.hpp b/xs/src/slic3r/GUI/OptionsGroup.hpp index 63ba91e6c..42db22225 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.hpp +++ b/xs/src/slic3r/GUI/OptionsGroup.hpp @@ -114,7 +114,7 @@ public: inline void disable() { for (auto& field : m_fields) field.second->disable(); } OptionsGroup(wxWindow* _parent, wxString title, bool is_tab_opt=false) : - m_parent(_parent), title(title), m_is_tab_opt(is_tab_opt) { + m_parent(_parent), title(title), m_is_tab_opt(is_tab_opt), staticbox(title!="") { sizer = (staticbox ? new wxStaticBoxSizer(new wxStaticBox(_parent, wxID_ANY, title), wxVERTICAL) : new wxBoxSizer(wxVERTICAL)); auto num_columns = 1U; if (label_width != 0) num_columns++; diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index aef85c78d..725017297 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -1417,8 +1417,8 @@ void TabPrinter::update(){ DynamicPrintConfig new_conf = *m_config; if (dialog->ShowModal() == wxID_YES) { - auto wipe = static_cast(m_config->option("wipe")); - wipe->values[i] = 0; + auto wipe = static_cast(m_config->option("wipe")->clone()); + wipe->values[i] = false; new_conf.set_key_value("wipe", wipe); } else { diff --git a/xs/xsp/GUI.xsp b/xs/xsp/GUI.xsp index cae480c2f..cbdd836da 100644 --- a/xs/xsp/GUI.xsp +++ b/xs/xsp/GUI.xsp @@ -35,12 +35,10 @@ void set_tab_panel(SV *ui) void add_debug_menu(SV *ui, int event_language_change) %code%{ Slic3r::GUI::add_debug_menu((wxMenuBar*)wxPli_sv_2_object(aTHX_ ui, "Wx::MenuBar"), event_language_change); %}; -void create_preset_tabs(PresetBundle *preset_bundle, bool no_controller, - bool is_disabled_button_browse, bool is_user_agent, +void create_preset_tabs(bool no_controller, bool is_disabled_button_browse, bool is_user_agent, int event_value_change, int event_presets_changed, int event_button_browse, int event_button_test) - %code%{ Slic3r::GUI::create_preset_tabs(preset_bundle, no_controller, - is_disabled_button_browse, is_user_agent, + %code%{ Slic3r::GUI::create_preset_tabs(no_controller, is_disabled_button_browse, is_user_agent, event_value_change, event_presets_changed, event_button_browse, event_button_test); %}; @@ -61,3 +59,6 @@ void set_app_config(AppConfig *app_config) void open_preferences_dialog(int preferences_event) %code%{ Slic3r::GUI::open_preferences_dialog(preferences_event); %}; + +void set_preset_bundle(PresetBundle *preset_bundle) + %code%{ Slic3r::GUI::set_preset_bundle(preset_bundle); %}; From e8adbd730370d038c14def06cf514be4c18e2376 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 9 Mar 2018 18:34:30 +0100 Subject: [PATCH 20/47] First prototype of adding of UI for frequently changed parameters --- lib/Slic3r/GUI/Plater.pm | 1 + xs/src/slic3r/GUI/GUI.cpp | 36 ++++++++++++++++++++++++++++++++++++ xs/src/slic3r/GUI/GUI.hpp | 3 +++ xs/xsp/GUI.xsp | 5 +++++ 4 files changed, 45 insertions(+) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index f9321daba..a99bbddef 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -394,6 +394,7 @@ sub new { } my $frequently_changed_parameters_sizer = Wx::BoxSizer->new(wxHORIZONTAL); + Slic3r::GUI::add_frequently_changed_parameters($self, $frequently_changed_parameters_sizer, $presets); my $object_info_sizer; { diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index a615081ae..281ea428a 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -604,4 +604,40 @@ wxWindow *get_widget_by_id(int id) return window; } +void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFlexGridSizer* preset_sizer) +{ + DynamicPrintConfig* config = &g_PresetBundle->prints.get_edited_preset().config; + m_optgroup = std::make_shared(parent, "", config); + //preset_sizer->RecalcSizes(); + const wxArrayInt& ar = preset_sizer->GetColWidths(); + m_optgroup->label_width = 90;//ar.IsEmpty() ? 90 : ar.front(); + m_optgroup->m_on_change = [](t_config_option_key opt_key, boost::any value){ + int i=0;// m_values[opt_key] = boost::any_cast(value) ? "1" : "0"; + }; + m_optgroup->append_single_option_line("fill_density"); + + ConfigOptionDef def; + + def.label = L("Support"); + def.type = coString; + def.gui_type = "select_open"; + def.tooltip = L("Select what kind of support do you need"); + def.enum_labels.push_back(L("None")); + def.enum_labels.push_back(L("Support on build plate only")); + def.enum_labels.push_back(L("Everywhere")); + def.default_value = new ConfigOptionString(L("None")); + Option option(def, "support"); + m_optgroup->append_single_option_line(option); + + def.label = L("Brim"); + def.type = coBool; + def.tooltip = L("This flag enables the brim that will be printed around each object on the first layer."); + def.default_value = new ConfigOptionBool{ false }; // 1; + def.gui_type = ""; + option = Option(def, "brim"); + m_optgroup->append_single_option_line(option); + + sizer->Add(m_optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxBottom, 1); +} + } } diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp index a0e03a768..a27f13f69 100644 --- a/xs/src/slic3r/GUI/GUI.hpp +++ b/xs/src/slic3r/GUI/GUI.hpp @@ -17,6 +17,7 @@ class wxArrayString; class wxArrayLong; class wxColour; class wxBoxSizer; +class wxFlexGridSizer; namespace Slic3r { @@ -127,6 +128,8 @@ wxString from_u8(const std::string &str); wxWindow *get_widget_by_id(int id); +void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFlexGridSizer* preset_sizer); + } } diff --git a/xs/xsp/GUI.xsp b/xs/xsp/GUI.xsp index cbdd836da..be36c531f 100644 --- a/xs/xsp/GUI.xsp +++ b/xs/xsp/GUI.xsp @@ -62,3 +62,8 @@ void open_preferences_dialog(int preferences_event) void set_preset_bundle(PresetBundle *preset_bundle) %code%{ Slic3r::GUI::set_preset_bundle(preset_bundle); %}; + +void add_frequently_changed_parameters(SV *ui_parent, SV *ui_sizer, SV *ui_p_sizer) + %code%{ Slic3r::GUI::add_frequently_changed_parameters((wxWindow*)wxPli_sv_2_object(aTHX_ ui_parent, "Wx::Window"), + (wxBoxSizer*)wxPli_sv_2_object(aTHX_ ui_sizer, "Wx::BoxSizer"), + (wxFlexGridSizer*)wxPli_sv_2_object(aTHX_ ui_p_sizer, "Wx::FlexGridSizer")); %}; From 79dc862498aace576d562780cb946e520f47a2ef Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 12 Mar 2018 09:23:59 +0100 Subject: [PATCH 21/47] Out of bed detection - Shaders refactoring --- lib/Slic3r/GUI/3DScene.pm | 116 +++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 65 deletions(-) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index fe19007e0..81bacd290 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -1728,13 +1728,13 @@ sub _vertex_shader_Gouraud { #define INTENSITY_CORRECTION 0.7 // normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) -#define LIGHT_TOP_DIR vec3(-0.4574957, 0.4574957, 0.7624929) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); #define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) #define LIGHT_TOP_SPECULAR (0.5 * INTENSITY_CORRECTION) #define LIGHT_TOP_SHININESS 50. // normalized values for (1./1.43, 0.2/1.43, 1./1.43) -#define LIGHT_FRONT_DIR vec3(0.6985074, 0.1397015, 0.6985074) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) #define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) #define LIGHT_FRONT_SHININESS 50. @@ -1753,44 +1753,37 @@ struct PrintBoxDetection uniform PrintBoxDetection print_box; -varying float intensity_specular; -varying float intensity_tainted; +// x = tainted, y = specular; +varying vec2 intensity; varying vec3 delta_box_min; varying vec3 delta_box_max; void main() { - vec3 normal, viewVector, halfVector; - float NdotL, NdotHV; + // position in camera space + vec3 eye = (gl_ModelViewMatrix * gl_Vertex).xyz; - vec3 eye = -(gl_ModelViewMatrix * gl_Vertex).xyz; - - // First transform the normal into eye space and normalize the result. - normal = normalize(gl_NormalMatrix * gl_Normal); + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(gl_NormalMatrix * gl_Normal); // Now normalize the light's direction. Note that according to the OpenGL specification, the light is stored in eye space. // Also since we're talking about a directional light, the position field is actually direction. - halfVector = normalize(LIGHT_TOP_DIR + eye); + vec3 halfVector = normalize(LIGHT_TOP_DIR - eye); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); - intensity_tainted = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - intensity_specular = 0.; + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + intensity.y = 0.0; if (NdotL > 0.0) - intensity_specular = LIGHT_TOP_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_TOP_SHININESS); + intensity.y += LIGHT_TOP_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_TOP_SHININESS); - // Perform the same lighting calculation for the 2nd light source. -// halfVector = normalize(LIGHT_FRONT_DIR + eye); + // Perform the same lighting calculation for the 2nd light source (no specular applied). NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); - intensity_tainted += NdotL * LIGHT_FRONT_DIFFUSE; - - // compute the specular term if NdotL is larger than zero -// if (NdotL > 0.0) -// intensity_specular += LIGHT_FRONT_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_FRONT_SHININESS); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; // compute deltas for out of print volume detection (world coordinates) if (print_box.volume_origin.w == 1.0) @@ -1815,19 +1808,19 @@ sub _fragment_shader_Gouraud { return <<'FRAGMENT'; #version 110 -varying float intensity_specular; -varying float intensity_tainted; +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +// x = tainted, y = specular; +varying vec2 intensity; + varying vec3 delta_box_min; varying vec3 delta_box_max; uniform vec4 uniform_color; -const vec3 ZERO = vec3(0.0, 0.0, 0.0); - void main() { - gl_FragColor = - vec4(intensity_specular, intensity_specular, intensity_specular, 0.) + uniform_color * intensity_tainted; + gl_FragColor = vec4(intensity.y, intensity.y, intensity.y, 0.0) + uniform_color * intensity.x; // if the fragment is outside the print volume darken it and set it as transparent if (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) @@ -1911,12 +1904,12 @@ sub _vertex_shader_variable_layer_height { return <<'VERTEX'; #version 110 -const vec3 LIGHT_TOP_DIR = vec3(0.0, 1.0, 0.0); +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); #define LIGHT_TOP_DIFFUSE 0.2 #define LIGHT_TOP_SPECULAR 0.3 #define LIGHT_TOP_SHININESS 50. -const vec3 LIGHT_FRONT_DIR = vec3(0.0, 0.0, 1.0); +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define LIGHT_FRONT_DIFFUSE 0.5 #define LIGHT_FRONT_SPECULAR 0.3 #define LIGHT_FRONT_SHININESS 50. @@ -1924,46 +1917,41 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.0, 0.0, 1.0); #define INTENSITY_AMBIENT 0.1 uniform float z_to_texture_row; -varying float intensity_specular; -varying float intensity_tainted; + +// x = tainted, y = specular; +varying vec2 intensity; + varying float object_z; void main() { - vec3 eye, normal, viewVector, halfVector; - float NdotL, NdotHV; + // position in camera space + vec3 eye = (gl_ModelViewMatrix * gl_Vertex).xyz; -// eye = gl_ModelViewMatrixInverse[3].xyz; - eye = vec3(0., 0., 1.); - - // First transform the normal into eye space and normalize the result. - normal = normalize(gl_NormalMatrix * gl_Normal); + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(gl_NormalMatrix * gl_Normal); // Now normalize the light's direction. Note that according to the OpenGL specification, the light is stored in eye space. // Also since we're talking about a directional light, the position field is actually direction. - halfVector = normalize(LIGHT_TOP_DIR + eye); + vec3 halfVector = normalize(LIGHT_TOP_DIR - eye); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. - NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); - intensity_tainted = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - intensity_specular = 0.; + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + intensity.y = 0.0; -// if (NdotL > 0.0) -// intensity_specular = LIGHT_TOP_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_TOP_SHININESS); - - // Perform the same lighting calculation for the 2nd light source. - halfVector = normalize(LIGHT_FRONT_DIR + eye); - NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); - intensity_tainted += NdotL * LIGHT_FRONT_DIFFUSE; - - // compute the specular term if NdotL is larger than zero if (NdotL > 0.0) - intensity_specular += LIGHT_FRONT_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_FRONT_SHININESS); + intensity.y += LIGHT_TOP_SPECULAR * pow(max(dot(normal, halfVector), 0.0), LIGHT_TOP_SHININESS); + // Perform the same lighting calculation for the 2nd light source (no specular) + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + // Scaled to widths of the Z texture. - object_z = gl_Vertex.z / gl_Vertex.w; + object_z = gl_Vertex.z; gl_Position = ftransform(); } @@ -1982,13 +1970,14 @@ uniform sampler2D z_texture; // Scaling from the Z texture rows coordinate to the normalized texture row coordinate. uniform float z_to_texture_row; uniform float z_texture_row_to_normalized; - -varying float intensity_specular; -varying float intensity_tainted; -varying float object_z; uniform float z_cursor; uniform float z_cursor_band_width; +// x = tainted, y = specular; +varying vec2 intensity; + +varying float object_z; + void main() { float object_z_row = z_to_texture_row * object_z; @@ -2007,15 +1996,12 @@ void main() float lod = clamp(0.5 * log2(max(dx_vtc*dx_vtc, dy_vtc*dy_vtc)), 0., 1.); // Sample the Z texture. Texture coordinates are normalized to <0, 1>. vec4 color = - (1. - lod) * texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.) + - lod * texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.); + mix(texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), + texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); + // Mix the final color. gl_FragColor = - vec4(intensity_specular, intensity_specular, intensity_specular, 1.) + - (1. - z_blend) * intensity_tainted * color + - z_blend * vec4(1., 1., 0., 0.); - // and reset the transparency. - gl_FragColor.a = 1.; + vec4(intensity.y, intensity.y, intensity.y, 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); } FRAGMENT From 5bb736daf2f1abff546d2d420267802149899c09 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 12 Mar 2018 16:52:21 +0100 Subject: [PATCH 22/47] Infill(Plater) updates with Infill (Print Settings). *Updated some fuctions --- xs/src/slic3r/GUI/GUI.cpp | 48 +++++++++++++++++++-- xs/src/slic3r/GUI/GUI.hpp | 3 ++ xs/src/slic3r/GUI/Tab.cpp | 91 ++++++++------------------------------- 3 files changed, 66 insertions(+), 76 deletions(-) diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index 281ea428a..dc357db0a 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -611,10 +611,44 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl //preset_sizer->RecalcSizes(); const wxArrayInt& ar = preset_sizer->GetColWidths(); m_optgroup->label_width = 90;//ar.IsEmpty() ? 90 : ar.front(); - m_optgroup->m_on_change = [](t_config_option_key opt_key, boost::any value){ - int i=0;// m_values[opt_key] = boost::any_cast(value) ? "1" : "0"; + m_optgroup->m_on_change = [config](t_config_option_key opt_key, boost::any value){ + TabPrint* tab_print = nullptr; + for (size_t i = 0; i < g_wxTabPanel->GetPageCount(); ++i) { + Tab *tab = dynamic_cast(g_wxTabPanel->GetPage(i)); + if (!tab) + continue; + if (tab->name() == "print"){ + tab_print = static_cast(tab); + break; + } + } + if (tab_print == nullptr) + return; + + if (opt_key == "fill_density"){ + value = m_optgroup->get_config_value(*config, opt_key); + tab_print->set_value(opt_key, value); + } + + if (opt_key == "brim"){ + if (boost::any_cast(value) == true) + { + double brim_width = config->opt_float("brim_width");// m_optgroup->get_config_value(*config, "brim_width"); + if (brim_width == 0.0) + tab_print->set_value("brim_width", wxString("10")); + } + else + tab_print->set_value("brim_width", wxString("0")); + } + + tab_print->update_dirty(); + }; - m_optgroup->append_single_option_line("fill_density"); + + Option option = m_optgroup->get_option("fill_density"); + option.opt.sidetext = ""; + option.opt.width = 200; + m_optgroup->append_single_option_line(option); ConfigOptionDef def; @@ -626,7 +660,8 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl def.enum_labels.push_back(L("Support on build plate only")); def.enum_labels.push_back(L("Everywhere")); def.default_value = new ConfigOptionString(L("None")); - Option option(def, "support"); + option = Option(def, "support"); + option.opt.width = 200; m_optgroup->append_single_option_line(option); def.label = L("Brim"); @@ -640,4 +675,9 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl sizer->Add(m_optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxBottom, 1); } +ConfigOptionsGroup* get_optgroup() +{ + return m_optgroup.get(); +} + } } diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp index a27f13f69..2baa10cb9 100644 --- a/xs/src/slic3r/GUI/GUI.hpp +++ b/xs/src/slic3r/GUI/GUI.hpp @@ -44,6 +44,7 @@ class TabIface; namespace GUI { class Tab; +class ConfigOptionsGroup; // Map from an file_type name to full file wildcard name. typedef std::map t_file_wild_card; inline t_file_wild_card& get_file_wild_card() { @@ -130,6 +131,8 @@ wxWindow *get_widget_by_id(int id); void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFlexGridSizer* preset_sizer); +ConfigOptionsGroup* get_optgroup(); + } } diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 725017297..066519650 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -233,83 +233,13 @@ void Tab::update_tab_ui() m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets); } -template -boost::any get_new_value(const DynamicPrintConfig &config_new, const DynamicPrintConfig &config_old, std::string opt_key, int &index) -{ - for (int i = 0; i < config_new.option(opt_key)->values.size(); i++) - if (config_new.option(opt_key)->values[i] != - config_old.option(opt_key)->values[i]){ - index = i; - break; - } - return config_new.option(opt_key)->values[index]; -} - // Load a provied DynamicConfig into the tab, modifying the active preset. // This could be used for example by setting a Wipe Tower position by interactive manipulation in the 3D view. void Tab::load_config(DynamicPrintConfig config) { bool modified = 0; - boost::any value; - int opt_index = 0; for(auto opt_key : m_config->diff(config)) { - switch ( config.def()->get(opt_key)->type ){ - case coFloatOrPercent:{ - const auto &conf_val = *config.option(opt_key); - value = conf_val.percent ? std::to_string(int(conf_val.value)) + "%" : std::to_string(conf_val.value); - } - break; - case coPercent: - value = config.option(opt_key)->value;// std::to_string(int(config.option(opt_key)->value)); - break; - case coFloat: - value = config.opt_float(opt_key); - break; - case coString: - value = config.opt_string(opt_key); - break; - case coPercents: - value = get_new_value(config, *m_config, opt_key, opt_index); - break; - case coFloats: - value = get_new_value(config, *m_config, opt_key, opt_index); - break; - case coStrings: - value = config.option(opt_key)->values.empty() ? "" : - get_new_value(config, *m_config, opt_key, opt_index); - break; - case coBool: - value = config.opt_bool(opt_key); - break; - case coBools: - value = get_new_value(config, *m_config, opt_key, opt_index); - break; - case coInt: - value = config.opt_int(opt_key); - break; - case coInts: - value = get_new_value(config, *m_config, opt_key, opt_index); - break; - case coEnum:{ - if (opt_key.compare("external_fill_pattern") == 0 || - opt_key.compare("fill_pattern") == 0) - value = config.option>(opt_key)->value; - else if (opt_key.compare("gcode_flavor") == 0) - value = config.option>(opt_key)->value; - else if (opt_key.compare("support_material_pattern") == 0) - value = config.option>(opt_key)->value; - else if (opt_key.compare("seam_position") == 0) - value = config.option>(opt_key)->value; - } - break; - case coPoints: - break; - case coNone: - break; - default: - break; - } - change_opt_value(*m_config, opt_key, value, opt_index); + m_config->set_key_value(opt_key, config.option(opt_key)->clone()); modified = 1; } if (modified) { @@ -380,6 +310,22 @@ void Tab::on_value_change(std::string opt_key, boost::any value) } g_wxMainFrame->ProcessWindowEvent(event); } + if (opt_key == "fill_density") + { + value = get_optgroup()->get_config_value(*m_config, opt_key); + get_optgroup()->set_value(opt_key, value); + } + if (opt_key == "support") + { + + } + if (opt_key == "brim_width") + { + bool val = m_config->opt_float("brim_width") > 0.0 ? true : false; + get_optgroup()->set_value("brim", val); + } + + update(); } @@ -1418,7 +1364,8 @@ void TabPrinter::update(){ DynamicPrintConfig new_conf = *m_config; if (dialog->ShowModal() == wxID_YES) { auto wipe = static_cast(m_config->option("wipe")->clone()); - wipe->values[i] = false; + for (int w = 0; w < wipe->values.size(); w++) + wipe->values[w] = false; new_conf.set_key_value("wipe", wipe); } else { From 1ae8684af147f3007324a3c876986b83231db4e1 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 13 Mar 2018 13:32:50 +0100 Subject: [PATCH 23/47] Modified TriangleMeshSlicer::make_loops() to fix #784 --- xs/src/libslic3r/TriangleMesh.cpp | 61 ++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/xs/src/libslic3r/TriangleMesh.cpp b/xs/src/libslic3r/TriangleMesh.cpp index ffbe507ef..2a0110a45 100644 --- a/xs/src/libslic3r/TriangleMesh.cpp +++ b/xs/src/libslic3r/TriangleMesh.cpp @@ -990,21 +990,34 @@ void TriangleMeshSlicer::make_loops(std::vector &lines, Polygo // Build a map of lines by edge_a_id and a_id. std::vector by_edge_a_id; + std::vector by_edge_b_id; std::vector by_a_id; + std::vector by_b_id; by_edge_a_id.reserve(lines.size()); + by_edge_b_id.reserve(lines.size()); by_a_id.reserve(lines.size()); + by_b_id.reserve(lines.size()); + for (IntersectionLines::iterator line = lines.begin(); line != lines.end(); ++ line) { if (! line->skip) { if (line->edge_a_id != -1) by_edge_a_id.push_back(&(*line)); // [line->edge_a_id].push_back(); - if (line->a_id != -1) + if (line->edge_b_id != -1) + by_edge_b_id.push_back(&(*line)); + if (line->a_id != -1) by_a_id.push_back(&(*line)); // [line->a_id].push_back(&(*line)); + if (line->b_id != -1) + by_b_id.push_back(&(*line)); // [line->a_id].push_back(&(*line)); } } auto by_edge_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->edge_a_id < il2->edge_a_id; }; auto by_vertex_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->a_id < il2->a_id; }; + auto by_edge_b_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->edge_b_id < il2->edge_b_id; }; + auto by_vertex_b_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->b_id < il2->b_id; }; std::sort(by_edge_a_id.begin(), by_edge_a_id.end(), by_edge_lower); std::sort(by_a_id.begin(), by_a_id.end(), by_vertex_lower); + std::sort(by_edge_b_id.begin(), by_edge_b_id.end(), by_edge_b_lower); + std::sort(by_b_id.begin(), by_b_id.end(), by_vertex_b_lower); IntersectionLines::iterator it_line_seed = lines.begin(); CYCLE: while (1) { @@ -1043,6 +1056,29 @@ void TriangleMeshSlicer::make_loops(std::vector &lines, Polygo break; } } + if (next_line == nullptr) + { + // checks reverted edge + key.edge_b_id = last_line->edge_b_id; + auto it_begin = std::lower_bound(by_edge_b_id.begin(), by_edge_b_id.end(), &key, by_edge_b_lower); + if (it_begin != by_edge_b_id.end()) { + auto it_end = std::upper_bound(it_begin, by_edge_b_id.end(), &key, by_edge_b_lower); + for (auto it_line = it_begin; it_line != it_end; ++it_line) + if (!(*it_line)->skip) { + // reverts edge + std::swap((*it_line)->a, (*it_line)->b); + std::swap((*it_line)->a_id, (*it_line)->b_id); + std::swap((*it_line)->edge_a_id, (*it_line)->edge_b_id); + next_line = *it_line; + // resorts lists + std::sort(by_edge_a_id.begin(), by_edge_a_id.end(), by_edge_lower); + std::sort(by_edge_b_id.begin(), by_edge_b_id.end(), by_edge_b_lower); + std::sort(by_a_id.begin(), by_a_id.end(), by_vertex_lower); + std::sort(by_b_id.begin(), by_b_id.end(), by_vertex_b_lower); + break; + } + } + } } if (next_line == nullptr && last_line->b_id != -1) { key.a_id = last_line->b_id; @@ -1055,6 +1091,29 @@ void TriangleMeshSlicer::make_loops(std::vector &lines, Polygo break; } } + if (next_line == nullptr) + { + // checks reverted edge + key.b_id = last_line->b_id; + auto it_begin = std::lower_bound(by_b_id.begin(), by_b_id.end(), &key, by_vertex_b_lower); + if (it_begin != by_b_id.end()) { + auto it_end = std::upper_bound(it_begin, by_b_id.end(), &key, by_vertex_b_lower); + for (auto it_line = it_begin; it_line != it_end; ++it_line) + if (!(*it_line)->skip) { + // reverts edge + std::swap((*it_line)->a, (*it_line)->b); + std::swap((*it_line)->a_id, (*it_line)->b_id); + std::swap((*it_line)->edge_a_id, (*it_line)->edge_b_id); + next_line = *it_line; + // resorts lists + std::sort(by_edge_a_id.begin(), by_edge_a_id.end(), by_edge_lower); + std::sort(by_edge_b_id.begin(), by_edge_b_id.end(), by_edge_b_lower); + std::sort(by_a_id.begin(), by_a_id.end(), by_vertex_lower); + std::sort(by_b_id.begin(), by_b_id.end(), by_vertex_b_lower); + break; + } + } + } } if (next_line == nullptr) { // check whether we closed this loop From d91e35f82095344d3c2c85e371e33a62f5ee8263 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 13 Mar 2018 14:21:41 +0100 Subject: [PATCH 24/47] Shaders tweaking --- lib/Slic3r/GUI/3DScene.pm | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index 81bacd290..821dc7b16 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -1725,19 +1725,19 @@ sub _vertex_shader_Gouraud { return <<'VERTEX'; #version 110 -#define INTENSITY_CORRECTION 0.7 +#define INTENSITY_CORRECTION 0.6 // normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); #define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SPECULAR (0.5 * INTENSITY_CORRECTION) -#define LIGHT_TOP_SHININESS 50. +#define LIGHT_TOP_SPECULAR (0.25 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 200.0 // normalized values for (1./1.43, 0.2/1.43, 1./1.43) const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) -#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) -#define LIGHT_FRONT_SHININESS 50. +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 #define INTENSITY_AMBIENT 0.3 @@ -1761,15 +1761,14 @@ varying vec3 delta_box_max; void main() { - // position in camera space - vec3 eye = (gl_ModelViewMatrix * gl_Vertex).xyz; + vec3 eye = -normalize((gl_ModelViewMatrix * gl_Vertex).xyz); // First transform the normal into camera space and normalize the result. vec3 normal = normalize(gl_NormalMatrix * gl_Normal); // Now normalize the light's direction. Note that according to the OpenGL specification, the light is stored in eye space. // Also since we're talking about a directional light, the position field is actually direction. - vec3 halfVector = normalize(LIGHT_TOP_DIR - eye); + vec3 halfVector = normalize(LIGHT_TOP_DIR + eye); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. @@ -1904,17 +1903,19 @@ sub _vertex_shader_variable_layer_height { return <<'VERTEX'; #version 110 +#define INTENSITY_CORRECTION 0.6 + const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); -#define LIGHT_TOP_DIFFUSE 0.2 -#define LIGHT_TOP_SPECULAR 0.3 -#define LIGHT_TOP_SHININESS 50. +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.25 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 200.0 const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE 0.5 -#define LIGHT_FRONT_SPECULAR 0.3 -#define LIGHT_FRONT_SHININESS 50. +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 -#define INTENSITY_AMBIENT 0.1 +#define INTENSITY_AMBIENT 0.3 uniform float z_to_texture_row; @@ -1925,15 +1926,14 @@ varying float object_z; void main() { - // position in camera space - vec3 eye = (gl_ModelViewMatrix * gl_Vertex).xyz; + vec3 eye = -normalize((gl_ModelViewMatrix * gl_Vertex).xyz); // First transform the normal into camera space and normalize the result. vec3 normal = normalize(gl_NormalMatrix * gl_Normal); // Now normalize the light's direction. Note that according to the OpenGL specification, the light is stored in eye space. // Also since we're talking about a directional light, the position field is actually direction. - vec3 halfVector = normalize(LIGHT_TOP_DIR - eye); + vec3 halfVector = normalize(LIGHT_TOP_DIR + eye); // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. From 523b297738c6fb66b1f5f96fdc4ad3d51c6adf7a Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 13 Mar 2018 14:37:59 +0100 Subject: [PATCH 25/47] Out of bed detection - Volume colors changed while dragging them --- lib/Slic3r/GUI/3DScene.pm | 1 + lib/Slic3r/GUI/Plater/3D.pm | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index 821dc7b16..0c1200e0a 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -1311,6 +1311,7 @@ sub Render { if ($self->enable_picking) { $self->mark_volumes_for_layer_height; $self->volumes->set_print_box($self->bed_bounding_box->x_min, $self->bed_bounding_box->y_min, 0.0, $self->bed_bounding_box->x_max, $self->bed_bounding_box->y_max, $self->{config}->get('max_print_height')); + $self->volumes->update_outside_state($self->{config}, 0); } $self->{plain_shader}->enable if $self->{plain_shader}; $self->volumes->render_VBOs; diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index 8f95a92f4..37e1321ae 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -216,7 +216,6 @@ sub reload_scene { { if (!$self->{model}->fits_print_volume($self->{config})) { $self->set_warning_enabled(1); - $self->volumes->update_outside_state($self->{config}, 0); Slic3r::GUI::_3DScene::generate_warning_texture(L("Detected object outside print volume")); } else { $self->set_warning_enabled(0); From 30f6e33656c365c393c49014128ef20956acdcda Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 13 Mar 2018 16:14:36 +0100 Subject: [PATCH 26/47] Completed update of frequently changed parameters --- xs/src/slic3r/GUI/Field.cpp | 9 ++++-- xs/src/slic3r/GUI/GUI.cpp | 59 ++++++++++++++++++++++++++----------- xs/src/slic3r/GUI/Tab.cpp | 46 ++++++++++++++++++++++------- xs/src/slic3r/GUI/Tab.hpp | 1 + 4 files changed, 85 insertions(+), 30 deletions(-) diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index 2161e8ec6..aed7ba12f 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -294,8 +294,10 @@ void Choice::BUILD() { if (m_opt.enum_labels.empty() && m_opt.enum_values.empty()){ } else{ - for (auto el : m_opt.enum_labels.empty() ? m_opt.enum_values : m_opt.enum_labels) - temp->Append(wxString(el)); + for (auto el : m_opt.enum_labels.empty() ? m_opt.enum_values : m_opt.enum_labels){ + const wxString& str = m_opt_id == "support" ? L_str(el) : el; + temp->Append(str); + } set_selection(); } temp->Bind(wxEVT_TEXT, ([this](wxCommandEvent e) { on_change_field(); }), temp->GetId()); @@ -444,6 +446,9 @@ boost::any Choice::get_value() boost::any ret_val; wxString ret_str = static_cast(window)->GetValue(); + if (m_opt_id == "support") + return ret_str; + if (m_opt.type != coEnum) ret_val = get_value_by_opt_type(ret_str); else diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index dc357db0a..efaffd1a0 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -180,6 +180,7 @@ std::vector g_tabs_list; wxLocale* g_wxLocale; std::shared_ptr m_optgroup; +double m_brim_width = 0.0; void set_wxapp(wxApp *app) { @@ -608,9 +609,8 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl { DynamicPrintConfig* config = &g_PresetBundle->prints.get_edited_preset().config; m_optgroup = std::make_shared(parent, "", config); - //preset_sizer->RecalcSizes(); const wxArrayInt& ar = preset_sizer->GetColWidths(); - m_optgroup->label_width = 90;//ar.IsEmpty() ? 90 : ar.front(); + m_optgroup->label_width = ar.IsEmpty() ? 100 : ar.front(); m_optgroup->m_on_change = [config](t_config_option_key opt_key, boost::any value){ TabPrint* tab_print = nullptr; for (size_t i = 0; i < g_wxTabPanel->GetPageCount(); ++i) { @@ -629,46 +629,71 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl value = m_optgroup->get_config_value(*config, opt_key); tab_print->set_value(opt_key, value); } - - if (opt_key == "brim"){ - if (boost::any_cast(value) == true) - { - double brim_width = config->opt_float("brim_width");// m_optgroup->get_config_value(*config, "brim_width"); - if (brim_width == 0.0) - tab_print->set_value("brim_width", wxString("10")); + else{ + DynamicPrintConfig new_conf = *config; + if (opt_key == "brim"){ + double new_val; + double brim_width = config->opt_float("brim_width"); + if (boost::any_cast(value) == true) + { + new_val = m_brim_width == 0.0 ? 10 : + m_brim_width < 0.0 ? m_brim_width * (-1) : + m_brim_width; + } + else{ + m_brim_width = brim_width * (-1); + new_val = 0; + } + new_conf.set_key_value("brim_width", new ConfigOptionFloat(new_val)); } - else - tab_print->set_value("brim_width", wxString("0")); + else{ //(opt_key == "support") + const wxString& selection = boost::any_cast(value); + + auto support_material = selection == _("None") ? false : true; + new_conf.set_key_value("support_material", new ConfigOptionBool(support_material)); + + if (selection == _("Everywhere")) + new_conf.set_key_value("support_material_buildplate_only", new ConfigOptionBool(false)); + else if (selection == _("Support on build plate only")) + new_conf.set_key_value("support_material_buildplate_only", new ConfigOptionBool(true)); + } + tab_print->load_config(new_conf); } tab_print->update_dirty(); - }; + const int width = 250; Option option = m_optgroup->get_option("fill_density"); option.opt.sidetext = ""; - option.opt.width = 200; + option.opt.width = width; m_optgroup->append_single_option_line(option); ConfigOptionDef def; def.label = L("Support"); - def.type = coString; + def.type = coStrings; def.gui_type = "select_open"; def.tooltip = L("Select what kind of support do you need"); def.enum_labels.push_back(L("None")); def.enum_labels.push_back(L("Support on build plate only")); def.enum_labels.push_back(L("Everywhere")); - def.default_value = new ConfigOptionString(L("None")); + std::string selection = !config->opt_bool("support_material") ? + "None" : + config->opt_bool("support_material_buildplate_only") ? + "Support on build plate only" : + "Everywhere"; + def.default_value = new ConfigOptionStrings { selection }; option = Option(def, "support"); - option.opt.width = 200; + option.opt.width = width; m_optgroup->append_single_option_line(option); + m_brim_width = config->opt_float("brim_width"); def.label = L("Brim"); def.type = coBool; def.tooltip = L("This flag enables the brim that will be printed around each object on the first layer."); - def.default_value = new ConfigOptionBool{ false }; // 1; def.gui_type = ""; + def.default_value = new ConfigOptionBool{ m_brim_width > 0.0 ? true : false }; option = Option(def, "brim"); m_optgroup->append_single_option_line(option); diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 066519650..b30738700 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -315,9 +315,14 @@ void Tab::on_value_change(std::string opt_key, boost::any value) value = get_optgroup()->get_config_value(*m_config, opt_key); get_optgroup()->set_value(opt_key, value); } - if (opt_key == "support") + if (opt_key == "support_material" || opt_key == "support_material_buildplate_only") { - + wxString new_selection = !m_config->opt_bool("support_material") ? + _("None") : + m_config->opt_bool("support_material_buildplate_only") ? + _("Support on build plate only") : + _("Everywhere"); + get_optgroup()->set_value("support", new_selection); } if (opt_key == "brim_width") { @@ -343,6 +348,22 @@ void Tab::on_presets_changed() } } +void Tab::update_frequently_changed_parameters() +{ + boost::any value = get_optgroup()->get_config_value(*m_config, "fill_density"); + get_optgroup()->set_value("fill_density", value); + + wxString new_selection = !m_config->opt_bool("support_material") ? + _("None") : + m_config->opt_bool("support_material_buildplate_only") ? + _("Support on build plate only") : + _("Everywhere"); + get_optgroup()->set_value("support", new_selection); + + bool val = m_config->opt_float("brim_width") > 0.0 ? true : false; + get_optgroup()->set_value("brim", val); +} + void Tab::reload_compatible_printers_widget() { bool has_any = !m_config->option("compatible_printers")->values.empty(); @@ -1388,15 +1409,13 @@ void TabPrinter::update(){ void Tab::load_current_preset() { auto preset = m_presets->get_edited_preset(); -// try{ -// local $SIG{ __WARN__ } = Slic3r::GUI::warning_catcher($self); - preset.is_default ? m_btn_delete_preset->Disable() : m_btn_delete_preset->Enable(true); - update(); - // For the printer profile, generate the extruder pages. - on_preset_loaded(); - // Reload preset pages with the new configuration values. - reload_config(); -// }; + preset.is_default ? m_btn_delete_preset->Disable() : m_btn_delete_preset->Enable(true); + update(); + // For the printer profile, generate the extruder pages. + on_preset_loaded(); + // Reload preset pages with the new configuration values. + reload_config(); + // use CallAfter because some field triggers schedule on_change calls using CallAfter, // and we don't want them to be called after this update_dirty() as they would mark the // preset dirty again @@ -1407,6 +1426,11 @@ void Tab::load_current_preset() return; update_tab_ui(); on_presets_changed(); + + if (name() == "print"){ + update_frequently_changed_parameters(); + update_changed_ui(); + } }); } diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index 4745aa732..e2dc51ee4 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -173,6 +173,7 @@ public: protected: void on_presets_changed(); + void update_frequently_changed_parameters(); }; //Slic3r::GUI::Tab::Print; From d9e2e37da78e55aefd6b26d48daf98c9218aef08 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 14 Mar 2018 10:14:48 +0100 Subject: [PATCH 27/47] Fixed bug with update infill parameters --- xs/src/slic3r/GUI/GUI.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index efaffd1a0..262d41a79 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -628,6 +628,7 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl if (opt_key == "fill_density"){ value = m_optgroup->get_config_value(*config, opt_key); tab_print->set_value(opt_key, value); + tab_print->update(); } else{ DynamicPrintConfig new_conf = *config; From 6d5d38eb6a69d138bccd04fb8c34776a48137588 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 14 Mar 2018 11:45:31 +0100 Subject: [PATCH 28/47] Fixed bug_2 with update infill parameters --- xs/src/slic3r/GUI/Tab.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index b30738700..858eb8bcf 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -731,13 +731,16 @@ void TabPrint::update() "\nShall I switch to rectilinear fill pattern?")); auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Infill")), wxICON_WARNING | wxYES | wxNO); DynamicPrintConfig new_conf = *m_config; + double fill_density; if (dialog->ShowModal() == wxID_YES) { new_conf.set_key_value("fill_pattern", new ConfigOptionEnum(ipRectilinear)); - new_conf.set_key_value("fill_density", new ConfigOptionPercent(100)); + fill_density = 100; } else - new_conf.set_key_value("fill_density", new ConfigOptionPercent(40)); + fill_density = 40; + new_conf.set_key_value("fill_density", new ConfigOptionPercent(fill_density)); load_config(new_conf); + on_value_change("fill_density", fill_density); } } } From de2d08f626fd3d722c0f66250f912793d20e37e8 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 14 Mar 2018 15:00:12 +0100 Subject: [PATCH 29/47] Update of G-code preview colors by Jindra. --- lib/Slic3r/GUI/Plater/3DPreview.pm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/Slic3r/GUI/Plater/3DPreview.pm b/lib/Slic3r/GUI/Plater/3DPreview.pm index d86615218..8f3fa49f5 100644 --- a/lib/Slic3r/GUI/Plater/3DPreview.pm +++ b/lib/Slic3r/GUI/Plater/3DPreview.pm @@ -253,19 +253,19 @@ sub new { # sets colors for gcode preview extrusion roles my @extrusion_roles_colors = ( - 'Perimeter' => 'FFA500', - 'External perimeter' => 'FFFF66', + 'Perimeter' => 'FFFF66', + 'External perimeter' => 'FFA500', 'Overhang perimeter' => '0000FF', - 'Internal infill' => 'FF0000', - 'Solid infill' => 'CD00CD', - 'Top solid infill' => 'FF3333', + 'Internal infill' => 'B1302A', + 'Solid infill' => 'D732D7', + 'Top solid infill' => 'FF1A1A', 'Bridge infill' => '9999FF', 'Gap fill' => 'FFFFFF', - 'Skirt' => '7F0000', + 'Skirt' => '845321', 'Support material' => '00FF00', 'Support material interface' => '008000', 'Wipe tower' => 'B3E3AB', - 'Custom' => 'FFFF00', + 'Custom' => '28CC94', ); $self->gcode_preview_data->set_extrusion_paths_colors(\@extrusion_roles_colors); From 15b2522ed9266c3f4cc9be55376b148e44062a2f Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 14 Mar 2018 15:10:16 +0100 Subject: [PATCH 30/47] Update "fill_density" to initial preset value instead of to 40% --- xs/src/slic3r/GUI/Tab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 858eb8bcf..212b451e4 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -737,7 +737,7 @@ void TabPrint::update() fill_density = 100; } else - fill_density = 40; + fill_density = m_presets->get_selected_preset().config.option("fill_density")->value; new_conf.set_key_value("fill_density", new ConfigOptionPercent(fill_density)); load_config(new_conf); on_value_change("fill_density", fill_density); From 639f2bc2f3b91ef86c221a7ce1851fe6f5fd1699 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 14 Mar 2018 15:38:54 +0100 Subject: [PATCH 31/47] Update m_initial_extruders_count after preset changing --- xs/src/slic3r/GUI/Tab.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 212b451e4..09d346ce3 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -1430,10 +1430,11 @@ void Tab::load_current_preset() update_tab_ui(); on_presets_changed(); - if (name() == "print"){ + if (name() == "print") update_frequently_changed_parameters(); - update_changed_ui(); - } + if (m_name == "printer") + static_cast(this)->m_initial_extruders_count = static_cast(this)->m_extruders_count; + update_changed_ui(); }); } From 37f142940073694456d7826d759b19f8d58ea4eb Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 14 Mar 2018 16:05:51 +0100 Subject: [PATCH 32/47] Yet another fix of the unix static Makefile (#793) --- doc/deps-build/unix-static/Makefile | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/deps-build/unix-static/Makefile b/doc/deps-build/unix-static/Makefile index 71e46320b..21740bc53 100644 --- a/doc/deps-build/unix-static/Makefile +++ b/doc/deps-build/unix-static/Makefile @@ -67,13 +67,17 @@ $(TBB).tar.gz: curl -L -o $@ https://github.com/wjakob/tbb/archive/$(TBB_SHA).tar.gz +# Note: libcurl build system seems to be a bit wonky about finding openssl (cf. #2378). +# It seems that currently the only working option is to set a prefix in the openssl build +# and use the `--with-ssl=...` option in libcurl. +# Additionally, pkg-config needs to be installed and openssl libs need to NOT be installed on the build system. libopenssl: $(OPENSSL).tar.gz tar -zxvf $(OPENSSL).tar.gz - cd $(OPENSSL) && ./config --openssldir=/etc/ssl shared no-ssl3-method no-dynamic-engine '-Wa,--noexecstack' - make -C $(OPENSSL) depend - make -C $(OPENSSL) -j$(NPROC) - make -C $(OPENSSL) install DESTDIR=$(DESTDIR) + cd $(OPENSSL) && ./config --prefix=$(DESTDIR)/usr/local no-shared no-ssl3-method no-dynamic-engine '-Wa,--noexecstack' + $(MAKE) -C $(OPENSSL) depend + $(MAKE) -C $(OPENSSL) -j$(NPROC) + $(MAKE) -C $(OPENSSL) install_sw $(OPENSSL).tar.gz: curl -L -o $@ 'https://github.com/openssl/openssl/archive/OpenSSL_1_1_0g.tar.gz' @@ -82,10 +86,9 @@ $(OPENSSL).tar.gz: libcurl: libopenssl $(CURL).tar.gz tar -zxvf $(CURL).tar.gz -# Note: It seems setting custom openssl path doesn't work when pkg-config and system openssl devel libs are installed cd $(CURL) && ./configure \ --enable-static \ - --enable-shared \ + --disable-shared \ --with-ssl=$(DESTDIR)/usr/local \ --with-pic \ --enable-ipv6 \ From b43a21d1be20963c5afb8c6df8f4618c62c8d0e4 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 14 Mar 2018 16:11:57 +0100 Subject: [PATCH 33/47] Extended Print::validate() to check, whether the objects are inside the print volume. --- xs/src/libslic3r/BoundingBox.hpp | 26 +------- xs/src/libslic3r/Model.cpp | 104 ++++++++++++++++++------------- xs/src/libslic3r/Model.hpp | 7 ++- xs/src/libslic3r/Print.cpp | 7 +++ 4 files changed, 73 insertions(+), 71 deletions(-) diff --git a/xs/src/libslic3r/BoundingBox.hpp b/xs/src/libslic3r/BoundingBox.hpp index b425a4e3c..92a2bd451 100644 --- a/xs/src/libslic3r/BoundingBox.hpp +++ b/xs/src/libslic3r/BoundingBox.hpp @@ -100,31 +100,7 @@ public: } bool contains(const BoundingBox3Base& other) const { - if (!contains(other.min)) - return false; - - if (!contains(PointClass(other.max.x, other.min.y, other.min.z))) - return false; - - if (!contains(PointClass(other.max.x, other.max.y, other.min.z))) - return false; - - if (!contains(PointClass(other.min.x, other.max.y, other.min.z))) - return false; - - if (!contains(PointClass(other.min.x, other.min.y, other.max.z))) - return false; - - if (!contains(PointClass(other.max.x, other.min.y, other.max.z))) - return false; - - if (!contains(other.max)) - return false; - - if (!contains(PointClass(other.min.x, other.max.y, other.max.z))) - return false; - - return true; + return contains(other.min) && contains(other.max); } }; diff --git a/xs/src/libslic3r/Model.cpp b/xs/src/libslic3r/Model.cpp index 944bf7743..41bb17ccf 100644 --- a/xs/src/libslic3r/Model.cpp +++ b/xs/src/libslic3r/Model.cpp @@ -233,51 +233,8 @@ BoundingBoxf3 Model::bounding_box() const BoundingBoxf3 Model::transformed_bounding_box() const { BoundingBoxf3 bb; - for (const ModelObject* obj : this->objects) - { - for (const ModelVolume* vol : obj->volumes) - { - if (!vol->modifier) - { - for (const ModelInstance* inst : obj->instances) - { - double c = cos(inst->rotation); - double s = sin(inst->rotation); - - for (int f = 0; f < vol->mesh.stl.stats.number_of_facets; ++f) - { - const stl_facet& facet = vol->mesh.stl.facet_start[f]; - - for (int i = 0; i < 3; ++i) - { - // original point - const stl_vertex& v = facet.vertex[i]; - Pointf3 p((double)v.x, (double)v.y, (double)v.z); - - // scale - p.x *= inst->scaling_factor; - p.y *= inst->scaling_factor; - p.z *= inst->scaling_factor; - - // rotate Z - double x = p.x; - double y = p.y; - p.x = c * x - s * y; - p.y = s * x + c * y; - - // translate - p.x += inst->offset.x; - p.y += inst->offset.y; - - bb.merge(p); - } - } - } - } - } - } - + bb.merge(obj->tight_bounding_box(false)); return bb; } @@ -477,6 +434,15 @@ bool Model::fits_print_volume(const DynamicPrintConfig* config) const return print_volume.contains(transformed_bounding_box()); } +bool Model::fits_print_volume(const FullPrintConfig &config) const +{ + if (objects.empty()) + return true; + BoundingBox bed_box_2D = get_extents(Polygon::new_scale(config.bed_shape.values)); + BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config.max_print_height)); + return print_volume.contains(transformed_bounding_box()); +} + ModelObject::ModelObject(Model *model, const ModelObject &other, bool copy_volumes) : name(other.name), input_file(other.input_file), @@ -607,7 +573,7 @@ void ModelObject::clear_instances() // Returns the bounding box of the transformed instances. // This bounding box is approximate and not snug. -BoundingBoxf3 ModelObject::bounding_box() +const BoundingBoxf3& ModelObject::bounding_box() { if (! m_bounding_box_valid) { BoundingBoxf3 raw_bbox; @@ -623,6 +589,54 @@ BoundingBoxf3 ModelObject::bounding_box() return m_bounding_box; } +BoundingBoxf3 ModelObject::tight_bounding_box(bool include_modifiers) const +{ + BoundingBoxf3 bb; + + for (const ModelVolume* vol : this->volumes) + { + if (include_modifiers || !vol->modifier) + { + for (const ModelInstance* inst : this->instances) + { + double c = cos(inst->rotation); + double s = sin(inst->rotation); + + for (int f = 0; f < vol->mesh.stl.stats.number_of_facets; ++f) + { + const stl_facet& facet = vol->mesh.stl.facet_start[f]; + + for (int i = 0; i < 3; ++i) + { + // original point + const stl_vertex& v = facet.vertex[i]; + Pointf3 p((double)v.x, (double)v.y, (double)v.z); + + // scale + p.x *= inst->scaling_factor; + p.y *= inst->scaling_factor; + p.z *= inst->scaling_factor; + + // rotate Z + double x = p.x; + double y = p.y; + p.x = c * x - s * y; + p.y = s * x + c * y; + + // translate + p.x += inst->offset.x; + p.y += inst->offset.y; + + bb.merge(p); + } + } + } + } + } + + return bb; +} + // A mesh containing all transformed instances of this object. TriangleMesh ModelObject::mesh() const { diff --git a/xs/src/libslic3r/Model.hpp b/xs/src/libslic3r/Model.hpp index 7ef1803ac..173bf0c1a 100644 --- a/xs/src/libslic3r/Model.hpp +++ b/xs/src/libslic3r/Model.hpp @@ -102,8 +102,12 @@ public: // Returns the bounding box of the transformed instances. // This bounding box is approximate and not snug. - BoundingBoxf3 bounding_box(); + // This bounding box is being cached. + const BoundingBoxf3& bounding_box(); void invalidate_bounding_box() { m_bounding_box_valid = false; } + // Returns a snug bounding box of the transformed instances. + // This bounding box is not being cached. + BoundingBoxf3 tight_bounding_box(bool include_modifiers) const; // A mesh containing all transformed instances of this object. TriangleMesh mesh() const; @@ -278,6 +282,7 @@ public: // Returs true if this model is contained into the print volume defined inside the given config bool fits_print_volume(const DynamicPrintConfig* config) const; + bool fits_print_volume(const FullPrintConfig &config) const; void print_info() const { for (const ModelObject *o : this->objects) o->print_info(); } }; diff --git a/xs/src/libslic3r/Print.cpp b/xs/src/libslic3r/Print.cpp index 1ff764e4a..13f4fab79 100644 --- a/xs/src/libslic3r/Print.cpp +++ b/xs/src/libslic3r/Print.cpp @@ -508,6 +508,13 @@ bool Print::has_skirt() const std::string Print::validate() const { + BoundingBox bed_box_2D = get_extents(Polygon::new_scale(config.bed_shape.values)); + BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config.max_print_height)); + for (PrintObject *po : this->objects) { + if (! print_volume.contains(po->model_object()->tight_bounding_box(false))) + return "Some objects are outside of the print volume."; + } + if (this->config.complete_objects) { // Check horizontal clearance. { From b62f721ea68a8fd64b604bf1c07f9644ec9241de Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 14 Mar 2018 16:30:51 +0100 Subject: [PATCH 34/47] Replaced the Prusa specific config bundles with a single PrusaResearch.ini, so the Wizard will now offer just a single file. This file was copied from the profile_inheritance branch to test the new profile hierarchy before the branch gets merged into the master. --- resources/profiles/PrusaResearch.ini | 1013 ++++++++++++++++++++++++++ 1 file changed, 1013 insertions(+) create mode 100644 resources/profiles/PrusaResearch.ini diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini new file mode 100644 index 000000000..d1bd4f552 --- /dev/null +++ b/resources/profiles/PrusaResearch.ini @@ -0,0 +1,1013 @@ +# Print profiles for the Prusa Research printers. + +[vendor] +# Vendor name will be shown by the Config Wizard. +name = Prusa Research +# Configuration version of this file. Config file will only be installed, if the config_version differs. +# This means, the server may force the Slic3r configuration to be downgraded. +config_version = 0.1 +# Where to get the updates from? +config_update_url = https://raw.githubusercontent.com/prusa3d/Slic3r-settings/master/live/PrusaResearch.ini + +# The printer models will be shown by the Configuration Wizard in this order, +# also the first model installed & the first nozzle installed will be activated after install. +#TODO: One day we may differentiate variants of the nozzles / hot ends, +#for example by the melt zone size, or whether the nozzle is hardened. +[printer_model:MK3] +variants = 0.4; 0.25; 0.6 + +[printer_model:MK2S] +variants = 0.4; 0.25; 0.6 + +[printer_model:MK2SMM] +# Printer model name will be shown by the installation wizard. +name = MK2S Multi Material +variants = 0.4; 0.6 + +# All presets starting with asterisk, for example *common*, are intermediate and they will +# not make it into the user interface. + +# Common print preset, mostly derived from MK2 single material with a 0.4mm nozzle. +# All other print presets will derive from the *common* print preset. +[print:*common*] +avoid_crossing_perimeters = 0 +bridge_acceleration = 1000 +bridge_angle = 0 +bridge_flow_ratio = 0.8 +bridge_speed = 20 +brim_width = 0 +clip_multipart_objects = 1 +compatible_printers = +complete_objects = 0 +default_acceleration = 1000 +dont_support_bridges = 1 +elefant_foot_compensation = 0 +ensure_vertical_shell_thickness = 1 +external_fill_pattern = rectilinear +external_perimeters_first = 0 +external_perimeter_extrusion_width = 0.45 +extra_perimeters = 0 +extruder_clearance_height = 20 +extruder_clearance_radius = 20 +extrusion_width = 0.45 +fill_angle = 45 +fill_density = 20% +fill_pattern = cubic +first_layer_acceleration = 1000 +first_layer_extrusion_width = 0.42 +first_layer_height = 0.2 +first_layer_speed = 30 +gap_fill_speed = 40 +gcode_comments = 0 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0.45 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 25% +interface_shells = 0 +max_print_speed = 100 +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +max_volumetric_speed = 0 +min_skirt_length = 4 +notes = +overhangs = 0 +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = [input_filename_base].gcode +perimeters = 2 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.45 +post_process = +print_settings_id = +raft_layers = 0 +resolution = 0 +seam_position = nearest +skirts = 1 +skirt_distance = 2 +skirt_height = 3 +small_perimeter_speed = 20 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.45 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_extruder = 0 +support_material_extrusion_width = 0.35 +support_material_interface_extruder = 0 +support_material_angle = 0 +support_material_buildplate_only = 0 +support_material_enforce_layers = 0 +support_material_contact_distance = 0.15 +support_material_interface_contact_loops = 0 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.2 +support_material_interface_speed = 100% +support_material_pattern = rectilinear +support_material_spacing = 2 +support_material_speed = 50 +support_material_synchronize_layers = 0 +support_material_threshold = 45 +support_material_with_sheath = 0 +support_material_xy_spacing = 60% +thin_walls = 0 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 40 +travel_speed = 180 +wipe_tower = 0 +wipe_tower_per_color_wipe = 20 +wipe_tower_width = 60 +wipe_tower_x = 180 +wipe_tower_y = 140 +xy_size_compensation = 0 + +# Print parameters common to a 0.25mm diameter nozzle. +[print:*0.25nozzle*] +external_perimeter_extrusion_width = 0.25 +extrusion_width = 0.25 +first_layer_extrusion_width = 0.25 +infill_extrusion_width = 0.25 +perimeter_extrusion_width = 0.25 +solid_infill_extrusion_width = 0.25 +top_infill_extrusion_width = 0.25 +support_material_extrusion_width = 0.18 +support_material_interface_layers = 0 +support_material_interface_spacing = 0.15 +support_material_spacing = 1 +support_material_xy_spacing = 150% + +# Print parameters common to a 0.6mm diameter nozzle. +[print:*0.6nozzle*] +external_perimeter_extrusion_width = 0.61 +extrusion_width = 0.67 +first_layer_extrusion_width = 0.65 +infill_extrusion_width = 0.7 +perimeter_extrusion_width = 0.65 +solid_infill_extrusion_width = 0.65 +top_infill_extrusion_width = 0.6 + +[print:*soluble_support*] +overhangs = 1 +skirts = 0 +support_material = 1 +support_material_contact_distance = 0 +support_material_extruder = 4 +support_material_extrusion_width = 0.45 +support_material_interface_extruder = 4 +support_material_interface_spacing = 0.1 +support_material_synchronize_layers = 1 +support_material_threshold = 80 +support_material_with_sheath = 1 +wipe_tower = 1 + +[print:*0.05mm*] +inherits = *common* +bottom_solid_layers = 10 +bridge_acceleration = 300 +bridge_flow_ratio = 0.7 +default_acceleration = 500 +external_perimeter_speed = 20 +fill_density = 20% +first_layer_acceleration = 500 +gap_fill_speed = 20 +infill_acceleration = 800 +infill_speed = 30 +max_print_speed = 80 +small_perimeter_speed = 15 +solid_infill_speed = 30 +support_material_extrusion_width = 0.3 +support_material_spacing = 1.5 +layer_height = 0.05 +perimeter_acceleration = 300 +perimeter_speed = 30 +perimeters = 3 +support_material_speed = 30 +top_solid_infill_speed = 20 +top_solid_layers = 15 + +[print:0.05mm ULTRADETAIL] +inherits = *0.05mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 +infill_extrusion_width = 0.5 + +[print:0.05mm ULTRADETAIL MK3] +inherits = *0.05mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +fill_pattern = grid +top_infill_extrusion_width = 0.4 + +[print:0.05mm ULTRADETAIL 0.25 nozzle] +inherits = *0.05mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 +external_perimeter_extrusion_width = 0 +extrusion_width = 0.28 +fill_density = 20% +first_layer_extrusion_width = 0.3 +infill_extrusion_width = 0 +infill_speed = 20 +max_print_speed = 100 +perimeter_extrusion_width = 0 +perimeter_speed = 20 +small_perimeter_speed = 10 +solid_infill_extrusion_width = 0 +solid_infill_speed = 20 +support_material_speed = 20 +top_infill_extrusion_width = 0 + +[print:0.05mm ULTRADETAIL 0.25 nozzle MK3] +inherits = *0.05mm*; *0.25nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 +fill_pattern = grid +top_infill_extrusion_width = 0.4 + +[print:*0.10mm*] +inherits = *common* +bottom_solid_layers = 7 +bridge_flow_ratio = 0.7 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 +layer_height = 0.1 +perimeter_acceleration = 800 +top_solid_layers = 9 + +[print:0.10mm DETAIL] +inherits = *0.10mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 +external_perimeter_speed = 40 +infill_acceleration = 2000 +infill_speed = 60 +perimeter_speed = 50 +solid_infill_speed = 50 + +[print:0.10mm DETAIL MK3] +inherits = *0.10mm* +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 35 +fill_pattern = grid +infill_acceleration = 1500 +infill_speed = 170 +max_print_speed = 200 +perimeter_speed = 45 +solid_infill_speed = 170 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 50 + +[print:0.10mm DETAIL 0.25 nozzle] +inherits = *0.10mm* +bridge_acceleration = 600 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 +external_perimeter_speed = 20 +infill_acceleration = 1600 +infill_speed = 40 +perimeter_acceleration = 600 +perimeter_speed = 25 +small_perimeter_speed = 10 +solid_infill_speed = 40 +top_solid_infill_speed = 30 + +[print:0.10mm DETAIL 0.25 nozzle MK3] +inherits = *0.10mm* +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 +external_perimeter_speed = 35 +fill_pattern = grid +infill_acceleration = 1500 +infill_speed = 170 +max_print_speed = 200 +perimeter_speed = 45 +solid_infill_speed = 170 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 50 + +[print:0.10mm DETAIL 0.6 nozzle MK3] +inherits = *0.10mm* +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +fill_pattern = grid +infill_acceleration = 1500 +infill_speed = 170 +max_print_speed = 200 +perimeter_speed = 45 +solid_infill_speed = 170 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 50 + +[print:*0.15mm*] +inherits = *common* +bottom_solid_layers = 5 +external_perimeter_speed = 40 +infill_acceleration = 2000 +infill_speed = 60 +layer_height = 0.15 +perimeter_acceleration = 800 +perimeter_speed = 50 +solid_infill_speed = 50 +top_infill_extrusion_width = 0.4 +top_solid_layers = 7 + +[print:0.15mm 100mms Linear Advance] +inherits = *0.15mm* +bridge_flow_ratio = 0.95 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 50 +infill_speed = 100 +max_print_speed = 150 +perimeter_speed = 60 +small_perimeter_speed = 30 +solid_infill_speed = 100 +support_material_speed = 60 +top_solid_infill_speed = 70 + +[print:0.15mm OPTIMAL] +inherits = *0.15mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 +top_infill_extrusion_width = 0.45 + +[print:0.15mm OPTIMAL 0.25 nozzle] +inherits = *0.15mm*; *0.25nozzle* +bridge_acceleration = 600 +bridge_flow_ratio = 0.7 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 +external_perimeter_speed = 20 +infill_acceleration = 1600 +infill_speed = 40 +perimeter_acceleration = 600 +perimeter_speed = 25 +small_perimeter_speed = 10 +solid_infill_speed = 40 +support_material_extrusion_width = 0.2 +top_solid_infill_speed = 30 + +[print:0.15mm OPTIMAL 0.6 nozzle] +inherits = *0.15mm*; *0.6nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 + +[print:0.15mm OPTIMAL MK3] +inherits = *0.15mm* +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 35 +fill_pattern = grid +infill_acceleration = 1500 +infill_speed = 170 +max_print_speed = 170 +perimeter_speed = 45 +solid_infill_speed = 170 +top_solid_infill_speed = 50 + +[print:0.15mm OPTIMAL SOLUBLE FULL] +inherits = *0.15mm*; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +external_perimeter_speed = 25 +notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +perimeter_speed = 40 +solid_infill_speed = 40 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 30 +wipe_tower = 1 + +[print:0.15mm OPTIMAL SOLUBLE INTERFACE] +inherits = 0.15mm OPTIMAL SOLUBLE FULL +notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 +support_material_xy_spacing = 80% + +[print:0.15mm OPTIMAL 0.25 nozzle MK3] +inherits = *0.15mm* +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 +external_perimeter_speed = 35 +fill_pattern = grid +infill_acceleration = 1500 +infill_speed = 170 +max_print_speed = 170 +perimeter_speed = 45 +solid_infill_speed = 170 +top_solid_infill_speed = 50 +[print:*0.20mm*] +inherits = *common* +bottom_solid_layers = 4 +bridge_flow_ratio = 0.95 +external_perimeter_speed = 40 +infill_acceleration = 2000 +infill_speed = 60 +layer_height = 0.2 +perimeter_acceleration = 800 +perimeter_speed = 50 +solid_infill_speed = 50 +top_infill_extrusion_width = 0.4 +top_solid_layers = 5 + +[print:0.15mm OPTIMAL 0.6 nozzle MK3] +inherits = *0.15mm* +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +fill_pattern = grid +infill_acceleration = 1500 +infill_speed = 170 +max_print_speed = 170 +perimeter_speed = 45 +solid_infill_speed = 170 +top_solid_infill_speed = 50 + +[print:0.20mm 100mms Linear Advance] +inherits = *0.20mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 50 +infill_speed = 100 +max_print_speed = 150 +perimeter_speed = 60 +small_perimeter_speed = 30 +solid_infill_speed = 100 +support_material_speed = 60 +top_solid_infill_speed = 70 + +[print:0.20mm FAST MK3] +inherits = *0.20mm* +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 35 +fill_pattern = grid +infill_acceleration = 1500 +infill_speed = 170 +max_print_speed = 170 +perimeter_speed = 45 +solid_infill_speed = 170 +top_solid_infill_speed = 50 + +[print:0.20mm NORMAL] +inherits = *0.20mm* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 + +[print:0.20mm NORMAL 0.6 nozzle] +inherits = *0.20mm*; *0.6nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 + +[print:0.20mm NORMAL SOLUBLE FULL] +inherits = *0.20mm*; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +external_perimeter_speed = 30 +notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +perimeter_speed = 40 +solid_infill_speed = 40 +top_solid_infill_speed = 30 + +[print:0.20mm NORMAL SOLUBLE INTERFACE] +inherits = 0.20mm NORMAL SOLUBLE FULL +notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 +support_material_xy_spacing = 80% + +[print:0.20mm FAST 0.6 nozzle MK3] +inherits = *0.20mm* +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +fill_pattern = grid +infill_acceleration = 1500 +infill_speed = 170 +max_print_speed = 170 +perimeter_speed = 45 +solid_infill_speed = 170 +top_solid_infill_speed = 50 + +[print:*0.35mm*] +inherits = *common* +bottom_solid_layers = 3 +external_perimeter_extrusion_width = 0.6 +external_perimeter_speed = 40 +first_layer_extrusion_width = 0.75 +infill_acceleration = 2000 +infill_speed = 60 +layer_height = 0.35 +perimeter_acceleration = 800 +perimeter_extrusion_width = 0.65 +perimeter_speed = 50 +solid_infill_extrusion_width = 0.65 +solid_infill_speed = 60 +top_solid_infill_speed = 50 +top_solid_layers = 4 + +[print:0.35mm FAST] +inherits = *0.35mm* +bridge_flow_ratio = 0.95 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 +first_layer_extrusion_width = 0.42 +perimeter_extrusion_width = 0.43 +solid_infill_extrusion_width = 0.7 +top_infill_extrusion_width = 0.43 + +[print:0.35mm FAST 0.6 nozzle] +inherits = *0.35mm*; *0.6nozzle* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 + +[print:0.35mm FAST sol full 0.6 nozzle] +inherits = *0.35mm*; *0.6nozzle*; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 +external_perimeter_extrusion_width = 0.6 +external_perimeter_speed = 30 +notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder +perimeter_speed = 40 +support_material_extrusion_width = 0.55 +support_material_interface_layers = 3 +support_material_xy_spacing = 120% +top_infill_extrusion_width = 0.57 + +[print:0.35mm FAST sol int 0.6 nozzle] +inherits = 0.35mm FAST sol full 0.6 nozzle +support_material_extruder = 0 +support_material_interface_layers = 2 +support_material_with_sheath = 0 +support_material_xy_spacing = 150% + +[filament:*common*] +cooling = 1 +compatible_printers = +compatible_printers_condition = +end_filament_gcode = "; Filament-specific end gcode" +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = +filament_soluble = 0 +min_print_speed = 5 +slowdown_below_layer_time = 20 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" + +[filament:*PLA*] +inherits = *common* +bed_temperature = 60 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +fan_always_on = 1 +fan_below_layer_time = 100 +filament_colour = #FF3232 +filament_max_volumetric_speed = 15 +filament_type = PLA +first_layer_bed_temperature = 60 +first_layer_temperature = 215 +max_fan_speed = 100 +min_fan_speed = 100 +temperature = 210 + +[filament:*PET*] +inherits = *common* +bed_temperature = 90 +bridge_fan_speed = 50 +disable_fan_first_layers = 3 +fan_always_on = 1 +fan_below_layer_time = 20 +filament_colour = #FF8000 +filament_max_volumetric_speed = 8 +filament_type = PET +first_layer_bed_temperature = 85 +first_layer_temperature = 230 +max_fan_speed = 50 +min_fan_speed = 30 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" +temperature = 240 + +[filament:*ABS*] +inherits = *common* +bed_temperature = 110 +bridge_fan_speed = 30 +cooling = 0 +disable_fan_first_layers = 3 +fan_always_on = 0 +fan_below_layer_time = 20 +filament_colour = #3A80CA +filament_max_volumetric_speed = 11 +filament_type = ABS +first_layer_bed_temperature = 100 +first_layer_temperature = 255 +max_fan_speed = 30 +min_fan_speed = 20 +temperature = 255 + +[filament:*FLEX*] +inherits = *common* +bridge_fan_speed = 100 +compatible_printers_condition = nozzle_diameter[0]>0.35 and num_extruders==1 +cooling = 0 +disable_fan_first_layers = 1 +extrusion_multiplier = 1.2 +fan_always_on = 0 +fan_below_layer_time = 100 +filament_colour = #00CA0A +filament_max_volumetric_speed = 1.5 +filament_type = FLEX +first_layer_bed_temperature = 50 +first_layer_temperature = 240 +max_fan_speed = 90 +min_fan_speed = 70 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 240 + +[filament:ColorFabb Brass Bronze] +inherits = *PLA* +compatible_printers_condition = nozzle_diameter[0]>0.35 +extrusion_multiplier = 1.2 +filament_colour = #804040 +filament_max_volumetric_speed = 10 + +[filament:ColorFabb HT] +inherits = *PET* +bed_temperature = 110 +bridge_fan_speed = 30 +cooling = 1 +disable_fan_first_layers = 3 +fan_always_on = 0 +fan_below_layer_time = 10 +first_layer_bed_temperature = 105 +first_layer_temperature = 270 +max_fan_speed = 20 +min_fan_speed = 10 +min_print_speed = 5 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" +temperature = 270 + +[filament:ColorFabb PLA-PHA] +inherits = *PLA* + +[filament:ColorFabb Woodfil] +inherits = *PLA* +compatible_printers_condition = nozzle_diameter[0]>0.35 +extrusion_multiplier = 1.2 +filament_colour = #804040 +filament_max_volumetric_speed = 10 +first_layer_temperature = 200 +min_print_speed = 5 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 200 + +[filament:ColorFabb XT] +inherits = *PET* +filament_type = PLA +first_layer_bed_temperature = 90 +first_layer_temperature = 260 +temperature = 270 + +[filament:ColorFabb XT-CF20] +inherits = *PET* +extrusion_multiplier = 1.2 +filament_colour = #804040 +filament_max_volumetric_speed = 1 +first_layer_bed_temperature = 90 +first_layer_temperature = 260 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +temperature = 260 + +[filament:ColorFabb nGen] +inherits = *PET* +bridge_fan_speed = 40 +fan_always_on = 0 +fan_below_layer_time = 10 +filament_type = NGEN +first_layer_temperature = 240 +max_fan_speed = 35 +min_fan_speed = 20 + +[filament:ColorFabb nGen flex] +inherits = *FLEX* +bed_temperature = 85 +bridge_fan_speed = 40 +cooling = 1 +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +fan_below_layer_time = 10 +filament_max_volumetric_speed = 5 +first_layer_bed_temperature = 85 +first_layer_temperature = 260 +max_fan_speed = 35 +min_fan_speed = 20 +temperature = 260 + +[filament:E3D Edge] +inherits = *PET* +filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" + +[filament:E3D PC-ABS] +inherits = *ABS* +first_layer_temperature = 270 +temperature = 270 + +[filament:Fillamentum ABS] +inherits = *ABS* +first_layer_temperature = 240 +temperature = 240 + +[filament:Fillamentum ASA] +inherits = *ABS* +fan_always_on = 1 +first_layer_temperature = 265 +temperature = 265 + +[filament:Fillamentum CPE HG100 HM100] +inherits = *PET* +filament_notes = "CPE HG100 , CPE HM100" +first_layer_bed_temperature = 90 +first_layer_temperature = 275 +max_fan_speed = 50 +min_fan_speed = 50 +temperature = 275 + +[filament:Fillamentum Timberfil] +inherits = *PLA* +compatible_printers_condition = nozzle_diameter[0]>0.35 +extrusion_multiplier = 1.2 +filament_colour = #804040 +filament_max_volumetric_speed = 10 +first_layer_temperature = 190 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 190 + +[filament:Generic ABS] +inherits = *ABS* +filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" + +[filament:Generic PET] +inherits = *PET* +filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" + +[filament:Generic PLA] +inherits = *PLA* +filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" + +[filament:Polymaker PC-Max] +inherits = *ABS* +bed_temperature = 115 +filament_colour = #3A80CA +first_layer_bed_temperature = 100 +first_layer_temperature = 270 +temperature = 270 + +[filament:Primavalue PVA] +inherits = *PLA* +cooling = 0 +fan_always_on = 0 +filament_colour = #FFFFD7 +filament_max_volumetric_speed = 10 +filament_notes = "List of materials tested with standart PVA print settings for MK2:\n\nPrimaSelect PVA+\nICE FILAMENTS PVA 'NAUGHTY NATURAL'\nVerbatim BVOH" +filament_soluble = 1 +filament_type = PVA +first_layer_temperature = 195 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 195 + +[filament:Prusa ABS] +inherits = *ABS* +filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" + +[filament:Prusa HIPS] +inherits = *ABS* +bridge_fan_speed = 50 +cooling = 1 +extrusion_multiplier = 0.9 +fan_always_on = 1 +fan_below_layer_time = 10 +filament_colour = #FFFFD7 +filament_soluble = 1 +filament_type = HIPS +first_layer_temperature = 220 +max_fan_speed = 20 +min_fan_speed = 20 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 220 + +[filament:Prusa PET] +inherits = *PET* +filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" + +[filament:Prusa PLA] +inherits = *PLA* +filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" + +[filament:SemiFlex or Flexfill 98A] +inherits = *FLEX* + +[filament:Taulman Bridge] +inherits = *common* +bed_temperature = 90 +bridge_fan_speed = 40 +cooling = 0 +disable_fan_first_layers = 3 +fan_always_on = 0 +fan_below_layer_time = 20 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 10 +filament_soluble = 0 +filament_type = PET +first_layer_bed_temperature = 60 +first_layer_temperature = 240 +max_fan_speed = 5 +min_fan_speed = 0 +min_print_speed = 5 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 250 + +[filament:Taulman T-Glase] +inherits = *PET* +bridge_fan_speed = 40 +cooling = 0 +fan_always_on = 0 +first_layer_bed_temperature = 90 +first_layer_temperature = 240 +max_fan_speed = 5 +min_fan_speed = 0 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" + +[filament:Verbatim BVOH] +inherits = *common* +bed_temperature = 60 +bridge_fan_speed = 100 +cooling = 0 +disable_fan_first_layers = 1 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 100 +filament_colour = #FFFFD7 +filament_max_volumetric_speed = 10 +filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" +filament_soluble = 1 +filament_type = PLA +first_layer_bed_temperature = 60 +first_layer_temperature = 215 +max_fan_speed = 100 +min_fan_speed = 100 +min_print_speed = 15 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 210 + +[filament:Verbatim PP] +inherits = *common* +bed_temperature = 100 +bridge_fan_speed = 100 +cooling = 1 +disable_fan_first_layers = 2 +extrusion_multiplier = 1 +fan_always_on = 1 +fan_below_layer_time = 100 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 5 +filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nEsun PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nEUMAKERS PLA" +filament_type = PLA +first_layer_bed_temperature = 100 +first_layer_temperature = 220 +max_fan_speed = 100 +min_fan_speed = 100 +min_print_speed = 15 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 220 + +[printer:*common*] +bed_shape = 0x0,250x0,250x210,0x210 +before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n +between_objects_gcode = +deretract_speed = 0 +end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors +extruder_colour = #FFFF00 +extruder_offset = 0x0 +gcode_flavor = marlin +layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] +max_layer_height = 0.25 +min_layer_height = 0.07 +nozzle_diameter = 0.4 +octoprint_apikey = +octoprint_host = +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\n +printer_settings_id = +retract_before_travel = 1 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 0.8 +retract_length_toolchange = 4 +retract_lift = 0.6 +retract_lift_above = 0 +retract_lift_below = 199 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 35 +serial_port = +serial_speed = 250000 +single_extruder_multi_material = 0 +start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 1 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 +printer_model = MK2S +printer_variant = 0.4 +default_print_profile = 0.15mm OPTIMAL +default_filament_profile = Prusa PLA + +[printer:*multimaterial*] +inherits = *common* +deretract_speed = 50 +retract_before_travel = 3 +retract_before_wipe = 60% +retract_layer_change = 0 +retract_length = 4 +retract_lift = 0.6 +retract_lift_above = 0 +retract_lift_below = 199 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 80 +single_extruder_multi_material = 1 +printer_model = MK2SMM + +[printer:*mm-single*] +inherits = *multimaterial* +end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; fan off\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n\n +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN +start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG1 E-4 F1000.0\nG92 E0.0 + +[printer:*mm-multi*] +inherits = *multimaterial* +end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; fan off\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors +extruder_colour = #FFAA55;#5182DB;#4ECDD3;#FB7259 +nozzle_diameter = 0.4,0.4,0.4,0.4 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN +start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\n; Start G-Code sequence START\nT[initial_tool]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_wipe_tower}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG1 E-4 F1000.0\n{endif}\nG92 E0.0 +variable_layer_height = 0 + +[printer:Original Prusa i3 MK2] +inherits = *common* + +[printer:Original Prusa i3 MK2 0.25 nozzle] +inherits = *common* +max_layer_height = 0.1 +min_layer_height = 0.05 +nozzle_diameter = 0.25 +retract_length = 1 +retract_speed = 50 +variable_layer_height = 0 +printer_variant = 0.25 +default_print_profile = 0.10mm DETAIL 0.25 nozzle + +[printer:Original Prusa i3 MK2 0.6 nozzle] +inherits = *common* +max_layer_height = 0.35 +min_layer_height = 0.1 +nozzle_diameter = 0.6 +printer_variant = 0.6 + +[printer:Original Prusa i3 MK2 MM Single Mode] +inherits = *mm-single* + +[printer:Original Prusa i3 MK2 MM Single Mode 0.6 nozzle] +inherits = *mm-single* +nozzle_diameter = 0.6 +printer_variant = 0.6 + +[printer:Original Prusa i3 MK2 MultiMaterial] +inherits = *mm-multi* +nozzle_diameter = 0.4,0.4,0.4,0.4 + +[printer:Original Prusa i3 MK2 MultiMaterial 0.6 nozzle] +inherits = *mm-multi* +nozzle_diameter = 0.6,0.6,0.6,0.6 +printer_variant = 0.6 + +[printer:Original Prusa i3 MK3] +inherits = *common* +end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n +retract_lift_below = 209 +start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} +printer_model = MK3 +default_print_profile = 0.15mm OPTIMAL MK3 + +[printer:Original Prusa i3 MK3 0.25 nozzle] +inherits = *common* +nozzle_diameter = 0.25 +end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n +retract_lift_below = 209 +start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} +printer_model = MK3 +default_print_profile = 0.10mm DETAIL MK3 + +[printer:Original Prusa i3 MK3 0.6 nozzle] +inherits = *common* +nozzle_diameter = 0.6 +end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n +retract_lift_below = 209 +start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} +printer_model = MK3 +default_print_profile = 0.15mm OPTIMAL MK3 From 7c027ee2ff8e63d992ae367f14d363d6a94742d2 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 14 Mar 2018 16:44:29 +0100 Subject: [PATCH 35/47] Removed the old Prusa specific config bundles. --- .../Original Prusa i3 MK2 and MK2S.ini | 3376 ---------------- ...inal Prusa i3 MK2, MK2S, MK2MM and MK3.ini | 976 ----- .../profiles/Original Prusa i3 MK2MM.ini | 3419 ----------------- resources/profiles/Original Prusa i3 MK3.ini | 3295 ---------------- 4 files changed, 11066 deletions(-) delete mode 100644 resources/profiles/Original Prusa i3 MK2 and MK2S.ini delete mode 100644 resources/profiles/Original Prusa i3 MK2, MK2S, MK2MM and MK3.ini delete mode 100644 resources/profiles/Original Prusa i3 MK2MM.ini delete mode 100644 resources/profiles/Original Prusa i3 MK3.ini diff --git a/resources/profiles/Original Prusa i3 MK2 and MK2S.ini b/resources/profiles/Original Prusa i3 MK2 and MK2S.ini deleted file mode 100644 index a186c3775..000000000 --- a/resources/profiles/Original Prusa i3 MK2 and MK2S.ini +++ /dev/null @@ -1,3376 +0,0 @@ -# generated by Slic3r Prusa Edition 1.39.0 on 2018-01-06 at 15:10:57 - -[print:0.05mm DETAIL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 25% -fill_pattern = cubic -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.5 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 30 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 80 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 30 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 15 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 30 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.3 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1.5 -support_material_speed = 30 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 180 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.05mm DETAIL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.28 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.3 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 20 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0 -perimeter_speed = 20 -perimeters = 4 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0 -solid_infill_speed = 20 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.18 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 20 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 200 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.05mm DETAIL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 25% -fill_pattern = grid -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 30 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 80 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 30 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 15 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 30 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.3 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1.5 -support_material_speed = 30 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 180 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 600 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.25 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.25 -fill_angle = 45 -fill_density = 15% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.25 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1600 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.25 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 40 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 600 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.25 -perimeter_speed = 25 -perimeters = 4 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.25 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.18 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.25 -top_solid_infill_speed = 30 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 3500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 200 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 250 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 200 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 5 -travel_speed = 250 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm 100mms Linear Advance] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 50 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 100 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 150 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 60 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 30 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 100 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 60 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 70 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 600 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.25 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.25 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.25 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1600 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.25 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 40 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 600 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.25 -perimeter_speed = 25 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.25 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.2 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 35 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.25 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 40 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 3500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 200 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 250 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 200 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 5 -travel_speed = 250 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL SOLUBLE FULL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 25 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 1 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL SOLUBLE INTERFACE] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 25 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm 100mms Linear Advance] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 50 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 100 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 150 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 60 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 30 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 100 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 60 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 70 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm FAST MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 3500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 200 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 250 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 200 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 5 -travel_speed = 250 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 40 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 40 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL SOLUBLE FULL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 1 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 30 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL SOLUBLE INTERFACE] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 30 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.7 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.43 -perimeter_speed = 50 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.7 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.43 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 50 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST sol full 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.55 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.57 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST sol int 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.55 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.57 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[filament:ColorFabb Brass Bronze] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.3 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 210 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 210 - -[filament:ColorFabb HT] -bed_temperature = 105 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 105 -first_layer_temperature = 270 -max_fan_speed = 20 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 270 - -[filament:ColorFabb PLA-PHA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:ColorFabb Woodfil] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 200 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 200 - -[filament:ColorFabb XT] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 270 - -[filament:ColorFabb XT-CF20] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 1 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 260 - -[filament:ColorFabb nGen] -bed_temperature = 85 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = NGEN -first_layer_bed_temperature = 85 -first_layer_temperature = 240 -max_fan_speed = 35 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:ColorFabb nGen flex] -bed_temperature = 85 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 5 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = FLEX -first_layer_bed_temperature = 85 -first_layer_temperature = 260 -max_fan_speed = 35 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 260 - -[filament:E3D Edge] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:E3D PC-ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 270 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 270 - -[filament:Fillamentum ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 240 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 240 - -[filament:Fillamentum ASA] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 265 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 265 - -[filament:Fillamentum CPE HG100 HM100] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "CPE HG100 , CPE HM100" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -max_fan_speed = 80 -min_fan_speed = 80 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 260 - -[filament:Fillamentum Timberfil] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 190 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 190 - -[filament:Generic ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 255 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 255 - -[filament:Generic PET] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:Generic PLA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:Polymaker PC-Max] -bed_temperature = 120 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 120 -first_layer_temperature = 270 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 270 - -[filament:Primavalue PVA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PVA print settings for MK2:\n\nPrimaSelect PVA+\nICE FILAMENTS PVA 'NAUGHTY NATURAL'\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 1 -filament_type = PVA -first_layer_bed_temperature = 60 -first_layer_temperature = 195 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 195 - -[filament:Prusa ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 255 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 255 - -[filament:Prusa HIPS] -bed_temperature = 100 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 0.9 -fan_always_on = 1 -fan_below_layer_time = 10 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 1 -filament_type = HIPS -first_layer_bed_temperature = 100 -first_layer_temperature = 220 -max_fan_speed = 20 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 220 - -[filament:Prusa PET] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:Prusa PLA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:SemiFlex or Flexfill 98A] -bed_temperature = 50 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 and num_extruders==1 -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #00CA0A -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 2.5 -filament_notes = "List of materials tested with FLEX print settings & FLEX material settings for MK2:\n\nFillamentum Flex 98A\nFillamentum Flex 92A\nPlasty Mladeč PP\nPlasty Mladeč TPE32 \nPlasty Mladeč TPE88" -filament_settings_id = -filament_soluble = 0 -filament_type = FLEX -first_layer_bed_temperature = 50 -first_layer_temperature = 220 -max_fan_speed = 90 -min_fan_speed = 70 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 230 - -[filament:Taulman Bridge] -bed_temperature = 50 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #DEE0E6 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 250 - -[filament:Taulman T-Glase] -bed_temperature = 90 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 240 - -[filament:Verbatim BVOH] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 1 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 210 - -[filament:Verbatim PP] -bed_temperature = 100 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 2 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #DEE0E6 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 5 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nEsun PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nEUMAKERS PLA" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 220 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 220 - -[printer:Original Prusa i3 MK2] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 0 -end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors -extruder_colour = #FFFF00 -extruder_offset = 0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.25 -min_layer_height = 0.07 -nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\n -printer_settings_id = -retract_before_travel = 1 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 0.8 -retract_length_toolchange = 3 -retract_lift = 0.6 -retract_lift_above = 0 -retract_lift_below = 199 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 35 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 0 -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 - -[printer:Original Prusa i3 MK2 0.25 nozzle] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 0 -end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors -extruder_colour = #FFFF00 -extruder_offset = 0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.1 -min_layer_height = 0.05 -nozzle_diameter = 0.25 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\n -printer_settings_id = -retract_before_travel = 1 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 1 -retract_length_toolchange = 3 -retract_lift = 0.6 -retract_lift_above = 0 -retract_lift_below = 199 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 50 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 0 -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 0 -wipe = 1 -z_offset = 0 - -[printer:Original Prusa i3 MK2 0.6 nozzle] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 0 -end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors -extruder_colour = #FFFF00 -extruder_offset = 0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.35 -min_layer_height = 0.1 -nozzle_diameter = 0.6 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\n -printer_settings_id = -retract_before_travel = 1 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 0.8 -retract_length_toolchange = 3 -retract_lift = 0.6 -retract_lift_above = 0 -retract_lift_below = 199 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 35 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 0 -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 - -[presets] -print = 0.15mm OPTIMAL -printer = Original Prusa i3 MK2 -filament = Prusa PLA diff --git a/resources/profiles/Original Prusa i3 MK2, MK2S, MK2MM and MK3.ini b/resources/profiles/Original Prusa i3 MK2, MK2S, MK2MM and MK3.ini deleted file mode 100644 index 3c3602edb..000000000 --- a/resources/profiles/Original Prusa i3 MK2, MK2S, MK2MM and MK3.ini +++ /dev/null @@ -1,976 +0,0 @@ -# generated by Slic3r Prusa Edition 1.39.0.29-prusa3d-win64 on 2018-01-22 at 14:53:14 - -# All presets starting with asterisk, for example *common*, are intermediate and they will -# not make it into the user interface. - -# Common print preset, mostly derived from MK2 single material with a 0.4mm nozzle. -# All other print presets will derive from the *common* print preset. -[print:*common*] -avoid_crossing_perimeters = 0 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeters_first = 0 -external_perimeter_extrusion_width = 0.45 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -interface_shells = 0 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -overhangs = 0 -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirts = 1 -skirt_distance = 2 -skirt_height = 3 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_extruder = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_enforce_layers = 0 -support_material_interface_contact_loops = 0 -support_material_interface_layers = 2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -travel_speed = 180 -wipe_tower = 0 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -# Print parameters common to a 0.25mm diameter nozzle. -[print:*0.25nozzle*] -external_perimeter_extrusion_width = 0.25 -extrusion_width = 0.25 -first_layer_extrusion_width = 0.25 -infill_extrusion_width = 0.25 -perimeter_extrusion_width = 0.25 -solid_infill_extrusion_width = 0.25 -top_infill_extrusion_width = 0.25 -support_material_extrusion_width = 0.18 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_spacing = 1 -support_material_xy_spacing = 150% - -# Print parameters common to a 0.6mm diameter nozzle. -[print:*0.6nozzle*] -external_perimeter_extrusion_width = 0.61 -extrusion_width = 0.67 -first_layer_extrusion_width = 0.65 -infill_extrusion_width = 0.75 -perimeter_extrusion_width = 0.65 -solid_infill_extrusion_width = 0.65 -top_infill_extrusion_width = 0.6 - -[print:*soluble_support*] -overhangs = 1 -skirts = 0 -support_material = 1 -support_material_contact_distance = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.45 -support_material_interface_extruder = 4 -support_material_interface_spacing = 0.1 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 1 -support_material_xy_spacing = 120% -wipe_tower = 1 - -[print:*0.05mm*] -inherits = *common* -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_flow_ratio = 0.7 -default_acceleration = 500 -external_perimeter_speed = 20 -fill_density = 25% -first_layer_acceleration = 500 -gap_fill_speed = 20 -infill_acceleration = 800 -infill_speed = 30 -max_print_speed = 80 -small_perimeter_speed = 15 -solid_infill_speed = 30 -support_material_extrusion_width = 0.3 -support_material_interface_spacing = 0.2 -support_material_spacing = 1.5 -layer_height = 0.05 -perimeter_acceleration = 300 -perimeter_speed = 30 -perimeters = 3 -support_material_contact_distance = 0.15 -support_material_speed = 30 -top_solid_infill_speed = 20 -top_solid_layers = 15 - -[print:0.05mm DETAIL] -inherits = *0.05mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -infill_extrusion_width = 0.5 - -[print:0.05mm DETAIL MK3] -inherits = *0.05mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -fill_pattern = grid -top_infill_extrusion_width = 0.4 - -[print:0.05mm DETAIL 0.25 nozzle] -inherits = *0.05mm*; *0.25nozzle* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 -external_perimeter_extrusion_width = 0 -extrusion_width = 0.28 -fill_density = 20% -first_layer_extrusion_width = 0.3 -infill_extrusion_width = 0 -infill_speed = 20 -max_print_speed = 100 -perimeter_extrusion_width = 0 -perimeter_speed = 20 -perimeters = 4 -small_perimeter_speed = 10 -solid_infill_extrusion_width = 0 -solid_infill_speed = 20 -support_material_speed = 20 -top_infill_extrusion_width = 0 - -[print:*0.10mm*] -inherits = *common* -bottom_solid_layers = 7 -bridge_flow_ratio = 0.7 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -layer_height = 0.1 -perimeter_acceleration = 800 -support_material_contact_distance = 0.15 -support_material_interface_spacing = 0.2 -support_material_spacing = 2 -top_solid_layers = 9 - -[print:0.10mm DETAIL] -inherits = *0.10mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -external_perimeter_speed = 40 -infill_acceleration = 2000 -infill_speed = 60 -perimeter_speed = 50 -perimeters = 3 -solid_infill_speed = 50 - -[print:0.10mm DETAIL MK3] -inherits = *0.10mm* -bridge_flow_ratio = 0.8 -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -external_perimeter_speed = 35 -fill_pattern = grid -infill_acceleration = 1500 -infill_speed = 170 -max_print_speed = 170 -perimeter_speed = 45 -perimeters = 2 -solid_infill_speed = 170 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 - -[print:0.10mm DETAIL 0.25 nozzle] -inherits = *0.10mm*; *0.25nozzle* -bridge_acceleration = 600 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -external_perimeter_speed = 20 -fill_density = 15% -infill_acceleration = 1600 -infill_speed = 40 -perimeter_acceleration = 600 -perimeter_speed = 25 -perimeters = 4 -small_perimeter_speed = 10 -solid_infill_speed = 40 -top_solid_infill_speed = 30 - -[print:*0.15mm*] -inherits = *common* -bottom_solid_layers = 5 -external_perimeter_speed = 40 -infill_acceleration = 2000 -infill_speed = 60 -layer_height = 0.15 -perimeter_acceleration = 800 -perimeter_speed = 50 -perimeters = 3 -solid_infill_speed = 50 -support_material_contact_distance = 0.15 -support_material_interface_spacing = 0.2 -support_material_spacing = 2 -top_infill_extrusion_width = 0.4 -top_solid_layers = 7 - -[print:0.15mm 100mms Linear Advance] -inherits = *0.15mm* -bottom_solid_layers = 4 -bridge_flow_ratio = 0.95 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 50 -infill_speed = 100 -max_print_speed = 150 -perimeter_speed = 60 -perimeters = 2 -small_perimeter_speed = 30 -solid_infill_speed = 100 -support_material_speed = 60 -top_solid_infill_speed = 70 -top_solid_layers = 5 - -[print:0.15mm OPTIMAL] -inherits = *0.15mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -top_infill_extrusion_width = 0.45 - -[print:0.15mm OPTIMAL 0.25 nozzle] -inherits = *0.15mm*; *0.25nozzle* -bridge_acceleration = 600 -bridge_flow_ratio = 0.7 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -external_perimeter_speed = 20 -infill_acceleration = 1600 -infill_speed = 40 -perimeter_acceleration = 600 -perimeter_speed = 25 -perimeters = 2 -small_perimeter_speed = 10 -solid_infill_speed = 40 -support_material_extrusion_width = 0.2 -support_material_threshold = 35 -top_solid_infill_speed = 30 - -[print:0.15mm OPTIMAL 0.6 nozzle] -inherits = *0.15mm*; *0.6nozzle* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -wipe_tower = 1 - -[print:0.15mm OPTIMAL MK3] -inherits = *0.15mm* -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -external_perimeter_speed = 35 -fill_pattern = grid -infill_acceleration = 1500 -infill_speed = 170 -max_print_speed = 170 -perimeter_speed = 45 -perimeters = 2 -solid_infill_speed = 170 -top_solid_infill_speed = 50 -wipe_tower = 1 - -[print:0.15mm OPTIMAL SOLUBLE FULL] -inherits = *0.15mm*; *soluble_support* -bottom_solid_layers = 5 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -external_perimeter_speed = 25 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -perimeter_speed = 40 -solid_infill_speed = 40 -support_material_xy_spacing = 60% -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 - -[print:0.15mm OPTIMAL SOLUBLE INTERFACE] -inherits = 0.15mm OPTIMAL SOLUBLE FULL -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -support_material_extruder = 0 -support_material_interface_layers = 3 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% - -[print:*0.20mm*] -inherits = *common* -bottom_solid_layers = 4 -bridge_flow_ratio = 0.95 -external_perimeter_speed = 40 -infill_acceleration = 2000 -infill_speed = 60 -layer_height = 0.2 -perimeter_acceleration = 800 -perimeter_speed = 50 -perimeters = 2 -solid_infill_speed = 50 -support_material_contact_distance = 0.15 -support_material_interface_spacing = 0.2 -support_material_spacing = 2 -top_infill_extrusion_width = 0.4 -top_solid_layers = 5 -wipe_tower = 1 - -[print:0.20mm 100mms Linear Advance] -inherits = *0.20mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -external_perimeter_speed = 50 -infill_speed = 100 -max_print_speed = 150 -perimeter_speed = 60 -small_perimeter_speed = 30 -solid_infill_speed = 100 -support_material_speed = 60 -top_solid_infill_speed = 70 - -[print:0.20mm FAST MK3] -inherits = *0.20mm* -bridge_speed = 30 -bridge_flow_ratio = 0.8 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -external_perimeter_speed = 35 -fill_pattern = grid -infill_acceleration = 1500 -infill_speed = 170 -max_print_speed = 170 -perimeter_speed = 45 -solid_infill_speed = 170 -top_solid_infill_speed = 50 - -[print:0.20mm NORMAL] -inherits = *0.20mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 - -[print:0.20mm NORMAL 0.6 nozzle] -inherits = *0.20mm*; *0.6nozzle* -bridge_flow_ratio = 0.8 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -perimeters = 3 - -[print:0.20mm NORMAL SOLUBLE FULL] -inherits = *0.20mm*; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -external_perimeter_speed = 30 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -perimeter_speed = 40 -solid_infill_speed = 40 -top_solid_infill_speed = 30 - -[print:0.20mm NORMAL SOLUBLE INTERFACE] -inherits = 0.20mm NORMAL SOLUBLE FULL -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -support_material_extruder = 0 -support_material_interface_layers = 3 -support_material_with_sheath = 0 - -[print:*0.35mm*] -inherits = *common* -bottom_solid_layers = 3 -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 40 -first_layer_extrusion_width = 0.75 -infill_acceleration = 2000 -infill_extrusion_width = 0.75 -infill_speed = 60 -layer_height = 0.35 -perimeter_acceleration = 800 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 2 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -support_material_contact_distance = 0.15 -support_material_interface_spacing = 0.2 -support_material_spacing = 2 -top_solid_infill_speed = 50 -top_solid_layers = 4 -wipe_tower = 1 - -[print:0.35mm FAST] -inherits = *0.35mm* -bridge_flow_ratio = 0.95 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -first_layer_extrusion_width = 0.42 -infill_extrusion_width = 0.7 -perimeter_extrusion_width = 0.43 -solid_infill_extrusion_width = 0.7 -top_infill_extrusion_width = 0.43 - -[print:0.35mm FAST 0.6 nozzle] -inherits = *0.35mm*; *0.6nozzle* -bottom_solid_layers = 7 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -perimeters = 3 -top_solid_layers = 9 - -[print:0.35mm FAST sol full 0.6 nozzle] -inherits = *0.35mm*; *0.6nozzle*; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 30 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -perimeter_speed = 40 -support_material_extrusion_width = 0.55 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.2 -support_material_with_sheath = 0 -top_infill_extrusion_width = 0.57 - -[print:0.35mm FAST sol int 0.6 nozzle] -inherits = 0.35mm FAST sol full 0.6 nozzle -support_material_extruder = 0 -support_material_interface_layers = 2 -support_material_xy_spacing = 150% - -[filament:*common*] -cooling = 1 -compatible_printers = -compatible_printers_condition = -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_settings_id = -filament_soluble = 0 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" - -[filament:*PLA*] -inherits = *common* -bed_temperature = 60 -bridge_fan_speed = 100 -disable_fan_first_layers = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_max_volumetric_speed = 15 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -temperature = 210 - -[filament:*PET*] -inherits = *common* -bed_temperature = 90 -bridge_fan_speed = 50 -disable_fan_first_layers = 3 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_max_volumetric_speed = 10 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:*ABS*] -inherits = *common* -bed_temperature = 100 -bridge_fan_speed = 30 -cooling = 0 -disable_fan_first_layers = 3 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_max_volumetric_speed = 13 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 255 -max_fan_speed = 30 -min_fan_speed = 10 -temperature = 255 - -[filament:*FLEX*] -inherits = *common* -bridge_fan_speed = 100 -compatible_printers_condition = nozzle_diameter[0]>0.35 and num_extruders==1 -cooling = 0 -disable_fan_first_layers = 1 -extrusion_multiplier = 1.2 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_max_volumetric_speed = 1.5 -filament_type = FLEX -first_layer_bed_temperature = 50 -first_layer_temperature = 240 -max_fan_speed = 90 -min_fan_speed = 70 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 240 - -[filament:ColorFabb Brass Bronze] -inherits = *PLA* -compatible_printers_condition = nozzle_diameter[0]>0.35 -extrusion_multiplier = 1.3 -filament_colour = #804040 -filament_max_volumetric_speed = 10 -min_print_speed = 5 - -[filament:ColorFabb HT] -bed_temperature = 105 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 105 -first_layer_temperature = 270 -max_fan_speed = 20 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 270 - -[filament:ColorFabb PLA-PHA] -inherits = *PLA* -filament_colour = #FF3232 - -[filament:ColorFabb Woodfil] -inherits = *PLA* -compatible_printers_condition = nozzle_diameter[0]>0.35 -extrusion_multiplier = 1.2 -filament_colour = #804040 -filament_max_volumetric_speed = 10 -first_layer_temperature = 200 -min_print_speed = 5 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 200 - -[filament:ColorFabb XT] -inherits = *PET* -filament_colour = #FF8000 -filament_type = PLA -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -temperature = 270 - -[filament:ColorFabb XT-CF20] -inherits = *PET* -extrusion_multiplier = 1.2 -filament_colour = #804040 -filament_max_volumetric_speed = 1 -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 260 - -[filament:ColorFabb nGen] -inherits = *PET* -bridge_fan_speed = 40 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_type = NGEN -first_layer_temperature = 240 -max_fan_speed = 35 -min_fan_speed = 20 - -[filament:ColorFabb nGen flex] -inherits = *flex* -bed_temperature = 85 -bridge_fan_speed = 40 -cooling = 1 -disable_fan_first_layers = 3 -extrusion_multiplier = 1 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_max_volumetric_speed = 5 -first_layer_bed_temperature = 85 -first_layer_temperature = 260 -max_fan_speed = 35 -min_fan_speed = 20 -temperature = 260 - -[filament:E3D Edge] -inherits = *PET* -filament_colour = #FF8000 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" - -[filament:E3D PC-ABS] -inherits = *ABS* -filament_colour = #3A80CA -first_layer_temperature = 270 -temperature = 270 - -[filament:Fillamentum ABS] -inherits = *ABS* -filament_colour = #3A80CA -first_layer_temperature = 240 -temperature = 240 - -[filament:Fillamentum ASA] -fan_always_on = 1 -filament_colour = #3A80CA -first_layer_temperature = 265 -temperature = 265 - -[filament:Fillamentum CPE HG100 HM100] -inherits = *PET* -disable_fan_first_layers = 1 -filament_colour = #FF8000 -filament_notes = "CPE HG100 , CPE HM100" -first_layer_bed_temperature = 90 -first_layer_temperature = 275 -max_fan_speed = 50 -min_fan_speed = 50 -temperature = 275 - -[filament:Fillamentum Timberfil] -inherits = *PLA* -compatible_printers_condition = nozzle_diameter[0]>0.35 -extrusion_multiplier = 1.2 -filament_colour = #804040 -filament_max_volumetric_speed = 10 -first_layer_temperature = 190 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 190 - -[filament:Generic ABS] -inherits = *ABS* -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" - -[filament:Generic PET] -inherits = *PET* -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" - -[filament:Generic PLA] -inherits = *PLA* -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" - -[filament:Polymaker PC-Max] -inherits = *ABS* -bed_temperature = 120 -filament_colour = #3A80CA -first_layer_bed_temperature = 120 -first_layer_temperature = 270 -temperature = 270 - -[filament:Primavalue PVA] -inherits = *PLA* -cooling = 0 -fan_always_on = 0 -filament_colour = #FFFFD7 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PVA print settings for MK2:\n\nPrimaSelect PVA+\nICE FILAMENTS PVA 'NAUGHTY NATURAL'\nVerbatim BVOH" -filament_soluble = 1 -filament_type = PVA -first_layer_temperature = 195 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 195 - -[filament:Prusa ABS] -inherits = *ABS* -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" - -[filament:Prusa HIPS] -inherits = *ABS* -bridge_fan_speed = 50 -cooling = 1 -extrusion_multiplier = 0.9 -fan_always_on = 1 -fan_below_layer_time = 10 -filament_colour = #FFFFD7 -filament_soluble = 1 -filament_type = HIPS -first_layer_temperature = 220 -max_fan_speed = 20 -min_fan_speed = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 220 - -[filament:Prusa PET] -inherits = *PET* -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" - -[filament:Prusa PLA] -inherits = *PLA* -filament_colour = #FF3232 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" - -[filament:SemiFlex or Flexfill 98A] -inherits = *flex* - -[filament:Taulman Bridge] -bed_temperature = 50 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #DEE0E6 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 250 - -[filament:Taulman T-Glase] -inherits = *PET* -bridge_fan_speed = 40 -cooling = 0 -fan_always_on = 0 -filament_colour = #FF8000 -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" - -[filament:Verbatim BVOH] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 1 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 210 - -[filament:Verbatim PP] -bed_temperature = 100 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 2 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #DEE0E6 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 5 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nEsun PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nEUMAKERS PLA" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 220 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 220 - -[printer:*common*] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 0 -end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors -extruder_colour = #FFFF00 -extruder_offset = 0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.25 -min_layer_height = 0.07 -nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\n -printer_settings_id = -retract_before_travel = 1 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 0.8 -retract_length_toolchange = 3 -retract_lift = 0.6 -retract_lift_above = 0 -retract_lift_below = 199 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 35 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 0 -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 - -[printer:*multimaterial*] -inherits = *common* -deretract_speed = 50 -retract_before_travel = 3 -retract_before_wipe = 60% -retract_layer_change = 0 -retract_length = 4 -retract_length_toolchange = 4 -retract_lift = 0.6 -retract_lift_above = 0 -retract_lift_below = 199 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 80 -single_extruder_multi_material = 1 - -[printer:*mm-single*] -inherits = *multimaterial* -end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; fan off\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n\n -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG1 E-4 F1000.0\nG92 E0.0 - -[printer:*mm-multi*] -inherits = *multimaterial* -end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; fan off\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors -extruder_colour = #FFAA55;#5182DB;#4ECDD3;#FB7259 -nozzle_diameter = 0.4,0.4,0.4,0.4 -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\n; Start G-Code sequence START\nT[initial_tool]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_wipe_tower}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG1 E-4 F1000.0\n{endif}\nG92 E0.0 -variable_layer_height = 0 - -[printer:Original Prusa i3 MK2] -inherits = *common* - -[printer:Original Prusa i3 MK2 0.25 nozzle] -inherits = *common* -max_layer_height = 0.1 -min_layer_height = 0.05 -nozzle_diameter = 0.25 -retract_length = 1 -retract_speed = 50 -variable_layer_height = 0 - -[printer:Original Prusa i3 MK2 0.6 nozzle] -inherits = *common* -max_layer_height = 0.35 -min_layer_height = 0.1 -nozzle_diameter = 0.6 - -[printer:Original Prusa i3 MK2 MM Single Mode] -inherits = *mm-single* - -[printer:Original Prusa i3 MK2 MM Single Mode 0.6 nozzle] -inherits = *mm-single* -nozzle_diameter = 0.6 - -[printer:Original Prusa i3 MK2 MultiMaterial] -inherits = *mm-multi* -nozzle_diameter = 0.4,0.4,0.4,0.4 - -[printer:Original Prusa i3 MK2 MultiMaterial 0.6 nozzle] -inherits = *mm-multi* -nozzle_diameter = 0.6,0.6,0.6,0.6 - -[printer:Original Prusa i3 MK3] -inherits = *common* -end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n -retract_lift_below = 209 -start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} - -[presets] -print = 0.15mm OPTIMAL MK3 -printer = Original Prusa i3 MK3 -filament = Prusa PLA diff --git a/resources/profiles/Original Prusa i3 MK2MM.ini b/resources/profiles/Original Prusa i3 MK2MM.ini deleted file mode 100644 index 035d15515..000000000 --- a/resources/profiles/Original Prusa i3 MK2MM.ini +++ /dev/null @@ -1,3419 +0,0 @@ -# generated by Slic3r Prusa Edition 1.39.0 on 2018-01-06 at 15:12:06 - -[print:0.05mm DETAIL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 25% -fill_pattern = cubic -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.5 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 30 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 80 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 30 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 15 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 30 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.3 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1.5 -support_material_speed = 30 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 180 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.05mm DETAIL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.28 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.3 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 20 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0 -perimeter_speed = 20 -perimeters = 4 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0 -solid_infill_speed = 20 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.18 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 20 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 200 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.05mm DETAIL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 25% -fill_pattern = grid -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 30 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 80 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 30 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 15 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 30 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.3 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1.5 -support_material_speed = 30 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 180 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 600 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.25 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.25 -fill_angle = 45 -fill_density = 15% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.25 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1600 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.25 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 40 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 600 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.25 -perimeter_speed = 25 -perimeters = 4 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.25 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.18 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.25 -top_solid_infill_speed = 30 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 3500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 200 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 250 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 200 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 5 -travel_speed = 250 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm 100mms Linear Advance] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 50 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 100 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 150 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 60 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 30 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 100 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 60 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 70 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 600 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.25 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.25 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.25 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1600 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.25 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 40 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 600 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.25 -perimeter_speed = 25 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.25 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.2 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 35 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.25 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 40 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 3500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 200 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 250 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 200 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 5 -travel_speed = 250 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL SOLUBLE FULL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 25 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 1 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL SOLUBLE INTERFACE] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 25 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm 100mms Linear Advance] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 50 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 100 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 150 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 60 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 30 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 100 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 60 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 70 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm FAST MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 3500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 200 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 250 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 200 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 5 -travel_speed = 250 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 40 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 40 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL SOLUBLE FULL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 1 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 30 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL SOLUBLE INTERFACE] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 30 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.7 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.43 -perimeter_speed = 50 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.7 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.43 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 50 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST sol full 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.55 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.57 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST sol int 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.55 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.57 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[filament:ColorFabb Brass Bronze] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.3 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 210 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 210 - -[filament:ColorFabb HT] -bed_temperature = 105 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 105 -first_layer_temperature = 270 -max_fan_speed = 20 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 270 - -[filament:ColorFabb PLA-PHA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:ColorFabb Woodfil] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 200 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 200 - -[filament:ColorFabb XT] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 270 - -[filament:ColorFabb XT-CF20] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 1 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 260 - -[filament:ColorFabb nGen] -bed_temperature = 85 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = NGEN -first_layer_bed_temperature = 85 -first_layer_temperature = 240 -max_fan_speed = 35 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:ColorFabb nGen flex] -bed_temperature = 85 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 5 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = FLEX -first_layer_bed_temperature = 85 -first_layer_temperature = 260 -max_fan_speed = 35 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 260 - -[filament:E3D Edge] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:E3D PC-ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 270 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 270 - -[filament:Fillamentum ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 240 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 240 - -[filament:Fillamentum ASA] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 265 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 265 - -[filament:Fillamentum CPE HG100 HM100] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "CPE HG100 , CPE HM100" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -max_fan_speed = 80 -min_fan_speed = 80 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 260 - -[filament:Fillamentum Timberfil] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 190 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 190 - -[filament:Generic ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 255 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 255 - -[filament:Generic PET] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:Generic PLA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:Polymaker PC-Max] -bed_temperature = 120 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 120 -first_layer_temperature = 270 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 270 - -[filament:Primavalue PVA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PVA print settings for MK2:\n\nPrimaSelect PVA+\nICE FILAMENTS PVA 'NAUGHTY NATURAL'\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 1 -filament_type = PVA -first_layer_bed_temperature = 60 -first_layer_temperature = 195 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 195 - -[filament:Prusa ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 255 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 255 - -[filament:Prusa HIPS] -bed_temperature = 100 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 0.9 -fan_always_on = 1 -fan_below_layer_time = 10 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 1 -filament_type = HIPS -first_layer_bed_temperature = 100 -first_layer_temperature = 220 -max_fan_speed = 20 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 220 - -[filament:Prusa PET] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:Prusa PLA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:SemiFlex or Flexfill 98A] -bed_temperature = 50 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 and num_extruders==1 -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #00CA0A -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 2.5 -filament_notes = "List of materials tested with FLEX print settings & FLEX material settings for MK2:\n\nFillamentum Flex 98A\nFillamentum Flex 92A\nPlasty Mladeč PP\nPlasty Mladeč TPE32 \nPlasty Mladeč TPE88" -filament_settings_id = -filament_soluble = 0 -filament_type = FLEX -first_layer_bed_temperature = 50 -first_layer_temperature = 220 -max_fan_speed = 90 -min_fan_speed = 70 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 230 - -[filament:Taulman Bridge] -bed_temperature = 50 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #DEE0E6 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 250 - -[filament:Taulman T-Glase] -bed_temperature = 90 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 240 - -[filament:Verbatim BVOH] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 1 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 210 - -[filament:Verbatim PP] -bed_temperature = 100 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 2 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #DEE0E6 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 5 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nEsun PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nEUMAKERS PLA" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 220 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 220 - -[printer:Original Prusa i3 MK2 MM Single Mode] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 50 -end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; fan off\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n\n -extruder_colour = #FFAA55 -extruder_offset = 0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.25 -min_layer_height = 0.07 -nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -printer_settings_id = -retract_before_travel = 3 -retract_before_wipe = 60% -retract_layer_change = 0 -retract_length = 4 -retract_length_toolchange = 6 -retract_lift = 0.6 -retract_lift_above = 0 -retract_lift_below = 199 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 80 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 1 -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG1 E-4 F1000.0\nG92 E0.0 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 - -[printer:Original Prusa i3 MK2 MM Single Mode 0.6 nozzle] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 50 -end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; fan off\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n\n -extruder_colour = #FFAA55 -extruder_offset = 0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.25 -min_layer_height = 0.07 -nozzle_diameter = 0.6 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -printer_settings_id = -retract_before_travel = 3 -retract_before_wipe = 60% -retract_layer_change = 0 -retract_length = 4 -retract_length_toolchange = 6 -retract_lift = 0.6 -retract_lift_above = 0 -retract_lift_below = 199 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 80 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 1 -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG1 E-4 F1000.0\nG92 E0.0 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 - -[printer:Original Prusa i3 MK2 MultiMaterial] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 50,50,50,50 -end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; fan off\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors -extruder_colour = #FFAA55;#5182DB;#4ECDD3;#FB7259 -extruder_offset = 0x0,0x0,0x0,0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.25,0.25,0.25,0.25 -min_layer_height = 0.07,0.07,0.07,0.07 -nozzle_diameter = 0.4,0.4,0.4,0.4 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -printer_settings_id = -retract_before_travel = 3,3,3,3 -retract_before_wipe = 60%,60%,60%,60% -retract_layer_change = 0,0,0,0 -retract_length = 4,4,4,4 -retract_length_toolchange = 4,4,4,4 -retract_lift = 0.6,0.6,0.6,0.6 -retract_lift_above = 0,0,0,0 -retract_lift_below = 199,199,199,199 -retract_restart_extra = 0,0,0,0 -retract_restart_extra_toolchange = 0,0,0,0 -retract_speed = 80,80,80,80 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 1 -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\n; Start G-Code sequence START\nT[initial_tool]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_wipe_tower}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG1 E-4 F1000.0\n{endif}\nG92 E0.0 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 0 -wipe = 1,1,1,1 -z_offset = 0 - -[printer:Original Prusa i3 MK2 MultiMaterial 0.6 nozzle] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 50,50,50,50 -end_gcode = {if not has_wipe_tower}\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; fan off\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n -extruder_colour = #FFAA55;#5182DB;#4ECDD3;#FB7259 -extruder_offset = 0x0,0x0,0x0,0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.25,0.25,0.25,0.25 -min_layer_height = 0.07,0.07,0.07,0.07 -nozzle_diameter = 0.6,0.6,0.6,0.6 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -printer_settings_id = -retract_before_travel = 3,3,3,3 -retract_before_wipe = 60%,60%,60%,60% -retract_layer_change = 0,0,0,0 -retract_length = 4,4,4,4 -retract_length_toolchange = 4,4,4,4 -retract_lift = 0.6,0.6,0.6,0.6 -retract_lift_above = 0,0,0,0 -retract_lift_below = 199,199,199,199 -retract_restart_extra = 0,0,0,0 -retract_restart_extra_toolchange = 0,0,0,0 -retract_speed = 80,80,80,80 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 1 -start_gcode = M115 U3.1.0 ; tell printer latest fw version\nM201 X9000 Y9000 Z500 E10000 ; sets maximum accelerations, mm/sec^2\nM203 X500 Y500 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1500 T1500 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.2 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\n; Start G-Code sequence START\nT[initial_tool]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\n{if not has_wipe_tower}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG1 E-4 F1000.0\n{endif}\nG92 E0.0 -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 0 -wipe = 1,1,1,1 -z_offset = 0 - -[presets] -print = 0.15mm OPTIMAL -printer = Original Prusa i3 MK2 MultiMaterial -filament = Prusa PLA -filament_1 = Prusa PLA -filament_2 = Prusa PLA -filament_3 = Prusa PLA diff --git a/resources/profiles/Original Prusa i3 MK3.ini b/resources/profiles/Original Prusa i3 MK3.ini deleted file mode 100644 index b53006b0f..000000000 --- a/resources/profiles/Original Prusa i3 MK3.ini +++ /dev/null @@ -1,3295 +0,0 @@ -# generated by Slic3r Prusa Edition 1.39.0 on 2018-02-02 at 10:48:46 - -[print:0.05mm DETAIL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 25% -fill_pattern = cubic -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.5 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 30 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 80 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 30 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 15 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 30 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.3 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1.5 -support_material_speed = 30 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 180 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.05mm DETAIL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.28 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.3 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 20 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0 -perimeter_speed = 20 -perimeters = 4 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0 -solid_infill_speed = 20 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.18 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 20 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 200 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.05mm DETAIL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 500 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 25% -fill_pattern = grid -first_layer_acceleration = 500 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 20 -gcode_comments = 0 -infill_acceleration = 800 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 30 -interface_shells = 0 -layer_height = 0.05 -max_print_speed = 80 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 300 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 30 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 15 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 30 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.3 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1.5 -support_material_speed = 30 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 20 -top_solid_layers = 15 -travel_speed = 180 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 600 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.25 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.25 -fill_angle = 45 -fill_density = 15% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.25 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1600 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.25 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 40 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 600 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.25 -perimeter_speed = 25 -perimeters = 4 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.25 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.18 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.25 -top_solid_infill_speed = 30 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.10mm DETAIL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 170 -interface_shells = 0 -layer_height = 0.1 -max_print_speed = 170 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 170 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 9 -travel_speed = 170 -wipe_tower = 0 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm 100mms Linear Advance] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 50 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 100 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 150 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 60 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 30 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 100 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 60 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 70 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL 0.25 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 600 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.25 -external_perimeter_speed = 20 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.25 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.25 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1600 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.25 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 40 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 600 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.25 -perimeter_speed = 25 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 10 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.25 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.2 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 0 -support_material_interface_spacing = 0.15 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 1 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 35 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.25 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 40 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 170 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 170 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 170 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 7 -travel_speed = 170 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL SOLUBLE FULL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 25 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 1 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm OPTIMAL SOLUBLE INTERFACE] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 5 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 25 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.15 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 30 -top_solid_layers = 7 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm 100mms Linear Advance] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 50 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 100 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 150 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 60 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 30 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 100 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 60 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 70 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm FAST MK3] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 1500 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 170 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 170 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 170 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 50 -top_solid_layers = 5 -travel_speed = 170 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 40 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 50 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 40 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL SOLUBLE FULL] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 1 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 30 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.20mm NORMAL SOLUBLE INTERFACE] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 4 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.2 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 40 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.45 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.1 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 30 -top_solid_layers = 5 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.95 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.7 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.43 -perimeter_speed = 50 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.7 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.43 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 7 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.61 -external_perimeter_speed = 40 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 0 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 50 -perimeters = 3 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.15 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.35 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.6 -top_solid_infill_speed = 50 -top_solid_layers = 9 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 15 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST sol full 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 4 -support_material_extrusion_width = 0.55 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 3 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 120% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.57 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.35mm FAST sol int 0.6 nozzle] -avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 -bridge_acceleration = 1000 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 20 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 and num_extruders>1 -complete_objects = 0 -default_acceleration = 1000 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 30 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.67 -fill_angle = 45 -fill_density = 20% -fill_pattern = cubic -first_layer_acceleration = 1000 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.2 -first_layer_speed = 30 -gap_fill_speed = 40 -gcode_comments = 0 -infill_acceleration = 2000 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.75 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -infill_speed = 60 -interface_shells = 0 -layer_height = 0.35 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = [input_filename_base].gcode -overhangs = 1 -perimeter_acceleration = 800 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.65 -perimeter_speed = 40 -perimeters = 2 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 0 -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.65 -solid_infill_speed = 60 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 1 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0 -support_material_enforce_layers = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.55 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 4 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 1 -support_material_threshold = 80 -support_material_with_sheath = 0 -support_material_xy_spacing = 150% -thin_walls = 0 -threads = 4 -top_infill_extrusion_width = 0.57 -top_solid_infill_speed = 50 -top_solid_layers = 4 -travel_speed = 120 -wipe_tower = 1 -wipe_tower_per_color_wipe = 20 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[filament:ColorFabb Brass Bronze] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.3 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 210 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 210 - -[filament:ColorFabb HT] -bed_temperature = 105 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 105 -first_layer_temperature = 270 -max_fan_speed = 20 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 270 - -[filament:ColorFabb PLA-PHA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:ColorFabb Woodfil] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 200 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 200 - -[filament:ColorFabb XT] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 270 - -[filament:ColorFabb XT-CF20] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 1 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 260 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 260 - -[filament:ColorFabb nGen] -bed_temperature = 85 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = NGEN -first_layer_bed_temperature = 85 -first_layer_temperature = 240 -max_fan_speed = 35 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:ColorFabb nGen flex] -bed_temperature = 85 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 10 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 5 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = FLEX -first_layer_bed_temperature = 85 -first_layer_temperature = 260 -max_fan_speed = 35 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 260 - -[filament:E3D Edge] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:E3D PC-ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 270 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 270 - -[filament:Fillamentum ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 240 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 240 - -[filament:Fillamentum ASA] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 265 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 265 - -[filament:Fillamentum CPE HG100 HM100] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "CPE HG100 , CPE HM100" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 275 -max_fan_speed = 50 -min_fan_speed = 50 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 275 - -[filament:Fillamentum Timberfil] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #804040 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 190 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 190 - -[filament:Generic ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 255 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 255 - -[filament:Generic PET] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:Generic PLA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:Polymaker PC-Max] -bed_temperature = 120 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 120 -first_layer_temperature = 270 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 270 - -[filament:Primavalue PVA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PVA print settings for MK2:\n\nPrimaSelect PVA+\nICE FILAMENTS PVA 'NAUGHTY NATURAL'\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 1 -filament_type = PVA -first_layer_bed_temperature = 60 -first_layer_temperature = 195 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 195 - -[filament:Prusa ABS] -bed_temperature = 100 -bridge_fan_speed = 30 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "List of materials tested with standart ABS print settings for MK2:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladeč ABS" -filament_settings_id = -filament_soluble = 0 -filament_type = ABS -first_layer_bed_temperature = 100 -first_layer_temperature = 255 -max_fan_speed = 30 -min_fan_speed = 10 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 255 - -[filament:Prusa HIPS] -bed_temperature = 100 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 0.9 -fan_always_on = 1 -fan_below_layer_time = 10 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 13 -filament_notes = "" -filament_settings_id = -filament_soluble = 1 -filament_type = HIPS -first_layer_bed_temperature = 100 -first_layer_temperature = 220 -max_fan_speed = 20 -min_fan_speed = 20 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 220 - -[filament:Prusa PET] -bed_temperature = 90 -bridge_fan_speed = 50 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of manufacturers tested with standart PET print settings for MK2:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladeč PETG" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 85 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" -temperature = 240 - -[filament:Prusa PLA] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 15 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 210 - -[filament:SemiFlex or Flexfill 98A] -bed_temperature = 50 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = nozzle_diameter[0]>0.35 and num_extruders==1 -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1.2 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #00CA0A -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 1.5 -filament_notes = "List of materials tested with FLEX print settings & FLEX material settings for MK2:\n\nFillamentum Flex 98A\nFillamentum Flex 92A\nPlasty Mladeč PP\nPlasty Mladeč TPE32 \nPlasty Mladeč TPE88" -filament_settings_id = -filament_soluble = 0 -filament_type = FLEX -first_layer_bed_temperature = 50 -first_layer_temperature = 240 -max_fan_speed = 90 -min_fan_speed = 70 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 240 - -[filament:Taulman Bridge] -bed_temperature = 50 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #DEE0E6 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 250 - -[filament:Taulman T-Glase] -bed_temperature = 90 -bridge_fan_speed = 40 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 3 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "" -filament_settings_id = -filament_soluble = 0 -filament_type = PET -first_layer_bed_temperature = 90 -first_layer_temperature = 240 -max_fan_speed = 5 -min_fan_speed = 0 -min_print_speed = 5 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" -temperature = 240 - -[filament:Verbatim BVOH] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 0 -disable_fan_first_layers = 1 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 100 -filament_colour = #FFFFD7 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" -filament_settings_id = -filament_soluble = 1 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 210 - -[filament:Verbatim PP] -bed_temperature = 100 -bridge_fan_speed = 100 -compatible_printers = -compatible_printers_condition = -cooling = 1 -disable_fan_first_layers = 2 -end_filament_gcode = "; Filament-specific end gcode" -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 100 -filament_colour = #DEE0E6 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_max_volumetric_speed = 5 -filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nEsun PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nEUMAKERS PLA" -filament_settings_id = -filament_soluble = 0 -filament_type = PLA -first_layer_bed_temperature = 100 -first_layer_temperature = 220 -max_fan_speed = 100 -min_fan_speed = 100 -min_print_speed = 15 -slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" -temperature = 220 - -[printer:Original Prusa i3 MK3] -bed_shape = 0x0,250x0,250x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n -between_objects_gcode = -deretract_speed = 0 -end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors -extruder_colour = #FFFF00 -extruder_offset = 0x0 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.25 -min_layer_height = 0.07 -nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n -retract_before_travel = 1 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 0.8 -retract_length_toolchange = 3 -retract_lift = 0.6 -retract_lift_above = 0 -retract_lift_below = 209 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 35 -serial_port = -serial_speed = 250000 -single_extruder_multi_material = 0 -start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 - -[presets] -print = 0.15mm OPTIMAL MK3 -printer = Original Prusa i3 MK3 -filament = Prusa PLA From 5812ca06d67eefb30b6824bf8d85dd6fdfa591aa Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 14 Mar 2018 18:09:31 +0100 Subject: [PATCH 36/47] Fixed ctest on Windows (should call Perl's prove.bat, not just prove) --- CMakeLists.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b860068b..cb3d6dfd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,18 +52,21 @@ endif() add_subdirectory(xs) +get_filename_component(PERL_BIN_PATH "${PERL_EXECUTABLE}" DIRECTORY) if (MSVC) # By default the startup project in MSVC is the 'ALL_BUILD' cmake-created project, # but we want 'slic3r' as the startup one because debugging run command is associated with it. # (Unfortunatelly it cannot be associated with ALL_BUILD using CMake.) # Note: For some reason this needs to be set in the top-level CMakeLists.txt set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT XS) + set(PERL_PROVE "${PERL_BIN_PATH}/prove.bat") +else () + set(PERL_PROVE "${PERL_BIN_PATH}/prove") endif () enable_testing () -get_filename_component(PERL_BIN_PATH "${PERL_EXECUTABLE}" DIRECTORY) -add_test (NAME xs COMMAND "${PERL_EXECUTABLE}" ${PERL_BIN_PATH}/prove -I ${PROJECT_SOURCE_DIR}/local-lib/lib/perl5 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/xs) -add_test (NAME integration COMMAND "${PERL_EXECUTABLE}" ${PERL_BIN_PATH}/prove WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) +add_test (NAME xs COMMAND "${PERL_EXECUTABLE}" ${PERL_PROVE} -I ${PROJECT_SOURCE_DIR}/local-lib/lib/perl5 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/xs) +add_test (NAME integration COMMAND "${PERL_EXECUTABLE}" ${PERL_PROVE} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) install(PROGRAMS slic3r.pl DESTINATION bin RENAME slic3r-prusa3d) From 4351187ce5c4a8b473575e5c6a57ce4d94caeeac Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 14 Mar 2018 18:16:17 +0100 Subject: [PATCH 37/47] Fixed Print::validate() to allow for objects protruding below the print bed. The part of the object below the print bed will simply not be sliced. This fix also fixes integration tests, which often work with boxes centered around (0,0,0). --- xs/src/libslic3r/Print.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xs/src/libslic3r/Print.cpp b/xs/src/libslic3r/Print.cpp index 13f4fab79..a3f5e231f 100644 --- a/xs/src/libslic3r/Print.cpp +++ b/xs/src/libslic3r/Print.cpp @@ -510,6 +510,8 @@ std::string Print::validate() const { BoundingBox bed_box_2D = get_extents(Polygon::new_scale(config.bed_shape.values)); BoundingBoxf3 print_volume(Pointf3(unscale(bed_box_2D.min.x), unscale(bed_box_2D.min.y), 0.0), Pointf3(unscale(bed_box_2D.max.x), unscale(bed_box_2D.max.y), config.max_print_height)); + // Allow the objects to protrude below the print bed, only the part of the object above the print bed will be sliced. + print_volume.min.z = -1e10; for (PrintObject *po : this->objects) { if (! print_volume.contains(po->model_object()->tight_bounding_box(false))) return "Some objects are outside of the print volume."; From 61ae78432ce92adb47ea6a7eb3aca65bb353459e Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 14 Mar 2018 20:08:34 +0100 Subject: [PATCH 38/47] Removed the unsupported "pillars" support pattern. --- xs/src/libslic3r/PrintConfig.cpp | 7 ++++--- xs/src/libslic3r/PrintConfig.hpp | 3 +-- xs/src/libslic3r/SupportMaterial.cpp | 1 - xs/t/15_config.t | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp index a1ca7cbfe..d7ee1e591 100644 --- a/xs/src/libslic3r/PrintConfig.cpp +++ b/xs/src/libslic3r/PrintConfig.cpp @@ -1527,12 +1527,10 @@ PrintConfigDef::PrintConfigDef() def->enum_values.push_back("rectilinear"); def->enum_values.push_back("rectilinear-grid"); def->enum_values.push_back("honeycomb"); - def->enum_values.push_back("pillars"); def->enum_labels.push_back("rectilinear"); def->enum_labels.push_back("rectilinear grid"); def->enum_labels.push_back("honeycomb"); - def->enum_labels.push_back("pillars"); - def->default_value = new ConfigOptionEnum(smpPillars); + def->default_value = new ConfigOptionEnum(smpRectilinear); def = this->add("support_material_spacing", coFloat); def->label = L("Pattern spacing"); @@ -1804,6 +1802,9 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va values is a dirty hack and will need to be removed sometime in the future, but it will avoid lots of complaints for now. */ value = "0"; + } else if (opt_key == "support_material_pattern" && value == "pillars") { + // Slic3r PE does not support the pillars. They never worked well. + value = "rectilinear"; } else if (opt_key == "support_material_threshold" && value == "0") { // 0 used to be automatic threshold, but we introduced percent values so let's // transform it into the default value diff --git a/xs/src/libslic3r/PrintConfig.hpp b/xs/src/libslic3r/PrintConfig.hpp index e87ea11bf..cb94a7921 100644 --- a/xs/src/libslic3r/PrintConfig.hpp +++ b/xs/src/libslic3r/PrintConfig.hpp @@ -33,7 +33,7 @@ enum InfillPattern { }; enum SupportMaterialPattern { - smpRectilinear, smpRectilinearGrid, smpHoneycomb, smpPillars, + smpRectilinear, smpRectilinearGrid, smpHoneycomb, }; enum SeamPosition { @@ -87,7 +87,6 @@ template<> inline t_config_enum_values& ConfigOptionEnum keys_map["rectilinear"] = smpRectilinear; keys_map["rectilinear-grid"] = smpRectilinearGrid; keys_map["honeycomb"] = smpHoneycomb; - keys_map["pillars"] = smpPillars; } return keys_map; } diff --git a/xs/src/libslic3r/SupportMaterial.cpp b/xs/src/libslic3r/SupportMaterial.cpp index b8df67ba6..0cecf0014 100644 --- a/xs/src/libslic3r/SupportMaterial.cpp +++ b/xs/src/libslic3r/SupportMaterial.cpp @@ -2491,7 +2491,6 @@ void PrintObjectSupportMaterial::generate_toolpaths( infill_pattern = ipRectilinear; break; case smpHoneycomb: - case smpPillars: infill_pattern = ipHoneycomb; break; } diff --git a/xs/t/15_config.t b/xs/t/15_config.t index 6e73c8a9a..397f7e479 100644 --- a/xs/t/15_config.t +++ b/xs/t/15_config.t @@ -99,8 +99,8 @@ foreach my $config (Slic3r::Config->new, Slic3r::Config::Static::new_FullPrintCo $config->set_deserialize('fill_pattern', 'line'); is $config->get('fill_pattern'), 'line', 'deserialize enum (fill_pattern)'; - $config->set_deserialize('support_material_pattern', 'pillars'); - is $config->get('support_material_pattern'), 'pillars', 'deserialize enum (support_material_pattern)'; + $config->set_deserialize('support_material_pattern', 'rectilinear'); + is $config->get('support_material_pattern'), 'rectilinear', 'deserialize enum (support_material_pattern)'; $config->set('extruder_offset', [[10,20],[30,45]]); is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [[10,20],[30,45]], 'set/get points'; From 22330c0caeb2dbb434b3101e75d0528fc0a5258c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 15 Mar 2018 10:13:40 +0100 Subject: [PATCH 39/47] Showed correct "Info" box on initial Plater --- lib/Slic3r/GUI/Plater.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 423cefe59..747567fe5 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -485,8 +485,8 @@ sub new { $right_sizer->Add($print_info_sizer, 0, wxEXPAND, 0); # Callback for showing / hiding the print info box. $self->{"print_info_box_show"} = sub { - if ($right_sizer->IsShown(4) != $_[0]) { - $right_sizer->Show(4, $_[0]); + if ($right_sizer->IsShown(5) != $_[0]) { + $right_sizer->Show(5, $_[0]); $self->Layout } }; From 75230a790c75bf25ffc8fc4cf94fac9031c4fad3 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 15 Mar 2018 11:06:33 +0100 Subject: [PATCH 40/47] Prusa specific Config Bundle: Commented out the config values, which this Slic3r version does not understand yet. Fixes https://github.com/prusa3d/Slic3r/issues/795 --- resources/profiles/PrusaResearch.ini | 37 ++++++++++++++++------------ 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index d1bd4f552..43d2ecbd1 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -909,10 +909,10 @@ use_volumetric_e = 0 variable_layer_height = 1 wipe = 1 z_offset = 0 -printer_model = MK2S -printer_variant = 0.4 -default_print_profile = 0.15mm OPTIMAL -default_filament_profile = Prusa PLA +#printer_model = MK2S +#printer_variant = 0.4 +#default_print_profile = 0.15mm OPTIMAL +#default_filament_profile = Prusa PLA [printer:*multimaterial*] inherits = *common* @@ -928,7 +928,7 @@ retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 80 single_extruder_multi_material = 1 -printer_model = MK2SMM +#printer_model = MK2SMM [printer:*mm-single*] inherits = *multimaterial* @@ -956,15 +956,15 @@ nozzle_diameter = 0.25 retract_length = 1 retract_speed = 50 variable_layer_height = 0 -printer_variant = 0.25 -default_print_profile = 0.10mm DETAIL 0.25 nozzle +#printer_variant = 0.25 +#default_print_profile = 0.10mm DETAIL 0.25 nozzle [printer:Original Prusa i3 MK2 0.6 nozzle] inherits = *common* max_layer_height = 0.35 min_layer_height = 0.1 nozzle_diameter = 0.6 -printer_variant = 0.6 +#printer_variant = 0.6 [printer:Original Prusa i3 MK2 MM Single Mode] inherits = *mm-single* @@ -972,7 +972,7 @@ inherits = *mm-single* [printer:Original Prusa i3 MK2 MM Single Mode 0.6 nozzle] inherits = *mm-single* nozzle_diameter = 0.6 -printer_variant = 0.6 +#printer_variant = 0.6 [printer:Original Prusa i3 MK2 MultiMaterial] inherits = *mm-multi* @@ -981,7 +981,7 @@ nozzle_diameter = 0.4,0.4,0.4,0.4 [printer:Original Prusa i3 MK2 MultiMaterial 0.6 nozzle] inherits = *mm-multi* nozzle_diameter = 0.6,0.6,0.6,0.6 -printer_variant = 0.6 +#printer_variant = 0.6 [printer:Original Prusa i3 MK3] inherits = *common* @@ -989,8 +989,8 @@ end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} -printer_model = MK3 -default_print_profile = 0.15mm OPTIMAL MK3 +#printer_model = MK3 +#default_print_profile = 0.15mm OPTIMAL MK3 [printer:Original Prusa i3 MK3 0.25 nozzle] inherits = *common* @@ -999,8 +999,8 @@ end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} -printer_model = MK3 -default_print_profile = 0.10mm DETAIL MK3 +#printer_model = MK3 +#default_print_profile = 0.10mm DETAIL MK3 [printer:Original Prusa i3 MK3 0.6 nozzle] inherits = *common* @@ -1009,5 +1009,10 @@ end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} -printer_model = MK3 -default_print_profile = 0.15mm OPTIMAL MK3 +#printer_model = MK3 +#default_print_profile = 0.15mm OPTIMAL MK3 + +[presets] +print = 0.15mm OPTIMAL MK3 +printer = Original Prusa i3 MK3 +filament = Prusa PLA From 8d4b6035728e0bcf241c65c48c16cbccf4ae71c5 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 15 Mar 2018 11:59:12 +0100 Subject: [PATCH 41/47] Correct updated Show/Hide of object_info_manifold_warning_icon --- lib/Slic3r/GUI/Plater.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 747567fe5..bb3a4c130 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -1942,6 +1942,7 @@ sub selection_changed { $self->{object_info_manifold_warning_icon}->SetToolTipString($message); } else { $self->{object_info_manifold}->SetLabel(L("Yes")); + $self->{object_info_manifold_warning_icon}->Hide; } } else { $self->{object_info_facets}->SetLabel($object->facets); From 4f0c6dd8799479997fb8d580c8684efd9a4e3c15 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 15 Mar 2018 17:14:13 +0100 Subject: [PATCH 42/47] Reworked the fix of #784 for efficiency and robustness: First, the same direction segments are chained as before, but this time the remaining open polylines are collected to be processed in the 2nd step. Second, the remaining open polylines are connected by a greedy algorithm disregarding their original orientation. As the orientation of loops created by the 2nd step is mixed, the orientation of these loops is unknown, therfore a CCW orientation is enforced. The CCW heuristics may fill holes and cavities, but no outer geometry will be lost. --- xs/src/libslic3r/TriangleMesh.cpp | 347 ++++++++++++++++++------------ xs/src/libslic3r/TriangleMesh.hpp | 15 +- 2 files changed, 219 insertions(+), 143 deletions(-) diff --git a/xs/src/libslic3r/TriangleMesh.cpp b/xs/src/libslic3r/TriangleMesh.cpp index 2a0110a45..e5e2d59e8 100644 --- a/xs/src/libslic3r/TriangleMesh.cpp +++ b/xs/src/libslic3r/TriangleMesh.cpp @@ -987,160 +987,227 @@ void TriangleMeshSlicer::make_loops(std::vector &lines, Polygo } } } - - // Build a map of lines by edge_a_id and a_id. - std::vector by_edge_a_id; - std::vector by_edge_b_id; - std::vector by_a_id; - std::vector by_b_id; - by_edge_a_id.reserve(lines.size()); - by_edge_b_id.reserve(lines.size()); - by_a_id.reserve(lines.size()); - by_b_id.reserve(lines.size()); - for (IntersectionLines::iterator line = lines.begin(); line != lines.end(); ++ line) { - if (! line->skip) { - if (line->edge_a_id != -1) - by_edge_a_id.push_back(&(*line)); // [line->edge_a_id].push_back(); - if (line->edge_b_id != -1) - by_edge_b_id.push_back(&(*line)); - if (line->a_id != -1) - by_a_id.push_back(&(*line)); // [line->a_id].push_back(&(*line)); - if (line->b_id != -1) - by_b_id.push_back(&(*line)); // [line->a_id].push_back(&(*line)); + struct OpenPolyline { + OpenPolyline() {}; + OpenPolyline(IntersectionReference &start, IntersectionReference &end, Points &&points) : + start(start), end(end), points(std::move(points)), consumed(false) {} + void reverse() { + std::swap(start, end); + std::reverse(points.begin(), points.end()); + } + IntersectionReference start; + IntersectionReference end; + Points points; + bool consumed; + }; + std::vector open_polylines; + { + // Build a map of lines by edge_a_id and a_id. + std::vector by_edge_a_id; + std::vector by_a_id; + by_edge_a_id.reserve(lines.size()); + by_a_id.reserve(lines.size()); + for (IntersectionLine &line : lines) { + if (! line.skip) { + if (line.edge_a_id != -1) + by_edge_a_id.emplace_back(&line); + if (line.a_id != -1) + by_a_id.emplace_back(&line); + } + } + auto by_edge_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->edge_a_id < il2->edge_a_id; }; + auto by_vertex_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->a_id < il2->a_id; }; + std::sort(by_edge_a_id.begin(), by_edge_a_id.end(), by_edge_lower); + std::sort(by_a_id.begin(), by_a_id.end(), by_vertex_lower); + // Chain the segments with a greedy algorithm, collect the loops and unclosed polylines. + IntersectionLines::iterator it_line_seed = lines.begin(); + for (;;) { + // take first spare line and start a new loop + IntersectionLine *first_line = nullptr; + for (; it_line_seed != lines.end(); ++ it_line_seed) + if (! it_line_seed->skip) { + first_line = &(*it_line_seed ++); + break; + } + if (first_line == nullptr) + break; + first_line->skip = true; + Points loop_pts; + loop_pts.emplace_back(first_line->a); + IntersectionLine *last_line = first_line; + + /* + printf("first_line edge_a_id = %d, edge_b_id = %d, a_id = %d, b_id = %d, a = %d,%d, b = %d,%d\n", + first_line->edge_a_id, first_line->edge_b_id, first_line->a_id, first_line->b_id, + first_line->a.x, first_line->a.y, first_line->b.x, first_line->b.y); + */ + + IntersectionLine key; + for (;;) { + // find a line starting where last one finishes + IntersectionLine* next_line = nullptr; + if (last_line->edge_b_id != -1) { + key.edge_a_id = last_line->edge_b_id; + auto it_begin = std::lower_bound(by_edge_a_id.begin(), by_edge_a_id.end(), &key, by_edge_lower); + if (it_begin != by_edge_a_id.end()) { + auto it_end = std::upper_bound(it_begin, by_edge_a_id.end(), &key, by_edge_lower); + for (auto it_line = it_begin; it_line != it_end; ++ it_line) + if (! (*it_line)->skip) { + next_line = *it_line; + break; + } + } + } + if (next_line == nullptr && last_line->b_id != -1) { + key.a_id = last_line->b_id; + auto it_begin = std::lower_bound(by_a_id.begin(), by_a_id.end(), &key, by_vertex_lower); + if (it_begin != by_a_id.end()) { + auto it_end = std::upper_bound(it_begin, by_a_id.end(), &key, by_vertex_lower); + for (auto it_line = it_begin; it_line != it_end; ++ it_line) + if (! (*it_line)->skip) { + next_line = *it_line; + break; + } + } + } + if (next_line == nullptr) { + // Check whether we closed this loop. + if ((first_line->edge_a_id != -1 && first_line->edge_a_id == last_line->edge_b_id) || + (first_line->a_id != -1 && first_line->a_id == last_line->b_id)) { + // The current loop is complete. Add it to the output. + loops->emplace_back(std::move(loop_pts)); + #ifdef SLIC3R_TRIANGLEMESH_DEBUG + printf(" Discovered %s polygon of %d points\n", (p.is_counter_clockwise() ? "ccw" : "cw"), (int)p.points.size()); + #endif + } else { + // This is an open polyline. Add it to the list of open polylines. These open polylines will processed later. + loop_pts.emplace_back(last_line->b); + open_polylines.emplace_back(OpenPolyline( + IntersectionReference(first_line->a_id, first_line->edge_a_id), + IntersectionReference(last_line->b_id, last_line->edge_b_id), std::move(loop_pts))); + } + break; + } + /* + printf("next_line edge_a_id = %d, edge_b_id = %d, a_id = %d, b_id = %d, a = %d,%d, b = %d,%d\n", + next_line->edge_a_id, next_line->edge_b_id, next_line->a_id, next_line->b_id, + next_line->a.x, next_line->a.y, next_line->b.x, next_line->b.y); + */ + loop_pts.emplace_back(next_line->a); + last_line = next_line; + next_line->skip = true; + } } } - auto by_edge_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->edge_a_id < il2->edge_a_id; }; - auto by_vertex_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->a_id < il2->a_id; }; - auto by_edge_b_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->edge_b_id < il2->edge_b_id; }; - auto by_vertex_b_lower = [](const IntersectionLine* il1, const IntersectionLine *il2) { return il1->b_id < il2->b_id; }; - std::sort(by_edge_a_id.begin(), by_edge_a_id.end(), by_edge_lower); - std::sort(by_a_id.begin(), by_a_id.end(), by_vertex_lower); - std::sort(by_edge_b_id.begin(), by_edge_b_id.end(), by_edge_b_lower); - std::sort(by_b_id.begin(), by_b_id.end(), by_vertex_b_lower); - IntersectionLines::iterator it_line_seed = lines.begin(); - CYCLE: while (1) { - // take first spare line and start a new loop - IntersectionLine *first_line = nullptr; - for (; it_line_seed != lines.end(); ++ it_line_seed) - if (! it_line_seed->skip) { - first_line = &(*it_line_seed ++); - break; - } - if (first_line == nullptr) - break; - first_line->skip = true; - Points loop_pts; - loop_pts.push_back(first_line->a); - IntersectionLine *last_line = first_line; - - /* - printf("first_line edge_a_id = %d, edge_b_id = %d, a_id = %d, b_id = %d, a = %d,%d, b = %d,%d\n", - first_line->edge_a_id, first_line->edge_b_id, first_line->a_id, first_line->b_id, - first_line->a.x, first_line->a.y, first_line->b.x, first_line->b.y); - */ - - IntersectionLine key; - for (;;) { - // find a line starting where last one finishes - IntersectionLine* next_line = nullptr; - if (last_line->edge_b_id != -1) { - key.edge_a_id = last_line->edge_b_id; - auto it_begin = std::lower_bound(by_edge_a_id.begin(), by_edge_a_id.end(), &key, by_edge_lower); - if (it_begin != by_edge_a_id.end()) { - auto it_end = std::upper_bound(it_begin, by_edge_a_id.end(), &key, by_edge_lower); - for (auto it_line = it_begin; it_line != it_end; ++ it_line) - if (! (*it_line)->skip) { - next_line = *it_line; - break; - } - } - if (next_line == nullptr) - { - // checks reverted edge - key.edge_b_id = last_line->edge_b_id; - auto it_begin = std::lower_bound(by_edge_b_id.begin(), by_edge_b_id.end(), &key, by_edge_b_lower); - if (it_begin != by_edge_b_id.end()) { - auto it_end = std::upper_bound(it_begin, by_edge_b_id.end(), &key, by_edge_b_lower); - for (auto it_line = it_begin; it_line != it_end; ++it_line) - if (!(*it_line)->skip) { - // reverts edge - std::swap((*it_line)->a, (*it_line)->b); - std::swap((*it_line)->a_id, (*it_line)->b_id); - std::swap((*it_line)->edge_a_id, (*it_line)->edge_b_id); - next_line = *it_line; - // resorts lists - std::sort(by_edge_a_id.begin(), by_edge_a_id.end(), by_edge_lower); - std::sort(by_edge_b_id.begin(), by_edge_b_id.end(), by_edge_b_lower); - std::sort(by_a_id.begin(), by_a_id.end(), by_vertex_lower); - std::sort(by_b_id.begin(), by_b_id.end(), by_vertex_b_lower); + // Now process the open polylines. + if (! open_polylines.empty()) { + // Store the end points of open_polylines into vectors sorted + struct OpenPolylineEnd { + OpenPolylineEnd(OpenPolyline *polyline, bool start) : polyline(polyline), start(start) {} + OpenPolyline *polyline; + // Is it the start or end point? + bool start; + const IntersectionReference& ipref() const { return start ? polyline->start : polyline->end; } + int point_id() const { return ipref().point_id; } + int edge_id () const { return ipref().edge_id; } + }; + auto by_edge_lower = [](const OpenPolylineEnd &ope1, const OpenPolylineEnd &ope2) { return ope1.edge_id() < ope2.edge_id(); }; + auto by_point_lower = [](const OpenPolylineEnd &ope1, const OpenPolylineEnd &ope2) { return ope1.point_id() < ope2.point_id(); }; + std::vector by_edge_id; + std::vector by_point_id; + by_edge_id.reserve(2 * open_polylines.size()); + by_point_id.reserve(2 * open_polylines.size()); + for (OpenPolyline &opl : open_polylines) { + if (opl.start.edge_id != -1) + by_edge_id .emplace_back(OpenPolylineEnd(&opl, true)); + if (opl.end.edge_id != -1) + by_edge_id .emplace_back(OpenPolylineEnd(&opl, false)); + if (opl.start.point_id != -1) + by_point_id.emplace_back(OpenPolylineEnd(&opl, true)); + if (opl.end.point_id != -1) + by_point_id.emplace_back(OpenPolylineEnd(&opl, false)); + } + std::sort(by_edge_id .begin(), by_edge_id .end(), by_edge_lower); + std::sort(by_point_id.begin(), by_point_id.end(), by_point_lower); + + // Try to connect the loops. + for (OpenPolyline &opl : open_polylines) { + if (opl.consumed) + continue; + opl.consumed = true; + OpenPolylineEnd end(&opl, false); + for (;;) { + // find a line starting where last one finishes + OpenPolylineEnd* next_start = nullptr; + if (end.edge_id() != -1) { + auto it_begin = std::lower_bound(by_edge_id.begin(), by_edge_id.end(), end, by_edge_lower); + if (it_begin != by_edge_id.end()) { + auto it_end = std::upper_bound(it_begin, by_edge_id.end(), end, by_edge_lower); + for (auto it_edge = it_begin; it_edge != it_end; ++ it_edge) + if (! it_edge->polyline->consumed) { + next_start = &(*it_edge); break; } } } - } - if (next_line == nullptr && last_line->b_id != -1) { - key.a_id = last_line->b_id; - auto it_begin = std::lower_bound(by_a_id.begin(), by_a_id.end(), &key, by_vertex_lower); - if (it_begin != by_a_id.end()) { - auto it_end = std::upper_bound(it_begin, by_a_id.end(), &key, by_vertex_lower); - for (auto it_line = it_begin; it_line != it_end; ++ it_line) - if (! (*it_line)->skip) { - next_line = *it_line; - break; - } - } - if (next_line == nullptr) - { - // checks reverted edge - key.b_id = last_line->b_id; - auto it_begin = std::lower_bound(by_b_id.begin(), by_b_id.end(), &key, by_vertex_b_lower); - if (it_begin != by_b_id.end()) { - auto it_end = std::upper_bound(it_begin, by_b_id.end(), &key, by_vertex_b_lower); - for (auto it_line = it_begin; it_line != it_end; ++it_line) - if (!(*it_line)->skip) { - // reverts edge - std::swap((*it_line)->a, (*it_line)->b); - std::swap((*it_line)->a_id, (*it_line)->b_id); - std::swap((*it_line)->edge_a_id, (*it_line)->edge_b_id); - next_line = *it_line; - // resorts lists - std::sort(by_edge_a_id.begin(), by_edge_a_id.end(), by_edge_lower); - std::sort(by_edge_b_id.begin(), by_edge_b_id.end(), by_edge_b_lower); - std::sort(by_a_id.begin(), by_a_id.end(), by_vertex_lower); - std::sort(by_b_id.begin(), by_b_id.end(), by_vertex_b_lower); + if (next_start == nullptr && end.point_id() != -1) { + auto it_begin = std::lower_bound(by_point_id.begin(), by_point_id.end(), end, by_point_lower); + if (it_begin != by_point_id.end()) { + auto it_end = std::upper_bound(it_begin, by_point_id.end(), end, by_point_lower); + for (auto it_point = it_begin; it_point != it_end; ++ it_point) + if (! it_point->polyline->consumed) { + next_start = &(*it_point); break; } } } - } - if (next_line == nullptr) { - // check whether we closed this loop - if ((first_line->edge_a_id != -1 && first_line->edge_a_id == last_line->edge_b_id) || - (first_line->a_id != -1 && first_line->a_id == last_line->b_id)) { - // loop is complete - loops->emplace_back(std::move(loop_pts)); - #ifdef SLIC3R_TRIANGLEMESH_DEBUG - printf(" Discovered %s polygon of %d points\n", (p.is_counter_clockwise() ? "ccw" : "cw"), (int)p.points.size()); - #endif - goto CYCLE; + if (next_start == nullptr) { + // The current loop could not be closed. Unmark the segment. + opl.consumed = false; + break; + } + // Attach this polyline to the end of the initial polyline. + if (next_start->start) { + auto it = next_start->polyline->points.begin(); + std::copy(++ it, next_start->polyline->points.end(), back_inserter(opl.points)); + //opl.points.insert(opl.points.back(), ++ it, next_start->polyline->points.end()); + } else { + auto it = next_start->polyline->points.rbegin(); + std::copy(++ it, next_start->polyline->points.rend(), back_inserter(opl.points)); + //opl.points.insert(opl.points.back(), ++ it, next_start->polyline->points.rend()); } - // we can't close this loop! - //// push @failed_loops, [@loop]; - //#ifdef SLIC3R_TRIANGLEMESH_DEBUG - printf(" Unable to close this loop having %d points\n", (int)loop_pts.size()); - //#endif - goto CYCLE; + end = *next_start; + end.start = !end.start; + next_start->polyline->points.clear(); + next_start->polyline->consumed = true; + // Check whether we closed this loop. + const IntersectionReference &ip1 = opl.start; + const IntersectionReference &ip2 = end.ipref(); + if ((ip1.edge_id != -1 && ip1.edge_id == ip2.edge_id) || + (ip1.point_id != -1 && ip1.point_id == ip2.point_id)) { + // The current loop is complete. Add it to the output. + assert(opl.points.front().point_id == opl.points.back().point_id); + assert(opl.points.front().edge_id == opl.points.back().edge_id); + // Remove the duplicate last point. + opl.points.pop_back(); + if (opl.points.size() >= 3) { + // The closed polygon is patched from pieces with messed up orientation, therefore + // the orientation of the patched up polygon is not known. + // Orient the patched up polygons CCW. This heuristic may close some holes and cavities. + double area = 0.; + for (size_t i = 0, j = opl.points.size() - 1; i < opl.points.size(); j = i ++) + area += double(opl.points[j].x + opl.points[i].x) * double(opl.points[i].y - opl.points[j].y); + if (area < 0) + std::reverse(opl.points.begin(), opl.points.end()); + loops->emplace_back(std::move(opl.points)); + } + opl.points.clear(); + break; + } + // Continue with the current loop. } - /* - printf("next_line edge_a_id = %d, edge_b_id = %d, a_id = %d, b_id = %d, a = %d,%d, b = %d,%d\n", - next_line->edge_a_id, next_line->edge_b_id, next_line->a_id, next_line->b_id, - next_line->a.x, next_line->a.y, next_line->b.x, next_line->b.y); - */ - loop_pts.push_back(next_line->a); - last_line = next_line; - next_line->skip = true; } } } diff --git a/xs/src/libslic3r/TriangleMesh.hpp b/xs/src/libslic3r/TriangleMesh.hpp index 3192c90b6..c700784a5 100644 --- a/xs/src/libslic3r/TriangleMesh.hpp +++ b/xs/src/libslic3r/TriangleMesh.hpp @@ -85,11 +85,11 @@ enum FacetEdgeType { feHorizontal }; -class IntersectionPoint : public Point +class IntersectionReference { public: - IntersectionPoint() : point_id(-1), edge_id(-1) {}; - // Inherits coord_t x, y + IntersectionReference() : point_id(-1), edge_id(-1) {}; + IntersectionReference(int point_id, int edge_id) : point_id(point_id), edge_id(edge_id) {} // Where is this intersection point located? On mesh vertex or mesh edge? // Only one of the following will be set, the other will remain set to -1. // Index of the mesh vertex. @@ -98,6 +98,15 @@ public: int edge_id; }; +class IntersectionPoint : public Point, public IntersectionReference +{ +public: + IntersectionPoint() {}; + IntersectionPoint(int point_id, int edge_id, const Point &pt) : IntersectionReference(point_id, edge_id), Point(pt) {} + IntersectionPoint(const IntersectionReference &ir, const Point &pt) : IntersectionReference(ir), Point(pt) {} + // Inherits coord_t x, y +}; + class IntersectionLine : public Line { public: From c88d2780ced7bb91e79e2e9a5ef4a58506d7d175 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Thu, 15 Mar 2018 18:06:26 +0100 Subject: [PATCH 43/47] Octoprint (#796) * Octoprint: GUI for CA file, improvements * Octoprint: Add GUI for Bonjour lookup, bugfixes * Octoprint: Bonjour browser: Cleanup Perl interaction * Octoprint: Bonjour: Perform several broadcast, UI fixes * Octoprint: Add files to localization list * Http: Disable CA File setting on SSL backends that don't support it --- lib/Slic3r/GUI/MainFrame.pm | 6 +- resources/localization/Slic3rPE.pot | 2161 +++++++++++++-------------- resources/localization/list.txt | 2 + xs/CMakeLists.txt | 2 + xs/src/slic3r/GUI/BonjourDialog.cpp | 200 +++ xs/src/slic3r/GUI/BonjourDialog.hpp | 49 + xs/src/slic3r/GUI/Field.cpp | 20 +- xs/src/slic3r/GUI/Field.hpp | 42 +- xs/src/slic3r/GUI/GUI.cpp | 24 +- xs/src/slic3r/GUI/GUI.hpp | 5 +- xs/src/slic3r/GUI/OptionsGroup.hpp | 4 +- xs/src/slic3r/GUI/Tab.cpp | 119 +- xs/src/slic3r/GUI/Tab.hpp | 14 +- xs/src/slic3r/Utils/Bonjour.cpp | 155 +- xs/src/slic3r/Utils/Bonjour.hpp | 20 +- xs/src/slic3r/Utils/Http.cpp | 46 +- xs/src/slic3r/Utils/Http.hpp | 1 + xs/src/slic3r/Utils/OctoPrint.cpp | 42 +- xs/src/slic3r/Utils/OctoPrint.hpp | 7 +- xs/xsp/GUI.xsp | 8 +- xs/xsp/Utils_OctoPrint.xsp | 1 - 21 files changed, 1587 insertions(+), 1341 deletions(-) create mode 100644 xs/src/slic3r/GUI/BonjourDialog.cpp create mode 100644 xs/src/slic3r/GUI/BonjourDialog.hpp diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index f5a9021c0..c53237228 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -217,11 +217,7 @@ sub _init_tabpanel { $self->{is_disabled_button_browse} = (!eval "use Net::Bonjour; 1") ? 1 : 0 ; # A variable to inform C++ Tab implementation about user_agent $self->{is_user_agent} = (eval "use LWP::UserAgent; 1") ? 1 : 0 ; - Slic3r::GUI::create_preset_tabs($self->{no_controller}, - $self->{is_disabled_button_browse}, - $self->{is_user_agent}, - $VALUE_CHANGE_EVENT, $PRESETS_CHANGED_EVENT, - $BUTTON_BROWSE_EVENT, $BUTTON_TEST_EVENT); + Slic3r::GUI::create_preset_tabs($self->{no_controller}, $VALUE_CHANGE_EVENT, $PRESETS_CHANGED_EVENT); $self->{options_tabs} = {}; for my $tab_name (qw(print filament printer)) { $self->{options_tabs}{$tab_name} = Slic3r::GUI::get_preset_tab("$tab_name"); diff --git a/resources/localization/Slic3rPE.pot b/resources/localization/Slic3rPE.pot index b70c92257..0282e7aae 100644 --- a/resources/localization/Slic3rPE.pot +++ b/resources/localization/Slic3rPE.pot @@ -1,419 +1,389 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy msgid "" msgstr "" -"Project-Id-Version: Slic3rPE\n" +"Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-02-28 13:53+0100\n" +"POT-Creation-Date: 2018-03-14 15:32+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:39 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:39 msgid "Shape" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:46 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:46 msgid "Rectangular" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:50 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1191 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:408 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:50 xs/src/slic3r/GUI/Tab.cpp:1270 +#: lib/Slic3r/GUI/Plater.pm:411 msgid "Size" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:51 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:51 msgid "Size in X and Y of the rectangular plate." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:57 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:57 msgid "Origin" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:58 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:58 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:62 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:62 msgid "Circular" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:65 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:129 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:200 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:211 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:325 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:336 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:355 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:434 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:781 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:801 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:860 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:878 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:896 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1044 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1052 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1094 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1103 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1113 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1121 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1129 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1215 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1421 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1491 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1527 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1704 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1711 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1718 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1727 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1737 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1747 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:65 xs/src/libslic3r/PrintConfig.cpp:129 +#: xs/src/libslic3r/PrintConfig.cpp:200 xs/src/libslic3r/PrintConfig.cpp:211 +#: xs/src/libslic3r/PrintConfig.cpp:325 xs/src/libslic3r/PrintConfig.cpp:336 +#: xs/src/libslic3r/PrintConfig.cpp:355 xs/src/libslic3r/PrintConfig.cpp:434 +#: xs/src/libslic3r/PrintConfig.cpp:781 xs/src/libslic3r/PrintConfig.cpp:801 +#: xs/src/libslic3r/PrintConfig.cpp:860 xs/src/libslic3r/PrintConfig.cpp:878 +#: xs/src/libslic3r/PrintConfig.cpp:896 xs/src/libslic3r/PrintConfig.cpp:1051 +#: xs/src/libslic3r/PrintConfig.cpp:1059 xs/src/libslic3r/PrintConfig.cpp:1101 +#: xs/src/libslic3r/PrintConfig.cpp:1110 xs/src/libslic3r/PrintConfig.cpp:1120 +#: xs/src/libslic3r/PrintConfig.cpp:1128 xs/src/libslic3r/PrintConfig.cpp:1136 +#: xs/src/libslic3r/PrintConfig.cpp:1222 xs/src/libslic3r/PrintConfig.cpp:1428 +#: xs/src/libslic3r/PrintConfig.cpp:1498 xs/src/libslic3r/PrintConfig.cpp:1534 +#: xs/src/libslic3r/PrintConfig.cpp:1711 xs/src/libslic3r/PrintConfig.cpp:1718 +#: xs/src/libslic3r/PrintConfig.cpp:1725 xs/src/libslic3r/PrintConfig.cpp:1734 +#: xs/src/libslic3r/PrintConfig.cpp:1744 xs/src/libslic3r/PrintConfig.cpp:1754 msgid "mm" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:66 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:431 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:66 xs/src/libslic3r/PrintConfig.cpp:431 msgid "Diameter" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:67 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:67 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:71 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:150 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:92 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:71 +#: xs/src/libslic3r/GCode/PreviewData.cpp:150 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:92 msgid "Custom" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:75 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:75 msgid "Load shape from STL..." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:120 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:120 msgid "Settings" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:298 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:298 msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:315 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:315 msgid "Error! " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:324 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:324 msgid "The selected file contains no geometry." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.cpp:328 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:328 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\BedShapeDialog.hpp:42 +#: xs/src/slic3r/GUI/BedShapeDialog.hpp:42 msgid "Bed Shape" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:224 +#: xs/src/slic3r/GUI/GUI.cpp:234 msgid "Array of language names and identifiers should have the same size." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:235 +#: xs/src/slic3r/GUI/GUI.cpp:245 msgid "Select the language" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:235 +#: xs/src/slic3r/GUI/GUI.cpp:245 msgid "Language" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:300 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:170 +#: xs/src/slic3r/GUI/GUI.cpp:312 xs/src/libslic3r/PrintConfig.cpp:170 msgid "Default" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:325 +#: xs/src/slic3r/GUI/GUI.cpp:337 msgid "Change Application Language" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:332 +#: xs/src/slic3r/GUI/GUI.cpp:344 msgid "Application will be restarted" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:332 +#: xs/src/slic3r/GUI/GUI.cpp:344 msgid "Attention!" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:339 +#: xs/src/slic3r/GUI/GUI.cpp:351 msgid "&Localization" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:488 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:470 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1300 +#: xs/src/slic3r/GUI/GUI.cpp:494 lib/Slic3r/GUI/MainFrame.pm:465 +#: lib/Slic3r/GUI/Plater.pm:1304 msgid "Error" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:493 +#: xs/src/slic3r/GUI/GUI.cpp:499 msgid "Notice" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:498 +#: xs/src/slic3r/GUI/GUI.cpp:504 msgid "GLUquadricObjPtr | Attempt to free unreferenced scalar" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\GUI.cpp:500 +#: xs/src/slic3r/GUI/GUI.cpp:506 msgid "Warning" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:50 -msgid "Save current " +#: xs/src/slic3r/GUI/GUI.cpp:655 +msgid "Support" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:51 -msgid "Delete this preset" +#: xs/src/slic3r/GUI/GUI.cpp:658 +msgid "Select what kind of support do you need" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:313 -msgid "Layers and perimeters" +#: xs/src/slic3r/GUI/GUI.cpp:659 xs/src/libslic3r/GCode/PreviewData.cpp:137 +msgid "None" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:314 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:777 -msgid "Layer height" +#: xs/src/slic3r/GUI/GUI.cpp:660 xs/src/libslic3r/PrintConfig.cpp:1415 +msgid "Support on build plate only" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:318 -msgid "Vertical shells" +#: xs/src/slic3r/GUI/GUI.cpp:661 +msgid "Everywhere" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:329 -msgid "Horizontal shells" -msgstr "" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:330 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1314 -msgid "Solid layers" -msgstr "" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:335 -msgid "Quality (slower slicing)" -msgstr "" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:342 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:356 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:449 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:452 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:831 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1113 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:107 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:208 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:736 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1733 -msgid "Advanced" -msgstr "" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:346 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:347 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:664 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:87 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:247 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:488 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:502 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:540 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:681 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:691 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:709 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:727 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:746 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1263 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1280 -msgid "Infill" -msgstr "" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:352 -msgid "Reducing printing time" -msgstr "" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:364 -msgid "Skirt and brim" -msgstr "" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:365 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:146 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:88 -msgid "Skirt" -msgstr "" - -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:371 +#: xs/src/slic3r/GUI/GUI.cpp:673 xs/src/slic3r/GUI/Tab.cpp:441 msgid "Brim" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:374 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:375 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:191 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1030 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1380 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1387 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1399 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1409 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1417 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1432 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1453 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1464 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1480 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1489 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1498 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1509 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1525 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1533 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1534 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1543 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1551 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1565 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:147 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:89 +#: xs/src/slic3r/GUI/GUI.cpp:675 +msgid "" +"This flag enables the brim that will be printed around each object on the " +"first layer." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:57 +msgid "Save current " +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:58 +msgid "Delete this preset" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:383 +msgid "Layers and perimeters" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:384 xs/src/libslic3r/PrintConfig.cpp:777 +msgid "Layer height" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:388 +msgid "Vertical shells" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:399 +msgid "Horizontal shells" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:400 xs/src/libslic3r/PrintConfig.cpp:1321 +msgid "Solid layers" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:405 +msgid "Quality (slower slicing)" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:412 xs/src/slic3r/GUI/Tab.cpp:426 +#: xs/src/slic3r/GUI/Tab.cpp:519 xs/src/slic3r/GUI/Tab.cpp:522 +#: xs/src/slic3r/GUI/Tab.cpp:905 xs/src/slic3r/GUI/Tab.cpp:1191 +#: xs/src/libslic3r/PrintConfig.cpp:107 xs/src/libslic3r/PrintConfig.cpp:208 +#: xs/src/libslic3r/PrintConfig.cpp:736 xs/src/libslic3r/PrintConfig.cpp:1740 +msgid "Advanced" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:416 xs/src/slic3r/GUI/Tab.cpp:417 +#: xs/src/slic3r/GUI/Tab.cpp:735 xs/src/libslic3r/PrintConfig.cpp:87 +#: xs/src/libslic3r/PrintConfig.cpp:247 xs/src/libslic3r/PrintConfig.cpp:488 +#: xs/src/libslic3r/PrintConfig.cpp:502 xs/src/libslic3r/PrintConfig.cpp:540 +#: xs/src/libslic3r/PrintConfig.cpp:681 xs/src/libslic3r/PrintConfig.cpp:691 +#: xs/src/libslic3r/PrintConfig.cpp:709 xs/src/libslic3r/PrintConfig.cpp:727 +#: xs/src/libslic3r/PrintConfig.cpp:746 xs/src/libslic3r/PrintConfig.cpp:1270 +#: xs/src/libslic3r/PrintConfig.cpp:1287 +msgid "Infill" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:422 +msgid "Reducing printing time" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:434 +msgid "Skirt and brim" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:435 xs/src/libslic3r/GCode/PreviewData.cpp:146 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:88 +msgid "Skirt" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:444 xs/src/slic3r/GUI/Tab.cpp:445 +#: xs/src/libslic3r/PrintConfig.cpp:191 xs/src/libslic3r/PrintConfig.cpp:1037 +#: xs/src/libslic3r/PrintConfig.cpp:1387 xs/src/libslic3r/PrintConfig.cpp:1394 +#: xs/src/libslic3r/PrintConfig.cpp:1406 xs/src/libslic3r/PrintConfig.cpp:1416 +#: xs/src/libslic3r/PrintConfig.cpp:1424 xs/src/libslic3r/PrintConfig.cpp:1439 +#: xs/src/libslic3r/PrintConfig.cpp:1460 xs/src/libslic3r/PrintConfig.cpp:1471 +#: xs/src/libslic3r/PrintConfig.cpp:1487 xs/src/libslic3r/PrintConfig.cpp:1496 +#: xs/src/libslic3r/PrintConfig.cpp:1505 xs/src/libslic3r/PrintConfig.cpp:1516 +#: xs/src/libslic3r/PrintConfig.cpp:1532 xs/src/libslic3r/PrintConfig.cpp:1540 +#: xs/src/libslic3r/PrintConfig.cpp:1541 xs/src/libslic3r/PrintConfig.cpp:1550 +#: xs/src/libslic3r/PrintConfig.cpp:1558 xs/src/libslic3r/PrintConfig.cpp:1572 +#: xs/src/libslic3r/GCode/PreviewData.cpp:147 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:89 msgid "Support material" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:380 +#: xs/src/slic3r/GUI/Tab.cpp:450 msgid "Raft" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:384 +#: xs/src/slic3r/GUI/Tab.cpp:454 msgid "Options for support material and raft" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:398 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:118 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:278 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:635 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:747 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:979 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1201 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1251 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1302 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1625 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:71 +#: xs/src/slic3r/GUI/Tab.cpp:468 xs/src/libslic3r/PrintConfig.cpp:118 +#: xs/src/libslic3r/PrintConfig.cpp:278 xs/src/libslic3r/PrintConfig.cpp:635 +#: xs/src/libslic3r/PrintConfig.cpp:747 xs/src/libslic3r/PrintConfig.cpp:986 +#: xs/src/libslic3r/PrintConfig.cpp:1208 xs/src/libslic3r/PrintConfig.cpp:1258 +#: xs/src/libslic3r/PrintConfig.cpp:1309 xs/src/libslic3r/PrintConfig.cpp:1632 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:71 msgid "Speed" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:399 +#: xs/src/slic3r/GUI/Tab.cpp:469 msgid "Speed for print moves" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:411 +#: xs/src/slic3r/GUI/Tab.cpp:481 msgid "Speed for non-print moves" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:414 +#: xs/src/slic3r/GUI/Tab.cpp:484 msgid "Modifiers" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:417 +#: xs/src/slic3r/GUI/Tab.cpp:487 msgid "Acceleration control (advanced)" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:424 +#: xs/src/slic3r/GUI/Tab.cpp:494 msgid "Autospeed (advanced)" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:430 +#: xs/src/slic3r/GUI/Tab.cpp:500 msgid "Multiple Extruders" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:431 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:966 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:308 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:702 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:958 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1272 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1445 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1471 +#: xs/src/slic3r/GUI/Tab.cpp:501 xs/src/slic3r/GUI/Tab.cpp:1040 +#: xs/src/libslic3r/PrintConfig.cpp:308 xs/src/libslic3r/PrintConfig.cpp:702 +#: xs/src/libslic3r/PrintConfig.cpp:965 xs/src/libslic3r/PrintConfig.cpp:1279 +#: xs/src/libslic3r/PrintConfig.cpp:1452 xs/src/libslic3r/PrintConfig.cpp:1478 msgid "Extruders" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:438 +#: xs/src/slic3r/GUI/Tab.cpp:508 msgid "Ooze prevention" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:442 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:149 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:91 +#: xs/src/slic3r/GUI/Tab.cpp:512 xs/src/libslic3r/GCode/PreviewData.cpp:149 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:91 msgid "Wipe tower" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:453 +#: xs/src/slic3r/GUI/Tab.cpp:523 msgid "Extrusion width" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:463 +#: xs/src/slic3r/GUI/Tab.cpp:533 msgid "Overlap" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:466 +#: xs/src/slic3r/GUI/Tab.cpp:536 msgid "Flow" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:469 +#: xs/src/slic3r/GUI/Tab.cpp:539 msgid "Other" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:476 +#: xs/src/slic3r/GUI/Tab.cpp:546 msgid "Output options" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:477 +#: xs/src/slic3r/GUI/Tab.cpp:547 msgid "Sequential printing" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:479 +#: xs/src/slic3r/GUI/Tab.cpp:549 msgid "Extruder clearance (mm)" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:488 +#: xs/src/slic3r/GUI/Tab.cpp:558 msgid "Output file" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:494 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1001 +#: xs/src/slic3r/GUI/Tab.cpp:564 xs/src/libslic3r/PrintConfig.cpp:1008 msgid "Post-processing scripts" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:500 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:501 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:859 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:860 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1156 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1157 +#: xs/src/slic3r/GUI/Tab.cpp:570 xs/src/slic3r/GUI/Tab.cpp:571 +#: xs/src/slic3r/GUI/Tab.cpp:933 xs/src/slic3r/GUI/Tab.cpp:934 +#: xs/src/slic3r/GUI/Tab.cpp:1234 xs/src/slic3r/GUI/Tab.cpp:1235 msgid "Notes" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:507 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:867 +#: xs/src/slic3r/GUI/Tab.cpp:577 xs/src/slic3r/GUI/Tab.cpp:941 msgid "Dependencies" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:508 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:868 +#: xs/src/slic3r/GUI/Tab.cpp:578 xs/src/slic3r/GUI/Tab.cpp:942 msgid "Profile dependencies" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:509 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:869 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1668 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:143 +#: xs/src/slic3r/GUI/Tab.cpp:579 xs/src/slic3r/GUI/Tab.cpp:943 +#: xs/src/slic3r/GUI/Tab.cpp:1746 xs/src/libslic3r/PrintConfig.cpp:143 msgid "Compatible printers" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:533 -#, no-c-format +#: xs/src/slic3r/GUI/Tab.cpp:603 +#, possible-c-format msgid "" "The Spiral Vase mode requires:\n" "- one perimeter\n" @@ -425,11 +395,11 @@ msgid "" "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:540 +#: xs/src/slic3r/GUI/Tab.cpp:610 msgid "Spiral Vase" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:560 +#: xs/src/slic3r/GUI/Tab.cpp:630 msgid "" "The Wipe Tower currently supports only:\n" "- first layer height 0.2mm\n" @@ -438,13 +408,12 @@ msgid "" "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:564 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:585 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:602 +#: xs/src/slic3r/GUI/Tab.cpp:634 xs/src/slic3r/GUI/Tab.cpp:656 +#: xs/src/slic3r/GUI/Tab.cpp:673 msgid "Wipe Tower" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:581 +#: xs/src/slic3r/GUI/Tab.cpp:652 msgid "" "The Wipe Tower currently supports the non-soluble supports only\n" "if they are printed with the current extruder without triggering a tool " @@ -455,7 +424,7 @@ msgid "" "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:599 +#: xs/src/slic3r/GUI/Tab.cpp:670 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers.\n" @@ -463,7 +432,7 @@ msgid "" "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:617 +#: xs/src/slic3r/GUI/Tab.cpp:688 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters\n" @@ -471,351 +440,356 @@ msgid "" "Shall I adjust those settings for supports?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:620 +#: xs/src/slic3r/GUI/Tab.cpp:691 msgid "Support Generator" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:662 +#: xs/src/slic3r/GUI/Tab.cpp:733 msgid "The " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:662 -#, no-c-format +#: xs/src/slic3r/GUI/Tab.cpp:733 +#, possible-c-format msgid "" " infill pattern is not supposed to work at 100% density.\n" "\n" "Shall I switch to rectilinear fill pattern?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:786 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:787 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:368 +#: xs/src/slic3r/GUI/Tab.cpp:860 xs/src/slic3r/GUI/Tab.cpp:861 +#: lib/Slic3r/GUI/Plater.pm:368 msgid "Filament" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:794 +#: xs/src/slic3r/GUI/Tab.cpp:868 msgid "Temperature " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:795 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1234 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:307 +#: xs/src/slic3r/GUI/Tab.cpp:869 xs/src/slic3r/GUI/Tab.cpp:1313 +#: xs/src/libslic3r/PrintConfig.cpp:307 msgid "Extruder" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:800 +#: xs/src/slic3r/GUI/Tab.cpp:874 msgid "Bed" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:805 +#: xs/src/slic3r/GUI/Tab.cpp:879 msgid "Cooling" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:806 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:922 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1695 +#: xs/src/slic3r/GUI/Tab.cpp:880 xs/src/libslic3r/PrintConfig.cpp:929 +#: xs/src/libslic3r/PrintConfig.cpp:1702 msgid "Enable" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:817 +#: xs/src/slic3r/GUI/Tab.cpp:891 msgid "Fan settings" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:818 +#: xs/src/slic3r/GUI/Tab.cpp:892 msgid "Fan speed" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:826 +#: xs/src/slic3r/GUI/Tab.cpp:900 msgid "Cooling thresholds" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:832 +#: xs/src/slic3r/GUI/Tab.cpp:906 msgid "Filament properties" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:836 +#: xs/src/slic3r/GUI/Tab.cpp:910 msgid "Print speed override" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:846 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1119 +#: xs/src/slic3r/GUI/Tab.cpp:920 xs/src/slic3r/GUI/Tab.cpp:1197 msgid "Custom G-code" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:847 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1120 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1342 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1357 +#: xs/src/slic3r/GUI/Tab.cpp:921 xs/src/slic3r/GUI/Tab.cpp:1198 +#: xs/src/libslic3r/PrintConfig.cpp:1349 xs/src/libslic3r/PrintConfig.cpp:1364 msgid "Start G-code" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:853 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1126 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:217 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:227 +#: xs/src/slic3r/GUI/Tab.cpp:927 xs/src/slic3r/GUI/Tab.cpp:1204 +#: xs/src/libslic3r/PrintConfig.cpp:217 xs/src/libslic3r/PrintConfig.cpp:227 msgid "End G-code" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:937 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:11 +#: xs/src/slic3r/GUI/Tab.cpp:1011 xs/src/slic3r/GUI/Preferences.cpp:11 msgid "General" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:938 +#: xs/src/slic3r/GUI/Tab.cpp:1012 msgid "Size and coordinates" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:940 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:34 +#: xs/src/slic3r/GUI/Tab.cpp:1014 xs/src/libslic3r/PrintConfig.cpp:34 msgid "Bed shape" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:942 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1637 +#: xs/src/slic3r/GUI/Tab.cpp:1016 xs/src/slic3r/GUI/Tab.cpp:1715 msgid " Set " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:962 +#: xs/src/slic3r/GUI/Tab.cpp:1036 msgid "Capabilities" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:967 +#: xs/src/slic3r/GUI/Tab.cpp:1041 msgid "Number of extruders of the printer." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:989 +#: xs/src/slic3r/GUI/Tab.cpp:1063 msgid "USB/Serial connection" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:990 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1193 +#: xs/src/slic3r/GUI/Tab.cpp:1064 xs/src/libslic3r/PrintConfig.cpp:1200 msgid "Serial port" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:995 +#: xs/src/slic3r/GUI/Tab.cpp:1069 msgid "Rescan serial ports" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1004 -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1072 +#: xs/src/slic3r/GUI/Tab.cpp:1078 xs/src/slic3r/GUI/Tab.cpp:1125 msgid "Test" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1017 +#: xs/src/slic3r/GUI/Tab.cpp:1091 msgid "Connection to printer works correctly." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1017 +#: xs/src/slic3r/GUI/Tab.cpp:1091 xs/src/slic3r/GUI/Tab.cpp:1135 msgid "Success!" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1020 +#: xs/src/slic3r/GUI/Tab.cpp:1094 msgid "Connection failed." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1032 +#: xs/src/slic3r/GUI/Tab.cpp:1106 msgid "OctoPrint upload" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1035 +#: xs/src/slic3r/GUI/Tab.cpp:1109 xs/src/slic3r/GUI/Tab.cpp:1156 msgid " Browse " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1110 +#: xs/src/slic3r/GUI/Tab.cpp:1135 lib/Slic3r/GUI/MainFrame.pm:209 +msgid "Connection to OctoPrint works correctly." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1138 +msgid "Could not connect to OctoPrint" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1138 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1162 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1163 +msgid "Open CA certificate file" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1177 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:1188 msgid "Firmware" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1132 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:48 +#: xs/src/slic3r/GUI/Tab.cpp:1210 xs/src/libslic3r/PrintConfig.cpp:48 msgid "Before layer change G-code" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1138 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:766 +#: xs/src/slic3r/GUI/Tab.cpp:1216 xs/src/libslic3r/PrintConfig.cpp:766 msgid "After layer change G-code" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1144 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1602 +#: xs/src/slic3r/GUI/Tab.cpp:1222 xs/src/libslic3r/PrintConfig.cpp:1609 msgid "Tool change G-code" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1150 +#: xs/src/slic3r/GUI/Tab.cpp:1228 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1187 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:400 +#: xs/src/slic3r/GUI/Tab.cpp:1266 xs/src/libslic3r/GCode/PreviewData.cpp:400 #, possible-c-format msgid "Extruder %d" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1194 +#: xs/src/slic3r/GUI/Tab.cpp:1273 msgid "Layer height limits" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1199 +#: xs/src/slic3r/GUI/Tab.cpp:1278 msgid "Position (for multi-extruder printers)" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1202 +#: xs/src/slic3r/GUI/Tab.cpp:1281 msgid "Retraction" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1205 +#: xs/src/slic3r/GUI/Tab.cpp:1284 msgid "Only lift Z" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1218 +#: xs/src/slic3r/GUI/Tab.cpp:1297 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1222 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:150 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2125 +#: xs/src/slic3r/GUI/Tab.cpp:1301 lib/Slic3r/GUI/Plater.pm:150 +#: lib/Slic3r/GUI/Plater.pm:2095 msgid "Preview" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1312 +#: xs/src/slic3r/GUI/Tab.cpp:1386 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1314 +#: xs/src/slic3r/GUI/Tab.cpp:1388 msgid "Firmware Retraction" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1469 +#: xs/src/slic3r/GUI/Tab.cpp:1547 msgid "Default " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1469 +#: xs/src/slic3r/GUI/Tab.cpp:1547 msgid " preset" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1470 +#: xs/src/slic3r/GUI/Tab.cpp:1548 msgid " preset\n" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1488 +#: xs/src/slic3r/GUI/Tab.cpp:1566 msgid "" "\n" "\n" "is not compatible with printer\n" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1488 +#: xs/src/slic3r/GUI/Tab.cpp:1566 msgid "" "\n" "\n" "and it has the following unsaved changes:" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1489 +#: xs/src/slic3r/GUI/Tab.cpp:1567 msgid "" "\n" "\n" "has the following unsaved changes:" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1491 +#: xs/src/slic3r/GUI/Tab.cpp:1569 msgid "" "\n" "\n" "Discard changes and continue anyway?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1492 +#: xs/src/slic3r/GUI/Tab.cpp:1570 msgid "Unsaved Changes" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1560 +#: xs/src/slic3r/GUI/Tab.cpp:1638 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1580 +#: xs/src/slic3r/GUI/Tab.cpp:1658 msgid "remove" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1580 +#: xs/src/slic3r/GUI/Tab.cpp:1658 msgid "delete" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1581 +#: xs/src/slic3r/GUI/Tab.cpp:1659 msgid "Are you sure you want to " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1581 +#: xs/src/slic3r/GUI/Tab.cpp:1659 msgid " the selected preset?" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1582 +#: xs/src/slic3r/GUI/Tab.cpp:1660 msgid "Remove" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1582 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:178 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:196 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2021 +#: xs/src/slic3r/GUI/Tab.cpp:1660 lib/Slic3r/GUI/Plater.pm:178 +#: lib/Slic3r/GUI/Plater.pm:196 lib/Slic3r/GUI/Plater.pm:1991 msgid "Delete" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1583 +#: xs/src/slic3r/GUI/Tab.cpp:1661 msgid " Preset" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1636 +#: xs/src/slic3r/GUI/Tab.cpp:1714 msgid "All" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1667 +#: xs/src/slic3r/GUI/Tab.cpp:1745 msgid "Select the printers this profile is compatible with." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1751 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:514 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1645 +#: xs/src/slic3r/GUI/Tab.cpp:1834 lib/Slic3r/GUI/MainFrame.pm:509 +#: lib/Slic3r/GUI/Plater.pm:1615 msgid "Save " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1751 +#: xs/src/slic3r/GUI/Tab.cpp:1834 msgid " as:" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1785 +#: xs/src/slic3r/GUI/Tab.cpp:1868 msgid "" "The supplied name is not valid; the following characters are not allowed:" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.cpp:1788 +#: xs/src/slic3r/GUI/Tab.cpp:1871 msgid "The supplied name is not available." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.hpp:182 +#: xs/src/slic3r/GUI/Tab.hpp:185 msgid "Print Settings" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.hpp:202 +#: xs/src/slic3r/GUI/Tab.hpp:205 msgid "Filament Settings" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.hpp:228 +#: xs/src/slic3r/GUI/Tab.hpp:226 msgid "Printer Settings" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Tab.hpp:248 +#: xs/src/slic3r/GUI/Tab.hpp:240 msgid "Save preset" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Field.cpp:42 +#: xs/src/slic3r/GUI/Field.cpp:59 msgid "default" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:26 +#: xs/src/slic3r/GUI/PresetHints.cpp:27 #, possible-c-format msgid "" "If estimated layer time is below ~%ds, fan will run at %d%% and print speed " @@ -823,7 +797,7 @@ msgid "" "speed will never be reduced below %dmm/s)." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:30 +#: xs/src/slic3r/GUI/PresetHints.cpp:31 #, possible-c-format msgid "" "\n" @@ -831,330 +805,355 @@ msgid "" "proportionally decreasing speed between %d%% and %d%%." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:34 +#: xs/src/slic3r/GUI/PresetHints.cpp:35 msgid "" "\n" "During the other layers, fan " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:36 +#: xs/src/slic3r/GUI/PresetHints.cpp:37 msgid "Fan " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:41 +#: xs/src/slic3r/GUI/PresetHints.cpp:42 #, possible-c-format msgid "will always run at %d%% " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:44 +#: xs/src/slic3r/GUI/PresetHints.cpp:45 #, possible-c-format msgid "except for the first %d layers" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:48 +#: xs/src/slic3r/GUI/PresetHints.cpp:49 msgid "except for the first layer" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:50 +#: xs/src/slic3r/GUI/PresetHints.cpp:51 msgid "will be turned off." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:151 +#: xs/src/slic3r/GUI/PresetHints.cpp:152 msgid "external perimeters" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:160 +#: xs/src/slic3r/GUI/PresetHints.cpp:161 msgid "perimeters" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:169 +#: xs/src/slic3r/GUI/PresetHints.cpp:170 msgid "infill" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:179 +#: xs/src/slic3r/GUI/PresetHints.cpp:180 msgid "solid infill" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:187 +#: xs/src/slic3r/GUI/PresetHints.cpp:188 msgid "top solid infill" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:198 +#: xs/src/slic3r/GUI/PresetHints.cpp:199 msgid "support" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:208 +#: xs/src/slic3r/GUI/PresetHints.cpp:209 msgid "support interface" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:214 +#: xs/src/slic3r/GUI/PresetHints.cpp:215 msgid "First layer volumetric" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:214 +#: xs/src/slic3r/GUI/PresetHints.cpp:215 msgid "Bridging volumetric" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:214 +#: xs/src/slic3r/GUI/PresetHints.cpp:215 msgid "Volumetric" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:215 +#: xs/src/slic3r/GUI/PresetHints.cpp:216 msgid " flow rate is maximized " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:218 +#: xs/src/slic3r/GUI/PresetHints.cpp:219 msgid "by the print profile maximum" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:219 +#: xs/src/slic3r/GUI/PresetHints.cpp:220 msgid "when printing " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:220 +#: xs/src/slic3r/GUI/PresetHints.cpp:221 msgid " with a volumetric rate " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:224 +#: xs/src/slic3r/GUI/PresetHints.cpp:225 #, possible-c-format msgid "%3.2f mm³/s" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:226 +#: xs/src/slic3r/GUI/PresetHints.cpp:227 #, possible-c-format msgid " at filament speed %3.2f mm/s." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:245 +#: xs/src/slic3r/GUI/PresetHints.cpp:246 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:262 +#: xs/src/slic3r/GUI/PresetHints.cpp:263 #, possible-c-format msgid "Recommended object thin wall thickness for layer height %.2f and " msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\PresetHints.cpp:269 +#: xs/src/slic3r/GUI/PresetHints.cpp:270 #, possible-c-format msgid "%d lines: %.2lf mm" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.hpp:17 +#: xs/src/slic3r/GUI/Preferences.hpp:17 msgid "Preferences" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:27 +#: xs/src/slic3r/GUI/Preferences.cpp:27 msgid "Remember output directory" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:29 +#: xs/src/slic3r/GUI/Preferences.cpp:29 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:35 +#: xs/src/slic3r/GUI/Preferences.cpp:35 msgid "Auto-center parts" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:37 +#: xs/src/slic3r/GUI/Preferences.cpp:37 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:43 +#: xs/src/slic3r/GUI/Preferences.cpp:43 msgid "Background processing" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:45 +#: xs/src/slic3r/GUI/Preferences.cpp:45 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:51 +#: xs/src/slic3r/GUI/Preferences.cpp:51 msgid "Disable USB/serial connection" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:53 +#: xs/src/slic3r/GUI/Preferences.cpp:53 msgid "" "Disable communication with the printer over a serial / USB cable. This " "simplifies the user interface in case the printer is never attached to the " "computer." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:59 +#: xs/src/slic3r/GUI/Preferences.cpp:59 msgid "Suppress \" - default - \" presets" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:61 +#: xs/src/slic3r/GUI/Preferences.cpp:61 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:67 +#: xs/src/slic3r/GUI/Preferences.cpp:67 msgid "Show incompatible print and filament presets" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:69 +#: xs/src/slic3r/GUI/Preferences.cpp:69 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:75 +#: xs/src/slic3r/GUI/Preferences.cpp:75 msgid "Use legacy OpenGL 1.1 rendering" msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:77 +#: xs/src/slic3r/GUI/Preferences.cpp:77 msgid "" "If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may " "try to check this checkbox. This will disable the layer height editing and " "anti aliasing, so it is likely better to upgrade your graphics driver." msgstr "" -#: c:\src\Slic3r\xs\src\slic3r\GUI\Preferences.cpp:101 +#: xs/src/slic3r/GUI/Preferences.cpp:101 msgid "You need to restart Slic3r to make the changes effective." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:26 +#: xs/src/slic3r/GUI/BonjourDialog.cpp:53 +msgid "Network lookup" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:66 +msgid "Address" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:67 +msgid "Hostname" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:68 +msgid "Service name" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:69 +msgid "OctoPrint version" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:187 +msgid "Searching for devices" +msgstr "" + +#: xs/src/slic3r/GUI/BonjourDialog.cpp:194 +msgid "Finished." +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:53 +msgid "G-code file successfully uploaded to the OctoPrint server" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:67 +msgid "Error while uploading to the OctoPrint server" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:102 +msgid "Invalid API key" +msgstr "" + +#: xs/src/libslic3r/PrintConfig.cpp:26 msgid "Avoid crossing perimeters" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:27 +#: xs/src/libslic3r/PrintConfig.cpp:27 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " "feature slows down both the print and the G-code generation." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:38 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1572 +#: xs/src/libslic3r/PrintConfig.cpp:38 xs/src/libslic3r/PrintConfig.cpp:1579 msgid "Other layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:39 +#: xs/src/libslic3r/PrintConfig.cpp:39 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:42 +#: xs/src/libslic3r/PrintConfig.cpp:42 msgid "Bed temperature" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:49 +#: xs/src/libslic3r/PrintConfig.cpp:49 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " "as [layer_num] and [layer_z]." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:59 +#: xs/src/libslic3r/PrintConfig.cpp:59 msgid "Between objects G-code" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:60 +#: xs/src/libslic3r/PrintConfig.cpp:60 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " "however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " "will not add temperature commands. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 S" -"[first_layer_temperature]\" command wherever you want." +"variables for all Slic3r settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:68 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:370 +#: xs/src/libslic3r/PrintConfig.cpp:68 lib/Slic3r/GUI/MainFrame.pm:364 msgid "Bottom" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:69 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:239 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:290 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:298 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:604 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:762 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:778 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:941 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:989 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1152 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1583 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1639 +#: xs/src/libslic3r/PrintConfig.cpp:69 xs/src/libslic3r/PrintConfig.cpp:239 +#: xs/src/libslic3r/PrintConfig.cpp:290 xs/src/libslic3r/PrintConfig.cpp:298 +#: xs/src/libslic3r/PrintConfig.cpp:604 xs/src/libslic3r/PrintConfig.cpp:762 +#: xs/src/libslic3r/PrintConfig.cpp:778 xs/src/libslic3r/PrintConfig.cpp:948 +#: xs/src/libslic3r/PrintConfig.cpp:996 xs/src/libslic3r/PrintConfig.cpp:1159 +#: xs/src/libslic3r/PrintConfig.cpp:1590 xs/src/libslic3r/PrintConfig.cpp:1646 msgid "Layers and Perimeters" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:70 +#: xs/src/libslic3r/PrintConfig.cpp:70 msgid "Number of solid layers to generate on bottom surfaces." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:72 +#: xs/src/libslic3r/PrintConfig.cpp:72 msgid "Bottom solid layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:77 +#: xs/src/libslic3r/PrintConfig.cpp:77 msgid "Bridge" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:78 +#: xs/src/libslic3r/PrintConfig.cpp:78 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:80 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:174 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:576 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:684 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:952 +#: xs/src/libslic3r/PrintConfig.cpp:80 xs/src/libslic3r/PrintConfig.cpp:174 +#: xs/src/libslic3r/PrintConfig.cpp:576 xs/src/libslic3r/PrintConfig.cpp:684 +#: xs/src/libslic3r/PrintConfig.cpp:959 msgid "mm/s²" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:86 +#: xs/src/libslic3r/PrintConfig.cpp:86 msgid "Bridging angle" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:88 +#: xs/src/libslic3r/PrintConfig.cpp:88 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " "bridges. Use 180° for zero angle." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:91 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:492 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1170 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1181 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1401 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1557 +#: xs/src/libslic3r/PrintConfig.cpp:91 xs/src/libslic3r/PrintConfig.cpp:492 +#: xs/src/libslic3r/PrintConfig.cpp:1177 xs/src/libslic3r/PrintConfig.cpp:1188 +#: xs/src/libslic3r/PrintConfig.cpp:1408 xs/src/libslic3r/PrintConfig.cpp:1564 msgid "°" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:97 +#: xs/src/libslic3r/PrintConfig.cpp:97 msgid "Bridges fan speed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:98 +#: xs/src/libslic3r/PrintConfig.cpp:98 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:99 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:504 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:789 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:850 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1060 +#: xs/src/libslic3r/PrintConfig.cpp:99 xs/src/libslic3r/PrintConfig.cpp:504 +#: xs/src/libslic3r/PrintConfig.cpp:789 xs/src/libslic3r/PrintConfig.cpp:850 +#: xs/src/libslic3r/PrintConfig.cpp:1067 msgid "%" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:106 +#: xs/src/libslic3r/PrintConfig.cpp:106 msgid "Bridge flow ratio" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:108 +#: xs/src/libslic3r/PrintConfig.cpp:108 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -1162,64 +1161,59 @@ msgid "" "before tweaking this." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:117 +#: xs/src/libslic3r/PrintConfig.cpp:117 msgid "Bridges" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:119 +#: xs/src/libslic3r/PrintConfig.cpp:119 msgid "Speed for printing bridges." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:120 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:638 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:749 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:811 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:868 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:981 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1137 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1146 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1536 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1649 +#: xs/src/libslic3r/PrintConfig.cpp:120 xs/src/libslic3r/PrintConfig.cpp:638 +#: xs/src/libslic3r/PrintConfig.cpp:749 xs/src/libslic3r/PrintConfig.cpp:811 +#: xs/src/libslic3r/PrintConfig.cpp:868 xs/src/libslic3r/PrintConfig.cpp:988 +#: xs/src/libslic3r/PrintConfig.cpp:1144 xs/src/libslic3r/PrintConfig.cpp:1153 +#: xs/src/libslic3r/PrintConfig.cpp:1543 xs/src/libslic3r/PrintConfig.cpp:1656 msgid "mm/s" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:127 +#: xs/src/libslic3r/PrintConfig.cpp:127 msgid "Brim width" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:128 +#: xs/src/libslic3r/PrintConfig.cpp:128 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:135 +#: xs/src/libslic3r/PrintConfig.cpp:135 msgid "Clip multi-part objects" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:136 +#: xs/src/libslic3r/PrintConfig.cpp:136 msgid "" "When printing multi-material objects, this settings will make slic3r 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)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:147 +#: xs/src/libslic3r/PrintConfig.cpp:147 msgid "Compatible printers condition" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:148 +#: xs/src/libslic3r/PrintConfig.cpp:148 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active printer profile." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:154 +#: xs/src/libslic3r/PrintConfig.cpp:154 msgid "Complete individual objects" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:155 +#: xs/src/libslic3r/PrintConfig.cpp:155 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -1227,78 +1221,75 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:163 +#: xs/src/libslic3r/PrintConfig.cpp:163 msgid "Enable auto cooling" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:164 +#: xs/src/libslic3r/PrintConfig.cpp:164 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:171 +#: xs/src/libslic3r/PrintConfig.cpp:171 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:180 +#: xs/src/libslic3r/PrintConfig.cpp:180 msgid "Disable fan for the first" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:181 +#: xs/src/libslic3r/PrintConfig.cpp:181 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:183 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:694 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1033 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1224 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1285 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1437 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1482 +#: xs/src/libslic3r/PrintConfig.cpp:183 xs/src/libslic3r/PrintConfig.cpp:694 +#: xs/src/libslic3r/PrintConfig.cpp:1040 xs/src/libslic3r/PrintConfig.cpp:1231 +#: xs/src/libslic3r/PrintConfig.cpp:1292 xs/src/libslic3r/PrintConfig.cpp:1444 +#: xs/src/libslic3r/PrintConfig.cpp:1489 msgid "layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:190 +#: xs/src/libslic3r/PrintConfig.cpp:190 msgid "Don't support bridges" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:192 +#: xs/src/libslic3r/PrintConfig.cpp:192 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:198 +#: xs/src/libslic3r/PrintConfig.cpp:198 msgid "Distance between copies" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:199 +#: xs/src/libslic3r/PrintConfig.cpp:199 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:207 +#: xs/src/libslic3r/PrintConfig.cpp:207 msgid "Elephant foot compensation" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:209 +#: xs/src/libslic3r/PrintConfig.cpp:209 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:218 +#: xs/src/libslic3r/PrintConfig.cpp:218 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all Slic3r settings." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:228 +#: xs/src/libslic3r/PrintConfig.cpp:228 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode. Note that you can use placeholder variables for all " @@ -1306,43 +1297,38 @@ msgid "" "extruder order." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:238 +#: xs/src/libslic3r/PrintConfig.cpp:238 msgid "Ensure vertical shell thickness" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:240 +#: xs/src/libslic3r/PrintConfig.cpp:240 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:246 +#: xs/src/libslic3r/PrintConfig.cpp:246 msgid "Top/bottom fill pattern" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:248 +#: xs/src/libslic3r/PrintConfig.cpp:248 msgid "" "Fill pattern for top/bottom infill. This only affects the external visible " "layer, and not its adjacent solid shells." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:267 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:277 +#: xs/src/libslic3r/PrintConfig.cpp:267 xs/src/libslic3r/PrintConfig.cpp:277 msgid "External perimeters" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:268 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:377 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:592 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:710 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:967 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1292 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1454 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1614 +#: xs/src/libslic3r/PrintConfig.cpp:268 xs/src/libslic3r/PrintConfig.cpp:377 +#: xs/src/libslic3r/PrintConfig.cpp:592 xs/src/libslic3r/PrintConfig.cpp:710 +#: xs/src/libslic3r/PrintConfig.cpp:974 xs/src/libslic3r/PrintConfig.cpp:1299 +#: xs/src/libslic3r/PrintConfig.cpp:1461 xs/src/libslic3r/PrintConfig.cpp:1621 msgid "Extrusion Width" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:269 +#: xs/src/libslic3r/PrintConfig.cpp:269 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -1350,67 +1336,60 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:272 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:597 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:715 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:972 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1296 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1458 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1619 +#: xs/src/libslic3r/PrintConfig.cpp:272 xs/src/libslic3r/PrintConfig.cpp:597 +#: xs/src/libslic3r/PrintConfig.cpp:715 xs/src/libslic3r/PrintConfig.cpp:979 +#: xs/src/libslic3r/PrintConfig.cpp:1303 xs/src/libslic3r/PrintConfig.cpp:1465 +#: xs/src/libslic3r/PrintConfig.cpp:1626 msgid "mm or % (leave 0 for default)" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:279 +#: xs/src/libslic3r/PrintConfig.cpp:279 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:282 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:619 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1255 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1306 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1501 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1631 +#: xs/src/libslic3r/PrintConfig.cpp:282 xs/src/libslic3r/PrintConfig.cpp:619 +#: xs/src/libslic3r/PrintConfig.cpp:1262 xs/src/libslic3r/PrintConfig.cpp:1313 +#: xs/src/libslic3r/PrintConfig.cpp:1508 xs/src/libslic3r/PrintConfig.cpp:1638 msgid "mm/s or %" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:289 +#: xs/src/libslic3r/PrintConfig.cpp:289 msgid "External perimeters first" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:291 +#: xs/src/libslic3r/PrintConfig.cpp:291 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:297 +#: xs/src/libslic3r/PrintConfig.cpp:297 msgid "Extra perimeters if needed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:299 -#, no-c-format +#: xs/src/libslic3r/PrintConfig.cpp:299 +#, possible-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " "is supported." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:309 +#: xs/src/libslic3r/PrintConfig.cpp:309 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " "extruders." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:320 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:69 +#: xs/src/libslic3r/PrintConfig.cpp:320 lib/Slic3r/GUI/Plater/3DPreview.pm:69 msgid "Height" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:321 +#: xs/src/libslic3r/PrintConfig.cpp:321 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -1418,31 +1397,30 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:331 +#: xs/src/libslic3r/PrintConfig.cpp:331 msgid "Radius" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:332 +#: xs/src/libslic3r/PrintConfig.cpp:332 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " "check for collisions and to display the graphical preview in the plater." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:342 +#: xs/src/libslic3r/PrintConfig.cpp:342 msgid "Extruder Color" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:343 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:406 +#: xs/src/libslic3r/PrintConfig.cpp:343 xs/src/libslic3r/PrintConfig.cpp:406 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:350 +#: xs/src/libslic3r/PrintConfig.cpp:350 msgid "Extruder offset" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:351 +#: xs/src/libslic3r/PrintConfig.cpp:351 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -1450,21 +1428,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:360 +#: xs/src/libslic3r/PrintConfig.cpp:360 msgid "Extrusion axis" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:361 +#: xs/src/libslic3r/PrintConfig.cpp:361 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:367 +#: xs/src/libslic3r/PrintConfig.cpp:367 msgid "Extrusion multiplier" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:368 +#: xs/src/libslic3r/PrintConfig.cpp:368 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -1472,11 +1450,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:376 +#: xs/src/libslic3r/PrintConfig.cpp:376 msgid "Default extrusion width" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:378 +#: xs/src/libslic3r/PrintConfig.cpp:378 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -1485,77 +1463,74 @@ msgid "" "height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:382 +#: xs/src/libslic3r/PrintConfig.cpp:382 msgid "mm or % (leave 0 for auto)" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:387 +#: xs/src/libslic3r/PrintConfig.cpp:387 msgid "Keep fan always on" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:388 +#: xs/src/libslic3r/PrintConfig.cpp:388 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:394 +#: xs/src/libslic3r/PrintConfig.cpp:394 msgid "Enable fan if layer print time is below" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:395 +#: xs/src/libslic3r/PrintConfig.cpp:395 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " "maximum speeds." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:397 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1242 +#: xs/src/libslic3r/PrintConfig.cpp:397 xs/src/libslic3r/PrintConfig.cpp:1249 msgid "approximate seconds" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:405 +#: xs/src/libslic3r/PrintConfig.cpp:405 msgid "Color" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:412 +#: xs/src/libslic3r/PrintConfig.cpp:412 msgid "Filament notes" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:413 +#: xs/src/libslic3r/PrintConfig.cpp:413 msgid "You can put your notes regarding the filament here." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:421 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:817 +#: xs/src/libslic3r/PrintConfig.cpp:421 xs/src/libslic3r/PrintConfig.cpp:817 msgid "Max volumetric speed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:422 +#: xs/src/libslic3r/PrintConfig.cpp:422 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " "speed. Set to zero for no limit." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:425 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:820 +#: xs/src/libslic3r/PrintConfig.cpp:425 xs/src/libslic3r/PrintConfig.cpp:820 msgid "mm³/s" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:432 +#: xs/src/libslic3r/PrintConfig.cpp:432 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:440 +#: xs/src/libslic3r/PrintConfig.cpp:440 msgid "Density" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:441 +#: xs/src/libslic3r/PrintConfig.cpp:441 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -1563,16 +1538,15 @@ msgid "" "displacement." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:444 +#: xs/src/libslic3r/PrintConfig.cpp:444 msgid "g/cm³" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:450 +#: xs/src/libslic3r/PrintConfig.cpp:450 msgid "Filament type" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:451 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1002 +#: xs/src/libslic3r/PrintConfig.cpp:451 xs/src/libslic3r/PrintConfig.cpp:1009 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -1581,77 +1555,73 @@ msgid "" "environment variables." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:470 +#: xs/src/libslic3r/PrintConfig.cpp:470 msgid "Soluble material" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:471 +#: xs/src/libslic3r/PrintConfig.cpp:471 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:476 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:450 +#: xs/src/libslic3r/PrintConfig.cpp:476 lib/Slic3r/GUI/Plater.pm:453 msgid "Cost" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:477 +#: xs/src/libslic3r/PrintConfig.cpp:477 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:478 +#: xs/src/libslic3r/PrintConfig.cpp:478 msgid "money/kg" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:487 +#: xs/src/libslic3r/PrintConfig.cpp:487 msgid "Fill angle" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:489 +#: xs/src/libslic3r/PrintConfig.cpp:489 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:501 +#: xs/src/libslic3r/PrintConfig.cpp:501 msgid "Fill density" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:503 -#, no-c-format +#: xs/src/libslic3r/PrintConfig.cpp:503 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:539 +#: xs/src/libslic3r/PrintConfig.cpp:539 msgid "Fill pattern" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:541 +#: xs/src/libslic3r/PrintConfig.cpp:541 msgid "Fill pattern for general low-density infill." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:573 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:582 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:591 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:625 +#: xs/src/libslic3r/PrintConfig.cpp:573 xs/src/libslic3r/PrintConfig.cpp:582 +#: xs/src/libslic3r/PrintConfig.cpp:591 xs/src/libslic3r/PrintConfig.cpp:625 msgid "First layer" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:574 +#: xs/src/libslic3r/PrintConfig.cpp:574 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:583 +#: xs/src/libslic3r/PrintConfig.cpp:583 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:593 +#: xs/src/libslic3r/PrintConfig.cpp:593 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -1659,11 +1629,11 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:603 +#: xs/src/libslic3r/PrintConfig.cpp:603 msgid "First layer height" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:605 +#: xs/src/libslic3r/PrintConfig.cpp:605 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -1671,59 +1641,58 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:609 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:740 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1390 +#: xs/src/libslic3r/PrintConfig.cpp:609 xs/src/libslic3r/PrintConfig.cpp:740 +#: xs/src/libslic3r/PrintConfig.cpp:1397 msgid "mm or %" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:615 +#: xs/src/libslic3r/PrintConfig.cpp:615 msgid "First layer speed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:616 +#: xs/src/libslic3r/PrintConfig.cpp:616 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:626 +#: xs/src/libslic3r/PrintConfig.cpp:626 msgid "" "Extruder temperature for first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output file." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:634 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:145 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:87 +#: xs/src/libslic3r/PrintConfig.cpp:634 +#: xs/src/libslic3r/GCode/PreviewData.cpp:145 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:87 msgid "Gap fill" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:636 +#: xs/src/libslic3r/PrintConfig.cpp:636 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:644 +#: xs/src/libslic3r/PrintConfig.cpp:644 msgid "Verbose G-code" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:645 +#: xs/src/libslic3r/PrintConfig.cpp:645 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:652 +#: xs/src/libslic3r/PrintConfig.cpp:652 msgid "G-code flavor" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:653 +#: xs/src/libslic3r/PrintConfig.cpp:653 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -1731,35 +1700,35 @@ msgid "" "extrusion value at all." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:682 +#: xs/src/libslic3r/PrintConfig.cpp:682 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:690 +#: xs/src/libslic3r/PrintConfig.cpp:690 msgid "Combine infill every" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:692 +#: xs/src/libslic3r/PrintConfig.cpp:692 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:696 +#: xs/src/libslic3r/PrintConfig.cpp:696 msgid "Combine infill every n layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:701 +#: xs/src/libslic3r/PrintConfig.cpp:701 msgid "Infill extruder" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:703 +#: xs/src/libslic3r/PrintConfig.cpp:703 msgid "The extruder to use when printing infill." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:711 +#: xs/src/libslic3r/PrintConfig.cpp:711 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -1768,32 +1737,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:720 +#: xs/src/libslic3r/PrintConfig.cpp:720 msgid "Infill before perimeters" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:721 +#: xs/src/libslic3r/PrintConfig.cpp:721 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:726 +#: xs/src/libslic3r/PrintConfig.cpp:726 msgid "Only infill where needed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:728 +#: xs/src/libslic3r/PrintConfig.cpp:728 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:735 +#: xs/src/libslic3r/PrintConfig.cpp:735 msgid "Infill/perimeters overlap" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:737 +#: xs/src/libslic3r/PrintConfig.cpp:737 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -1801,22 +1770,22 @@ msgid "" "perimeter extrusion width." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:748 +#: xs/src/libslic3r/PrintConfig.cpp:748 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:757 +#: xs/src/libslic3r/PrintConfig.cpp:757 msgid "Interface shells" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:758 +#: xs/src/libslic3r/PrintConfig.cpp:758 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:767 +#: xs/src/libslic3r/PrintConfig.cpp:767 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -1824,23 +1793,22 @@ msgid "" "[layer_z]." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:779 +#: xs/src/libslic3r/PrintConfig.cpp:779 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:787 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:796 +#: xs/src/libslic3r/PrintConfig.cpp:787 xs/src/libslic3r/PrintConfig.cpp:796 msgid "Max" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:788 +#: xs/src/libslic3r/PrintConfig.cpp:788 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:797 -#, no-c-format +#: xs/src/libslic3r/PrintConfig.cpp:797 +#, possible-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -1848,29 +1816,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:807 +#: xs/src/libslic3r/PrintConfig.cpp:807 msgid "Max print speed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:808 +#: xs/src/libslic3r/PrintConfig.cpp:808 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:818 +#: xs/src/libslic3r/PrintConfig.cpp:818 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:826 +#: xs/src/libslic3r/PrintConfig.cpp:826 msgid "Max volumetric slope positive" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:827 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:838 +#: xs/src/libslic3r/PrintConfig.cpp:827 xs/src/libslic3r/PrintConfig.cpp:838 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -1878,111 +1845,109 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:831 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:842 +#: xs/src/libslic3r/PrintConfig.cpp:831 xs/src/libslic3r/PrintConfig.cpp:842 msgid "mm³/s²" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:837 +#: xs/src/libslic3r/PrintConfig.cpp:837 msgid "Max volumetric slope negative" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:848 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:857 +#: xs/src/libslic3r/PrintConfig.cpp:848 xs/src/libslic3r/PrintConfig.cpp:857 msgid "Min" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:849 +#: xs/src/libslic3r/PrintConfig.cpp:849 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:858 +#: xs/src/libslic3r/PrintConfig.cpp:858 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:866 +#: xs/src/libslic3r/PrintConfig.cpp:866 msgid "Min print speed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:867 +#: xs/src/libslic3r/PrintConfig.cpp:867 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:874 +#: xs/src/libslic3r/PrintConfig.cpp:874 msgid "Minimum extrusion length" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:875 +#: xs/src/libslic3r/PrintConfig.cpp:875 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:884 +#: xs/src/libslic3r/PrintConfig.cpp:884 msgid "Configuration notes" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:885 +#: xs/src/libslic3r/PrintConfig.cpp:885 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:894 +#: xs/src/libslic3r/PrintConfig.cpp:894 msgid "Nozzle diameter" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:895 +#: xs/src/libslic3r/PrintConfig.cpp:895 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:901 +#: xs/src/libslic3r/PrintConfig.cpp:901 msgid "API Key" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:902 +#: xs/src/libslic3r/PrintConfig.cpp:902 msgid "" "Slic3r can upload G-code files to OctoPrint. This field should contain the " "API Key required for authentication." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:908 -msgid "Host or IP" +#: xs/src/libslic3r/PrintConfig.cpp:915 +msgid "Hostname, IP or URL" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:909 +#: xs/src/libslic3r/PrintConfig.cpp:916 msgid "" "Slic3r can upload G-code files to OctoPrint. This field should contain the " -"hostname or IP address of the OctoPrint instance." +"hostname, IP address or URL of the OctoPrint instance." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:915 +#: xs/src/libslic3r/PrintConfig.cpp:922 msgid "Only retract when crossing perimeters" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:916 +#: xs/src/libslic3r/PrintConfig.cpp:923 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:923 +#: xs/src/libslic3r/PrintConfig.cpp:930 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " "such skirt when changing temperatures." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:930 +#: xs/src/libslic3r/PrintConfig.cpp:937 msgid "Output filename format" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:931 +#: xs/src/libslic3r/PrintConfig.cpp:938 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -1990,40 +1955,38 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:940 +#: xs/src/libslic3r/PrintConfig.cpp:947 msgid "Detect bridging perimeters" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:942 +#: xs/src/libslic3r/PrintConfig.cpp:949 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:948 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:966 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:978 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:988 +#: xs/src/libslic3r/PrintConfig.cpp:955 xs/src/libslic3r/PrintConfig.cpp:973 +#: xs/src/libslic3r/PrintConfig.cpp:985 xs/src/libslic3r/PrintConfig.cpp:995 msgid "Perimeters" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:949 +#: xs/src/libslic3r/PrintConfig.cpp:956 msgid "" "This is the acceleration your printer will use for perimeters. A high value " "like 9000 usually gives good results if your hardware is up to the job. Set " "zero to disable acceleration control for perimeters." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:957 +#: xs/src/libslic3r/PrintConfig.cpp:964 msgid "Perimeter extruder" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:959 +#: xs/src/libslic3r/PrintConfig.cpp:966 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:968 +#: xs/src/libslic3r/PrintConfig.cpp:975 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -2032,12 +1995,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:980 +#: xs/src/libslic3r/PrintConfig.cpp:987 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:990 +#: xs/src/libslic3r/PrintConfig.cpp:997 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -2045,33 +2008,33 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:994 +#: xs/src/libslic3r/PrintConfig.cpp:1001 msgid "(minimum)" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1014 +#: xs/src/libslic3r/PrintConfig.cpp:1021 msgid "Printer notes" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1015 +#: xs/src/libslic3r/PrintConfig.cpp:1022 msgid "You can put your notes regarding the printer here." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1029 +#: xs/src/libslic3r/PrintConfig.cpp:1036 msgid "Raft layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1031 +#: xs/src/libslic3r/PrintConfig.cpp:1038 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1039 +#: xs/src/libslic3r/PrintConfig.cpp:1046 msgid "Resolution" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1040 +#: xs/src/libslic3r/PrintConfig.cpp:1047 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -2079,271 +2042,266 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1050 +#: xs/src/libslic3r/PrintConfig.cpp:1057 msgid "Minimum travel after retraction" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1051 +#: xs/src/libslic3r/PrintConfig.cpp:1058 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1057 +#: xs/src/libslic3r/PrintConfig.cpp:1064 msgid "Retract amount before wipe" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1058 +#: xs/src/libslic3r/PrintConfig.cpp:1065 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1065 +#: xs/src/libslic3r/PrintConfig.cpp:1072 msgid "Retract on layer change" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1066 +#: xs/src/libslic3r/PrintConfig.cpp:1073 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1071 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1080 +#: xs/src/libslic3r/PrintConfig.cpp:1078 xs/src/libslic3r/PrintConfig.cpp:1087 msgid "Length" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1072 +#: xs/src/libslic3r/PrintConfig.cpp:1079 msgid "Retraction Length" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1073 +#: xs/src/libslic3r/PrintConfig.cpp:1080 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1075 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1085 +#: xs/src/libslic3r/PrintConfig.cpp:1082 xs/src/libslic3r/PrintConfig.cpp:1092 msgid "mm (zero to disable)" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1081 +#: xs/src/libslic3r/PrintConfig.cpp:1088 msgid "Retraction Length (Toolchange)" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1082 +#: xs/src/libslic3r/PrintConfig.cpp:1089 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1090 +#: xs/src/libslic3r/PrintConfig.cpp:1097 msgid "Lift Z" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1091 +#: xs/src/libslic3r/PrintConfig.cpp:1098 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1099 +#: xs/src/libslic3r/PrintConfig.cpp:1106 msgid "Above Z" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1100 +#: xs/src/libslic3r/PrintConfig.cpp:1107 msgid "Only lift Z above" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1101 +#: xs/src/libslic3r/PrintConfig.cpp:1108 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1108 +#: xs/src/libslic3r/PrintConfig.cpp:1115 msgid "Below Z" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1109 +#: xs/src/libslic3r/PrintConfig.cpp:1116 msgid "Only lift Z below" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1110 +#: xs/src/libslic3r/PrintConfig.cpp:1117 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1118 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1126 +#: xs/src/libslic3r/PrintConfig.cpp:1125 xs/src/libslic3r/PrintConfig.cpp:1133 msgid "Extra length on restart" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1119 +#: xs/src/libslic3r/PrintConfig.cpp:1126 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1127 +#: xs/src/libslic3r/PrintConfig.cpp:1134 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1134 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1135 +#: xs/src/libslic3r/PrintConfig.cpp:1141 xs/src/libslic3r/PrintConfig.cpp:1142 msgid "Retraction Speed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1136 +#: xs/src/libslic3r/PrintConfig.cpp:1143 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1142 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1143 +#: xs/src/libslic3r/PrintConfig.cpp:1149 xs/src/libslic3r/PrintConfig.cpp:1150 msgid "Deretraction Speed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1144 +#: xs/src/libslic3r/PrintConfig.cpp:1151 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1151 +#: xs/src/libslic3r/PrintConfig.cpp:1158 msgid "Seam position" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1153 +#: xs/src/libslic3r/PrintConfig.cpp:1160 msgid "Position of perimeters starting points." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1169 +#: xs/src/libslic3r/PrintConfig.cpp:1176 msgid "Direction" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1171 +#: xs/src/libslic3r/PrintConfig.cpp:1178 msgid "Preferred direction of the seam" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1172 +#: xs/src/libslic3r/PrintConfig.cpp:1179 msgid "Seam preferred direction" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1180 +#: xs/src/libslic3r/PrintConfig.cpp:1187 msgid "Jitter" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1182 +#: xs/src/libslic3r/PrintConfig.cpp:1189 msgid "Seam preferred direction jitter" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1183 +#: xs/src/libslic3r/PrintConfig.cpp:1190 msgid "Preferred direction of the seam - jitter" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1194 +#: xs/src/libslic3r/PrintConfig.cpp:1201 msgid "USB/serial port for printer connection." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1202 +#: xs/src/libslic3r/PrintConfig.cpp:1209 msgid "Serial port speed" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1203 +#: xs/src/libslic3r/PrintConfig.cpp:1210 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1212 +#: xs/src/libslic3r/PrintConfig.cpp:1219 msgid "Distance from object" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1213 +#: xs/src/libslic3r/PrintConfig.cpp:1220 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1221 +#: xs/src/libslic3r/PrintConfig.cpp:1228 msgid "Skirt height" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1222 +#: xs/src/libslic3r/PrintConfig.cpp:1229 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1229 +#: xs/src/libslic3r/PrintConfig.cpp:1236 msgid "Loops (minimum)" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1230 +#: xs/src/libslic3r/PrintConfig.cpp:1237 msgid "Skirt Loops" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1231 +#: xs/src/libslic3r/PrintConfig.cpp:1238 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1239 +#: xs/src/libslic3r/PrintConfig.cpp:1246 msgid "Slow down if layer print time is below" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1240 +#: xs/src/libslic3r/PrintConfig.cpp:1247 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1250 +#: xs/src/libslic3r/PrintConfig.cpp:1257 msgid "Small perimeters" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1252 +#: xs/src/libslic3r/PrintConfig.cpp:1259 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1262 +#: xs/src/libslic3r/PrintConfig.cpp:1269 msgid "Solid infill threshold area" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1264 +#: xs/src/libslic3r/PrintConfig.cpp:1271 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1265 +#: xs/src/libslic3r/PrintConfig.cpp:1272 msgid "mm²" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1271 +#: xs/src/libslic3r/PrintConfig.cpp:1278 msgid "Solid infill extruder" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1273 +#: xs/src/libslic3r/PrintConfig.cpp:1280 msgid "The extruder to use when printing solid infill." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1279 +#: xs/src/libslic3r/PrintConfig.cpp:1286 msgid "Solid infill every" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1281 +#: xs/src/libslic3r/PrintConfig.cpp:1288 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -2351,14 +2309,13 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1291 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1301 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:142 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:84 +#: xs/src/libslic3r/PrintConfig.cpp:1298 xs/src/libslic3r/PrintConfig.cpp:1308 +#: xs/src/libslic3r/GCode/PreviewData.cpp:142 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:84 msgid "Solid infill" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1293 +#: xs/src/libslic3r/PrintConfig.cpp:1300 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -2366,22 +2323,22 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1303 +#: xs/src/libslic3r/PrintConfig.cpp:1310 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1315 +#: xs/src/libslic3r/PrintConfig.cpp:1322 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1322 +#: xs/src/libslic3r/PrintConfig.cpp:1329 msgid "Spiral vase" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1323 +#: xs/src/libslic3r/PrintConfig.cpp:1330 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -2390,18 +2347,18 @@ msgid "" "when printing more than an object." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1332 +#: xs/src/libslic3r/PrintConfig.cpp:1339 msgid "Temperature variation" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1333 +#: xs/src/libslic3r/PrintConfig.cpp:1340 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " "wiped." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1343 +#: xs/src/libslic3r/PrintConfig.cpp:1350 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -2412,80 +2369,76 @@ msgid "" "\"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1358 +#: xs/src/libslic3r/PrintConfig.cpp:1365 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode. This is used to override settings for a specific filament. If Slic3r " "detects M104, M109, M140 or M190 in your custom codes, such commands will " "not be prepended automatically so you're free to customize the order of " "heating commands and other custom actions. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 S" -"[first_layer_temperature]\" command wherever you want. If you have multiple " +"variables for all Slic3r settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want. If you have multiple " "extruders, the gcode is processed in extruder order." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1373 +#: xs/src/libslic3r/PrintConfig.cpp:1380 msgid "Single Extruder Multi Material" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1374 +#: xs/src/libslic3r/PrintConfig.cpp:1381 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1379 +#: xs/src/libslic3r/PrintConfig.cpp:1386 msgid "Generate support material" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1381 +#: xs/src/libslic3r/PrintConfig.cpp:1388 msgid "Enable support material generation." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1386 +#: xs/src/libslic3r/PrintConfig.cpp:1393 msgid "XY separation between an object and its support" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1388 +#: xs/src/libslic3r/PrintConfig.cpp:1395 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1398 +#: xs/src/libslic3r/PrintConfig.cpp:1405 msgid "Pattern angle" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1400 +#: xs/src/libslic3r/PrintConfig.cpp:1407 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1408 -msgid "Support on build plate only" -msgstr "" - -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1410 +#: xs/src/libslic3r/PrintConfig.cpp:1417 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1416 +#: xs/src/libslic3r/PrintConfig.cpp:1423 msgid "Contact Z distance" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1418 +#: xs/src/libslic3r/PrintConfig.cpp:1425 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1431 +#: xs/src/libslic3r/PrintConfig.cpp:1438 msgid "Enforce support for the first" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1433 +#: xs/src/libslic3r/PrintConfig.cpp:1440 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -2493,21 +2446,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1439 +#: xs/src/libslic3r/PrintConfig.cpp:1446 msgid "Enforce support for the first n layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1444 +#: xs/src/libslic3r/PrintConfig.cpp:1451 msgid "Support material/raft/skirt extruder" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1446 +#: xs/src/libslic3r/PrintConfig.cpp:1453 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1455 +#: xs/src/libslic3r/PrintConfig.cpp:1462 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -2515,91 +2468,91 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1463 +#: xs/src/libslic3r/PrintConfig.cpp:1470 msgid "Interface loops" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1465 +#: xs/src/libslic3r/PrintConfig.cpp:1472 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1470 +#: xs/src/libslic3r/PrintConfig.cpp:1477 msgid "Support material/raft interface extruder" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1472 +#: xs/src/libslic3r/PrintConfig.cpp:1479 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1479 +#: xs/src/libslic3r/PrintConfig.cpp:1486 msgid "Interface layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1481 +#: xs/src/libslic3r/PrintConfig.cpp:1488 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1488 +#: xs/src/libslic3r/PrintConfig.cpp:1495 msgid "Interface pattern spacing" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1490 +#: xs/src/libslic3r/PrintConfig.cpp:1497 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1497 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:148 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:90 +#: xs/src/libslic3r/PrintConfig.cpp:1504 +#: xs/src/libslic3r/GCode/PreviewData.cpp:148 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:90 msgid "Support material interface" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1499 +#: xs/src/libslic3r/PrintConfig.cpp:1506 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1508 +#: xs/src/libslic3r/PrintConfig.cpp:1515 msgid "Pattern" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1510 +#: xs/src/libslic3r/PrintConfig.cpp:1517 msgid "Pattern used to generate support material." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1524 +#: xs/src/libslic3r/PrintConfig.cpp:1531 msgid "Pattern spacing" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1526 +#: xs/src/libslic3r/PrintConfig.cpp:1533 msgid "Spacing between support material lines." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1535 +#: xs/src/libslic3r/PrintConfig.cpp:1542 msgid "Speed for printing support material." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1542 +#: xs/src/libslic3r/PrintConfig.cpp:1549 msgid "Synchronize with object layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1544 +#: xs/src/libslic3r/PrintConfig.cpp:1551 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1550 +#: xs/src/libslic3r/PrintConfig.cpp:1557 msgid "Overhang threshold" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1552 +#: xs/src/libslic3r/PrintConfig.cpp:1559 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -2608,61 +2561,60 @@ msgid "" "detection (recommended)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1564 +#: xs/src/libslic3r/PrintConfig.cpp:1571 msgid "With sheath around the support" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1566 +#: xs/src/libslic3r/PrintConfig.cpp:1573 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1573 +#: xs/src/libslic3r/PrintConfig.cpp:1580 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1576 +#: xs/src/libslic3r/PrintConfig.cpp:1583 msgid "Temperature" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1582 +#: xs/src/libslic3r/PrintConfig.cpp:1589 msgid "Detect thin walls" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1584 +#: xs/src/libslic3r/PrintConfig.cpp:1591 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1590 +#: xs/src/libslic3r/PrintConfig.cpp:1597 msgid "Threads" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1591 +#: xs/src/libslic3r/PrintConfig.cpp:1598 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1603 +#: xs/src/libslic3r/PrintConfig.cpp:1610 msgid "" "This custom code is inserted right before every extruder change. Note that " "you can use placeholder variables for all Slic3r settings as well as " "[previous_extruder] and [next_extruder]." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1613 -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1624 -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:143 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:85 +#: xs/src/libslic3r/PrintConfig.cpp:1620 xs/src/libslic3r/PrintConfig.cpp:1631 +#: xs/src/libslic3r/GCode/PreviewData.cpp:143 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:85 msgid "Top solid infill" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1615 +#: xs/src/libslic3r/PrintConfig.cpp:1622 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -2671,7 +2623,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1626 +#: xs/src/libslic3r/PrintConfig.cpp:1633 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -2680,53 +2632,51 @@ msgid "" "for auto." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1638 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:369 +#: xs/src/libslic3r/PrintConfig.cpp:1645 lib/Slic3r/GUI/MainFrame.pm:363 msgid "Top" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1640 +#: xs/src/libslic3r/PrintConfig.cpp:1647 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1642 +#: xs/src/libslic3r/PrintConfig.cpp:1649 msgid "Top solid layers" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1647 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:95 +#: xs/src/libslic3r/PrintConfig.cpp:1654 lib/Slic3r/GUI/Plater/3DPreview.pm:95 msgid "Travel" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1648 +#: xs/src/libslic3r/PrintConfig.cpp:1655 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1656 +#: xs/src/libslic3r/PrintConfig.cpp:1663 msgid "Use firmware retraction" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1657 +#: xs/src/libslic3r/PrintConfig.cpp:1664 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1663 +#: xs/src/libslic3r/PrintConfig.cpp:1670 msgid "Use relative E distances" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1664 +#: xs/src/libslic3r/PrintConfig.cpp:1671 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1670 +#: xs/src/libslic3r/PrintConfig.cpp:1677 msgid "Use volumetric E" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1671 +#: xs/src/libslic3r/PrintConfig.cpp:1678 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -2736,84 +2686,83 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1681 +#: xs/src/libslic3r/PrintConfig.cpp:1688 msgid "Enable variable layer height feature" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1682 +#: xs/src/libslic3r/PrintConfig.cpp:1689 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1688 +#: xs/src/libslic3r/PrintConfig.cpp:1695 msgid "Wipe while retracting" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1689 +#: xs/src/libslic3r/PrintConfig.cpp:1696 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1696 +#: xs/src/libslic3r/PrintConfig.cpp:1703 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1702 +#: xs/src/libslic3r/PrintConfig.cpp:1709 msgid "Position X" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1703 +#: xs/src/libslic3r/PrintConfig.cpp:1710 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1709 +#: xs/src/libslic3r/PrintConfig.cpp:1716 msgid "Position Y" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1710 +#: xs/src/libslic3r/PrintConfig.cpp:1717 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1716 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:70 +#: xs/src/libslic3r/PrintConfig.cpp:1723 lib/Slic3r/GUI/Plater/3DPreview.pm:70 msgid "Width" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1717 +#: xs/src/libslic3r/PrintConfig.cpp:1724 msgid "Width of a wipe tower" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1723 +#: xs/src/libslic3r/PrintConfig.cpp:1730 msgid "Per color change depth" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1724 +#: xs/src/libslic3r/PrintConfig.cpp:1731 msgid "" "Depth of a wipe color per color change. For N colors, there will be maximum " "(N-1) tool switches performed, therefore the total depth of the wipe tower " "will be (N-1) times this value." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1732 +#: xs/src/libslic3r/PrintConfig.cpp:1739 msgid "XY Size Compensation" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1734 +#: xs/src/libslic3r/PrintConfig.cpp:1741 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1742 +#: xs/src/libslic3r/PrintConfig.cpp:1749 msgid "Z offset" msgstr "" -#: C:\src\Slic3r\xs\src\libslic3r\PrintConfig.cpp:1743 +#: xs/src/libslic3r/PrintConfig.cpp:1750 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -2821,1063 +2770,1015 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:137 -msgid "None" -msgstr "" - -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:138 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:80 +#: xs/src/libslic3r/GCode/PreviewData.cpp:138 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:80 msgid "Perimeter" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:139 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:81 +#: xs/src/libslic3r/GCode/PreviewData.cpp:139 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:81 msgid "External perimeter" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:140 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:82 +#: xs/src/libslic3r/GCode/PreviewData.cpp:140 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:82 msgid "Overhang perimeter" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:141 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:83 +#: xs/src/libslic3r/GCode/PreviewData.cpp:141 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:83 msgid "Internal infill" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:144 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:86 +#: xs/src/libslic3r/GCode/PreviewData.cpp:144 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:86 msgid "Bridge infill" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:151 +#: xs/src/libslic3r/GCode/PreviewData.cpp:151 msgid "Mixed" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:330 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:68 +#: xs/src/libslic3r/GCode/PreviewData.cpp:330 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:68 msgid "Feature type" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:332 +#: xs/src/libslic3r/GCode/PreviewData.cpp:332 msgid "Height (mm)" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:334 +#: xs/src/libslic3r/GCode/PreviewData.cpp:334 msgid "Width (mm)" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:336 +#: xs/src/libslic3r/GCode/PreviewData.cpp:336 msgid "Speed (mm/s)" msgstr "" -#: c:\src\Slic3r\xs\src\libslic3r\GCode\PreviewData.cpp:338 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:72 +#: xs/src/libslic3r/GCode/PreviewData.cpp:338 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:72 msgid "Tool" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI.pm:286 -msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "" - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:66 +#: lib/Slic3r/GUI/MainFrame.pm:66 msgid "Version " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:66 +#: lib/Slic3r/GUI/MainFrame.pm:66 msgid "" " - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:118 +#: lib/Slic3r/GUI/MainFrame.pm:118 msgid "Plater" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:120 +#: lib/Slic3r/GUI/MainFrame.pm:120 msgid "Controller" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:192 +#: lib/Slic3r/GUI/MainFrame.pm:191 msgid "No Bonjour device found" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:192 +#: lib/Slic3r/GUI/MainFrame.pm:191 msgid "Device Browser" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:211 -msgid "Connection to OctoPrint works correctly." -msgstr "" - -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:214 +#: lib/Slic3r/GUI/MainFrame.pm:212 msgid "I wasn't able to connect to OctoPrint (" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:215 +#: lib/Slic3r/GUI/MainFrame.pm:213 msgid "). Check hostname and OctoPrint version (at least 1.1.0 is required)." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:251 +#: lib/Slic3r/GUI/MainFrame.pm:245 msgid "Open STL/OBJ/AMF…\tCtrl+O" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:251 +#: lib/Slic3r/GUI/MainFrame.pm:245 msgid "Open a model" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:254 +#: lib/Slic3r/GUI/MainFrame.pm:248 msgid "&Load Config…\tCtrl+L" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:254 +#: lib/Slic3r/GUI/MainFrame.pm:248 msgid "Load exported configuration file" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:257 +#: lib/Slic3r/GUI/MainFrame.pm:251 msgid "&Export Config…\tCtrl+E" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:257 +#: lib/Slic3r/GUI/MainFrame.pm:251 msgid "Export current configuration to file" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:260 +#: lib/Slic3r/GUI/MainFrame.pm:254 msgid "&Load Config Bundle…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:260 +#: lib/Slic3r/GUI/MainFrame.pm:254 msgid "Load presets from a bundle" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:263 +#: lib/Slic3r/GUI/MainFrame.pm:257 msgid "&Export Config Bundle…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:263 +#: lib/Slic3r/GUI/MainFrame.pm:257 msgid "Export all presets to file" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:268 +#: lib/Slic3r/GUI/MainFrame.pm:262 msgid "Q&uick Slice…\tCtrl+U" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:268 +#: lib/Slic3r/GUI/MainFrame.pm:262 msgid "Slice a file into a G-code" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:274 +#: lib/Slic3r/GUI/MainFrame.pm:268 msgid "Quick Slice and Save &As…\tCtrl+Alt+U" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:274 +#: lib/Slic3r/GUI/MainFrame.pm:268 msgid "Slice a file into a G-code, save as" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:280 +#: lib/Slic3r/GUI/MainFrame.pm:274 msgid "&Repeat Last Quick Slice\tCtrl+Shift+U" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:280 +#: lib/Slic3r/GUI/MainFrame.pm:274 msgid "Repeat last quick slice" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:287 +#: lib/Slic3r/GUI/MainFrame.pm:281 msgid "Slice to SV&G…\tCtrl+G" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:287 +#: lib/Slic3r/GUI/MainFrame.pm:281 msgid "Slice file to a multi-layer SVG" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:291 +#: lib/Slic3r/GUI/MainFrame.pm:285 msgid "(&Re)Slice Now\tCtrl+S" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:291 +#: lib/Slic3r/GUI/MainFrame.pm:285 msgid "Start new slicing process" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:294 +#: lib/Slic3r/GUI/MainFrame.pm:288 msgid "Repair STL file…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:294 +#: lib/Slic3r/GUI/MainFrame.pm:288 msgid "Automatically repair an STL file" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:299 +#: lib/Slic3r/GUI/MainFrame.pm:293 msgid "Preferences…\tCtrl+," msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:299 +#: lib/Slic3r/GUI/MainFrame.pm:293 msgid "Application preferences" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:304 +#: lib/Slic3r/GUI/MainFrame.pm:298 msgid "&Quit" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:304 +#: lib/Slic3r/GUI/MainFrame.pm:298 msgid "Quit Slic3r" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:314 +#: lib/Slic3r/GUI/MainFrame.pm:308 msgid "Export G-code..." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:314 +#: lib/Slic3r/GUI/MainFrame.pm:308 msgid "Export current plate as G-code" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:317 +#: lib/Slic3r/GUI/MainFrame.pm:311 msgid "Export plate as STL..." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:317 +#: lib/Slic3r/GUI/MainFrame.pm:311 msgid "Export current plate as STL" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:320 +#: lib/Slic3r/GUI/MainFrame.pm:314 msgid "Export plate as AMF..." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:320 +#: lib/Slic3r/GUI/MainFrame.pm:314 msgid "Export current plate as AMF" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:323 +#: lib/Slic3r/GUI/MainFrame.pm:317 msgid "Export plate as 3MF..." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:323 +#: lib/Slic3r/GUI/MainFrame.pm:317 msgid "Export current plate as 3MF" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:336 +#: lib/Slic3r/GUI/MainFrame.pm:330 msgid "Select &Plater Tab\tCtrl+1" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:336 +#: lib/Slic3r/GUI/MainFrame.pm:330 msgid "Show the plater" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:342 +#: lib/Slic3r/GUI/MainFrame.pm:336 msgid "Select &Controller Tab\tCtrl+T" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:342 +#: lib/Slic3r/GUI/MainFrame.pm:336 msgid "Show the printer controller" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:350 +#: lib/Slic3r/GUI/MainFrame.pm:344 msgid "Select P&rint Settings Tab\tCtrl+2" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:350 +#: lib/Slic3r/GUI/MainFrame.pm:344 msgid "Show the print settings" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:353 +#: lib/Slic3r/GUI/MainFrame.pm:347 msgid "Select &Filament Settings Tab\tCtrl+3" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:353 +#: lib/Slic3r/GUI/MainFrame.pm:347 msgid "Show the filament settings" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:356 +#: lib/Slic3r/GUI/MainFrame.pm:350 msgid "Select Print&er Settings Tab\tCtrl+4" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:356 +#: lib/Slic3r/GUI/MainFrame.pm:350 msgid "Show the printer settings" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:368 +#: lib/Slic3r/GUI/MainFrame.pm:362 msgid "Iso" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:368 +#: lib/Slic3r/GUI/MainFrame.pm:362 msgid "Iso View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:369 +#: lib/Slic3r/GUI/MainFrame.pm:363 msgid "Top View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:370 +#: lib/Slic3r/GUI/MainFrame.pm:364 msgid "Bottom View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:371 +#: lib/Slic3r/GUI/MainFrame.pm:365 msgid "Front" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:371 +#: lib/Slic3r/GUI/MainFrame.pm:365 msgid "Front View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:372 +#: lib/Slic3r/GUI/MainFrame.pm:366 msgid "Rear" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:372 +#: lib/Slic3r/GUI/MainFrame.pm:366 msgid "Rear View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:373 +#: lib/Slic3r/GUI/MainFrame.pm:367 msgid "Left" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:373 +#: lib/Slic3r/GUI/MainFrame.pm:367 msgid "Left View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:374 +#: lib/Slic3r/GUI/MainFrame.pm:368 msgid "Right" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:374 +#: lib/Slic3r/GUI/MainFrame.pm:368 msgid "Right View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:380 +#: lib/Slic3r/GUI/MainFrame.pm:374 msgid "&Configuration " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:380 +#: lib/Slic3r/GUI/MainFrame.pm:374 msgid "Run Configuration " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:385 +#: lib/Slic3r/GUI/MainFrame.pm:379 msgid "Prusa 3D Drivers" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:385 +#: lib/Slic3r/GUI/MainFrame.pm:379 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:388 +#: lib/Slic3r/GUI/MainFrame.pm:382 msgid "Prusa Edition Releases" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:388 +#: lib/Slic3r/GUI/MainFrame.pm:382 msgid "Open the Prusa Edition releases page in your browser" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:395 +#: lib/Slic3r/GUI/MainFrame.pm:389 msgid "Slic3r &Website" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:395 +#: lib/Slic3r/GUI/MainFrame.pm:389 msgid "Open the Slic3r website in your browser" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:398 +#: lib/Slic3r/GUI/MainFrame.pm:392 msgid "Slic3r &Manual" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:398 +#: lib/Slic3r/GUI/MainFrame.pm:392 msgid "Open the Slic3r manual in your browser" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:402 +#: lib/Slic3r/GUI/MainFrame.pm:396 msgid "System Info" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:402 +#: lib/Slic3r/GUI/MainFrame.pm:396 msgid "Show system information" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:405 +#: lib/Slic3r/GUI/MainFrame.pm:399 msgid "Report an Issue" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:405 +#: lib/Slic3r/GUI/MainFrame.pm:399 msgid "Report an issue on the Slic3r Prusa Edition" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:408 +#: lib/Slic3r/GUI/MainFrame.pm:402 msgid "&About Slic3r" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:408 +#: lib/Slic3r/GUI/MainFrame.pm:402 msgid "Show about dialog" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:418 +#: lib/Slic3r/GUI/MainFrame.pm:412 msgid "&File" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:419 +#: lib/Slic3r/GUI/MainFrame.pm:413 msgid "&Plater" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:420 +#: lib/Slic3r/GUI/MainFrame.pm:414 msgid "&Object" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:421 +#: lib/Slic3r/GUI/MainFrame.pm:415 msgid "&Window" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:422 +#: lib/Slic3r/GUI/MainFrame.pm:416 msgid "&View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:426 +#: lib/Slic3r/GUI/MainFrame.pm:420 msgid "&Help" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:457 +#: lib/Slic3r/GUI/MainFrame.pm:452 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:469 +#: lib/Slic3r/GUI/MainFrame.pm:464 msgid "No previously sliced file." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:474 +#: lib/Slic3r/GUI/MainFrame.pm:469 msgid "Previously sliced file (" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:474 +#: lib/Slic3r/GUI/MainFrame.pm:469 msgid ") not found." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:475 +#: lib/Slic3r/GUI/MainFrame.pm:470 msgid "File Not Found" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:514 +#: lib/Slic3r/GUI/MainFrame.pm:509 msgid "SVG" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:514 +#: lib/Slic3r/GUI/MainFrame.pm:509 msgid "G-code" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:514 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1645 +#: lib/Slic3r/GUI/MainFrame.pm:509 lib/Slic3r/GUI/Plater.pm:1615 msgid " file as:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:528 +#: lib/Slic3r/GUI/MainFrame.pm:523 msgid "Slicing…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:528 +#: lib/Slic3r/GUI/MainFrame.pm:523 msgid "Processing " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:548 +#: lib/Slic3r/GUI/MainFrame.pm:543 msgid " was successfully sliced." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:550 +#: lib/Slic3r/GUI/MainFrame.pm:545 msgid "Slicing Done!" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:566 +#: lib/Slic3r/GUI/MainFrame.pm:561 msgid "Select the STL file to repair:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:580 +#: lib/Slic3r/GUI/MainFrame.pm:575 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:594 +#: lib/Slic3r/GUI/MainFrame.pm:589 msgid "Your file was repaired." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:594 +#: lib/Slic3r/GUI/MainFrame.pm:589 msgid "Repair" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:605 +#: lib/Slic3r/GUI/MainFrame.pm:600 msgid "Save configuration as:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:623 -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:667 +#: lib/Slic3r/GUI/MainFrame.pm:618 lib/Slic3r/GUI/MainFrame.pm:662 msgid "Select configuration to load:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:646 +#: lib/Slic3r/GUI/MainFrame.pm:641 msgid "Save presets bundle as:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:687 +#: lib/Slic3r/GUI/MainFrame.pm:682 #, possible-perl-format msgid "%d presets successfully imported." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:749 +#: lib/Slic3r/GUI/MainFrame.pm:744 msgid "You have unsaved changes " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:749 +#: lib/Slic3r/GUI/MainFrame.pm:744 msgid ". Discard changes and continue anyway?" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\MainFrame.pm:750 +#: lib/Slic3r/GUI/MainFrame.pm:745 msgid "Unsaved Presets" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:104 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2124 +#: lib/Slic3r/GUI/Plater.pm:104 lib/Slic3r/GUI/Plater.pm:2094 msgid "3D" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:138 +#: lib/Slic3r/GUI/Plater.pm:138 msgid "2D" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:157 +#: lib/Slic3r/GUI/Plater.pm:157 msgid "Layers" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:177 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:195 +#: lib/Slic3r/GUI/Plater.pm:177 lib/Slic3r/GUI/Plater.pm:195 msgid "Add…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:179 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:197 +#: lib/Slic3r/GUI/Plater.pm:179 lib/Slic3r/GUI/Plater.pm:197 msgid "Delete All" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:180 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:198 +#: lib/Slic3r/GUI/Plater.pm:180 lib/Slic3r/GUI/Plater.pm:198 msgid "Arrange" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:182 +#: lib/Slic3r/GUI/Plater.pm:182 msgid "More" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:183 +#: lib/Slic3r/GUI/Plater.pm:183 msgid "Fewer" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:185 +#: lib/Slic3r/GUI/Plater.pm:185 msgid "45° ccw" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:186 +#: lib/Slic3r/GUI/Plater.pm:186 msgid "45° cw" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:187 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:203 +#: lib/Slic3r/GUI/Plater.pm:187 lib/Slic3r/GUI/Plater.pm:203 msgid "Scale…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:188 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:204 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2099 +#: lib/Slic3r/GUI/Plater.pm:188 lib/Slic3r/GUI/Plater.pm:204 +#: lib/Slic3r/GUI/Plater.pm:2069 msgid "Split" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:189 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:205 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2102 +#: lib/Slic3r/GUI/Plater.pm:189 lib/Slic3r/GUI/Plater.pm:205 +#: lib/Slic3r/GUI/Plater.pm:2072 msgid "Cut…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:191 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:206 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2106 +#: lib/Slic3r/GUI/Plater.pm:191 lib/Slic3r/GUI/Plater.pm:206 +#: lib/Slic3r/GUI/Plater.pm:2076 msgid "Settings…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:192 +#: lib/Slic3r/GUI/Plater.pm:192 msgid "Layer Editing" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:207 +#: lib/Slic3r/GUI/Plater.pm:207 msgid "Layer editing" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:220 +#: lib/Slic3r/GUI/Plater.pm:220 msgid "Name" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:221 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:900 +#: lib/Slic3r/GUI/Plater.pm:221 lib/Slic3r/GUI/Plater.pm:904 msgid "Copies" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:222 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1056 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1061 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2068 +#: lib/Slic3r/GUI/Plater.pm:222 lib/Slic3r/GUI/Plater.pm:1060 +#: lib/Slic3r/GUI/Plater.pm:1065 lib/Slic3r/GUI/Plater.pm:2038 msgid "Scale" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:236 +#: lib/Slic3r/GUI/Plater.pm:236 msgid "Export G-code…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:237 +#: lib/Slic3r/GUI/Plater.pm:237 msgid "Slice now" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:238 +#: lib/Slic3r/GUI/Plater.pm:238 msgid "Print…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:239 +#: lib/Slic3r/GUI/Plater.pm:239 msgid "Send to printer" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:240 +#: lib/Slic3r/GUI/Plater.pm:240 msgid "Export STL…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:367 +#: lib/Slic3r/GUI/Plater.pm:367 msgid "Print settings" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:369 +#: lib/Slic3r/GUI/Plater.pm:369 msgid "Printer" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:398 +#: lib/Slic3r/GUI/Plater.pm:401 msgid "Info" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:409 +#: lib/Slic3r/GUI/Plater.pm:412 msgid "Volume" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:410 +#: lib/Slic3r/GUI/Plater.pm:413 msgid "Facets" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:411 +#: lib/Slic3r/GUI/Plater.pm:414 msgid "Materials" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:412 +#: lib/Slic3r/GUI/Plater.pm:415 msgid "Manifold" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:438 +#: lib/Slic3r/GUI/Plater.pm:441 msgid "Sliced Info" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:447 +#: lib/Slic3r/GUI/Plater.pm:450 msgid "Used Filament (m)" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:448 +#: lib/Slic3r/GUI/Plater.pm:451 msgid "Used Filament (mm³)" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:449 +#: lib/Slic3r/GUI/Plater.pm:452 msgid "Used Filament (g)" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:451 +#: lib/Slic3r/GUI/Plater.pm:454 msgid "Estimated printing time" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:629 +#: lib/Slic3r/GUI/Plater.pm:633 msgid "Loading…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:629 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:643 +#: lib/Slic3r/GUI/Plater.pm:633 lib/Slic3r/GUI/Plater.pm:647 msgid "Processing input file\n" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:663 +#: lib/Slic3r/GUI/Plater.pm:667 msgid "" "This file contains several objects positioned at multiple heights. Instead " "of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?\n" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:666 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:683 +#: lib/Slic3r/GUI/Plater.pm:670 lib/Slic3r/GUI/Plater.pm:687 msgid "Multi-part object detected" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:680 +#: lib/Slic3r/GUI/Plater.pm:684 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?\n" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:692 +#: lib/Slic3r/GUI/Plater.pm:696 msgid "Loaded " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:744 +#: lib/Slic3r/GUI/Plater.pm:748 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:745 +#: lib/Slic3r/GUI/Plater.pm:749 msgid "Object too large?" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:900 +#: lib/Slic3r/GUI/Plater.pm:904 msgid "Enter the number of copies of the selected object:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:927 +#: lib/Slic3r/GUI/Plater.pm:931 msgid "" "\n" "Non-positive value." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:928 +#: lib/Slic3r/GUI/Plater.pm:932 msgid "" "\n" "Not a numeric value." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:929 +#: lib/Slic3r/GUI/Plater.pm:933 msgid "Slic3r Error" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:950 -msgid "Enter the rotation angle:" -msgstr "" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:950 -msgid "Rotate around " -msgstr "" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:950 -msgid "Invalid rotation angle entered" -msgstr "" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1030 +#: lib/Slic3r/GUI/Plater.pm:1034 #, possible-perl-format msgid "Enter the new size for the selected object (print bed: %smm):" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1031 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1035 +#: lib/Slic3r/GUI/Plater.pm:1035 lib/Slic3r/GUI/Plater.pm:1039 msgid "Scale along " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1031 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1035 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1056 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1061 +#: lib/Slic3r/GUI/Plater.pm:1035 lib/Slic3r/GUI/Plater.pm:1039 +#: lib/Slic3r/GUI/Plater.pm:1060 lib/Slic3r/GUI/Plater.pm:1065 msgid "Invalid scaling value entered" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1035 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1061 -#, no-perl-format +#: lib/Slic3r/GUI/Plater.pm:1039 lib/Slic3r/GUI/Plater.pm:1065 +#, possible-perl-format msgid "Enter the scale % for the selected object:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1056 +#: lib/Slic3r/GUI/Plater.pm:1060 msgid "Enter the new max size for the selected object:" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1112 +#: lib/Slic3r/GUI/Plater.pm:1116 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1121 +#: lib/Slic3r/GUI/Plater.pm:1125 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1286 +#: lib/Slic3r/GUI/Plater.pm:1290 msgid "Slicing cancelled" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1300 +#: lib/Slic3r/GUI/Plater.pm:1304 msgid "Another export job is currently running." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1445 +#: lib/Slic3r/GUI/Plater.pm:1335 +msgid "Save G-code file as:" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1352 +msgid "Export cancelled" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1449 msgid "File added to print queue" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1448 +#: lib/Slic3r/GUI/Plater.pm:1452 msgid "Sending G-code file to the OctoPrint server..." msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1451 +#: lib/Slic3r/GUI/Plater.pm:1455 msgid "G-code file exported to " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1454 +#: lib/Slic3r/GUI/Plater.pm:1458 msgid "Export failed" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1524 -msgid "G-code file successfully uploaded to the OctoPrint server" -msgstr "" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1526 -msgid "Error while uploading to the OctoPrint server: " -msgstr "" - -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1539 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1581 +#: lib/Slic3r/GUI/Plater.pm:1509 lib/Slic3r/GUI/Plater.pm:1551 msgid "STL file exported to " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1592 +#: lib/Slic3r/GUI/Plater.pm:1562 msgid "AMF file exported to " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1596 +#: lib/Slic3r/GUI/Plater.pm:1566 msgid "Error exporting AMF file " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1608 +#: lib/Slic3r/GUI/Plater.pm:1578 msgid "3MF file exported to " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1612 +#: lib/Slic3r/GUI/Plater.pm:1582 msgid "Error exporting 3MF file " msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1958 +#: lib/Slic3r/GUI/Plater.pm:1818 +msgid "" +"Please install the OpenGL modules to use this feature (see build " +"instructions)." +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1928 #, possible-perl-format msgid "%d (%d shells)" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1960 +#: lib/Slic3r/GUI/Plater.pm:1930 #, possible-perl-format msgid "Auto-repaired (%d errors)" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1965 +#: lib/Slic3r/GUI/Plater.pm:1935 #, possible-perl-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " "facets reversed, %d backwards edges" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:1970 +#: lib/Slic3r/GUI/Plater.pm:1940 msgid "Yes" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2021 +#: lib/Slic3r/GUI/Plater.pm:1991 msgid "Remove the selected object" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2024 +#: lib/Slic3r/GUI/Plater.pm:1994 msgid "Increase copies" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2024 +#: lib/Slic3r/GUI/Plater.pm:1994 msgid "Place one more copy of the selected object" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2027 +#: lib/Slic3r/GUI/Plater.pm:1997 msgid "Decrease copies" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2027 +#: lib/Slic3r/GUI/Plater.pm:1997 msgid "Remove one copy of the selected object" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2030 +#: lib/Slic3r/GUI/Plater.pm:2000 msgid "Set number of copies…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2030 +#: lib/Slic3r/GUI/Plater.pm:2000 msgid "Change the number of copies of the selected object" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2034 +#: lib/Slic3r/GUI/Plater.pm:2004 msgid "Rotate 45° clockwise" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2034 +#: lib/Slic3r/GUI/Plater.pm:2004 msgid "Rotate the selected object by 45° clockwise" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2037 +#: lib/Slic3r/GUI/Plater.pm:2007 msgid "Rotate 45° counter-clockwise" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2037 +#: lib/Slic3r/GUI/Plater.pm:2007 msgid "Rotate the selected object by 45° counter-clockwise" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2042 +#: lib/Slic3r/GUI/Plater.pm:2012 msgid "Rotate" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2042 +#: lib/Slic3r/GUI/Plater.pm:2012 msgid "Rotate the selected object by an arbitrary angle" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2044 +#: lib/Slic3r/GUI/Plater.pm:2014 msgid "Around X axis…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2044 +#: lib/Slic3r/GUI/Plater.pm:2014 msgid "Rotate the selected object by an arbitrary angle around X axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2047 +#: lib/Slic3r/GUI/Plater.pm:2017 msgid "Around Y axis…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2047 +#: lib/Slic3r/GUI/Plater.pm:2017 msgid "Rotate the selected object by an arbitrary angle around Y axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2050 +#: lib/Slic3r/GUI/Plater.pm:2020 msgid "Around Z axis…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2050 +#: lib/Slic3r/GUI/Plater.pm:2020 msgid "Rotate the selected object by an arbitrary angle around Z axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2055 +#: lib/Slic3r/GUI/Plater.pm:2025 msgid "Mirror" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2055 +#: lib/Slic3r/GUI/Plater.pm:2025 msgid "Mirror the selected object" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2057 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2073 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2089 +#: lib/Slic3r/GUI/Plater.pm:2027 lib/Slic3r/GUI/Plater.pm:2043 +#: lib/Slic3r/GUI/Plater.pm:2059 msgid "Along X axis…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2057 +#: lib/Slic3r/GUI/Plater.pm:2027 msgid "Mirror the selected object along the X axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2060 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2076 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2092 +#: lib/Slic3r/GUI/Plater.pm:2030 lib/Slic3r/GUI/Plater.pm:2046 +#: lib/Slic3r/GUI/Plater.pm:2062 msgid "Along Y axis…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2060 +#: lib/Slic3r/GUI/Plater.pm:2030 msgid "Mirror the selected object along the Y axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2063 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2079 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2095 +#: lib/Slic3r/GUI/Plater.pm:2033 lib/Slic3r/GUI/Plater.pm:2049 +#: lib/Slic3r/GUI/Plater.pm:2065 msgid "Along Z axis…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2063 +#: lib/Slic3r/GUI/Plater.pm:2033 msgid "Mirror the selected object along the Z axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2068 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2084 +#: lib/Slic3r/GUI/Plater.pm:2038 lib/Slic3r/GUI/Plater.pm:2054 msgid "Scale the selected object along a single axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2070 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2086 +#: lib/Slic3r/GUI/Plater.pm:2040 lib/Slic3r/GUI/Plater.pm:2056 msgid "Uniformly…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2070 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2086 +#: lib/Slic3r/GUI/Plater.pm:2040 lib/Slic3r/GUI/Plater.pm:2056 msgid "Scale the selected object along the XYZ axes" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2073 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2089 +#: lib/Slic3r/GUI/Plater.pm:2043 lib/Slic3r/GUI/Plater.pm:2059 msgid "Scale the selected object along the X axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2076 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2092 +#: lib/Slic3r/GUI/Plater.pm:2046 lib/Slic3r/GUI/Plater.pm:2062 msgid "Scale the selected object along the Y axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2079 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2095 +#: lib/Slic3r/GUI/Plater.pm:2049 lib/Slic3r/GUI/Plater.pm:2065 msgid "Scale the selected object along the Z axis" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2084 +#: lib/Slic3r/GUI/Plater.pm:2054 msgid "Scale to size" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2099 +#: lib/Slic3r/GUI/Plater.pm:2069 msgid "Split the selected object into individual parts" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2102 +#: lib/Slic3r/GUI/Plater.pm:2072 msgid "Open the 3D cutting tool" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2106 +#: lib/Slic3r/GUI/Plater.pm:2076 msgid "Open the object editor dialog" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2110 +#: lib/Slic3r/GUI/Plater.pm:2080 msgid "Reload from Disk" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2110 +#: lib/Slic3r/GUI/Plater.pm:2080 msgid "Reload the selected file from Disk" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2113 +#: lib/Slic3r/GUI/Plater.pm:2083 msgid "Export object as STL…" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater.pm:2113 +#: lib/Slic3r/GUI/Plater.pm:2083 msgid "Export this single object as STL file" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\2D.pm:131 +#: lib/Slic3r/GUI/Plater/2D.pm:131 msgid "What do you want to print today? ™" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\2D.pm:132 +#: lib/Slic3r/GUI/Plater/2D.pm:132 msgid "Drag your objects here" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:63 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:63 msgid "1 Layer" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:65 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:65 msgid "View" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:75 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:75 msgid "Show" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:78 -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:79 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:78 lib/Slic3r/GUI/Plater/3DPreview.pm:79 msgid "Feature types" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:96 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:96 msgid "Retractions" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:97 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:97 msgid "Unretractions" msgstr "" -#: c:\src\Slic3r\lib\Slic3r\GUI\Plater\3DPreview.pm:98 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:98 msgid "Shells" msgstr "" diff --git a/resources/localization/list.txt b/resources/localization/list.txt index 5a6965d6a..292549545 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -9,6 +9,8 @@ xs/src/slic3r/GUI/2DBed.cpp xs/src/slic3r/GUI/PresetHints.cpp xs/src/slic3r/GUI/Preferences.hpp xs/src/slic3r/GUI/Preferences.cpp +xs/src/slic3r/GUI/BonjourDialog.cpp +xs/src/slic3r/Utils/OctoPrint.cpp xs/src/libslic3r/PrintConfig.cpp xs/src/libslic3r/GCode/PreviewData.cpp lib/Slic3r/GUI.pm diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt index ce16a08f5..913ffc1e1 100644 --- a/xs/CMakeLists.txt +++ b/xs/CMakeLists.txt @@ -199,6 +199,8 @@ add_library(libslic3r_gui STATIC ${LIBDIR}/slic3r/GUI/2DBed.hpp ${LIBDIR}/slic3r/GUI/wxExtensions.cpp ${LIBDIR}/slic3r/GUI/wxExtensions.hpp + ${LIBDIR}/slic3r/GUI/BonjourDialog.cpp + ${LIBDIR}/slic3r/GUI/BonjourDialog.hpp ${LIBDIR}/slic3r/Utils/Http.cpp ${LIBDIR}/slic3r/Utils/Http.hpp ${LIBDIR}/slic3r/Utils/OctoPrint.cpp diff --git a/xs/src/slic3r/GUI/BonjourDialog.cpp b/xs/src/slic3r/GUI/BonjourDialog.cpp new file mode 100644 index 000000000..34fac9a91 --- /dev/null +++ b/xs/src/slic3r/GUI/BonjourDialog.cpp @@ -0,0 +1,200 @@ +#include "slic3r/Utils/Bonjour.hpp" // On Windows, boost needs to be included before wxWidgets headers + +#include "BonjourDialog.hpp" + +#include +#include + +#include +#include +#include +#include +#include + +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/Utils/Bonjour.hpp" + + +namespace Slic3r { + + +struct BonjourReplyEvent : public wxEvent +{ + BonjourReply reply; + + BonjourReplyEvent(wxEventType eventType, int winid, BonjourReply &&reply) : + wxEvent(winid, eventType), + reply(std::move(reply)) + {} + + virtual wxEvent *Clone() const + { + return new BonjourReplyEvent(*this); + } +}; + +wxDEFINE_EVENT(EVT_BONJOUR_REPLY, BonjourReplyEvent); + +wxDECLARE_EVENT(EVT_BONJOUR_COMPLETE, wxCommandEvent); +wxDEFINE_EVENT(EVT_BONJOUR_COMPLETE, wxCommandEvent); + +class ReplySet: public std::set {}; + +struct LifetimeGuard +{ + std::mutex mutex; + BonjourDialog *dialog; + + LifetimeGuard(BonjourDialog *dialog) : dialog(dialog) {} +}; + + +BonjourDialog::BonjourDialog(wxWindow *parent) : + wxDialog(parent, wxID_ANY, _(L("Network lookup"))), + list(new wxListView(this, wxID_ANY, wxDefaultPosition, wxSize(800, 300))), + replies(new ReplySet), + label(new wxStaticText(this, wxID_ANY, "")), + timer(new wxTimer()), + timer_state(0) +{ + wxBoxSizer *vsizer = new wxBoxSizer(wxVERTICAL); + + vsizer->Add(label, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 10); + + list->SetSingleStyle(wxLC_SINGLE_SEL); + list->SetSingleStyle(wxLC_SORT_DESCENDING); + list->AppendColumn(_(L("Address")), wxLIST_FORMAT_LEFT, 50); + list->AppendColumn(_(L("Hostname")), wxLIST_FORMAT_LEFT, 100); + list->AppendColumn(_(L("Service name")), wxLIST_FORMAT_LEFT, 200); + list->AppendColumn(_(L("OctoPrint version")), wxLIST_FORMAT_LEFT, 50); + + vsizer->Add(list, 1, wxEXPAND | wxALL, 10); + + wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL); + button_sizer->Add(new wxButton(this, wxID_OK, "OK"), 0, wxALL, 10); + button_sizer->Add(new wxButton(this, wxID_CANCEL, "Cancel"), 0, wxALL, 10); + // ^ Note: The Ok/Cancel labels are translated by wxWidgets + + vsizer->Add(button_sizer, 0, wxALIGN_CENTER); + SetSizerAndFit(vsizer); + + Bind(EVT_BONJOUR_REPLY, &BonjourDialog::on_reply, this); + + Bind(EVT_BONJOUR_COMPLETE, [this](wxCommandEvent &) { + this->timer_state = 0; + }); + + Bind(wxEVT_TIMER, &BonjourDialog::on_timer, this); +} + +BonjourDialog::~BonjourDialog() +{ + // Needed bacuse of forward defs +} + +bool BonjourDialog::show_and_lookup() +{ + Show(); // Because we need GetId() to work before ShowModal() + + timer->Stop(); + timer->SetOwner(this); + timer_state = 1; + timer->Start(1000); + wxTimerEvent evt_dummy; + on_timer(evt_dummy); + + // The background thread needs to queue messages for this dialog + // and for that it needs a valid pointer to it (mandated by the wxWidgets API). + // Here we put the pointer under a shared_ptr and protect it by a mutex, + // so that both threads can access it safely. + auto dguard = std::make_shared(this); + + bonjour = std::move(Bonjour("octoprint") + .set_retries(3) + .set_timeout(4) + .on_reply([dguard](BonjourReply &&reply) { + std::lock_guard lock_guard(dguard->mutex); + auto dialog = dguard->dialog; + if (dialog != nullptr) { + auto evt = new BonjourReplyEvent(EVT_BONJOUR_REPLY, dialog->GetId(), std::move(reply)); + wxQueueEvent(dialog, evt); + } + }) + .on_complete([dguard]() { + std::lock_guard lock_guard(dguard->mutex); + auto dialog = dguard->dialog; + if (dialog != nullptr) { + auto evt = new wxCommandEvent(EVT_BONJOUR_COMPLETE, dialog->GetId()); + wxQueueEvent(dialog, evt); + } + }) + .lookup() + ); + + bool res = ShowModal() == wxID_OK && list->GetFirstSelected() >= 0; + { + // Tell the background thread the dialog is going away... + std::lock_guard lock_guard(dguard->mutex); + dguard->dialog = nullptr; + } + return res; +} + +wxString BonjourDialog::get_selected() const +{ + auto sel = list->GetFirstSelected(); + return sel >= 0 ? list->GetItemText(sel) : wxString(); +} + + +// Private + +void BonjourDialog::on_reply(BonjourReplyEvent &e) +{ + if (replies->find(e.reply) != replies->end()) { + // We already have this reply + return; + } + + replies->insert(std::move(e.reply)); + + auto selected = get_selected(); + list->DeleteAllItems(); + + // The whole list is recreated so that we benefit from it already being sorted in the set. + // (And also because wxListView's sorting API is bananas.) + for (const auto &reply : *replies) { + auto item = list->InsertItem(0, reply.full_address); + list->SetItem(item, 1, reply.hostname); + list->SetItem(item, 2, reply.service_name); + list->SetItem(item, 3, reply.version); + } + + for (int i = 0; i < 4; i++) { + this->list->SetColumnWidth(i, wxLIST_AUTOSIZE); + if (this->list->GetColumnWidth(i) < 100) { this->list->SetColumnWidth(i, 100); } + } + + if (!selected.IsEmpty()) { + // Attempt to preserve selection + auto hit = list->FindItem(-1, selected); + if (hit >= 0) { list->SetItemState(hit, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); } + } +} + +void BonjourDialog::on_timer(wxTimerEvent &) +{ + const auto search_str = _(L("Searching for devices")); + + if (timer_state > 0) { + const std::string dots(timer_state, '.'); + label->SetLabel(wxString::Format("%s %s", search_str, dots)); + timer_state = (timer_state) % 3 + 1; + } else { + label->SetLabel(wxString::Format("%s: %s", search_str, _(L("Finished.")))); + timer->Stop(); + } +} + + +} diff --git a/xs/src/slic3r/GUI/BonjourDialog.hpp b/xs/src/slic3r/GUI/BonjourDialog.hpp new file mode 100644 index 000000000..e3f53790b --- /dev/null +++ b/xs/src/slic3r/GUI/BonjourDialog.hpp @@ -0,0 +1,49 @@ +#ifndef slic3r_BonjourDialog_hpp_ +#define slic3r_BonjourDialog_hpp_ + +#include + +#include + +class wxListView; +class wxStaticText; +class wxTimer; +class wxTimerEvent; + + +namespace Slic3r { + +class Bonjour; +class BonjourReplyEvent; +class ReplySet; + + +class BonjourDialog: public wxDialog +{ +public: + BonjourDialog(wxWindow *parent); + BonjourDialog(BonjourDialog &&) = delete; + BonjourDialog(const BonjourDialog &) = delete; + BonjourDialog &operator=(BonjourDialog &&) = delete; + BonjourDialog &operator=(const BonjourDialog &) = delete; + ~BonjourDialog(); + + bool show_and_lookup(); + wxString get_selected() const; +private: + wxListView *list; + std::unique_ptr replies; + wxStaticText *label; + std::shared_ptr bonjour; + std::unique_ptr timer; + unsigned timer_state; + + void on_reply(BonjourReplyEvent &); + void on_timer(wxTimerEvent &); +}; + + + +} + +#endif diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index aed7ba12f..c2fc5e4e4 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -261,7 +261,7 @@ void SpinCtrl::BUILD() { // # when it was changed from the text control, so the on_change callback // # gets the old one, and on_kill_focus resets the control to the old value. // # As a workaround, we get the new value from $event->GetString and store -// #here temporarily so that we can return it from $self->get_value +// # here temporarily so that we can return it from $self->get_value std::string value = e.GetString().utf8_str().data(); if (is_matched(value, "^\\d+$")) tmp_value = std::stoi(value); @@ -365,9 +365,9 @@ void Choice::set_selection() } } -void Choice::set_value(const std::string value) //! Redundant? +void Choice::set_value(const std::string value, bool change_event) //! Redundant? { - m_disable_change_event = true; + m_disable_change_event = !change_event; size_t idx=0; for (auto el : m_opt.enum_values) @@ -384,9 +384,9 @@ void Choice::set_value(const std::string value) //! Redundant? m_disable_change_event = false; } -void Choice::set_value(boost::any value) +void Choice::set_value(boost::any value, bool change_event) { - m_disable_change_event = true; + m_disable_change_event = !change_event; switch (m_opt.type){ case coInt: @@ -429,7 +429,7 @@ void Choice::set_values(const std::vector values) return; m_disable_change_event = true; -// #it looks that Clear() also clears the text field in recent wxWidgets versions, +// # it looks that Clear() also clears the text field in recent wxWidgets versions, // # but we want to preserve it auto ww = dynamic_cast(window); auto value = ww->GetValue(); @@ -541,9 +541,9 @@ void PointCtrl::BUILD() y_textctrl->SetToolTip(get_tooltip_text(X+", "+Y)); } -void PointCtrl::set_value(const Pointf value) +void PointCtrl::set_value(const Pointf value, bool change_event) { - m_disable_change_event = true; + m_disable_change_event = !change_event; double val = value.x; x_textctrl->SetValue(val - int(val) == 0 ? wxString::Format(_T("%i"), int(val)) : wxNumberFormatter::ToString(val, 2, wxNumberFormatter::Style_None)); @@ -553,7 +553,7 @@ void PointCtrl::set_value(const Pointf value) m_disable_change_event = false; } -void PointCtrl::set_value(boost::any value) +void PointCtrl::set_value(boost::any value, bool change_event) { Pointf pt; Pointf *ptf = boost::any_cast(&value); @@ -579,7 +579,7 @@ void PointCtrl::set_value(boost::any value) // return; // } // } - set_value(pt); + set_value(pt, change_event); } boost::any PointCtrl::get_value() diff --git a/xs/src/slic3r/GUI/Field.hpp b/xs/src/slic3r/GUI/Field.hpp index db8ad4c9f..2ddb5d9f8 100644 --- a/xs/src/slic3r/GUI/Field.hpp +++ b/xs/src/slic3r/GUI/Field.hpp @@ -78,7 +78,7 @@ public: /// Sets a value for this control. /// subclasses should overload with a specific version /// Postcondition: Method does not fire the on_change event. - virtual void set_value(boost::any value) = 0; + virtual void set_value(boost::any value, bool change_event) = 0; /// Gets a boost::any representing this control. /// subclasses should overload with a specific version @@ -134,13 +134,13 @@ public: void BUILD(); wxWindow* window {nullptr}; - virtual void set_value(std::string value) { - m_disable_change_event = true; + virtual void set_value(std::string value, bool change_event = false) { + m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(wxString(value)); m_disable_change_event = false; } - virtual void set_value(boost::any value) { - m_disable_change_event = true; + virtual void set_value(boost::any value, bool change_event = false) { + m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(boost::any_cast(value)); m_disable_change_event = false; } @@ -161,13 +161,13 @@ public: wxWindow* window{ nullptr }; void BUILD() override; - void set_value(const bool value) { - m_disable_change_event = true; + void set_value(const bool value, bool change_event = false) { + m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(value); m_disable_change_event = false; } - void set_value(boost::any value) { - m_disable_change_event = true; + void set_value(boost::any value, bool change_event = false) { + m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(boost::any_cast(value)); m_disable_change_event = false; } @@ -189,13 +189,13 @@ public: wxWindow* window{ nullptr }; void BUILD() override; - void set_value(const std::string value) { - m_disable_change_event = true; + void set_value(const std::string value, bool change_event = false) { + m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(value); m_disable_change_event = false; } - void set_value(boost::any value) { - m_disable_change_event = true; + void set_value(boost::any value, bool change_event = false) { + m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(boost::any_cast(value)); m_disable_change_event = false; } @@ -218,8 +218,8 @@ public: void BUILD() override; void set_selection(); - void set_value(const std::string value); - void set_value(boost::any value); + void set_value(const std::string value, bool change_event = false); + void set_value(boost::any value, bool change_event = false); void set_values(const std::vector values); boost::any get_value() override; @@ -237,13 +237,13 @@ public: wxWindow* window{ nullptr }; void BUILD() override; - void set_value(const std::string value) { - m_disable_change_event = true; + void set_value(const std::string value, bool change_event = false) { + m_disable_change_event = !change_event; dynamic_cast(window)->SetColour(value); m_disable_change_event = false; } - void set_value(boost::any value) { - m_disable_change_event = true; + void set_value(boost::any value, bool change_event = false) { + m_disable_change_event = !change_event; dynamic_cast(window)->SetColour(boost::any_cast(value)); m_disable_change_event = false; } @@ -267,8 +267,8 @@ public: void BUILD() override; - void set_value(const Pointf value); - void set_value(boost::any value); + void set_value(const Pointf value, bool change_event = false); + void set_value(boost::any value, bool change_event = false); boost::any get_value() override; void enable() override { diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index 262d41a79..0410b7969 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -358,24 +358,17 @@ void open_preferences_dialog(int event_preferences) dlg->ShowModal(); } -void create_preset_tabs(bool no_controller, bool is_disabled_button_browse, bool is_user_agent, - int event_value_change, int event_presets_changed, - int event_button_browse, int event_button_test) +void create_preset_tabs(bool no_controller, int event_value_change, int event_presets_changed) { add_created_tab(new TabPrint (g_wxTabPanel, no_controller)); add_created_tab(new TabFilament (g_wxTabPanel, no_controller)); - add_created_tab(new TabPrinter (g_wxTabPanel, no_controller, is_disabled_button_browse, is_user_agent)); + add_created_tab(new TabPrinter (g_wxTabPanel, no_controller)); for (size_t i = 0; i < g_wxTabPanel->GetPageCount(); ++ i) { Tab *tab = dynamic_cast(g_wxTabPanel->GetPage(i)); if (! tab) continue; tab->set_event_value_change(wxEventType(event_value_change)); tab->set_event_presets_changed(wxEventType(event_presets_changed)); - if (tab->name() == "printer"){ - TabPrinter* tab_printer = static_cast(tab); - tab_printer->set_event_button_browse(wxEventType(event_button_browse)); - tab_printer->set_event_button_test(wxEventType(event_button_test)); - } } } @@ -591,19 +584,6 @@ wxString from_u8(const std::string &str) return wxString::FromUTF8(str.c_str()); } -wxWindow *get_widget_by_id(int id) -{ - if (g_wxMainFrame == nullptr) { - throw std::runtime_error("Main frame not set"); - } - - wxWindow *window = g_wxMainFrame->FindWindow(id); - if (window == nullptr) { - throw std::runtime_error((boost::format("Could not find widget by ID: %1%") % id).str()); - } - - return window; -} void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFlexGridSizer* preset_sizer) { diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp index 2baa10cb9..084b6de46 100644 --- a/xs/src/slic3r/GUI/GUI.hpp +++ b/xs/src/slic3r/GUI/GUI.hpp @@ -86,9 +86,7 @@ void add_debug_menu(wxMenuBar *menu, int event_language_change); void open_preferences_dialog(int event_preferences); // Create a new preset tab (print, filament and printer), -void create_preset_tabs(bool no_controller, bool is_disabled_button_browse, bool is_user_agent, - int event_value_change, int event_presets_changed, - int event_button_browse, int event_button_test); +void create_preset_tabs(bool no_controller, int event_value_change, int event_presets_changed); TabIface* get_preset_tab_iface(char *name); // add it at the end of the tab panel. @@ -127,7 +125,6 @@ wxString L_str(const std::string &str); // Return wxString from std::string in UTF8 wxString from_u8(const std::string &str); -wxWindow *get_widget_by_id(int id); void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFlexGridSizer* preset_sizer); diff --git a/xs/src/slic3r/GUI/OptionsGroup.hpp b/xs/src/slic3r/GUI/OptionsGroup.hpp index 42db22225..aa0563866 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.hpp +++ b/xs/src/slic3r/GUI/OptionsGroup.hpp @@ -97,9 +97,9 @@ public: if (m_fields.find(id) == m_fields.end()) return nullptr; return m_fields.at(id).get(); } - bool set_value(t_config_option_key id, boost::any value) { + bool set_value(t_config_option_key id, boost::any value, bool change_event = false) { if (m_fields.find(id) == m_fields.end()) return false; - m_fields.at(id)->set_value(value); + m_fields.at(id)->set_value(value, change_event); return true; } boost::any get_value(t_config_option_key id) { diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index e2dfa6f27..d0f9f0ce3 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -3,6 +3,9 @@ #include "PresetBundle.hpp" #include "PresetHints.hpp" #include "../../libslic3r/Utils.hpp" +#include "slic3r/Utils/Http.hpp" +#include "slic3r/Utils/OctoPrint.hpp" +#include "BonjourDialog.hpp" #include #include @@ -14,6 +17,7 @@ #include #include #include +#include #include @@ -1102,39 +1106,18 @@ void TabPrinter::build() } optgroup = page->new_optgroup(_(L("OctoPrint upload"))); - // # append two buttons to the Host line - auto octoprint_host_browse = [this] (wxWindow* parent) { + + auto octoprint_host_browse = [this, optgroup] (wxWindow* parent) { auto btn = new wxButton(parent, wxID_ANY, _(L(" Browse "))+"\u2026", wxDefaultPosition, wxDefaultSize, wxBU_LEFT); -// btn->SetFont($Slic3r::GUI::small_font); btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("zoom.png")), wxBITMAP_TYPE_PNG)); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn); - if (m_is_disabled_button_browse) - btn->Disable(); - - btn->Bind(wxEVT_BUTTON, [this, parent](wxCommandEvent e){ - if (m_event_button_browse > 0){ - wxCommandEvent event(m_event_button_browse); - event.SetString("Button BROWSE was clicked!"); - g_wxMainFrame->ProcessWindowEvent(event); + btn->Bind(wxEVT_BUTTON, [this, parent, optgroup](wxCommandEvent e) { + BonjourDialog dialog(parent); + if (dialog.show_and_lookup()) { + optgroup->set_value("octoprint_host", std::move(dialog.get_selected()), true); } -// // # look for devices -// auto entries; -// { -// my $res = Net::Bonjour->new('http'); -// $res->discover; -// $entries = [$res->entries]; -// } -// if (@{$entries}) { -// my $dlg = Slic3r::GUI::BonjourBrowser->new($self, $entries); -// $self->_load_key_value('octoprint_host', $dlg->GetValue . ":".$dlg->GetPort) -// if $dlg->ShowModal == wxID_OK; -// } -// else { -// auto msg_window = new wxMessageDialog(parent, "No Bonjour device found", "Device Browser", wxOK | wxICON_INFORMATION); -// msg_window->ShowModal(); -// } }); return sizer; @@ -1143,33 +1126,23 @@ void TabPrinter::build() auto octoprint_host_test = [this](wxWindow* parent) { auto btn = m_octoprint_host_test_btn = new wxButton(parent, wxID_ANY, _(L("Test")), wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT); -// btn->SetFont($Slic3r::GUI::small_font); btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("wrench.png")), wxBITMAP_TYPE_PNG)); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn); - btn->Bind(wxEVT_BUTTON, [this, parent](wxCommandEvent e) { - if (m_event_button_test > 0){ - wxCommandEvent event(m_event_button_test); - event.SetString("Button TEST was clicked!"); - g_wxMainFrame->ProcessWindowEvent(event); + btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent e) { + OctoPrint octoprint(m_config); + wxString msg; + if (octoprint.test(msg)) { + show_info(this, _(L("Connection to OctoPrint works correctly.")), _(L("Success!"))); + } else { + const auto text = wxString::Format("%s: %s\n\n%s", + _(L("Could not connect to OctoPrint")), msg, _(L("Note: OctoPrint version at least 1.1.0 is required.")) + ); + show_error(this, text); } -// my $ua = LWP::UserAgent->new; -// $ua->timeout(10); -// -// my $res = $ua->get( -// "http://".$self->{config}->octoprint_host . "/api/version", -// 'X-Api-Key' = > $self->{config}->octoprint_apikey, -// ); -// if ($res->is_success) { -// show_info(parent, "Connection to OctoPrint works correctly.", "Success!"); -// } -// else { -// show_error(parent, -// "I wasn't able to connect to OctoPrint (".$res->status_line . "). " -// . "Check hostname and OctoPrint version (at least 1.1.0 is required)."); -// } - }); + }); + return sizer; }; @@ -1179,6 +1152,45 @@ void TabPrinter::build() optgroup->append_line(host_line); optgroup->append_single_option_line("octoprint_apikey"); + if (Http::ca_file_supported()) { + + Line cafile_line = optgroup->create_single_option_line("octoprint_cafile"); + + auto octoprint_cafile_browse = [this, optgroup] (wxWindow* parent) { + auto btn = new wxButton(parent, wxID_ANY, _(L(" Browse "))+"\u2026", wxDefaultPosition, wxDefaultSize, wxBU_LEFT); + btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("zoom.png")), wxBITMAP_TYPE_PNG)); + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(btn); + + btn->Bind(wxEVT_BUTTON, [this, optgroup] (wxCommandEvent e){ + static const auto filemasks = _(L("Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*")); + wxFileDialog openFileDialog(this, _(L("Open CA certificate file")), "", "", filemasks, wxFD_OPEN | wxFD_FILE_MUST_EXIST); + if (openFileDialog.ShowModal() != wxID_CANCEL) { + optgroup->set_value("octoprint_cafile", std::move(openFileDialog.GetPath()), true); + } + }); + + return sizer; + }; + + cafile_line.append_widget(octoprint_cafile_browse); + optgroup->append_line(cafile_line); + + auto octoprint_cafile_hint = [this, optgroup] (wxWindow* parent) { + auto txt = new wxStaticText(parent, wxID_ANY, + _(L("HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."))); + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(txt); + return sizer; + }; + + Line cafile_hint { "", "" }; + cafile_hint.full_width = 1; + cafile_hint.widget = std::move(octoprint_cafile_hint); + optgroup->append_line(cafile_hint); + + } + optgroup = page->new_optgroup(_(L("Firmware"))); optgroup->append_single_option_line("gcode_flavor"); @@ -1337,13 +1349,8 @@ void TabPrinter::update(){ m_serial_test_btn->Disable(); } - en = !m_config->opt_string("octoprint_host").empty(); - if ( en && m_is_user_agent) - m_octoprint_host_test_btn->Enable(); - else - m_octoprint_host_test_btn->Disable(); - get_field("octoprint_apikey")->toggle(en); - + m_octoprint_host_test_btn->Enable(!m_config->opt_string("octoprint_host").empty()); + bool have_multiple_extruders = m_extruders_count > 1; get_field("toolchange_gcode")->toggle(have_multiple_extruders); get_field("single_extruder_multi_material")->toggle(have_multiple_extruders); diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index e2dc51ee4..4f65f1475 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -214,11 +214,6 @@ public: //Slic3r::GUI::Tab::Printer; class TabPrinter : public Tab { - bool m_is_disabled_button_browse; - bool m_is_user_agent; - // similar event by clicking Buttons "Browse" & "Test" - wxEventType m_event_button_browse = 0; - wxEventType m_event_button_test = 0; public: wxButton* m_serial_test_btn; wxButton* m_octoprint_host_test_btn; @@ -228,10 +223,7 @@ public: std::vector m_extruder_pages; TabPrinter() {} - TabPrinter(wxNotebook* parent, bool no_controller, bool is_disabled_btn_browse, bool is_user_agent) : - Tab(parent, _(L("Printer Settings")), "printer", no_controller), - m_is_disabled_button_browse(is_disabled_btn_browse), - m_is_user_agent(is_user_agent) {} + TabPrinter(wxNotebook* parent, bool no_controller) : Tab(parent, _(L("Printer Settings")), "printer", no_controller) {} ~TabPrinter(){} void build() override; @@ -240,10 +232,6 @@ public: void extruders_count_changed(size_t extruders_count); void build_extruder_pages(); void on_preset_loaded() override; - - // Set the events to the callbacks posted to the main frame window (currently implemented in Perl). - void set_event_button_browse(wxEventType evt) { m_event_button_browse = evt; } - void set_event_button_test(wxEventType evt) { m_event_button_test = evt; } }; class SavePresetWindow :public wxDialog diff --git a/xs/src/slic3r/Utils/Bonjour.cpp b/xs/src/slic3r/Utils/Bonjour.cpp index 6107e2c60..09d9b5873 100644 --- a/xs/src/slic3r/Utils/Bonjour.cpp +++ b/xs/src/slic3r/Utils/Bonjour.cpp @@ -1,9 +1,7 @@ #include "Bonjour.hpp" -#include // XXX #include #include -#include #include #include #include @@ -23,16 +21,18 @@ namespace asio = boost::asio; using boost::asio::ip::udp; -// TODO: Fuzzing test (done without TXT) -// FIXME: check char retype to unsigned - - namespace Slic3r { // Minimal implementation of a MDNS/DNS-SD client // This implementation is extremely simple, only the bits that are useful -// for very basic MDNS discovery are present. +// for basic MDNS discovery of OctoPi devices are present. +// However, the bits that are present are implemented with security in mind. +// Only fully correct DNS replies are allowed through. +// While decoding the decoder will bail the moment it encounters anything fishy. +// At least that's the idea. To help prove this is actually the case, +// the implementations has been tested with AFL. + struct DnsName: public std::string { @@ -48,8 +48,7 @@ struct DnsName: public std::string return boost::none; } - // Check for recursion depth to prevent parsing names that are nested too deeply - // or end up cyclic: + // Check for recursion depth to prevent parsing names that are nested too deeply or end up cyclic: if (depth >= MAX_RECURSION) { return boost::none; } @@ -443,6 +442,30 @@ private: } }; +std::ostream& operator<<(std::ostream &os, const DnsMessage &msg) +{ + os << "DnsMessage(ID: " << msg.header.id << ", " + << "Q: " << (msg.question ? msg.question->name.c_str() : "none") << ", " + << "A: " << (msg.rr_a ? msg.rr_a->ip.to_string() : "none") << ", " + << "AAAA: " << (msg.rr_aaaa ? msg.rr_aaaa->ip.to_string() : "none") << ", " + << "services: ["; + + enum { SRV_PRINT_MAX = 3 }; + unsigned i = 0; + for (const auto &sdpair : msg.sdmap) { + os << sdpair.first << ", "; + + if (++i >= SRV_PRINT_MAX) { + os << "..."; + break; + } + } + + os << "])"; + + return os; +} + struct BonjourRequest { @@ -515,6 +538,7 @@ struct Bonjour::priv const std::string protocol; const std::string service_dn; unsigned timeout; + unsigned retries; uint16_t rq_id; std::vector buffer; @@ -524,6 +548,7 @@ struct Bonjour::priv priv(std::string service, std::string protocol); + std::string strip_service_dn(const std::string &service_name) const; void udp_receive(udp::endpoint from, size_t bytes); void lookup_perform(); }; @@ -533,11 +558,26 @@ Bonjour::priv::priv(std::string service, std::string protocol) : protocol(std::move(protocol)), service_dn((boost::format("_%1%._%2%.local") % this->service % this->protocol).str()), timeout(10), + retries(1), rq_id(0) { buffer.resize(DnsMessage::MAX_SIZE); } +std::string Bonjour::priv::strip_service_dn(const std::string &service_name) const +{ + if (service_name.size() <= service_dn.size()) { + return service_name; + } + + auto needle = service_name.rfind(service_dn); + if (needle == service_name.size() - service_dn.size()) { + return service_name.substr(0, needle - 1); + } else { + return service_name; + } +} + void Bonjour::priv::udp_receive(udp::endpoint from, size_t bytes) { if (bytes == 0 || !replyfn) { @@ -557,7 +597,10 @@ void Bonjour::priv::udp_receive(udp::endpoint from, size_t bytes) } const auto &srv = *sdpair.second.srv; - BonjourReply reply(ip, sdpair.first, srv.hostname); + auto service_name = strip_service_dn(sdpair.first); + + std::string path; + std::string version; if (sdpair.second.txt) { static const std::string tag_path = "path="; @@ -565,13 +608,14 @@ void Bonjour::priv::udp_receive(udp::endpoint from, size_t bytes) for (const auto &value : sdpair.second.txt->values) { if (value.size() > tag_path.size() && value.compare(0, tag_path.size(), tag_path) == 0) { - reply.path = value.substr(tag_path.size()); + path = std::move(value.substr(tag_path.size())); } else if (value.size() > tag_version.size() && value.compare(0, tag_version.size(), tag_version) == 0) { - reply.version = value.substr(tag_version.size()); + version = std::move(value.substr(tag_version.size())); } } } + BonjourReply reply(ip, srv.port, std::move(service_name), srv.hostname, std::move(path), std::move(version)); replyfn(std::move(reply)); } } @@ -595,15 +639,26 @@ void Bonjour::priv::lookup_perform() udp::endpoint mcast(BonjourRequest::MCAST_IP4, BonjourRequest::MCAST_PORT); socket.send_to(asio::buffer(brq->data), mcast); - bool timeout = false; + bool expired = false; + bool retry = false; asio::deadline_timer timer(io_service); - timer.expires_from_now(boost::posix_time::seconds(10)); - timer.async_wait([=, &timeout](const error_code &error) { - timeout = true; - if (self->completefn) { - self->completefn(); + retries--; + std::function timer_handler = [&](const error_code &error) { + if (retries == 0 || error) { + expired = true; + if (self->completefn) { + self->completefn(); + } + } else { + retry = true; + retries--; + timer.expires_from_now(boost::posix_time::seconds(timeout)); + timer.async_wait(timer_handler); } - }); + }; + + timer.expires_from_now(boost::posix_time::seconds(timeout)); + timer.async_wait(timer_handler); udp::endpoint recv_from; const auto recv_handler = [&](const error_code &error, size_t bytes) { @@ -612,8 +667,11 @@ void Bonjour::priv::lookup_perform() socket.async_receive_from(asio::buffer(buffer, buffer.size()), recv_from, recv_handler); while (io_service.run_one()) { - if (timeout) { + if (expired) { socket.cancel(); + } else if (retry) { + retry = false; + socket.send_to(asio::buffer(brq->data), mcast); } else { buffer.resize(DnsMessage::MAX_SIZE); socket.async_receive_from(asio::buffer(buffer, buffer.size()), recv_from, recv_handler); @@ -626,13 +684,39 @@ void Bonjour::priv::lookup_perform() // API - public part -BonjourReply::BonjourReply(boost::asio::ip::address ip, std::string service_name, std::string hostname) : +BonjourReply::BonjourReply(boost::asio::ip::address ip, uint16_t port, std::string service_name, std::string hostname, std::string path, std::string version) : ip(std::move(ip)), + port(port), service_name(std::move(service_name)), hostname(std::move(hostname)), - path("/"), - version("Unknown") -{} + path(path.empty() ? std::move(std::string("/")) : std::move(path)), + version(version.empty() ? std::move(std::string("Unknown")) : std::move(version)) +{ + std::string proto; + std::string port_suffix; + if (port == 443) { proto = "https://"; } + if (port != 443 && port != 80) { port_suffix = std::to_string(port).insert(0, 1, ':'); } + if (this->path[0] != '/') { this->path.insert(0, 1, '/'); } + full_address = proto + ip.to_string() + port_suffix; + if (this->path != "/") { full_address += path; } +} + +bool BonjourReply::operator==(const BonjourReply &other) const +{ + return this->full_address == other.full_address + && this->service_name == other.service_name; +} + +bool BonjourReply::operator<(const BonjourReply &other) const +{ + if (this->ip != other.ip) { + // So that the common case doesn't involve string comparison + return this->ip < other.ip; + } else { + auto cmp = this->full_address.compare(other.full_address); + return cmp != 0 ? cmp < 0 : this->service_name < other.service_name; + } +} std::ostream& operator<<(std::ostream &os, const BonjourReply &reply) { @@ -641,6 +725,7 @@ std::ostream& operator<<(std::ostream &os, const BonjourReply &reply) return os; } + Bonjour::Bonjour(std::string service, std::string protocol) : p(new priv(std::move(service), std::move(protocol))) {} @@ -660,6 +745,12 @@ Bonjour& Bonjour::set_timeout(unsigned timeout) return *this; } +Bonjour& Bonjour::set_retries(unsigned retries) +{ + if (p && retries > 0) { p->retries = retries; } + return *this; +} + Bonjour& Bonjour::on_reply(ReplyFn fn) { if (p) { p->replyfn = std::move(fn); } @@ -677,7 +768,7 @@ Bonjour::Ptr Bonjour::lookup() auto self = std::make_shared(std::move(*this)); if (self->p) { - auto io_thread = std::thread([self](){ + auto io_thread = std::thread([self]() { self->p->lookup_perform(); }); self->p->io_thread = std::move(io_thread); @@ -687,18 +778,4 @@ Bonjour::Ptr Bonjour::lookup() } -void Bonjour::pokus() // XXX -{ - auto bonjour = Bonjour("octoprint") - .set_timeout(15) - .on_reply([](BonjourReply &&reply) { - std::cerr << "BonjourReply: " << reply << std::endl; - }) - .on_complete([](){ - std::cerr << "MDNS lookup complete" << std::endl; - }) - .lookup(); -} - - } diff --git a/xs/src/slic3r/Utils/Bonjour.hpp b/xs/src/slic3r/Utils/Bonjour.hpp index 285625c04..63f34638c 100644 --- a/xs/src/slic3r/Utils/Bonjour.hpp +++ b/xs/src/slic3r/Utils/Bonjour.hpp @@ -1,26 +1,31 @@ #ifndef slic3r_Bonjour_hpp_ #define slic3r_Bonjour_hpp_ +#include #include #include #include -// #include #include namespace Slic3r { -// TODO: reply data structure struct BonjourReply { boost::asio::ip::address ip; + uint16_t port; std::string service_name; std::string hostname; + std::string full_address; std::string path; std::string version; - BonjourReply(boost::asio::ip::address ip, std::string service_name, std::string hostname); + BonjourReply() = delete; + BonjourReply(boost::asio::ip::address ip, uint16_t port, std::string service_name, std::string hostname, std::string path, std::string version); + + bool operator==(const BonjourReply &other) const; + bool operator<(const BonjourReply &other) const; }; std::ostream& operator<<(std::ostream &, const BonjourReply &); @@ -32,7 +37,7 @@ private: struct priv; public: typedef std::shared_ptr Ptr; - typedef std::function ReplyFn; + typedef std::function ReplyFn; typedef std::function CompleteFn; Bonjour(std::string service, std::string protocol = "tcp"); @@ -40,12 +45,15 @@ public: ~Bonjour(); Bonjour& set_timeout(unsigned timeout); + Bonjour& set_retries(unsigned retries); + // ^ Note: By default there is 1 retry (meaning 1 broadcast is sent). + // Timeout is per one retry, ie. total time spent listening = retries * timeout. + // If retries > 1, then care needs to be taken as more than one reply from the same service may be received. + Bonjour& on_reply(ReplyFn fn); Bonjour& on_complete(CompleteFn fn); Ptr lookup(); - - static void pokus(); // XXX: remove private: std::unique_ptr p; }; diff --git a/xs/src/slic3r/Utils/Http.cpp b/xs/src/slic3r/Utils/Http.cpp index 45a350a59..de28904e2 100644 --- a/xs/src/slic3r/Utils/Http.cpp +++ b/xs/src/slic3r/Utils/Http.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include @@ -45,7 +44,9 @@ struct Http::priv priv(const std::string &url); ~priv(); + static bool ca_file_supported(::CURL *curl); static size_t writecb(void *data, size_t size, size_t nmemb, void *userp); + std::string curl_error(CURLcode curlcode); std::string body_size_error(); void http_perform(); }; @@ -71,6 +72,29 @@ Http::priv::~priv() ::curl_slist_free_all(headerlist); } +bool Http::priv::ca_file_supported(::CURL *curl) +{ +#ifdef _WIN32 + bool res = false; +#else + bool res = true; +#endif + + if (curl == nullptr) { return res; } + +#if LIBCURL_VERSION_MAJOR >= 7 && LIBCURL_VERSION_MINOR >= 48 + ::curl_tlssessioninfo *tls; + if (::curl_easy_getinfo(curl, CURLINFO_TLS_SSL_PTR, &tls) == CURLE_OK) { + if (tls->backend == CURLSSLBACKEND_SCHANNEL || tls->backend == CURLSSLBACKEND_DARWINSSL) { + // With Windows and OS X native SSL support, cert files cannot be set + res = false; + } + } +#endif + + return res; +} + size_t Http::priv::writecb(void *data, size_t size, size_t nmemb, void *userp) { auto self = static_cast(userp); @@ -88,6 +112,14 @@ size_t Http::priv::writecb(void *data, size_t size, size_t nmemb, void *userp) return realsize; } +std::string Http::priv::curl_error(CURLcode curlcode) +{ + return (boost::format("%1% (%2%)") + % ::curl_easy_strerror(curlcode) + % curlcode + ).str(); +} + std::string Http::priv::body_size_error() { return (boost::format("HTTP body data size exceeded limit (%1% bytes)") % limit).str(); @@ -121,7 +153,7 @@ void Http::priv::http_perform() if (res == CURLE_WRITE_ERROR) { error = std::move(body_size_error()); } else { - error = ::curl_easy_strerror(res); + error = std::move(curl_error(res)); }; if (errorfn) { @@ -180,7 +212,7 @@ Http& Http::remove_header(std::string name) Http& Http::ca_file(const std::string &name) { - if (p) { + if (p && priv::ca_file_supported(p->curl)) { ::curl_easy_setopt(p->curl, CURLOPT_CAINFO, name.c_str()); } @@ -257,5 +289,13 @@ Http Http::post(std::string url) return http; } +bool Http::ca_file_supported() +{ + ::CURL *curl = ::curl_easy_init(); + bool res = priv::ca_file_supported(curl); + if (curl != nullptr) { ::curl_easy_cleanup(curl); } + return res; +} + } diff --git a/xs/src/slic3r/Utils/Http.hpp b/xs/src/slic3r/Utils/Http.hpp index c591e17c5..6ac5fcce1 100644 --- a/xs/src/slic3r/Utils/Http.hpp +++ b/xs/src/slic3r/Utils/Http.hpp @@ -41,6 +41,7 @@ public: Ptr perform(); void perform_sync(); + static bool ca_file_supported(); private: Http(const std::string &url); diff --git a/xs/src/slic3r/Utils/OctoPrint.cpp b/xs/src/slic3r/Utils/OctoPrint.cpp index 58530833b..5bf51f470 100644 --- a/xs/src/slic3r/Utils/OctoPrint.cpp +++ b/xs/src/slic3r/Utils/OctoPrint.cpp @@ -20,16 +20,19 @@ OctoPrint::OctoPrint(DynamicPrintConfig *config) : cafile(config->opt_string("octoprint_cafile")) {} -std::string OctoPrint::test() const +bool OctoPrint::test(wxString &msg) const { // Since the request is performed synchronously here, - // it is ok to refer to `res` from within the closure - std::string res; + // it is ok to refer to `msg` from within the closure - auto http = Http::get(std::move(make_url("api/version"))); + bool res = true; + + auto url = std::move(make_url("api/version")); + auto http = Http::get(std::move(url)); set_auth(http); http.on_error([&](std::string, std::string error, unsigned status) { - res = format_error(error, status); + res = false; + msg = format_error(error, status); }) .perform_sync(); @@ -43,21 +46,26 @@ void OctoPrint::send_gcode(int windowId, int completeEvt, int errorEvt, const st http.form_add("print", print ? "true" : "false") .form_add_file("file", filename) .on_complete([=](std::string body, unsigned status) { - wxWindow *window = GUI::get_widget_by_id(windowId); + wxWindow *window = wxWindow::FindWindowById(windowId); + if (window == nullptr) { return; } + wxCommandEvent* evt = new wxCommandEvent(completeEvt); - evt->SetString("G-code file successfully uploaded to the OctoPrint server"); + evt->SetString(_(L("G-code file successfully uploaded to the OctoPrint server"))); evt->SetInt(100); wxQueueEvent(window, evt); }) .on_error([=](std::string body, std::string error, unsigned status) { - wxWindow *window = GUI::get_widget_by_id(windowId); + wxWindow *window = wxWindow::FindWindowById(windowId); + if (window == nullptr) { return; } wxCommandEvent* evt_complete = new wxCommandEvent(completeEvt); evt_complete->SetInt(100); wxQueueEvent(window, evt_complete); wxCommandEvent* evt_error = new wxCommandEvent(errorEvt); - evt_error->SetString(wxString::Format("Error while uploading to the OctoPrint server: %s", format_error(error, status))); + evt_error->SetString(wxString::Format("%s: %s", + _(L("Error while uploading to the OctoPrint server")), + format_error(error, status))); wxQueueEvent(window, evt_error); }) .perform(); @@ -85,19 +93,15 @@ std::string OctoPrint::make_url(const std::string &path) const } } -std::string OctoPrint::format_error(std::string error, unsigned status) +wxString OctoPrint::format_error(std::string error, unsigned status) { + const wxString wxerror = error; + if (status != 0) { - std::string res{"HTTP "}; - res.append(std::to_string(status)); - - if (status == 401) { - res.append(": Invalid API key"); - } - - return std::move(res); + return wxString::Format("HTTP %u: %s", status, + (status == 401 ? _(L("Invalid API key")) : wxerror)); } else { - return std::move(error); + return std::move(wxerror); } } diff --git a/xs/src/slic3r/Utils/OctoPrint.hpp b/xs/src/slic3r/Utils/OctoPrint.hpp index eca3baa63..1f544295c 100644 --- a/xs/src/slic3r/Utils/OctoPrint.hpp +++ b/xs/src/slic3r/Utils/OctoPrint.hpp @@ -2,8 +2,8 @@ #define slic3r_OctoPrint_hpp_ #include +#include -// #include "Http.hpp" // XXX: ? namespace Slic3r { @@ -16,8 +16,7 @@ class OctoPrint public: OctoPrint(DynamicPrintConfig *config); - std::string test() const; - // XXX: style + bool test(wxString &curl_msg) const; void send_gcode(int windowId, int completeEvt, int errorEvt, const std::string &filename, bool print = false) const; private: std::string host; @@ -26,7 +25,7 @@ private: void set_auth(Http &http) const; std::string make_url(const std::string &path) const; - static std::string format_error(std::string error, unsigned status); + static wxString format_error(std::string error, unsigned status); }; diff --git a/xs/xsp/GUI.xsp b/xs/xsp/GUI.xsp index be36c531f..3dc92fa94 100644 --- a/xs/xsp/GUI.xsp +++ b/xs/xsp/GUI.xsp @@ -35,12 +35,8 @@ void set_tab_panel(SV *ui) void add_debug_menu(SV *ui, int event_language_change) %code%{ Slic3r::GUI::add_debug_menu((wxMenuBar*)wxPli_sv_2_object(aTHX_ ui, "Wx::MenuBar"), event_language_change); %}; -void create_preset_tabs(bool no_controller, bool is_disabled_button_browse, bool is_user_agent, - int event_value_change, int event_presets_changed, - int event_button_browse, int event_button_test) - %code%{ Slic3r::GUI::create_preset_tabs(no_controller, is_disabled_button_browse, is_user_agent, - event_value_change, event_presets_changed, - event_button_browse, event_button_test); %}; +void create_preset_tabs(bool no_controller, int event_value_change, int event_presets_changed) + %code%{ Slic3r::GUI::create_preset_tabs(no_controller, event_value_change, event_presets_changed); %}; Ref get_preset_tab(char *name) %code%{ RETVAL=Slic3r::GUI::get_preset_tab_iface(name); %}; diff --git a/xs/xsp/Utils_OctoPrint.xsp b/xs/xsp/Utils_OctoPrint.xsp index 062af4e0c..124f66cb5 100644 --- a/xs/xsp/Utils_OctoPrint.xsp +++ b/xs/xsp/Utils_OctoPrint.xsp @@ -9,6 +9,5 @@ OctoPrint(DynamicPrintConfig *config); ~OctoPrint(); - std::string test() const; void send_gcode(int windowId, int completeEvt, int errorEvt, std::string filename, bool print = false) const; }; From 1b23f9cd6e8877fb0aa787d186ff1ed9c040e6a9 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 16 Mar 2018 10:04:42 +0100 Subject: [PATCH 44/47] Fixing compilation errors: A non-const reference does not accept a temporary variable. --- xs/src/libslic3r/TriangleMesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xs/src/libslic3r/TriangleMesh.cpp b/xs/src/libslic3r/TriangleMesh.cpp index e5e2d59e8..aecb39662 100644 --- a/xs/src/libslic3r/TriangleMesh.cpp +++ b/xs/src/libslic3r/TriangleMesh.cpp @@ -990,7 +990,7 @@ void TriangleMeshSlicer::make_loops(std::vector &lines, Polygo struct OpenPolyline { OpenPolyline() {}; - OpenPolyline(IntersectionReference &start, IntersectionReference &end, Points &&points) : + OpenPolyline(const IntersectionReference &start, const IntersectionReference &end, Points &&points) : start(start), end(end), points(std::move(points)), consumed(false) {} void reverse() { std::swap(start, end); From a38cbac312039f4fcb45fc9dc65e3748885df21d Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 16 Mar 2018 11:56:37 +0100 Subject: [PATCH 45/47] Removed the LWP and Growl Perl dependencies. --- Build.PL | 3 --- lib/Slic3r/GUI.pm | 1 - lib/Slic3r/GUI/MainFrame.pm | 52 ------------------------------------- lib/Slic3r/GUI/Plater.pm | 1 - 4 files changed, 57 deletions(-) diff --git a/Build.PL b/Build.PL index 31ec9cf82..e006d11eb 100644 --- a/Build.PL +++ b/Build.PL @@ -40,10 +40,7 @@ if ($gui) { Socket 2.016 ); %recommends = qw( - Growl::GNTP 0.15 Wx::GLCanvas 0 - LWP::UserAgent 0 - Net::Bonjour 0 ); if ($^O eq 'MSWin32') { $recommends{"Win32::TieRegistry"} = 0; diff --git a/lib/Slic3r/GUI.pm b/lib/Slic3r/GUI.pm index 1aa6ba955..2bb5c9e4a 100644 --- a/lib/Slic3r/GUI.pm +++ b/lib/Slic3r/GUI.pm @@ -34,7 +34,6 @@ use Slic3r::GUI::SystemInfo; use Wx::Locale gettext => 'L'; our $have_OpenGL = eval "use Slic3r::GUI::3DScene; 1"; -our $have_LWP = eval "use LWP::UserAgent; 1"; use Wx 0.9901 qw(:bitmap :dialog :icon :id :misc :systemsettings :toplevelwindow :filedialog :font); use Wx::Event qw(EVT_IDLE EVT_COMMAND EVT_MENU); diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index c53237228..4868ed7e2 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -25,10 +25,6 @@ our $last_config; our $VALUE_CHANGE_EVENT = Wx::NewEventType; # 2) To inform about a preset selection change or a "modified" status change. our $PRESETS_CHANGED_EVENT = Wx::NewEventType; -# 3) To inform about a click on Browse button -our $BUTTON_BROWSE_EVENT = Wx::NewEventType; -# 4) To inform about a click on Test button -our $BUTTON_TEST_EVENT = Wx::NewEventType; sub new { my ($class, %params) = @_; @@ -169,54 +165,6 @@ sub _init_tabpanel { } } }); - # The following event is emited by the C++ Tab implementation , - # when the Browse button was clicked - EVT_COMMAND($self, -1, $BUTTON_BROWSE_EVENT, sub { - my ($self, $event) = @_; - my $msg = $event->GetString; - - # look for devices - my $entries; - { - my $res = Net::Bonjour->new('http'); - $res->discover; - $entries = [ $res->entries ]; - } - if (@{$entries}) { - my $dlg = Slic3r::GUI::BonjourBrowser->new($self, $entries); - my $tab = Slic3r::GUI::get_preset_tab("printer"); - $tab->load_key_value('octoprint_host', $dlg->GetValue . ":" . $dlg->GetPort) - if $dlg->ShowModal == wxID_OK; - } else { - Wx::MessageDialog->new($self, L('No Bonjour device found'), L('Device Browser'), wxOK | wxICON_INFORMATION)->ShowModal; - } - }); - # The following event is emited by the C++ Tab implementation , - # when the Test button was clicked - EVT_COMMAND($self, -1, $BUTTON_TEST_EVENT, sub { - my ($self, $event) = @_; - my $msg = $event->GetString; - - my $ua = LWP::UserAgent->new; - $ua->timeout(10); - - my $config = Slic3r::GUI::get_preset_tab("printer")->get_config; - my $res = $ua->get( - "http://" . $config->octoprint_host . "/api/version", - 'X-Api-Key' => $config->octoprint_apikey, - ); - if ($res->is_success) { - Slic3r::GUI::show_info($self, L("Connection to OctoPrint works correctly."), _L("Success!")); - } else { - Slic3r::GUI::show_error($self, - L("I wasn't able to connect to OctoPrint (") . $res->status_line . - L("). Check hostname and OctoPrint version (at least 1.1.0 is required).")); - } - }); - # A variable to inform C++ Tab implementation about disabling of Browse button - $self->{is_disabled_button_browse} = (!eval "use Net::Bonjour; 1") ? 1 : 0 ; - # A variable to inform C++ Tab implementation about user_agent - $self->{is_user_agent} = (eval "use LWP::UserAgent; 1") ? 1 : 0 ; Slic3r::GUI::create_preset_tabs($self->{no_controller}, $VALUE_CHANGE_EVENT, $PRESETS_CHANGED_EVENT); $self->{options_tabs} = {}; for my $tab_name (qw(print filament printer)) { diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index bb3a4c130..8a533f28d 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -8,7 +8,6 @@ use utf8; use File::Basename qw(basename dirname); use List::Util qw(sum first max); use Slic3r::Geometry qw(X Y Z scale unscale deg2rad rad2deg); -use LWP::UserAgent; use threads::shared qw(shared_clone); use Wx qw(:button :colour :cursor :dialog :filedialog :keycode :icon :font :id :listctrl :misc :panel :sizer :toolbar :window wxTheApp :notebook :combobox wxNullBitmap); From e162c47167b21285925e871b61956f29a083ca42 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 16 Mar 2018 12:07:54 +0100 Subject: [PATCH 46/47] Removed some dependencies on Perl IO module. --- lib/Slic3r/Test.pm | 1 - t/svg.t | 1 + utils/gcode_sectioncut.pl | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Slic3r/Test.pm b/lib/Slic3r/Test.pm index 53d6d1024..6471ae123 100644 --- a/lib/Slic3r/Test.pm +++ b/lib/Slic3r/Test.pm @@ -7,7 +7,6 @@ require Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = qw(_eq); -use IO::Scalar; use List::Util qw(first); use Slic3r::Geometry qw(epsilon X Y Z); diff --git a/t/svg.t b/t/svg.t index 6092efe24..47d24ceb8 100644 --- a/t/svg.t +++ b/t/svg.t @@ -10,6 +10,7 @@ BEGIN { use Slic3r; use Slic3r::Test; +use IO::Scalar; { my $print = Slic3r::Test::init_print('20mm_cube'); diff --git a/utils/gcode_sectioncut.pl b/utils/gcode_sectioncut.pl index afc011ce8..e83f3fcda 100644 --- a/utils/gcode_sectioncut.pl +++ b/utils/gcode_sectioncut.pl @@ -11,7 +11,6 @@ BEGIN { } use Getopt::Long qw(:config no_auto_abbrev); -use IO::All; use List::Util qw(max); use Slic3r; use Slic3r::Geometry qw(X Y); From 9ae2fa662144bb7d76b9a306682386c13fd7b3bf Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 16 Mar 2018 13:13:27 +0100 Subject: [PATCH 47/47] Removed Perl Slic3r::GUI::Notifier module. The Growl for OSX is dead and the D-bus support for Linux/X was broken. --- lib/Slic3r/GUI.pm | 6 ++--- lib/Slic3r/GUI/Notifier.pm | 46 -------------------------------------- 2 files changed, 3 insertions(+), 49 deletions(-) delete mode 100644 lib/Slic3r/GUI/Notifier.pm diff --git a/lib/Slic3r/GUI.pm b/lib/Slic3r/GUI.pm index 2bb5c9e4a..5ade026af 100644 --- a/lib/Slic3r/GUI.pm +++ b/lib/Slic3r/GUI.pm @@ -15,7 +15,6 @@ use Slic3r::GUI::Controller; use Slic3r::GUI::Controller::ManualControlDialog; use Slic3r::GUI::Controller::PrinterPanel; use Slic3r::GUI::MainFrame; -use Slic3r::GUI::Notifier; use Slic3r::GUI::Plater; use Slic3r::GUI::Plater::2D; use Slic3r::GUI::Plater::2DToolpaths; @@ -87,7 +86,6 @@ sub OnInit { Slic3r::set_data_dir($datadir || Wx::StandardPaths::Get->GetUserDataDir); Slic3r::GUI::set_wxapp($self); - $self->{notifier} = Slic3r::GUI::Notifier->new; $self->{app_config} = Slic3r::GUI::AppConfig->new; $self->{preset_bundle} = Slic3r::GUI::PresetBundle->new; @@ -271,7 +269,9 @@ sub notify { $frame->RequestUserAttention(&Wx::wxMAC ? wxUSER_ATTENTION_ERROR : wxUSER_ATTENTION_INFO) unless ($frame->IsActive); - $self->{notifier}->notify($message); + # There used to be notifier using a Growl application for OSX, but Growl is dead. + # The notifier also supported the Linux X D-bus notifications, but that support was broken. + #TODO use wxNotificationMessage? } # Called after the Preferences dialog is closed and the program settings are saved. diff --git a/lib/Slic3r/GUI/Notifier.pm b/lib/Slic3r/GUI/Notifier.pm deleted file mode 100644 index 54afffae0..000000000 --- a/lib/Slic3r/GUI/Notifier.pm +++ /dev/null @@ -1,46 +0,0 @@ -# Notify about the end of slicing. -# The notifications are sent out using the Growl protocol if installed, and using DBus XWindow protocol. - -package Slic3r::GUI::Notifier; -use Moo; - -has 'growler' => (is => 'rw'); - -my $icon = Slic3r::var("Slic3r.png"); - -sub BUILD { - my ($self) = @_; - - if (eval 'use Growl::GNTP; 1') { - # register with growl - eval { - $self->growler(Growl::GNTP->new(AppName => 'Slic3r', AppIcon => $icon)); - $self->growler->register([{Name => 'SKEIN_DONE', DisplayName => 'Slicing Done'}]); - }; - # if register() fails (for example because of a timeout), disable growler at all - $self->growler(undef) if $@; - } -} - -sub notify { - my ($self, $message) = @_; - my $title = 'Slicing Done!'; - - eval { - $self->growler->notify(Event => 'SKEIN_DONE', Title => $title, Message => $message) - if $self->growler; - }; - # Net::DBus is broken in multithreaded environment - if (0 && eval 'use Net::DBus; 1') { - eval { - my $session = Net::DBus->session; - my $serv = $session->get_service('org.freedesktop.Notifications'); - my $notifier = $serv->get_object('/org/freedesktop/Notifications', - 'org.freedesktop.Notifications'); - $notifier->Notify('Slic3r', 0, $icon, $title, $message, [], {}, -1); - undef $Net::DBus::bus_session; - }; - } -} - -1;