fn alignUVGizmo theObj theFace =
(
 First get the face normal vector.  It is shown in BLUE on the image
faceNormal = in coordsys theObj (getFaceNormal theObj theFace)
 This is the desired up vector in world space  It is shown in YELLOW on the image
worldUpVector = [0,0,1]
 Now get the crossproduct of the face normal and the up vector.  This will give you a vector that is perpendicular to the plane defined  by the normal and the up vector. Normalize it to get a normal vector  pointing to the right.  It is shown in RED on the image
rightVector = normalize (cross worldUpVector faceNormal)
 Now using the face normal and the new vector,  get a vector that is perpendicular to the plane defined by the two.  This is the "local up vector", the vector that is the projection of  the world up vector on the face you selected. This one is perpendicular  to both the face normal and the right vector, and you have 3 normals now  that define the X, Y and Z of your new orthogonal coordinate system  for the UVW gizmo!  Note that this new vector can be seen as the SHADOW of the World Up vector  on the face of the object in the above image.  It is now displayed in green in the image below:
upVector = normalize ( cross rightVector faceNormal )
 Using the 3 vectors, define a matrix3 value which represents the  coordinate system of the gizmo. The face normal is the Z axis,  the right vector is the X axis, and the local up vector is the Y axis:
theMatrix =matrix3 rightVector upVector faceNormal [0,0,0]
theMap = Uvwmap()
modPanel.addModToSelection theMap ui: on
theMap.gizmo.transform = theMatrix
)
