Visio has a number of ShapeSheet transform functions that allow you to transform a point expressed in one shape's coordinate space to the coordinate space of another one.
- LOCTOLOC
- LOCTOPAR
- LOC
- PAR
- ANGLETOLOC
- ANGLETOPAR
Local and Parent Coordinates
When you open the ShapeSheet in Visio you're presented with coordinates expressed in two ways - Local and Parent coordinates.
Most cells use Local coordinates (see green shading above) and these are values that are local to the shape's bottom left origin (x:0, y:0).
The others, PinX/Y and Angle (shown in blue), describe the position and orientation of the shape in the coordinate space of its Parent container. This container may be the page, for a top level shape, or a group shape if it's a sub-shape.
Pin and LocPin
While a shape's Pin represents its position within a container (ie its Parent position), the LocPin (or Local Pin) can be seen as an offset for the shape's drawing origin.
For example, in the following image the blue rectangle's Pin is set at x:40, y:40 in Parent coordinates, which in this case is the page. The shape's Local Pin is set to the default middle of the the shape at x:30, y:20 (see red cross-hair). Note, normally Visio uses relative formulas - I'm just using absolute values here to make it easier to see what's happening.
The rectangle is also a group shape and contains a single orange circle sub-shape. The Pin position of the sub-shape is set to x:40, y:30 and this is described in Parent coordinates, which is the rectangle.
If you then shift the rectangle's LocPin to x:20, y:10 then you can see that the entire local coordinate space of the of the rectangle has moved. Note though, that the shape's Pin position, relative to the page, remains the same, as do the local coordinates of the (orange) sub-shape.
So now we're clear on Local and Parent coordinates, let's move on to looking at the transform functions.
ShapeSheet Transform Functions
Visio has six main functions to help with changing from one coordinate system to another. Two for dealing with angles, which I'll come onto in minute, and four for general transformation.
LOCTOLOC
and LOCTOPAR
allow you to specify both the source and destination coordinate spaces via cell references, neither of which have to be in the shape you're defining your formula in. You can think of LOC
and PAR
, on the other hand, as shortcuts that allow you to assume the destination coordinate space is the one in that you're defining the formula in.
LOC
Docs description: Takes a point defined in one shape's local coordinates and returns the equivalent point expressed in the local coordinates of the shape associated with the formula.
Example usage: If you look in the "Blocks with Perspective" stencil you'll find that each shape references a vanishing point defined on the page. The shape contains a control that uses the LOC
function to convert the page level point to one that's described in the Local coordinates of the respective shape.
PAR
Docs description: Returns the x,y coordinates of a point in the coordinate system of the shape's parent.
My description: Takes a point in the Local coordinates of a shape and converts it to the Parent coordinate space of the shape where this function is used.
Example usage: Any time you use point to point glue with a connector (ie statically gluing a 1D endpoint to a connection point, rather than dynamic whole shape glue) Visio injects formulas into the connector endpoint cells and uses the PAR
function to convert the Local coordinates of the connection points to the Parent coordinates it needs to locate the connector on the page.
LOCTOLOC
Docs description: Returns a transformed point in local coordinates in the destination coordinate system.
My description: Takes a point in the Local coordinates of a shape and converts it to the Local coordinate space of another shape.
Example usage: I couldn't spot an example of LOCTOLOC
in the built in stencil content, so here's a slightly contrived example - consider the following image where you've got a rectangle (Sheet.3) with an (orange) sub-shape. You want to locate the sub-shape over the connection point in the other rectangle (Sheet.1), so in the ShapeSheet of the sub-shape (Sheet.4) you use the LOCTOLOC
function to transform the Local coordinates of the connection point to Local coordinates within the group shape - Sheet.3. The result is that sub-shape will remain positioned over the connection point irrespective of where its group parent is placed on the page. One benefit of this arrangement is that, although the orange sub-shape appears to be a child of the the upper rectangle (Sheet.1), it will be deleted when its parent (Sheet.3) is removed from the page allowing for an interesting visual attribute type relationship.
LOCTOPAR
Docs description: Returns a transformed point in parent coordinates in the destination coordinate system.
Example usage: If you use static (point to point) glue to connect two shapes together, Visio injects a formula into the PinX/Y cells and makes use of the LOCTOPAR
function. In the image below you can see the PinX cell for the (green) Decision shape and that the point being transformed is the Local Connection point in the (blue) Process.4 shape. It's using Process.4 as the source coordinate space via a reference to the Process.4!EventXFMod cell, and this shape (Decision) as the destination coordinate space via another reference to the [Decision.]EventXFMod cell. (The outer PNTX
function just pulls the x component out of the point and there's also the addition of 12.5 mm, which is half the shape's width.)
ANGLETOPAR
Docs description: Returns a transformed angle in the destination shape's parent coordinate system. Converts an angle from local coordinates in a source shape to the parent coordinates in a destination shape.
Example usage: When you add a connection point to a shape in Visio via the UI, the point is given a direction. The direction is set via a vector, which, by default, is perpendicular to the vertex that the connection is applied to. You can see this in the following image where the lower ShapeSheet shows the cells for the green circle.
I've added a second geometry section (see diagonal green line) and set the end of the line to the DirX/Y cells of the first connection row so that you can visualize that vector. The image shows the blue rectangle mid-drag, and you can see that the rectangle rotates to the angle determined by the vector. Visio then takes this angle and uses the ANGLETOPAR
function to transform the degree value from the Local value in the coordinate space of the green circle, to Parent coordinate space of the rectangle.
ANGLETOLOC
Docs description: Returns a transformed angle in the destination shape's local coordinate system. Converts an angle from local coordinates in a source shape to the local coordinates in a destination shape.
ANGLETOLOC
is broadly the same as ANGLETOPAR
just that it returns coordinates from a Local space rather than the Parent.
Wrap up
So I hope this helps in understanding how this set of functions work. The key thing to think about when using them is where is your calculation going to be consumed? Is it a cell that uses Local or Parent coordinates? Note that the consuming cell is not necessarily where the function is defined.