mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 17:36:00 +08:00
Fixed scaling of multipart objects using the sidebar panel
This commit is contained in:
parent
deefe1b2e9
commit
646af02560
@ -1416,31 +1416,29 @@ void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& translation
|
|||||||
if (!m_valid)
|
if (!m_valid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Vec3d relative_scale = scale;
|
||||||
|
if (transformation_type.absolute()) {
|
||||||
|
// converts to relative scale
|
||||||
|
if (m_mode == Instance) {
|
||||||
|
if (is_single_full_instance()) {
|
||||||
|
BoundingBoxf3 current_box = get_bounding_box_in_current_reference_system().first;
|
||||||
|
BoundingBoxf3 original_box;
|
||||||
|
if (transformation_type.world())
|
||||||
|
original_box = get_full_unscaled_instance_bounding_box();
|
||||||
|
else
|
||||||
|
original_box = get_full_unscaled_instance_local_bounding_box();
|
||||||
|
|
||||||
|
relative_scale = original_box.size().cwiseProduct(scale).cwiseQuotient(current_box.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
transformation_type.set_relative();
|
||||||
|
}
|
||||||
|
|
||||||
for (unsigned int i : m_list) {
|
for (unsigned int i : m_list) {
|
||||||
GLVolume& v = *(*m_volumes)[i];
|
GLVolume& v = *(*m_volumes)[i];
|
||||||
const VolumeCache& volume_data = m_cache.volumes_data[i];
|
const VolumeCache& volume_data = m_cache.volumes_data[i];
|
||||||
const Geometry::Transformation& inst_trafo = volume_data.get_instance_transform();
|
const Geometry::Transformation& inst_trafo = volume_data.get_instance_transform();
|
||||||
|
|
||||||
Vec3d relative_scale = scale;
|
|
||||||
|
|
||||||
if (transformation_type.absolute()) {
|
|
||||||
if (m_mode == Instance) {
|
|
||||||
if (is_single_full_instance()) {
|
|
||||||
BoundingBoxf3 current_box = get_bounding_box_in_current_reference_system().first;
|
|
||||||
BoundingBoxf3 original_box;
|
|
||||||
if (transformation_type.world())
|
|
||||||
original_box = get_full_unscaled_instance_bounding_box();
|
|
||||||
else
|
|
||||||
original_box = get_full_unscaled_instance_local_bounding_box();
|
|
||||||
|
|
||||||
relative_scale = original_box.size().cwiseProduct(scale).cwiseQuotient(current_box.size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
}
|
|
||||||
transformation_type.set_relative();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_mode == Instance) {
|
if (m_mode == Instance) {
|
||||||
if (transformation_type.instance()) {
|
if (transformation_type.instance()) {
|
||||||
const Vec3d world_inst_pivot = m_cache.dragging_center - inst_trafo.get_offset();
|
const Vec3d world_inst_pivot = m_cache.dragging_center - inst_trafo.get_offset();
|
||||||
@ -2940,10 +2938,10 @@ static void verify_instances_rotation_synchronized(const Model &model, const GLV
|
|||||||
assert(idx_volume_first != -1); // object without instances?
|
assert(idx_volume_first != -1); // object without instances?
|
||||||
if (idx_volume_first == -1)
|
if (idx_volume_first == -1)
|
||||||
continue;
|
continue;
|
||||||
const Transform3d::ConstLinearPart &rotation0 = volumes[idx_volume_first]->get_instance_transformation().get_matrix().linear();
|
const Transform3d::ConstLinearPart& rotation0 = volumes[idx_volume_first]->get_instance_transformation().get_matrix().linear();
|
||||||
for (int i = idx_volume_first + 1; i < (int)volumes.size(); ++i)
|
for (int i = idx_volume_first + 1; i < (int)volumes.size(); ++i)
|
||||||
if (volumes[i]->object_idx() == idx_object) {
|
if (volumes[i]->object_idx() == idx_object) {
|
||||||
const Transform3d::ConstLinearPart &rotation = volumes[i]->get_instance_transformation().get_matrix().linear();
|
const Transform3d::ConstLinearPart& rotation = volumes[i]->get_instance_transformation().get_matrix().linear();
|
||||||
assert(is_rotation_xy_synchronized(rotation, rotation0));
|
assert(is_rotation_xy_synchronized(rotation, rotation0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user