Bugfix: inconsistent scaling when object had multiple copies in plater. #3798

This commit is contained in:
Alessandro Ranellucci 2017-04-04 19:18:18 +02:00
parent bc96a1a268
commit 8f66d88320
2 changed files with 8 additions and 6 deletions

View File

@ -753,18 +753,20 @@ ModelObject::mirror(const Axis &axis)
} }
void void
ModelObject::transform_by_instance(const ModelInstance &instance, bool dont_translate) ModelObject::transform_by_instance(ModelInstance instance, bool dont_translate)
{ {
// We get instance by copy because we would alter it in the loop below,
// causing inconsistent values in subsequent instances.
this->rotate(instance.rotation, Z); this->rotate(instance.rotation, Z);
this->scale(instance.scaling_factor); this->scale(instance.scaling_factor);
if (!dont_translate) if (!dont_translate)
this->translate(instance.offset.x, instance.offset.y, 0); this->translate(instance.offset.x, instance.offset.y, 0);
for (ModelInstancePtrs::iterator i = this->instances.begin(); i != this->instances.end(); ++i) { for (ModelInstance* i : this->instances) {
(*i)->rotation -= instance.rotation; i->rotation -= instance.rotation;
(*i)->scaling_factor /= instance.scaling_factor; i->scaling_factor /= instance.scaling_factor;
if (!dont_translate) if (!dont_translate)
(*i)->offset.translate(-instance.offset.x, -instance.offset.y); i->offset.translate(-instance.offset.x, -instance.offset.y);
} }
this->origin_translation = Pointf3(0,0,0); this->origin_translation = Pointf3(0,0,0);
this->invalidate_bounding_box(); this->invalidate_bounding_box();

View File

@ -160,7 +160,7 @@ class ModelObject
void scale_to_fit(const Sizef3 &size); void scale_to_fit(const Sizef3 &size);
void rotate(float angle, const Axis &axis); void rotate(float angle, const Axis &axis);
void mirror(const Axis &axis); void mirror(const Axis &axis);
void transform_by_instance(const ModelInstance &instance, bool dont_translate = false); void transform_by_instance(ModelInstance instance, bool dont_translate = false);
size_t materials_count() const; size_t materials_count() const;
size_t facets_count() const; size_t facets_count() const;
bool needed_repair() const; bool needed_repair() const;