C# 使用C遍历Visio流程图中所有可能的路径#

C# 使用C遍历Visio流程图中所有可能的路径#,c#,visual-studio-2010,ms-office,visio,C#,Visual Studio 2010,Ms Office,Visio,我最近开始使用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

我最近开始使用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
你能告诉我如何检查单个进程之间的连接并遍历它吗?非常感谢你的帮助

您可以使用(Visio 2010+)查找哪些形状连接到当前形状。因此,您将能够根据流程图构建图形(模型)

另请查看这篇文章,它解释了有关Visio connectivity的内容:


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

我有这样的代码,但我不能分享,因为它是商业产品的一部分

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

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

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

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