diff --git a/lib/Slic3r/Format/AMF.pm b/lib/Slic3r/Format/AMF.pm index d66a60d11..ec6b31fe4 100644 --- a/lib/Slic3r/Format/AMF.pm +++ b/lib/Slic3r/Format/AMF.pm @@ -56,6 +56,9 @@ sub write_file { foreach my $opt_key (@{$config->get_keys}) { printf $fh qq{ %s\n}, $opt_key, $config->serialize($opt_key); } + if ($object->name) { + printf $fh qq{ %s\n}, $object->name; + } printf $fh qq{ \n}; printf $fh qq{ \n}; @@ -81,12 +84,15 @@ sub write_file { foreach my $volume (@{ $object->volumes }) { my $vertices_offset = shift @vertices_offset; printf $fh qq{ \n}, - (!defined $volume->material_id) ? '' : (sprintf ' materialid="%s"', $volume->material_id); + ($volume->material_id eq '') ? '' : (sprintf ' materialid="%s"', $volume->material_id); my $config = $volume->config; foreach my $opt_key (@{$config->get_keys}) { printf $fh qq{ %s\n}, $opt_key, $config->serialize($opt_key); } + if ($volume->name) { + printf $fh qq{ %s\n}, $volume->name; + } if ($volume->modifier) { printf $fh qq{ 1\n}; } diff --git a/lib/Slic3r/Format/AMF/Parser.pm b/lib/Slic3r/Format/AMF/Parser.pm index 8d4a839f4..f6713f5c7 100644 --- a/lib/Slic3r/Format/AMF/Parser.pm +++ b/lib/Slic3r/Format/AMF/Parser.pm @@ -114,6 +114,10 @@ sub end_element { } elsif ($opt_key eq 'modifier' && $self->{_volume}) { $self->{_volume}->set_modifier($value); } + } elsif ($self->{_metadata_type} eq 'name' && $self->{_volume}) { + $self->{_volume}->set_name($value); + } elsif ($self->{_metadata_type} eq 'name' && $self->{_object}) { + $self->{_object}->set_name($value); } elsif ($self->{_material}) { $self->{_material}->set_attribute($self->{_metadata_type}, $value); } diff --git a/lib/Slic3r/Format/OBJ.pm b/lib/Slic3r/Format/OBJ.pm index 788dce14e..616b38cdc 100644 --- a/lib/Slic3r/Format/OBJ.pm +++ b/lib/Slic3r/Format/OBJ.pm @@ -25,11 +25,9 @@ sub read_file { my $model = Slic3r::Model->new; - my $material_id = basename($file); - $model->set_material($material_id); - - my $object = $model->add_object; - my $volume = $object->add_volume(mesh => $mesh, material_id => $material_id); + my $basename = basename($file); + my $object = $model->add_object(input_file => $file, name => $basename); + my $volume = $object->add_volume(mesh => $mesh, name => $basename); return $model; } diff --git a/lib/Slic3r/Format/STL.pm b/lib/Slic3r/Format/STL.pm index c21f9b85b..c9fc303ff 100644 --- a/lib/Slic3r/Format/STL.pm +++ b/lib/Slic3r/Format/STL.pm @@ -16,10 +16,9 @@ sub read_file { my $model = Slic3r::Model->new; - my $material_id = basename($file); - $model->set_material($material_id); - my $object = $model->add_object; - my $volume = $object->add_volume(mesh => $mesh, material_id => $material_id); + my $basename = basename($file); + my $object = $model->add_object(input_file => $file, name => $basename); + my $volume = $object->add_volume(mesh => $mesh, name => $basename); return $model; } diff --git a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm index a987c043f..c094cc63a 100644 --- a/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm +++ b/lib/Slic3r/GUI/Plater/ObjectPartsPanel.pm @@ -109,13 +109,8 @@ sub reload_tree { foreach my $volume_id (0..$#{$object->volumes}) { my $volume = $object->volumes->[$volume_id]; - my $material_id = $volume->material_id // '_'; - my $material_name = $material_id eq '_' - ? sprintf("Part #%d", $volume_id+1) - : $object->model->get_material_name($material_id); - my $icon = $volume->modifier ? ICON_MODIFIERMESH : ICON_SOLIDMESH; - my $itemId = $tree->AppendItem($rootId, $material_name, $icon); + my $itemId = $tree->AppendItem($rootId, $volume->name || $volume_id, $icon); $tree->SetPlData($itemId, { type => 'volume', volume_id => $volume_id, @@ -158,7 +153,7 @@ sub selection_changed { } $self->{btn_delete}->Enable; - # attach volume material config to settings panel + # attach volume config to settings panel my $volume = $self->{model_object}->volumes->[ $itemData->{volume_id} ]; $config = $volume->config; $self->{staticbox}->SetLabel('Part Settings'); @@ -208,6 +203,7 @@ sub on_btn_load { foreach my $volume (@{$object->volumes}) { my $new_volume = $self->{model_object}->add_volume($volume); $new_volume->set_modifier($is_modifier); + $new_volume->set_name(basename($input_file)); # apply the same translation we applied to the object $new_volume->mesh->translate(@{$self->{model_object}->origin_translation}, 0); diff --git a/lib/Slic3r/Model.pm b/lib/Slic3r/Model.pm index 10668b6b9..66f83930b 100644 --- a/lib/Slic3r/Model.pm +++ b/lib/Slic3r/Model.pm @@ -40,6 +40,8 @@ sub add_object { my $new_object = $self->_add_object; + $new_object->set_name($args{name}) + if defined $args{name}; $new_object->set_input_file($args{input_file}) if defined $args{input_file}; $new_object->config->apply($args{config}) @@ -271,7 +273,9 @@ sub split_meshes { ); $new_object->add_volume( mesh => $mesh, + name => $volume->name, material_id => $volume->material_id, + config => $volume->config, ); # add one instance per original instance @@ -325,8 +329,7 @@ sub add_volume { $new_volume = $self->_add_volume_clone($volume); - # TODO: material_id can't be undef. - if (defined $volume->material_id) { + if ($volume->material_id ne '') { # merge material attributes and config (should we rename materials in case of duplicates?) if (my $material = $volume->object->model->get_material($volume->material_id)) { my %attributes = %{ $material->attributes }; @@ -342,13 +345,17 @@ sub add_volume { $new_volume = $self->_add_volume($args{mesh}); + $new_volume->set_name($args{name}) + if defined $args{name}; $new_volume->set_material_id($args{material_id}) if defined $args{material_id}; $new_volume->set_modifier($args{modifier}) if defined $args{modifier}; + $new_volume->config->apply($args{config}) + if defined $args{config}; } - if (defined $new_volume->material_id && !defined $self->model->get_material($new_volume->material_id)) { + if ($new_volume->material_id ne '' && !defined $self->model->get_material($new_volume->material_id)) { # TODO: this should be a trigger on Volume::material_id $self->model->set_material($new_volume->material_id); } @@ -607,16 +614,20 @@ sub cut { if ($upper_mesh->facets_count > 0) { $upper->add_volume( + name => $volume->name, material_id => $volume->material_id, mesh => $upper_mesh, modifier => $volume->modifier, + config => $volume->config, ); } if ($lower_mesh->facets_count > 0) { $lower->add_volume( + name => $volume->name, material_id => $volume->material_id, mesh => $lower_mesh, modifier => $volume->modifier, + config => $volume->config, ); } } diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index 409e65f1b..da9f52fcc 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -97,7 +97,7 @@ sub apply_config { $model_object_config->normalize; $new->apply_dynamic($model_object_config); } - if (defined $volume->material_id) { + if ($volume->material_id ne '') { my $material_config = $object->model_object->model->get_material($volume->material_id)->config->clone; $material_config->normalize; $new->apply_dynamic($material_config); @@ -190,7 +190,7 @@ sub add_model_object { $config->apply_dynamic($object_config); $config->apply_dynamic($volume->config); - if (defined $volume->material_id) { + if ($volume->material_id ne '') { my $material_config = $volume->material->config->clone; $material_config->normalize; $config->apply_dynamic($material_config); @@ -1045,7 +1045,7 @@ sub auto_assign_extruders { my $extruders = scalar @{ $self->config->nozzle_diameter }; foreach my $i (0..$#{$model_object->volumes}) { my $volume = $model_object->volumes->[$i]; - if (defined $volume->material_id) { + if ($volume->material_id ne '') { my $material = $model_object->model->get_material($volume->material_id); my $config = $material->config; my $extruder_id = $i + 1; diff --git a/xs/src/Model.cpp b/xs/src/Model.cpp index abbff5fa0..ee8dc1057 100644 --- a/xs/src/Model.cpp +++ b/xs/src/Model.cpp @@ -186,6 +186,7 @@ ModelObject::ModelObject(Model *model) ModelObject::ModelObject(Model *model, const ModelObject &other) : model(model), + name(other.name), input_file(other.input_file), instances(), volumes(), @@ -321,7 +322,8 @@ ModelVolume::ModelVolume(ModelObject* object, const TriangleMesh &mesh) {} ModelVolume::ModelVolume(ModelObject* object, const ModelVolume &other) -: object(object), mesh(other.mesh), config(other.config), modifier(other.modifier) +: object(object), name(other.name), mesh(other.mesh), config(other.config), + modifier(other.modifier) { this->material_id(other.material_id()); } diff --git a/xs/src/Model.hpp b/xs/src/Model.hpp index 293e7d350..dfcd75b4c 100644 --- a/xs/src/Model.hpp +++ b/xs/src/Model.hpp @@ -87,6 +87,7 @@ class ModelObject { friend class Model; public: + std::string name; std::string input_file; ModelInstancePtrs instances; ModelVolumePtrs volumes; @@ -138,6 +139,7 @@ class ModelVolume { friend class ModelObject; public: + std::string name; TriangleMesh mesh; DynamicPrintConfig config; bool modifier; diff --git a/xs/xsp/Model.xsp b/xs/xsp/Model.xsp index 1f573cb37..1038b804e 100644 --- a/xs/xsp/Model.xsp +++ b/xs/xsp/Model.xsp @@ -136,6 +136,10 @@ ModelMaterial::attributes() int instances_count() %code%{ RETVAL = THIS->instances.size(); %}; + std::string name() + %code%{ RETVAL = THIS->name; %}; + void set_name(std::string value) + %code%{ THIS->name = value; %}; std::string input_file() %code%{ RETVAL = THIS->input_file; %}; void set_input_file(std::string value) @@ -162,6 +166,10 @@ ModelMaterial::attributes() Ref object() %code%{ RETVAL = THIS->get_object(); %}; + std::string name() + %code%{ RETVAL = THIS->name; %}; + void set_name(std::string value) + %code%{ THIS->name = value; %}; t_model_material_id material_id(); void set_material_id(t_model_material_id material_id) %code%{ THIS->material_id(material_id); %};