johnvisiomvp

Life with Visio and other Microsoft Toys!

Posts Tagged ‘Shapes

Colour My World

leave a comment »

When I was working on the Windows 7&8 phone apps I created a Visio template to help design phone apps. As usually, it was a Visio stencil that was a bit more than dragging and dropping clipart. One of the WP7 and WP8 features it replicated was accent colours that were set on the phone and were applied to the apps. If you changed the Accent colour any object that used the Accent colour would change.
The technique I used was based on a technique demonstrated by Mark Nelson. The original Visio was based on a palette of 24 colours that were enumerated 0 to 24. Mark’s technique used a Lookup formula in the colour cell that looked up the colour in a list. It basically used the list to find the index of the colour.
The instructions are to put this formula in the FillForegnd cell.
=Lookup(Prop.Status,”Black;White;Red;Green;Blue;Yellow”)
Lookup will match the value of the custom property (the old name for Shape Data) Status to the list shown above. The value returned by Lookup will be a number, starting with 0, which corresponds to the position of the matched value in the list. The list shows Visio’s numbering sequence for the first couple of colours. As I said, there were 24 originalcolours, So the list of colour string can be extended to add the missing colours.

If the Status property choices are “Warning”, “Caution” and “Clear”, in the Lookup formula, replace the words “Red”, “Yellow” and “Green” with “Warning”, “Caution” and “Clear”. You must leave the other colours in as place holders to get the correct colour position. Actually, you should keep the list of colours as a comment so that if you want add or change the colours or strings you have a template for their placement. The final formula would be:
=Lookup(Prop.Status,”Black;White;Warning;Clear;Blue;Caution”)

This is fine if the colours you want are in the original 24 colours of the Visio colour palette. Luckily Visio has been extended so in addition to the original colour names you can use a string in the colour cell as long as it evaluates to an RGB value. So now it is a matter of manipulating strings.
In Mark’s solution, everything was within one formula. The string manipulation will require a few more cells. So, what cells and where should they be placed? Most of the strings do not have to be available to the user, so User cells rather than Shape Data cells makes more sense. A Shape Data cell will be required to let the user choose the colour. In Visio there are three shapesheets that can be used. In addition to the shapes’s shapesheet there is a page and a document shapesheet. To reference the document stencil, precede the cell name with TheDoc! And use ThePage! As the prefix for the page. To actually access these shapesheets go to the Developer tab. There is a dropdown for each shapesheet on the ribbon. So why use them? If you have an item that is referenced several times on a page or many times in a document, placing it in the shapesheet with the appropriate scope makes sense. The value is in one location and maintenance is reduced. Do you really want to be hunting through a document to find out where a list is used to change a value? Use a reference and keep a single copy of the value.
So, to solve the limitation on colours, I create two user properties. Both were lists (Type 1 shape data). One list was the names and a the other was a matching list of the RGB values. I could have placed these values in the User Data section for the shape, but I placed them in the User data for the document. So any shape in the document could use these values. The difference between a User property and a shape data property is that the user property is hidden from the user.
I put the reference to an occurrence of the colour in the Page Shapesheet. So the control of the Accent colour is at the page level. So if I change the accent colour, all shapes on that page using an accent colour will change. I chose the page level because I may want to have different accent colours on different pages.
So, the Document shapesheet would have two user data cells:
User.WP7Colours =”Magenta;Purple;Teal;Lime;Brown;Pink;Mango;Blue;Red ;Green”

User.WP7ColoursRGB =”RGB(255,00,151);RGB(162, 00, 255);RGB(00, 171, 169);RGB(140,191, 38);RGB(153, 102,00); RGB(233,113,184);RGB(240, 150, 09);RGB(27, 161, 226);RGB(229, 20, 00);RGB(51, 153, 51)”

Or for the Windows phone 8 accent colours
User.WP8Colours =”Amber;Brown;Cobalt;Crimson;Cyan;Emerald;Green;Indigo;Lime;Magenta;Mauve;Olive; Orange;Pink;Red;Steel;Taupe;Teal;Violet;Yellow”

User.WP8ColoursRGB =”RGB(240,163,10);RGB(130,90,44);RGB(0,80,239);RGB(162,0,37);RGB(27,161,226); RGB(0,138,0);RGB(96,169,23);RGB(106,0,255);RGB(164,196,0);RGB(216,0,115);RGB(118,96,138);RGB(109,135,100); RGB(250,104,0);RGB(244,114,208);RGB(229,20,0);RGB(100,118,135);RGB(135,121,78);RGB(0,171,169);RGB(170,0,255); RGB(227,200,0)”

