def OriTransform(): if cad.GetNumSelected() == 0: wx.GetApp().PickObjects('Pick objects to transform') if cad.GetNumSelected() == 0: return config = HeeksConfig() selected_items = cad.GetSelectedObjects() cad.ClearSelection(False) o1 = PickOrigin('Pick From Origin') if o1 == None: wx.MessageBox("You didn't pick an origin\nTransform Cancelled!") return o2 = PickOrigin('Pick To Origin') if o2 == None: wx.MessageBox("You didn't pick an origin\nTransform Cancelled!") return cad.StartHistory() m1 = o1.GetOrigin() mat = m1.Inverse() m2 = o2.GetOrigin() mat.Multiply(m2) for object in selected_items: cad.TransformUndoably(object, mat) cad.EndHistory()
def RotateToFace(self, object): n = self.context_face_plane.normal p = n * (-self.context_face_plane.d) x, y = n.ArbitraryAxes() face_matrix = geom.Matrix(p, x, y) inv_matrix = face_matrix.Inverse() cad.StartHistory() selected = cad.GetSelectedObjects() # if any objects are selected, move them if len(selected) > 0: for object in selected: cad.TransformUndoably(object, inv_matrix) else: # move the solid parent_body = object.GetParentBody() cad.TransformUndoably(parent_body, inv_matrix) cad.EndHistory()
def Mirror(): if cad.GetNumSelected() == 0: wx.GetApp().PickObjects('Pick objects to mirror') if cad.GetNumSelected() == 0: return config = HeeksConfig() selected_items = cad.GetSelectedObjects() cad.ClearSelection(False) copy = config.ReadBool("MirrorCopy", False) axis = geom.Point3D(0, 0, 1) pos = geom.Point3D(0, 0, 0) axis.x = config.ReadFloat("MirrorAxisX", 1.0) axis.y = config.ReadFloat("MirrorAxisY", 0.0) axis.z = config.ReadFloat("MirrorAxisZ", 0.0) pos.x = config.ReadFloat("MirrorPosX", 0.0) pos.y = config.ReadFloat("MirrorPosY", 0.0) pos.z = config.ReadFloat("MirrorPosZ", 0.0) result, axis, pos, copy = InputMirrorPlane(axis, pos, copy, 'Mirror') if not result: return config.WriteBool("MirrorCopy", copy) config.WriteFloat("MirrorAxisX", axis.x) config.WriteFloat("MirrorAxisY", axis.y) config.WriteFloat("MirrorAxisZ", axis.z) config.WriteFloat("MirrorPosX", pos.x) config.WriteFloat("MirrorPosY", pos.y) config.WriteFloat("MirrorPosZ", pos.z) cad.StartHistory() mat = geom.Matrix() x, y = axis.ArbitraryAxes() axis_mat = geom.Matrix(pos, x, y) inv_mat = axis_mat.Inverse() mat.Multiply(inv_mat) # transform so axis goes to z axis mat.Scale3(1.0, 1.0, -1.0) # mirror in z axis mat.Multiply(axis_mat) # transform back to where it was for object in selected_items: if copy: if object.CanBeCopied(): object = object.MakeACopy() object.Transform(mat) cad.AddUndoably(object) else: cad.TransformUndoably(object, mat) cad.EndHistory()
def Scale(): centre_Pos = geom.Point3D(0, 0, 0) if cad.GetNumSelected() == 0: wx.GetApp().PickObjects('Pick objects to scale') if cad.GetNumSelected() == 0: return config = HeeksConfig() selected_items = cad.GetSelectedObjects() cad.ClearSelection(False) scale_factor = config.ReadFloat('ScaleFactor', 1.0) copy = config.ReadBool("ScaleCopy", False) pos = geom.Point3D(0, 0, 0) pos.x = config.ReadFloat("ScaleAboutPosX", 0.0) pos.y = config.ReadFloat("ScaleAboutPosY", 0.0) pos.z = config.ReadFloat("ScaleAboutPosZ", 0.0) result, pos, scale_factor, copy = InputScale(pos, scale_factor, copy, 'Scale') if not result: return config.WriteFloat("ScaleFactor", scale_factor) config.WriteBool("ScaleCopy", copy) config.WriteFloat("ScaleAboutPosX", pos.x) config.WriteFloat("ScaleAboutPosY", pos.y) config.WriteFloat("ScaleAboutPosZ", pos.z) cad.StartHistory() mat = geom.Matrix() mat.Translate(-pos) mat.Scale(scale_factor) mat.Translate(pos) for object in selected_items: if copy: if object.CanBeCopied(): object = object.MakeACopy() object.Transform(mat) cad.AddUndoably(object) else: cad.TransformUndoably(object, mat) cad.EndHistory()
def Rotate(copy=False): #rotation axis - Z axis by default axis_Dir = geom.Point3D(0, 0, 1) line_Pos = geom.Point3D(0, 0, 0) if cad.GetNumSelected() == 0: wx.GetApp().PickObjects('Pick objects to rotate') if cad.GetNumSelected() == 0: return config = HeeksConfig() ncopies = None if copy: ncopies = config.ReadInt('RotateNumCopies', 1) RemoveUncopyable() if cad.GetNumSelected() == 0: return selected_items = cad.GetSelectedObjects() cad.ClearSelection(False) angle = config.ReadFloat('RotateAngle', 90.0) # enter angle, plane and position axis = geom.Point3D(0, 0, 1) pos = geom.Point3D(0, 0, 0) axis.x = config.ReadFloat("RotateAxisX", 0.0) axis.y = config.ReadFloat("RotateAxisY", 0.0) axis.z = config.ReadFloat("RotateAxisZ", 1.0) pos.x = config.ReadFloat("RotatePosX", 0.0) pos.y = config.ReadFloat("RotatePosY", 0.0) pos.z = config.ReadFloat("RotatePosZ", 0.0) axial_shift = config.ReadFloat('RotateAxialShift', 0.0) result, angle, axis, pos, ncopies, axial_shift = InputAngleWithPlane( angle, axis, pos, ncopies, axial_shift, 'Rotate') if not result: return if copy: if ncopies < 1: return config.WriteInt("RotateNumCopies", ncopies) config.WriteFloat("RotateAngle", angle) config.WriteFloat("RotateAxialShift", axial_shift) config.WriteFloat("RotateAxisX", axis.x) config.WriteFloat("RotateAxisY", axis.y) config.WriteFloat("RotateAxisZ", axis.z) config.WriteFloat("RotatePosX", pos.x) config.WriteFloat("RotatePosY", pos.y) config.WriteFloat("RotatePosZ", pos.z) cad.StartHistory() if copy: for i in range(0, ncopies): mat = geom.Matrix() mat.Translate(-pos) mat.RotateAxis(angle * 0.0174532925199433 * (i + 1), axis) mat.Translate(pos) for object in selected_items: new_object = object.MakeACopy() object.GetOwner().Add(new_object) cad.TransformUndoably(new_object, mat) else: mat = geom.Matrix() mat.Translate(-pos) mat.RotateAxis(angle * 0.0174532925199433, axis) mat.Translate(pos) for object in selected_items: cad.TransformUndoably(object, mat) cad.EndHistory()
def Translate(copy=False): if cad.GetNumSelected() == 0: wx.GetApp().PickObjects('Pick objects to move') if cad.GetNumSelected() == 0: return config = HeeksConfig() ncopies = None if copy: ncopies = config.ReadInt('TranslateNumCopies', 1) RemoveUncopyable() if cad.GetNumSelected() == 0: return selected_items = cad.GetSelectedObjects() cad.ClearSelection(False) fromp = geom.Point3D() to = geom.Point3D() fromp.x = config.ReadFloat("TranslateFromX", 0.0) fromp.y = config.ReadFloat("TranslateFromY", 0.0) fromp.z = config.ReadFloat("TranslateFromZ", 0.0) to.x = config.ReadFloat("TranslateToX", 0.0) to.y = config.ReadFloat("TranslateToY", 0.0) to.z = config.ReadFloat("TranslateToZ", 0.0) result, fromp, to, ncopies = InputFromAndTo(fromp, to, ncopies, 'Move Translate') if not result: return if copy: if ncopies < 1: return config.WriteInt("TranslateNumCopies", ncopies) config.WriteFloat("TranslateFromX", fromp.x) config.WriteFloat("TranslateFromY", fromp.y) config.WriteFloat("TranslateFromZ", fromp.z) config.WriteFloat("TranslateToX", to.x) config.WriteFloat("TranslateToY", to.y) config.WriteFloat("TranslateToZ", to.z) cad.StartHistory() if copy: for i in range(0, ncopies): mat = geom.Matrix() mat.Translate((to - fromp) * (i + 1)) for object in selected_items: new_object = object.MakeACopy() object.GetOwner().Add(new_object) cad.TransformUndoably(new_object, mat) else: mat = geom.Matrix() mat.Translate(to - fromp) for object in selected_items: cad.TransformUndoably(object, mat) cad.EndHistory()