Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/slic3r/GUI/Plater.cpp')
-rw-r--r--src/slic3r/GUI/Plater.cpp136
1 files changed, 65 insertions, 71 deletions
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index e8b9ae491..1b3c001a4 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -223,6 +223,9 @@ ObjectInfo::ObjectInfo(wxWindow *parent) :
Add(sizer_manifold, 0, wxEXPAND | wxTOP, 4);
sla_hidden_items = { label_volume, info_volume, /*label_materials, info_materials*/ };
+
+ // Fixes layout issues on plater, short BitmapComboBoxes with some Windows scaling, see GH issue #7414.
+ this->Show(false);
}
void ObjectInfo::show_sizer(bool show)
@@ -1182,10 +1185,10 @@ void Sidebar::jump_to_option(const std::string& opt_key, Preset::Type type, cons
void Sidebar::jump_to_option(size_t selected)
{
const Search::Option& opt = p->searcher.get_option(selected);
- wxGetApp().get_tab(opt.type)->activate_option(opt.opt_key(), boost::nowide::narrow(opt.category));
-
- // Switch to the Settings NotePad
-// wxGetApp().mainframe->select_tab();
+ if (opt.type == Preset::TYPE_PREFERENCES)
+ wxGetApp().open_preferences(opt.opt_key(), boost::nowide::narrow(opt.group));
+ else
+ wxGetApp().get_tab(opt.type)->activate_option(opt.opt_key(), boost::nowide::narrow(opt.category));
}
ObjectManipulation* Sidebar::obj_manipul()
@@ -3655,12 +3658,12 @@ void Plater::priv::reload_from_disk()
if (has_source || has_name) {
int new_volume_idx = -1;
int new_object_idx = -1;
- if (has_source) {
- // take idxs from source
- new_volume_idx = old_volume->source.volume_idx;
- new_object_idx = old_volume->source.object_idx;
- }
- else {
+// if (has_source) {
+// // take idxs from source
+// new_volume_idx = old_volume->source.volume_idx;
+// new_object_idx = old_volume->source.object_idx;
+// }
+// else {
// take idxs from the 1st matching volume
for (size_t o = 0; o < new_model.objects.size(); ++o) {
ModelObject* obj = new_model.objects[o];
@@ -3676,39 +3679,40 @@ void Plater::priv::reload_from_disk()
if (found)
break;
}
- }
+// }
- if (new_object_idx < 0 && (int)new_model.objects.size() <= new_object_idx) {
+ if (new_object_idx < 0 || int(new_model.objects.size()) <= new_object_idx) {
fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name));
continue;
}
ModelObject* new_model_object = new_model.objects[new_object_idx];
- if (new_volume_idx < 0 && (int)new_model.objects.size() <= new_volume_idx) {
+ if (new_volume_idx < 0 || int(new_model_object->volumes.size()) <= new_volume_idx) {
fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name));
continue;
}
- if (new_volume_idx < (int)new_model_object->volumes.size()) {
- old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]);
- ModelVolume* new_volume = old_model_object->volumes.back();
- new_volume->set_new_unique_id();
- new_volume->config.apply(old_volume->config);
- new_volume->set_type(old_volume->type());
- new_volume->set_material_id(old_volume->material_id());
- new_volume->set_transformation(old_volume->get_transformation());
- new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset));
- assert(! old_volume->source.is_converted_from_inches || ! old_volume->source.is_converted_from_meters);
- if (old_volume->source.is_converted_from_inches)
- new_volume->convert_from_imperial_units();
- else if (old_volume->source.is_converted_from_meters)
- new_volume->convert_from_meters();
- std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back());
- old_model_object->delete_volume(old_model_object->volumes.size() - 1);
- if (!sinking)
- old_model_object->ensure_on_bed();
- old_model_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1");
-
- sla::reproject_points_and_holes(old_model_object);
- }
+
+ old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]);
+ ModelVolume* new_volume = old_model_object->volumes.back();
+ new_volume->set_new_unique_id();
+ new_volume->config.apply(old_volume->config);
+ new_volume->set_type(old_volume->type());
+ new_volume->set_material_id(old_volume->material_id());
+ new_volume->set_transformation(old_volume->get_transformation());
+ new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset));
+ new_volume->source.object_idx = old_volume->source.object_idx;
+ new_volume->source.volume_idx = old_volume->source.volume_idx;
+ assert(! old_volume->source.is_converted_from_inches || ! old_volume->source.is_converted_from_meters);
+ if (old_volume->source.is_converted_from_inches)
+ new_volume->convert_from_imperial_units();
+ else if (old_volume->source.is_converted_from_meters)
+ new_volume->convert_from_meters();
+ std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back());
+ old_model_object->delete_volume(old_model_object->volumes.size() - 1);
+ if (!sinking)
+ old_model_object->ensure_on_bed();
+ old_model_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1");
+
+ sla::reproject_points_and_holes(old_model_object);
}
}
}
@@ -5717,23 +5721,26 @@ void Plater::export_stl(bool extended, bool selection_only)
return;
// Following lambda generates a combined mesh for export with normals pointing outwards.
- auto mesh_to_export = [](const ModelObject* mo, bool instances) -> TriangleMesh {
+ auto mesh_to_export = [](const ModelObject& mo, int instance_id) {
TriangleMesh mesh;
- for (const ModelVolume *v : mo->volumes)
+ for (const ModelVolume* v : mo.volumes)
if (v->is_model_part()) {
TriangleMesh vol_mesh(v->mesh());
vol_mesh.transform(v->get_matrix(), true);
mesh.merge(vol_mesh);
}
- if (instances) {
+ if (instance_id == -1) {
TriangleMesh vols_mesh(mesh);
mesh = TriangleMesh();
- for (const ModelInstance *i : mo->instances) {
+ for (const ModelInstance* i : mo.instances) {
TriangleMesh m = vols_mesh;
m.transform(i->get_matrix(), true);
mesh.merge(m);
}
}
+ else if (0 <= instance_id && instance_id < mo.instances.size())
+ mesh.transform(mo.instances[instance_id]->get_matrix(), true);
+
return mesh;
};
@@ -5742,14 +5749,8 @@ void Plater::export_stl(bool extended, bool selection_only)
if (selection_only) {
const ModelObject* model_object = p->model.objects[obj_idx];
if (selection.get_mode() == Selection::Instance)
- {
- if (selection.is_single_full_object())
- mesh = mesh_to_export(model_object, true);
- else
- mesh = mesh_to_export(model_object, false);
- }
- else
- {
+ mesh = selection.is_single_full_object() ? mesh_to_export(*model_object, -1) : mesh_to_export(*model_object, selection.get_instance_idx());
+ else {
const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
mesh = model_object->volumes[volume->volume_idx()]->mesh();
mesh.transform(volume->get_volume_transformation().get_matrix(), true);
@@ -5757,69 +5758,62 @@ void Plater::export_stl(bool extended, bool selection_only)
}
}
else {
- for (const ModelObject *o : p->model.objects)
- mesh.merge(mesh_to_export(o, true));
+ for (const ModelObject* o : p->model.objects) {
+ mesh.merge(mesh_to_export(*o, -1));
+ }
}
}
- else
- {
+ else {
// This is SLA mode, all objects have only one volume.
// However, we must have a look at the backend to load
// hollowed mesh and/or supports
const PrintObjects& objects = p->sla_print.objects();
- for (const SLAPrintObject* object : objects)
- {
+ for (const SLAPrintObject* object : objects) {
const ModelObject* model_object = object->model_object();
if (selection_only) {
if (model_object->id() != p->model.objects[obj_idx]->id())
continue;
}
- Transform3d mesh_trafo_inv = object->trafo().inverse();
- bool is_left_handed = object->is_left_handed();
+ const Transform3d mesh_trafo_inv = object->trafo().inverse();
+ const bool is_left_handed = object->is_left_handed();
TriangleMesh pad_mesh;
- bool has_pad_mesh = extended && object->has_mesh(slaposPad);
- if (has_pad_mesh)
- {
+ const bool has_pad_mesh = extended && object->has_mesh(slaposPad);
+ if (has_pad_mesh) {
pad_mesh = object->get_mesh(slaposPad);
pad_mesh.transform(mesh_trafo_inv);
}
TriangleMesh supports_mesh;
- bool has_supports_mesh = extended && object->has_mesh(slaposSupportTree);
- if (has_supports_mesh)
- {
+ const bool has_supports_mesh = extended && object->has_mesh(slaposSupportTree);
+ if (has_supports_mesh) {
supports_mesh = object->get_mesh(slaposSupportTree);
supports_mesh.transform(mesh_trafo_inv);
}
const std::vector<SLAPrintObject::Instance>& obj_instances = object->instances();
- for (const SLAPrintObject::Instance& obj_instance : obj_instances)
- {
+ for (const SLAPrintObject::Instance& obj_instance : obj_instances) {
auto it = std::find_if(model_object->instances.begin(), model_object->instances.end(),
[&obj_instance](const ModelInstance *mi) { return mi->id() == obj_instance.instance_id; });
assert(it != model_object->instances.end());
- if (it != model_object->instances.end())
- {
- bool one_inst_only = selection_only && ! selection.is_single_full_object();
+ if (it != model_object->instances.end()) {
+ const bool one_inst_only = selection_only && ! selection.is_single_full_object();
- int instance_idx = it - model_object->instances.begin();
+ const int instance_idx = it - model_object->instances.begin();
const Transform3d& inst_transform = one_inst_only
? Transform3d::Identity()
: object->model_object()->instances[instance_idx]->get_transformation().get_matrix();
TriangleMesh inst_mesh;
- if (has_pad_mesh)
- {
+ if (has_pad_mesh) {
TriangleMesh inst_pad_mesh = pad_mesh;
inst_pad_mesh.transform(inst_transform, is_left_handed);
inst_mesh.merge(inst_pad_mesh);
}
- if (has_supports_mesh)
- {
+ if (has_supports_mesh) {
TriangleMesh inst_supports_mesh = supports_mesh;
inst_supports_mesh.transform(inst_transform, is_left_handed);
inst_mesh.merge(inst_supports_mesh);