The Page shapesheet would have one user cell:
User.WP7AccentColour =INDEX(LOOKUP(Prop.WP7AccentColour,TheDoc!User.WP7Colours),TheDoc!User.WP7ColoursRGB)

Or for the Windows phone 8 accent colours
User.WP8AccentColour =INDEX(LOOKUP(Prop.WP8AccentColour,TheDoc!User.WP8Colours),TheDoc!User.WP8ColoursRGB)

And a Shape Data cell :
Prop.WP7AccentColour Type=1
Label = Accent Colour 7
Format =TheDoc!User.WP7Colours
Value =INDEX(5,Prop.WP7AccentColour.Format)
Or
Prop.WP8AccentColour Type=1
Label = Accent Colour 8
Format =TheDoc!User.WP8Colours
Value =INDEX(9,Prop.WP8AccentColour.Format)

In the actual shape shapesheet Fill Format section the FillForegnd cell would be ThePage!User.WP7AccentColour or ThePage!User.WP8AccentColour.

So if you need to add colour palettes to a shape or group of shapes you can create two lists, one for the name of the colour and the other the RGB values. Treating the colour as a string, create a shape data to hold the value and assign that string to the appropriate colour cell. Where you place the user cells or shape data cells is dependent on whether the colour palette is limited to a shape or to a page or a document.
I have added a sample Visio drawing in the Technet Gallery. https://gallery.technet.microsoft.com/Visio-Colour-picker-29158b2c

Enjoy…

John Marshall… Visio MVP Visio.MVPs.org

Written by johnvisiomvp

July 8, 2017 at 6:15 pm

Posted in Shapes, Uncategorized, Visio

Tagged with ,

Visio 2016 Electrical Engineering Shapes

leave a comment »

While researching a new PowerPoint deck on Visio 2016, I came across a supposed update to the Electrical Engineering stencil.

ee

Unfortunately, the way I learned how to draw EE shapes, long before Visio existed when I was getting my EE degree, was what was in Visio 2013. The bold lines in 2016 are distracting and so is the misalignment of the “wires”. The stubs on the components is also distracting.

Enjoy…

John Marshall… Visio MVP Visio.MVPs.org

Written by johnvisiomvp

March 13, 2017 at 1:24 am

Posted in Shapes, Visio

Tagged with ,

Open Shape Surgery for the Visio Developer

leave a comment »

One of the first gotchas for new Visio developers is the UnGroup command.

Visio shapes are simple, they can have one colour and one line type. To make a traffic light, you need to group a red circle, yellow circle and a green circle. When grouped, Visio will take a collection of shapes and create a new shape with a group section and a shape collection of the shapes selected. To  ungroup, the shapes are released from the collection and the group shape is deleted. The process is reversible, some times. Shape developers learned early on, that this new shape was like any other shape and could have other sections added to it. Shape Data, User Data, Connections, Control Handles etc. Unfortunately, when these shapes are ungrouped, these extra sections are not preserved. So knowing this why would you ever want to ungroup one of these these?  You can always subselect or use the Drawing Explorer to get access to one of the sub shapes. Welcome to one of the other gotchas, the bounding box. Sometimes you have to ungroup, and create a group with a more appropriate bounding box. You can go bigger by adding a temporary shape of the desired size, lock the group from recalculating the bounding box and delete the temporary shape, but you can not go smaller without Ungrouping. You would then create a shape of the correct size, group it and before adding the other shapes to the group, lock the group shape from recalculating. The final cleanup would be to add back the component shapes and delete the temporary shape.

Early on Graham Wideman showed me a way to remove VBA projects from a Visio solution. Deleting the VBA only got you part of the way, there was still a Project stub that made Visio think the file contained a VBA solution. His solution was to edit the XML version of the file and delete the stub.

 

 

 

 

Written by johnvisiomvp

April 17, 2016 at 4:22 pm

Posted in Shapes, VBA, Visio

Tagged with , ,

Taming Geometry Sections in Visio

leave a comment »

Ever create a pair of shapes in Visio, butted them together and do a Union operations and find that the joining line between the shapes does not disappear and find that the new shape has two geometry sections? So, before you start to copy rows from one section to the other, place a rectangle shape over the offending line and union that with the original shape. You will now have one Geometry section. The rectangle does not have to be a precise match, just cover part of the line. You can then easily edit the Geometry section and delete the offending rows. Far easier than copying rows between Geometry Sections.

Recently I was creating shapes that basically looked like a stack of trapezoids. Rather than create the trapezoids, I created a stack of rectangles. Each rectangle was the width of the various cross sections and the height was the distance between transitions.  Once Unioned, I edited the shapesheet and deleted the extra rows that the rectangles created.

