From f2b05b2986e6cf414df3dc93c7358cb6349967b3 Mon Sep 17 00:00:00 2001 From: Roy-043 <70520633+Roy-043@users.noreply.github.com> Date: Thu, 28 Jul 2022 13:56:05 +0200 Subject: [PATCH 1/3] Draft: Avoid faulty Base.Placement.rotate() in draftobjects.array.py --- src/Mod/Draft/draftobjects/array.py | 35 +++++++++++++---------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/Mod/Draft/draftobjects/array.py b/src/Mod/Draft/draftobjects/array.py index 8292c60751..04070965a6 100644 --- a/src/Mod/Draft/draftobjects/array.py +++ b/src/Mod/Draft/draftobjects/array.py @@ -471,26 +471,22 @@ def polar_placements(base_placement, if number == 0: return placements - spin = App.Placement(App.Vector(), base_placement.Rotation) - pl = App.Placement(base_placement.Base, App.Rotation()) - center = center.sub(base_placement.Base) - if angle == 360: - fraction = float(angle)/number + fraction = float(angle) / number else: - fraction = float(angle)/(number - 1) - - center_tuple = DraftVecUtils.tup(center) - axis_tuple = DraftVecUtils.tup(axis) + fraction = float(angle) / (number - 1) for i in range(number - 1): - currangle = fraction + (i*fraction) - npl = pl.copy() - npl.rotate(center_tuple, axis_tuple, currangle) - npl = npl.multiply(spin) + currangle = fraction + (i * fraction) + npl = base_placement.copy() + # Workaround for `faulty` implementation of Base.Placement.rotate(center, axis, angle). + # See: https://forum.freecadweb.org/viewtopic.php?p=613196#p613196 + offset_rotation = App.Placement(App.Vector(0, 0, 0), App.Rotation(axis, currangle), center) + npl = offset_rotation * npl + if axisvector: if not DraftVecUtils.isNull(axisvector): - npl.translate(App.Vector(axisvector).multiply(i+1)) + npl.translate(App.Vector(axisvector).multiply(i + 1)) placements.append(npl) return placements @@ -512,20 +508,21 @@ def circ_placements(base_placement, for xcount in range(1, circle_number): rc = xcount * r_distance + trans = App.Vector(direction).multiply(rc) c = 2 * rc * math.pi n = math.floor(c / tan_distance) n = int(math.floor(n / symmetry) * symmetry) if n == 0: continue - angle = 360.0/n + angle = 360.0 / n for ycount in range(0, n): npl = base_placement.copy() - trans = App.Vector(direction).multiply(rc) npl.translate(trans) - npl.rotate(npl.Rotation.inverted().multVec(center-trans), - axis, - ycount * angle) + # Workaround for `faulty` implementation of Base.Placement.rotate(center, axis, angle). + # See: https://forum.freecadweb.org/viewtopic.php?p=613196#p613196 + offset_rotation = App.Placement(App.Vector(0, 0, 0), App.Rotation(axis, ycount * angle), center) + npl = offset_rotation * npl placements.append(npl) return placements From 2647c37289e1bda011001ca3259f212b2d76b6e2 Mon Sep 17 00:00:00 2001 From: Roy-043 <70520633+Roy-043@users.noreply.github.com> Date: Fri, 12 Aug 2022 12:34:46 +0200 Subject: [PATCH 2/3] Update array.py Updated to use the new implementation of Base.Placement.rotate(). --- src/Mod/Draft/draftobjects/array.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/Mod/Draft/draftobjects/array.py b/src/Mod/Draft/draftobjects/array.py index 04070965a6..8356672e64 100644 --- a/src/Mod/Draft/draftobjects/array.py +++ b/src/Mod/Draft/draftobjects/array.py @@ -479,11 +479,8 @@ def polar_placements(base_placement, for i in range(number - 1): currangle = fraction + (i * fraction) npl = base_placement.copy() - # Workaround for `faulty` implementation of Base.Placement.rotate(center, axis, angle). - # See: https://forum.freecadweb.org/viewtopic.php?p=613196#p613196 - offset_rotation = App.Placement(App.Vector(0, 0, 0), App.Rotation(axis, currangle), center) - npl = offset_rotation * npl - + print("hier") + npl.rotate(center, axis, currangle, comp=True) if axisvector: if not DraftVecUtils.isNull(axisvector): npl.translate(App.Vector(axisvector).multiply(i + 1)) @@ -519,10 +516,8 @@ def circ_placements(base_placement, for ycount in range(0, n): npl = base_placement.copy() npl.translate(trans) - # Workaround for `faulty` implementation of Base.Placement.rotate(center, axis, angle). - # See: https://forum.freecadweb.org/viewtopic.php?p=613196#p613196 - offset_rotation = App.Placement(App.Vector(0, 0, 0), App.Rotation(axis, ycount * angle), center) - npl = offset_rotation * npl + print("hier") + npl.rotate(center, axis, ycount * angle, comp=True) placements.append(npl) return placements From f22de4cfd2d495cd6e06b86617a110356eeab68c Mon Sep 17 00:00:00 2001 From: Roy-043 <70520633+Roy-043@users.noreply.github.com> Date: Fri, 12 Aug 2022 12:38:13 +0200 Subject: [PATCH 3/3] Update array.py Oops... removed to print() statements. --- src/Mod/Draft/draftobjects/array.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Mod/Draft/draftobjects/array.py b/src/Mod/Draft/draftobjects/array.py index 8356672e64..deed4fab0f 100644 --- a/src/Mod/Draft/draftobjects/array.py +++ b/src/Mod/Draft/draftobjects/array.py @@ -479,7 +479,6 @@ def polar_placements(base_placement, for i in range(number - 1): currangle = fraction + (i * fraction) npl = base_placement.copy() - print("hier") npl.rotate(center, axis, currangle, comp=True) if axisvector: if not DraftVecUtils.isNull(axisvector): @@ -516,7 +515,6 @@ def circ_placements(base_placement, for ycount in range(0, n): npl = base_placement.copy() npl.translate(trans) - print("hier") npl.rotate(center, axis, ycount * angle, comp=True) placements.append(npl)