Powershell + Visio创建Crow的巢图?

时间:2016-04-14 21:54:48

标签: database powershell visio

我正在尝试使用PowerShell在Visio 2013中以编程方式生成Crow的脚数据库图。

在实体形状添加到绘图后,我对如何向实体形状添加属性感到困惑。

这是我到目前为止所提出的。它打开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 Office\Office15\Visio Content\1033\DBCROW_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 GUI手动向实体添加属性时,实体会在将属性拖放到其上时自动调整大小。这让我相信.Drop()不是将属性添加到实体的合适方法,但我无法弄清楚这样做的正确方法是什么。

如何在Visio中以实验方式向实体添加属性?

注意:“属性”和“实体”是指“Crow's foot数据库表示法”模板中包含的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 Office\Office15\Visio Content\1033\DBCROW_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 个答案:

答案 0 :(得分: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
}

它对我来说很好,但属性从底部到顶部编号。我认为这应该很容易解决。