【问题标题】:Traverse through every possible path in a Visio Flow-Chart with C#使用 C# 遍历 Visio 流程图中的所有可能路径
【发布时间】:2013-12-02 22:53:09
【问题描述】:

我最近开始使用 C#,我必须导入一个包含不同路径的流程图的 Visio 文件。

我用这段代码加载文件。

public Container loadFile(string fileName)
{
    Microsoft.Office.Interop.Visio.Application app = new Microsoft.Office.Interop.Visio.Application();
    app.Visible = false;
    Documents docs = app.Documents;
    Document doc = docs.Open(fileName);
    Microsoft.Office.Interop.Visio.Page page = doc.Pages[1];
    Container container = printProperties(page.Shapes);
    return container; 
}

public Container printProperties(Microsoft.Office.Interop.Visio.Shapes shapes)
{
    Container container = new Container("Visio Import");
    container.setParent(null);

    // Look at each shape in the collection.
    foreach (Microsoft.Office.Interop.Visio.Shape shape in shapes)
    {
        // traverse
    }

    return container;
}

我想遍历流程图的所有可能 (!) 路径并打印流程名称。例如

Path 1:
- Enter PIN
- Select Account
- Select Amount
- Print Receipt
- Take Money

Path 2:
- Enter PIN
- Select Account
- Check Money
- Abort

你能告诉我如何检查单个进程之间的连接并遍历它吗?非常感谢您的帮助!

【问题讨论】:

    标签: c# visual-studio-2010 ms-office visio


    【解决方案1】:

    我有执行此操作的代码,但我不能分享它,因为它是商业产品的一部分。

    但是,我可以告诉您,我在 Visio 中处理此操作的方式是,我首先在 VBA 中编写了一组非常通用的有向图类:一个用于节点,一个用于边,一个用于图形作为所有的。我在图形类中构建了循环路径检查,以及在图形中查找所有路径的代码。

    然后我有一些代码可以读取 Visio 页面并填充这个简单的图形表示,并调用适当的代码。

    我认为这可能对您也有好处,因为 Visio 方面不可避免地会比简单的有向图实现更混乱。我没有使用 API 的 ConnectedShapes 部分,因为我必须支持到 Visio 2003,所以我实际上查看了我的形状上的 Connects 和 FromConnects 对象,以查看哪些 OneD 连接器附加到一个形状,并确定一个形状是否位于箭头的头部或尾部。这是将图表部分与 Visio 部分分开的另一个原因,因为我们阅读 Visio 页面的方式会随着时间的推移而发生变化,但图表理论将保持不变。

    寻路算法首先找到图中的所有终端节点,我的意思是那些没有下游节点的节点。对于其中的每一个,我都添加了一个名为 DownstreamPaths 的列表,它只是空的,因为下游没有任何内容。然后对于图中的每个节点,我调用一个递归函数来填充当前节点的所有下游路径,基本上它所做的只是在每个节点上构建一个 DownstreamPaths 列表。此列表是列表列表,因此您只需查看每个下游节点,并将该节点附加到其自己的 DownstreamPaths 列表的头部,并将其添加到当前节点的路径列表中。 完成后,您会找到所有起始节点,上游没有任何内容,并整理所有下游路径列表,然后您将获得路径列表。

    【讨论】:

      【解决方案2】:

      您可以使用shape.ConnectedShapes (Visio 2010+) 来查找哪些形状与当前形状相关联。因此,您将能够根据流程图构建图形(模型)。

      还请查看这篇解释 Visio 连接性的文章: http://blogs.msdn.com/b/visio/archive/2009/09/22/the-visio-2010-connectivity-api.aspx

      不过,在该图中查找所有路径是另一回事,解决方案可能取决于您分析的流程图类型;例如,如果流程图有一个循环,实际上会有无数条路径......此外,对于相对简单的无环图,可能路径的数量可能会呈指数增长。您可以尝试“在有向图中查找所有路径”搜索。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 2012-10-09
        • 2020-07-20
        • 2015-04-19
        • 1970-01-01
        相关资源
        最近更新 更多