Links
Comment on page
💻

Как изменить координаты фигуры программно

Описание системы координат, описание раздела в таблице свойств содержащей информацию о размерах и положении фигуры, нюансы обращения к ячейке.

Особенности системы координат

Для начала поговорим о том, как в MS Visio описываются координаты фигуры.
С помощью пользовательского интерфейса геометрические параметры фигуры можно изменять используя окно «Размер и положение».
Окно «Размер и положение»
По умолчанию, точкой отсчета координат страницы является ее левый нижний угол. Местоположение фигуры на странице определяется параметрами X, Y и «Положение булавки» (Pin Position).
Определение координат фигуры

«Положение булавки» или Pin Point

По умолчанию «Положение булавки» располагается в геометрическом центре фигуры (В середине по центру). С помощью выпадающего списка в окне «Размер и положение» можно изменять «Положение булавки».
Положение булавки

Раздел ShapeTransform в ShapeSheet

В таблице свойств фигуры (ShapeSheet) параметры определяющие размеры и расположение фигуры содержатся в разделе Shape Transform.
Раздел Shape Transform
Параметрам X/Y в окне «Размер и положение» соответствуют параметры содержащиеся в ячейках PinX/PinY таблицы свойств. А параметр «Положение булавки» соответствует комбинации параметров LocPinX и LocPinY.

Как программно изменять размеры, ориентацию и местоположение фигуры

В Visio вся информация о параметрах объекта хранится в ячейках таблицы свойств. Существует два способа обращения к ячейкам:
  • с указанием непосредственно имени ячейки (Cells)
    Синтаксис
    выражение.Cells("Имя ячейки")
    выражение Переменная, представляющая объект Shape .
    Параметры
    Имя
    Обязательный или необязательный
    Тип данных
    Описание
    Имя ячейки
    Обязательный
    Строка
    Имя ячейки таблицы свойств фигуры.
  • с указанием индексов раздела, строки раздела и столбца в строке (CellsSRC - Section (Раздел), Row (Строка), Column (Столбец)).
    Синтаксис
    выражение. CellsSRC( Section , Row , Column )
    выражение Переменная, представляющая объект Shape .
    Параметры
    Имя
    Обязательный или необязательный
    Тип данных
    Описание
    Section
    Обязательный
    Integer
    Индекс раздела ячейки.
    Row
    Обязательный
    Integer
    Индекс строки в ячейке.
    Column
    Обязательный
    Integer
    Индекс столбца ячейки.
Некоторые языки программирования (например C#) поддерживают обращение к ячейкам только с использованием CellsSRC!
Разделу Shape Transform таблицы свойств соответствует одна из строк в разделе visSectionObject.
При программировании в среде VBA в приложении Visio, в другом приложении с использованием раннего связывания можно использовать специальные константы Visio из перечисления стандартных констант Visio. При использовании позднего связывания или языка программирования Visual Basic Script необходимо использовать числовые индексы соответствующие разделу, строкам и столбцам.
В нижеследующей таблице приведены названия констант, соответствующие значения и описания для строки и столбцов ячеек относящихся к разделу Shape Transform таблицы свойств.
Константа
Значение
Описание
visSectionObject
1
Содержит общие неповторяющихся свойства объекта.
visRowXFormOut
1
Индекс строки в разделе visSectionObject , который содержится информация о разделе Shape Transform (параметры размеров и местоположения фигуры).
visXFormWidth
2
Ячейка Width (раздел "Shape Transform")
visXFormHeight
3
Ячейка Height (раздел "Shape Transform")
visXFormAngle
6
Ячейка Angle (раздел "Shape Transform")
visXFormPinX
0
Ячейка PinX (раздел "Shape Transform")
visXFormPinY
1
Ячейка PinY (раздел "Shape Transform")
visXFormLocPinX
4
Ячейка LocPinX (раздел "Shape Transform")
visXFormLocPinY
5
Ячейка LocPinY (раздел "Shape Transform")
visXFormFlipX
7
Ячейка FlipX (раздел "Shape Transform")
visXFormFlipY
8
Ячейка FlipY (раздел "Shape Transform")
visXFormResizeMode
9
Ячейка ResizeMode (раздел "Shape Transform")

Примеры

Sub ShapeTransform_Cells()
Dim sh As Shape
Set sh = ActiveWindow.Selection.PrimaryItem
sh.Cells("Width").FormulaU = "50 mm"
sh.Cells("Height").FormulaU = "30 mm"
sh.Cells("Angle").FormulaU = "33 deg"
sh.Cells("PinX").FormulaU = "60 mm"
sh.Cells("PinY").FormulaU = "60 mm"
sh.Cells("LocPinX").FormulaU = "Width*0"
sh.Cells("LocPinY").FormulaU = "Height*1"
sh.Cells("FlipX").FormulaU = "True"
sh.Cells("FlipY").FormulaU = "True"
sh.Cells("ResizeMode").FormulaU = "1"
End Sub
Sub ShapeTransform_CellsSRC()
Dim sh As Shape
Set sh = ActiveWindow.Selection.PrimaryItem
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = "50 mm"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormHeight).FormulaU = "50 mm"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormAngle).FormulaU = "16 deg"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = "50 mm"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = "55 mm"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = "Width*0.5"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = "Height*0.5"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormFlipX).FormulaU = "FALSE"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormFlipY).FormulaU = "FALSE"
sh.CellsSRC(visSectionObject, visRowXFormOut, visXFormResizeMode).FormulaU = "FALSE"
End Sub