首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C#遍历Visio流程图中的所有可能路径

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

Stack Overflow用户
提问于 2013-11-30 00:48:50
回答 2查看 2.1K关注 0票数 0

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

我用下面的代码加载文件。

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
Path 1:
- Enter PIN
- Select Account
- Select Amount
- Print Receipt
- Take Money

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-12-02 22:53:09

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

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-30 03:56:09

您可以使用Visio( shape.ConnectedShapes 2010+)查找哪些形状已连接到当前形状。因此,您将能够在流程图之外构建一个图(模型)。

也可以看看这篇文章,它解释了关于Visio连接的事情:http://blogs.msdn.com/b/visio/archive/2009/09/22/the-visio-2010-connectivity-api.aspx

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20290308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档