Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д.

Smart-шейпы

Перечень литературы

17.04.2014  Creating SmartShapes with the ShapeSheet (part 1) - Introducing the ShapeSheet  Microsoft.   

03.02.2012  Easy Music Note Paper with the Smart Staff Shape!  Chris Roth.   

21.01.2011  How fonts travel in Visio  John Goldsmith.   

24.06.2010  Jump to Any Page With Visio SmartShapes  Chris Roth.   

31.05.2010  Playing with the Shape of Data  Chris Roth.   

22.07.2009  Why Visio Shape Smarts Makes Your Life Easier  Chris Roth.   

27.03.2009  Run Circles Around Your Text With the Circle-text Title SmartShape  Chris Roth.   

25.09.2008  Смарт-шейпы  Геннадий Туманов.  Из серии статей об автоматизации. Как создавать интеллектуальные шейпы. Рассматриваются практические примеры работы с шейп-листом. 

22.09.2008  A SmartShape is Worth 1000 Symbols  Chris Roth.   

14.06.2008  Punish Your Users with (not so) SmartShapes That Misbehave  Chris Roth.   

Ответы на вопросы

Фиксированный список в ShapeData и единицы измерения - ошибка конвертирования

Замечено, что в некоторых случаях Visio нежелательно конвертирует фиксированный список в ShapeData. Это происходит,если значение похоже на числовое значение с единицами измерения. Например, значения из списка Prop.fieldValue.Format="25P;13IN" конвертируются в "25 p", "13 in". 

Варианты исправления ситуации:
1. В случаях, когда возможна угроза нежелательного конвертирования, использовать явно текстовый формат.
Например, вместо "25P;13IN" использовать """25P"";""13IN""".
Тогда в окне ShapeData вместо 25 p будет видно "25P".
Если все-таки при чтении данных необходимо получить именно 25P, то использовать формулу =SUBSTITUTE(Prop.Row_1,Chr(34),"") или
=MID(Prop.Row_1,2,LEN(Prop.Row_1)-2)
В случае SUBSTITUTE предполагается, что сами значения не должны содержать кавычек. Иначе данные будут искажены.
2. Другой вариант - экранировать значения спецсимволом. Например знак "_" в конце значения или (по аналогии с Excel) знак апострофа в начале значения.
То есть "25P_;13IN_" или "'25P;'13IN".
Соответственно удаление экранирующего символа производить формулой 

=SUBSTITUTE(Prop.Row_1,"_","") или
=IF(RIGHT(Prop.Row_1,1)="_",LEFT(Prop.Row_1,LEN(Prop.Row_1)-1),Prop.Row_1) или
=IF(LEFT(Prop.Row_1,1)="'",RIGHT(Prop.Row_1,LEN(Prop.Row_1)-1),Prop.Row_1) 

источник: http://visguy.com/vgforum/index.php?topic=8634.msg37648 

Как вычислить факт подключения динамического коннектора

Я пытаюсь заставить динамический коннектор показывать другой цвет, если он не подключен к шейпам обоими концами. Насколько я могу судить, единственное, что изменяется при соединении - это то, что в ячейках BeginX, EndX литеральные значения изменяются на функции. Существует ли функция, которую можно использовать, чтобы отличить функцию от литерала (или есть какой-либо другой способ)? 

Можно использовать EndTrigger/BeginTrigger в секции GlueInfo. 

LineColor=IF(BegTrigger+EndTrigger>=3,2,0) 

Да, вроде бы это работает. Но мой Visio показывает _XFTrigger(Connector!EventXFMod) или _XFTRIGGER(Sheet.17!EventXFMod). Получается, что это как-то превращается в 1/2? 

То, что вы видите - это формулы. Щелкните правой кнопкой на ячейке и выберите "show values". Или нажмите F5 для переключения формула/значение. 

Как задать фиксированное расстояние Connection points на коннекторе

Я пытаюсь сделать смарт-шейп, который автоматически корректируется в зависимости от данных, поступающих из БД. Одна из последних задач - сделать на коннекторе две точки соединения, чтобы одна была на 10 мм от начала коннектора, а вторая - на 10 мм от конца.
Проблема в том, что точки соединения не остаются на коннекторе или нарушается расстояние. 

Если у вас Visio 2010 или старше, можно использовать функцию pointalongpath. Только нужна небольшая добавка, потому что эта функция принимает процент от пути, а не абсолютное расстояние. Поэтому нужно 10 мм преобразовать в процент. 

User.Pathlength = Guard(PathLength(Geometry1.Path)+0 mm)
User.Percentile = Guard(10 mm/User.Pathlength)
Connections.Port1 X = Guard(Pointalongpath(Geometry1.Path,User.Percentile))
Connections.Port1 Y = Guard(Pointalongpath(Geometry1.Path,User.Percentile))
Connections.Port2 X = Guard(Pointalongpath(Geometry1.Path,1-User.Percentile))
Connections.Port2 Y = Guard(Pointalongpath(Geometry1.Path,1-User.Percentile)) 

Источник - http://visguy.com/vgforum/index.php?topic=8717