Next time I will talk about open shape surgery, a lesson learned from an old master.

Enjoy.

John Marshall… Visio MVP       Visio.MVPs.org

Written by johnvisiomvp

November 22, 2015 at 2:29 am

Posted in Shapes, Uncategorized, Visio

Tagged with , ,

Dual Outlets

leave a comment »

The VBA code to stack shapes was used to create a series of shapes that represented inserts into the cap of a bottle that allowed hoses to be connected. For the single connections, the shapes making up the stack were horizontally symmetrical, so after stacking the shapes it was a simple matter of aligning all the shapes around their centers. The dual connections were only slightly more complex. All the shapes were aligned around the same center, but the shape through the cap was offset from the rest. So, it was just a matter of adding a horizontal guide to align to the edge of the bottom shape above the cap and then horizontally move the part within the cap to align to the guide. The next step was to use the Size & Position window to add the horizontal offset to that shape.

So, now I had a single outlet shape with the proper offset. The next step was to group the shape, duplicate the group and align the two grouped shapes horizontally and vertically. The result is a dual version of the shape. Cleanup involved deleting the duplicated section through the cap, ungrouping and doing a Join operation to simplify the shape. Since I had to do a number of shapes of various cap sizes, outlet sizes and offsets, I kept a master of the single outlet version (the one with the offset), so I could earebuild the shapes.

Enjoy.

John Marshall… Visio MVP       Visio.MVPs.org

Written by johnvisiomvp

August 21, 2015 at 7:49 am

Posted in Shapes, Visio

Tagged with ,

Are Visio Shapes Stacked against you?

leave a comment »

Recently I have been working on some Visio shapes that were basically a stack of rectangles. Though Visio has tools for aligning and distributing shapes, it does not have an easy way of stacking shapes. If you are lucky enough to have shapes that are multiples of the grid size, it is a piece of cake. If not, the guides can be used to connect a shape, above or below the guide. If you want to do more than two it gets tricky. First, you have to determine the top of the shape to determine where to place the next guide. Then use the Size / Position dialog to set the position of the guide. You can then add the next shape to the guide.

This of course would be tedious, but long before Visio was acquired by Microsoft, it was the first non Microsoft company to fully implement VBA. So, now the problem is trivial, turn on developer mode and write some VBA. So, this routine will take the selected shapes and stack them.

Public Sub StackVertical()
Dim vsoSelect As Visio.Selection
Dim vsoShape As Visio.Shape
Dim ShapeH As Double
Dim OldShapeH As Double
Dim pin As Double

Set vsoSelect = Visio.ActiveWindow.Selection
If vsoSelect.Count > 0 Then
Set vsoShape = ActiveWindow.Selection.Item(1)
pin = vsoShape.Cells(“piny”).Result(“inches”) + vsoShape.Cells(“LocPinY”).Result(“inches”)

For Each vsoShape In vsoSelect
ShapeH = vsoShape.Cells(“Height”).Result(“inches”)
vsoShape.Cells(“piny”) = pin – (OldShapeH + ShapeH) / 2
pin = pin – (OldShapeH + ShapeH) / 2
OldShapeH = ShapeH
Next vsoShape
Else
MsgBox “You Must Have Something Selected”
End If

End Sub

… and the following code will stack the shapes horizontally.

Public Sub StackHorizontal()
Dim vsoSelect As Visio.Selection
Dim vsoShape As Visio.Shape
Dim ShapeW As Double
Dim OldShapeW As Double
Dim pin As Double

Set vsoSelect = Visio.ActiveWindow.Selection
If vsoSelect.Count > 0 Then
Set vsoShape = ActiveWindow.Selection.Item(1)
pin = vsoShape.Cells(“pinx”).Result(“inches”) – vsoShape.Cells(“LocPinx”).Result(“inches”)

For Each vsoShape In vsoSelect
ShapeW = vsoShape.Cells(“Width”).Result(“inches”)
vsoShape.Cells(“pinx”) = pin + (OldShapeW + ShapeW) / 2
pin = pin + (OldShapeW + ShapeW) / 2
OldShapeW = ShapeW
Next vsoShape
Else
MsgBox “You Must Have Something Selected”
End If

End Sub
Though you could do a select area, it may be safer to use the Ctrl key to select the shapes in the stacking order you want.

Enjoy.

John Marshall… Visio MVP       Visio.MVPs.org

Written by johnvisiomvp

August 14, 2015 at 1:05 pm

Posted in Shapes, Visio

Tagged with ,