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

Свойства

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

28.09.2009  Manipulating Visio Shape Data using VBA  Abdalla Hassan.   

02.02.2009  Copying Data from one Shape to Another  David Parker.   

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

Почему в коде нельзя присвоить CustomProp тип Row = 1?

Может, кто подскажет, почему в коде нельзя присвоить CustomProp тип Row = 1?
p3 = Shape.AddNamedRow(visSectionProp, "tttt", 1) 

Почему нельзя - не могу подсказать, а вот выкрутиться вроде можно. Можно создать тип по умолчанию, а потом переопределить его 

p3 = ActivePage.Shapes(1).AddNamedRow(visSectionProp, "tttt", 0)
Set cellObj = ActivePage.Shapes(1).Cells("Prop.tttt.Type")
cellObj.Formula = 1 

Как задать требуемый номер и свойства элемента?

Подскажите пожалуйста, как задать требуемый (а не присваиваемый) номер и свойства элемента (узел и ветви графа), и как затем организовать ссылку в проекте VBA на эти данные. (где это все хранится?) 

Номер (а точнее имя, которое может включать и номер) задать нельзя. Это делается только автоматикой. А для своей идентификации можно использовать поля данных, пользовательские свойства, текстовое поле, вводить дополнительные поля и т.д.
Каждому элементу (шейпу) уже сопоставлен большой массив данных (типа электронной таблицы). Там в ячейках определены геометрия, шрифты, цвета и т.д. Туда же можно добавлять и ячейки пользовательских свойств.
Некоторые мастер-шейпы на трафаретах уже имеют поля для пользовательских свойств, открываемые по Shape / Custop Properties. Если при этом пишут No custom properties exist, то можно нажать OK и здесь же определить эти свойства, а затем и ввести в них значения.
"как затем организовать ссылку в проекте VBA"?
Все шейпы на рисунке собраны в коллекцию. Просматривая эту коллекцию, можно найти нужный шейп (по имени или каким-то свойствам). Свойства доступны через ячейки шейп-листа (уже упомянутая таблица). Для выхода на эти ячейки существуют либо константы для указания секции, строки, ячейки в строке, либо некоторые ячейки имеют уникальные имена. 

Как программно извлечь все свойства шейпа?

Как программно извлечь все свойства шейпа (имеется в виду Properties которые можно вызвать через контекстное меню на правый клик). Конкретно нужно извлечь свойства UML шейпов 

Вот программка, выбирающая значения свойств Part_Number, Manufacturer и Cost. У Вас свойства будут называться немного по-другому, но принцип тот же. 

