Powershell + Visio создание диаграммы Вороньего Гнезда?


Я пытаюсь грамотно сгенерировать диаграмму базы данных "гусиная лапка" в Visio 2013 с помощью powershell.

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

Это то, что я придумал до сих пор. Он открывает Visio и добавляет объект к чертежу,а затем дает ему имя. Это все работает.
clear-host
$visio = New-Object -ComObject Visio.Application 
$docs = $visio.Documents
$doc = $docs.Add("Basic Diagram.vst") # use basic template 
$pages = $visio.ActiveDocument.Pages # set active page 
$page = $pages.Item(1)
$DBCrowStencil = "C:Program Files (x86)Microsoft OfficeOffice15Visio Content1033DBCROW_U.vssx" # Add the crow's foot notation stencils.
$stencil = $visio.Documents.Add($DBCrowStencil)
$EntityShape = $stencil.Masters.Item("Entity") 
$AttributeShape = $stencil.Masters.Item("Attribute") 
$shape1 = $page.Drop($EntityShape, 2, 8) 
$shape1.Text = "Table Name"

Проблема в том, что сущность имеет 0 атрибутов, добавленных к ней. Я пробовал что-то очень примитивное, например как это:

$x = 1
$y = 0.3
$Increment = 0.5
For ($i=1; $i -lt 5; $i++)  {
    $shape1.Drop($AttributeShape, $x, $y)
    $shape1.Text = ("Col Name " + $i)
    $y = $y - $Increment
}

Который технически работает. Атрибуты добавляются и привязываются к сущности, но сущность не изменяет размер, чтобы инкапсулировать все атрибуты. Я не могу изменить размер сущности, поскольку она защищена, и когда я вручную добавляю атрибут к сущности через графический интерфейс Visio, сущность автоматически изменяется, когда я перетаскиваю атрибут на нее. Это заставляет меня поверить в это .Drop () не является подходящим методом для добавления атрибутов к сущности, но я не могу понять, что именно правильный метод для этого есть.

Как вы про грамматически добавляете атрибуты к сущности в Visio?

Примечание: "атрибут" и "сущность" относятся к формам Visio, содержащимся в шаблоне "обозначение базы данных гусиной лапки".

Вот окончательный код, который работает для справки для всех, кто смотрит на это:

$visio = New-Object -ComObject Visio.Application 
$docs = $visio.Documents
$doc = $docs.Add("Basic Diagram.vst") # use basic template 
$pages = $visio.ActiveDocument.Pages # set active page 
$page = $pages.Item(1)
$DBCrowStencil = "C:Program Files (x86)Microsoft OfficeOffice15Visio Content1033DBCROW_U.vssx" # Add the crow's foot notation stencils.
$stencil = $visio.Documents.Add($DBCrowStencil)
$EntityShape = $stencil.Masters.Item("Entity") 
$AttributeShape = $stencil.Masters.Item("Attribute") 
$shape1 = $page.Drop($EntityShape, 2, 8) 
$shape1.Text = "Table Name"

For ($i=1; $i -lt 5; $i++)  {
    $attr = $page.DropIntoList($AttributeShape, $shape1, $i)
    $attr.Text = ("Col Name " + $i)
}
1 2

1 ответ:

Я не связывался с сущностями и атрибутами, но в соответствии с макросом (который является лучшим способом выяснить, как делать вещи программно в Visio), это, кажется, подход:

$x = 1
$y = 0.3
$Increment = 0.5
For ($i=1; $i -lt 5; $i++)  {
    $attr=  $page.DropIntoList($AttributeShape,$shape1,1)
    $attr.Text = ("Col Name " + $i)
    $y = $y - $Increment
}

Для меня это работало нормально, но атрибуты были пронумерованы снизу вверх. Думаю, это будет легко исправить.