我最近开始使用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你能告诉我如何检查单个进程之间的连接并遍历它吗?非常感谢您的帮助!
发布于 2013-12-02 22:53:09
我有这样做的代码,但我不能分享它,因为它是商业产品的一部分。
但是,我可以告诉您,我在Visio中处理此问题的方法是,我首先用VBA编写了一组非常通用的有向图类:一个用于节点,一个用于边,还有一个用于整个图形。我在图形类中构建了循环路径检查,以及查找图形中所有路径的代码。
然后我有了一些代码,它们将读取Visio页面并填充这个简单的图形表示,然后调用适当的代码。
我认为这也可能对您有好处,因为Visio方面的事情将不可避免地比简单的有向图实现更混乱。我没有使用该应用编程接口的ConnectedShapes部分,因为我必须向下支持Visio2003,所以我实际上查看了形状上的Connects和FromConnects对象,以查看哪些OneD连接器附加到形状,并确定形状是位于箭头的头部还是尾部。这是将图表部分与Visio部分分开的另一个原因,因为我们阅读Visio页面的方式可能会随着时间的推移而发生变化,但图论将保持不变。
路径查找算法的工作方式是首先查找图中的所有终端节点,我指的是那些没有下游节点的节点。对于其中的每一个,我都添加了一个名为DownstreamPaths的列表,该列表是空的,因为没有任何下游内容。然后,对于图中的每个节点,我调用一个递归函数来填充当前节点的所有下游路径,基本上它所做的就是在每个节点上构建一个DownstreamPaths列表。这个列表是一个列表列表,因此您只需查看每个下游节点,并将该节点附加到其自己的DownstreamPaths列表的头部,然后将其添加到当前节点的路径列表中。当所有这些都完成后,您找到所有的起始节点,没有上游的任何东西,并整理这些节点上的所有下游路径列表,然后您就得到了路径列表。
发布于 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
然而,在该图中查找所有路径是另一回事,解决方案可能取决于您分析的流程图的类型;例如,如果流程图有一个循环,那么实际上将有无限数量的路径……此外,对于相对简单的非循环图,可能路径的数量可能呈指数级增长。您可以尝试“在有向图中查找所有路径”搜索。
https://stackoverflow.com/questions/20290308
复制相似问题