Private Sub Document_DocumentSaved(ByVal doc As IVDocument)
Dim pagObj As Visio.Page 'Visio Page Object
Dim shpsObj As Visio.Shapes 'Visio Shapes collection
Dim shpObj As Visio.Shape 'Visio Shape object
Dim celObj As Visio.Cell 'Visio Cell object
Dim OrderInfo() As String 'Array to hold Purchase Order Info
Dim iShapeCount As Integer 'Counter
Dim i As Integer'Counter
Set pagObj = ActivePage 'Get the active page
Set shpsObj = pagObj.Shapes 'Get the Shapes collection of the page
IshapeCount = shpsObj.Count 'Total number of shapes
'Set the array size to hold all of the shape information
'0 based array, 4 by total # of shapes
ReDim OrderInfo(3, iShapeCount - 1)
'For each shape on the page, collect the Name, Part Number
'Manufacturer, and Cost
For i = 1 To iShapeCount
'Get the i'th shape
Set shpObj = shpsObj(i)
'Get the shape name
OrderInfo(0, i - 1) = shpObj.Name
'Get the Part Number Property, then get the value as a string
If shpObj.CellExists("Prop.Part_Number", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Part_Number")
OrderInfo(1, i - 1) = celObj.ResultStr("")
End If
'Get the Manufacturer Property, then get the value as a string
If shpObj.CellExists("Prop.Manufacturer", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Manufacturer")
OrderInfo(2, i - 1) = celObj.ResultStr("")
End If
'Get the Cost Property, then get the value
If shpObj.CellExists("Prop.Cost", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Cost")
OrderInfo(3, i - 1) = celObj.ResultIU
End If
'Release Shape object
Set shpObj = Nothing
Next
'Print to Immediate window to verify data collection
For i = 0 To pagObj.Shapes.Count - 1
Debug.Print OrderInfo(0, i) & "," _
& OrderInfo(1, i) & "," _
& OrderInfo(2, i) & "," _
& OrderInfo(3, i)
Next
'Call a function to write data out to any external
'data storage, pass the array of collected data
'ExportData OrderInfo
End Sub 

Как программно добраться до свойств шейпа (Properties)?

Как программно добраться до свойств шейпа (Properties)? В Cells их не видно. Например, у шейпа Class есть много свойств (Attributes, Operations) - там довольно большой уровень вложенности и их нигде не видно 

Начинаем исследования.
Создаем рисунок UML и бросаем всего один шейп Class (о нем шла речь в примере).
Нажимаем View / Drawing Explorer Window и раскрываем в дереве Foregorund Pages. Видим последовательно вложенные Static Structure-1, Shapes, Class. Это наш первый шейп Class на рисунке. Пытаемся раскрыть дальше и видим, что в нем появляются еще Shapes и целая линейка из 8 шейпов. Вот они наши Attributes, Parameters и т.д.
Вывод - Class представляется вроде как группой из восьми шейпов, каждый из которых несет свою информацию. Как несет - пока не видно.
Чтобы было, что искать, задаем пару атрибутов. Например attribute1 : Short и attribute2 : bool.
Сохраняем рисунок в виде XML, открываем в текстовом редакторе и даем поиск "attribute1". Ну, вот оно и проявилось - -attribute1 : Short -attribute2 : bool.
То есть искомые атрибуты хранятся внутри группы в шейпе Attributes в виде обычного текста.
Проверяем из VBA: 

Sub ttt()
MsgBox ActivePage.Shapes(1).Shapes.Count
MsgBox ActivePage.Shapes(1).Shapes(6).Name
MsgBox ActivePage.Shapes(1).Shapes(6).Text
End Sub 

Видим последовательно:
8 - (число шейпов в группе)
Attributes - (шестой шейп - этот как раз шейп Attributes)
attribute1 : Short
attribute2 : bool
А это значения атрибутов, которые мы и ожидали увидеть.
Все (вкратце) 

Как формировать список выбора в пользовательском поле?

Необходимо формировать список выбора в пользовательском поле Shape из поля базы данных. Скажите, пожалуйста, как это сделать? 

Тип поля должен быть установлен, например, в Fixed List, а в ячейку Format нужно подсунуть данные, выбранные из базы. Например, ="12;13;14" будет давать для выбора список из трех величин. 

Как задать программно формату ячейки форматную строку?

Предположим, есть процедура
Private Sub Document_ShapeAdded(ByVal Shape As IVShape)
nam = Shape.Name
If InStr(1, nam, "Вентилятор") > 0 Then
formatstroka = "ВОМД-24;ВОМ-18"
' здесь надо задать формат в соответствии с форматной строкой
End If
End Sub
Как задать программно формату ячейки форматную строку? 

Пусть в трафарете имеется мастер-шейп, в котором определено пользовательское свойство: Label = Typ; Type = Fixed List (другие аргументы, в том числе и формат, не заполнены).
Тогда при премещении этого мастер-шейпа на лист (срабатывает данный обработчик) нужно будет в ячейку Format записать "ВОМД-24;ВОМ-18".
Если бы данные брались не из базы, а просто как текстовая константа, это делалось бы так:
Shape.Сells("prop.row_1.Format").Formula = """ВОМД-24;ВОМ-18"""
В Вашем же случае вместо константы в тройных кавычках нужно будет подсунуть строку, сформированную из всех возможных значений, полученных из базы.
Ну и, понятно, если пользовательских свойств несколько, то вместо prop.row_1 должна быть указана нужная строка. 

Как извлечь свойства нестандартных шейпов?

На странице много нестандартных шейпов с кучей Custom Properties.
Возможно ли программно извлечь их названия и значения? Они неизвестны на этапе проектирования. 

Возможно.
Нужно использовать адресацию по индексам и проверку на CellsSRCExists
Примерно так: 

Sub ttt()
iShapeCount = ActivePage.Shapes.Count
s = ""
For i = 1 To iShapeCount
Set shpObj = ActivePage.Shapes(i)
s = s & shpObj.Name & " --> "
'visCustPropsLabel visCustPropsPrompt
'visCustPropsSortKey visCustPropsType
'visCustPropsFormat visCustPropsValue
'visCustPropsInvis visCustPropsAsk
For j = 0 To 7
If shpObj.CellsSRCExists(visSectionProp, visRowProp + j, visCustPropsLabel, True) Then
Set CellObj = shpObj.CellsSRC(visSectionProp, visRowProp + j, visCustPropsLabel)
s = s & CellObj.ResultStr(0)
Set CellObj = Nothing
End If
Next
Set shpObj = Nothing
Next
MsgBox s
End Sub 

Возможна ли передача значений из Custom... одного объекта в Custom... другого?

Возможна ли передача значений из Custom... одного объекта в Custom... другого? Через ShapeSheet или помощью VBA? И еще, как сформировать ссылку на ячейку другого объекта в таблице ShapeSheet? 

Возможна.
В VBA устанавливается нужная ячейка шейп-листа нужного объекта, затем в нее пишутся или читаются данные. Например, 

Set CellObj = shpObj.CellsSRC(visSectionProp, visRowProp + j, visCustPropsValue)
s = CellObj.ResultStr(0) 

читает значение пользовательского свойства.
В случае ссылки через Шейп-лист нужно знать имя шейпа, на который ссылаемся. Например,
формула =Sheet.1!Prop.Row_1 , записанная в ячейку Value, обеспечит перенос значения пользовательского свойства из первой строки шейпа Sheet.1 в шейп-приемник. 

Как в Visio сделать ссылку на число?

Как в Visio сделать ссылку на число. Т.е. есть одинаковое число в нескольких местах документа (адресация на монтажной схеме панели, формата А1) необходимо, чтобы при изменении в одном месте данного числа, все такие же заменились на вновь введенное. 

Можно сделать ссылку на текст другого шейпа (один раз это число где-то придется ввести).
Например, если вставить поле Insert / Field / Custom Formula вот с таким текстом 

ShapeText(Sheet.1!TheText) 

то в данном шейпе всегда будет повторяться текст шейпа Sheet.1. 

Есть функция в VB, возвращающая NAME шейпа без цифр?

Думаю вопрос несложный для опытных пользователей. Пытаясь написать программку в VB под Visio, обнаружил что у расположеных на листе нескольких копий одного шейпа различаются имена. Например, на трафарете "реле", на листе одно имя "реле.4" другое "реле.7" и т.д. цифры меняются, в зависимости от элементов из которого состоит шейп. Программа воспринимает шейпы как разные, что мешает нормальной работе. Подскажите, можно ли поменяв настройки, убрать цифры в именах последующих, копируемых, шейпов, или может быть есть функция в VB возвращающая NAME шейпа без цифр. Спасибо за все ответы. 

Поменяв настройки - нельзя.
Можно пользоваться ссылкой на Мастер-шейп, от которого они образованы. Его имя для всех таких шейпов будет одинаковым. 

ActivePage.Shapes(i).Master.Name 

Можно ли значение кастом_пропертис использовать как номер скратч-ячейки?

Необходимо сделать в одном стенсиле несколько заготовок (автопозиционируемая рамка) которые различаются одним-двумя параметрами (допустим заливка, толщина линий). Можно ли в невидимый слой поместить несколько образцов, пронумеровав их 1-n, а затем в соответствии со значением кастом_пропертис выбрать соответствующий порядковый номер из другого списка?
Более конкретно: есть 7 вариантов заливок, но номерация их паттернов идет не подряд 28-30, 36-39. Можно ли значение кастом_пропертис использовать как номер скратч-ячейки? Или, если нельзя, как сделать по-другому (желательно без VBA)? 

Пример:
Берем прямоугольник и делаем ему одно Custom Properties со значениями:
- Label - MyPattern
- Type - Fixed List
- Format - 1;2;12;22
- Value - 2
А в ячейку Fill Pattern загоняем вложенный If типа =IF(Prop.Row_1=1;2;IF(Prop.Row_1=2;3;IF(Prop.Row_1=12;4;8)))
Расшифровка:
Если пользовательское свойство = 1, назначить Pattern = 2, Иначе следующий If
Если пользовательское свойство = 2, назначить Pattern = 3, Иначе следующий If
Если пользовательское свойство = 12, назначить Pattern = 4, Иначе назанчить Pattern = 8
То есть значения одного списка перекодируются в значения другого списка. В Custom Properties выбираются значения из 1, 2, 12, 22, а Pattern получается соответственно 2, 3, 4, 8. 

Можно ли значение кастом_пропертис использовать как номер скратч-ячейки 2?

Меня интересует более общий подход, можно ли элемент списка 1,2,3,...,n (fixed type в custom properties) использовать как параметр ссылки, например на строку user.row_n. 

:) Элементарно!
Делаем Format попроще - 1;2;3;4
Именуем 4 ячейки в User тоже 1, 2, 3, 4 - Это не обязательно, просто ссылаться на User.1 проще, чем на User.row_1.
В User прописываем, например, str1, str2, str3, str4.
А в Scratch всовываем вообще страшную штуку - =GUARD(SETF(GetRef(Fields.Value);"=User."&Prop.Row_1))
Теперь, выбирая значения Custom Properties, мы видим, как в текстовом поле шейпа появляется текст str1, str2 и т.д., который записан в разных ячейках User.