Maybe I’m missing something.

To rotate a group about its Z access, for example, I can query its zaxis to return its vector3D:

zvector3D = group1.transformation.zaxis

Then find it’s center point3d:

centerpoint3D = group1.bounds.center

Then create a transform that can be used to do the rotation directly:

t = Geom::Transformation.rotation centerpoint3D, zvector3D, angle

This works (I think) no matter how deeply nested the group is within arbitrarily transformed parent groups.

:

However, to Scale the same group, there is no option to scale along a vector. You can only scale along the global X, Y, or Z axes. So for scaling I first have to inverse the group’s (nested) transforms, then do the scaling, then reapply to nested transforms.

But maybe I’m missing something?