我正在 C# 上的 Studio 2010 中编写 Visio 2010 的加载项。我需要阅读当前在 Visio 中打开的图表。我知道如何阅读图表的形状。
问题是
- 如果我有一个形状对象,哪些属性可以给我页面上形状的坐标和其他形状(如果有的话),当前那个是连接的,
- 如果我有一个连接器对象,哪些属性可以给我它连接的形状和连接的方向。
我正在 C# 上的 Studio 2010 中编写 Visio 2010 的加载项。我需要阅读当前在 Visio 中打开的图表。我知道如何阅读图表的形状。
问题是
Visio 中的连接是通过 Connect 对象处理的。每个形状都有一组传入连接对象和传出连接对象。它们的名称分别是 FromConnects 和 Connects。
每个连接对象都有一个 FromSheet 和 ToSheet 属性,它们只是指向 Shape 对象的指针,FromSheet 形状是连接到 ToSheet 形状的形状。
所以,如果你有一个正方形(shape1)用连接线(connector)连接到另一个正方形(shape2),你实际拥有的是:connector is connected to shape1 connector is connected to shape2
因此,在 shape1 上,您将查看 FromConnects 并看到一个 Connects 项目,其中 FromSheet 引用连接器,而 ToSheet 引用 shape1。形状 2 将是相同的。如果您查看连接器形状上的 Connects,您会看到相同的 Connects 项目,其中引用了相同的对象。
因此,弄清楚 shape1 是否连接到 shape2 或反之亦然,只需查看连接器上的顺序……连接对象 1 将是“从”形状,而连接对象 2 将是“至”形状。
下面是两个 VBA 例程,它们在您传入的形状上获取传入和传出胶水,并返回一个集合对象。我知道您说您使用的是 C#,但我为 Visio 做 VBA。该代码仅说明了原始连接信息。我建议您尝试在 VBA 中四处走动,看看这一切是如何工作的,因为它仍然让我感到困惑。
Public Function GetShapesThatConnectTo(TheShp As Visio.Shape) As Collection
Dim Result As Collection
Set Result = New Collection
For i = 1 To TheShp.FromConnects.Count
Result.Add TheShp.FromConnects.Item(i).FromSheet
Next i
Set GetShapesThatConnectTo = Result
End Function
Public Function GetWhatShapeConnectsTo(TheShp As Visio.Shape) As Collection
Dim Result As Collection
Set Result = New Collection
For i = 1 To TheShp.Connects.Count
Result.Add TheShp.Connects.Item(i).ToSheet
Next i
Set GetWhatShapeConnectsTo = Result
End Function
对于坐标:
foreach (Visio.Page Page in Pages)
{
Visio.Shapes Shapes = Page.Shapes;
foreach (Visio.Shape Shape in Shapes)
{
double x = Shape.Cells["PinX"].ResultIU;
double y = Shape.Cells["PinY"].ResultIU;