From 1474f36b74c0ca3de7eb52218016aa4d9d2e986a Mon Sep 17 00:00:00 2001 From: Roy-043 Date: Thu, 16 Feb 2023 00:06:29 +0100 Subject: [PATCH] [Arch] children of Component did not rotate with Host --- src/Mod/Arch/ArchComponent.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Mod/Arch/ArchComponent.py b/src/Mod/Arch/ArchComponent.py index 1951d17124..df2ac49100 100644 --- a/src/Mod/Arch/ArchComponent.py +++ b/src/Mod/Arch/ArchComponent.py @@ -314,28 +314,28 @@ class Component(ArchIFC.IfcProduct): if prop == "Placement": if hasattr(self,"oldPlacement"): if self.oldPlacement: - import DraftVecUtils deltap = obj.Placement.Base.sub(self.oldPlacement.Base) if deltap.Length == 0: deltap = None - v = FreeCAD.Vector(0,0,1) - deltar = FreeCAD.Rotation(self.oldPlacement.Rotation.multVec(v),obj.Placement.Rotation.multVec(v)) - #print "Rotation",deltar.Axis,deltar.Angle + deltar = obj.Placement.Rotation * self.oldPlacement.Rotation.inverted() if deltar.Angle < 0.0001: deltar = None for child in self.getMovableChildren(obj): - #print "moving ",child.Label if deltar: - #child.Placement.Rotation = child.Placement.Rotation.multiply(deltar) - not enough, child must also move - # use shape methods to obtain a correct placement - import Part,math - shape = Part.Shape() - shape.Placement = child.Placement - #print("angle before rotation:",shape.Placement.Rotation.Angle) - #print("rotation angle:",math.degrees(deltar.Angle)) - shape.rotate(DraftVecUtils.tup(self.oldPlacement.Base), DraftVecUtils.tup(deltar.Axis), math.degrees(deltar.Angle)) - #print("angle after rotation:",shape.Placement.Rotation.Angle) - child.Placement = shape.Placement + import math + # Code for V1.0: + # child.Placement.rotate(self.oldPlacement.Base, + # deltar.Axis, + # math.degrees(deltar.Angle), + # comp=True) + + # Workaround solution for V0.20.3 backport: + # See: https://forum.freecadweb.org/viewtopic.php?p=613196#p613196 + offset_rotation = FreeCAD.Placement(FreeCAD.Vector(0, 0, 0), + FreeCAD.Rotation(deltar.Axis, math.degrees(deltar.Angle)), + self.oldPlacement.Base) + child.Placement = offset_rotation * child.Placement + # End workaround solution. if deltap: child.Placement.move(deltap)