C# 在visio中识别形状父对象

C# 在visio中识别形状父对象,c#,office-interop,visio,office-addins,C#,Office Interop,Visio,Office Addins,Hii我有一个visio文档,它是一个BPMN模板。在该BPMN文档中,我通过选择更多形状-> 因此,我的BPMN visio文档如下所示 其中,BPMN和名为的任务是BPMN形状,计算机是网络->计算机中的形状,矩形是常规->基本形状中的形状,与其他形状类似。(即)在BPMN visio文档中,对于BPMN形状,我还有其他形状 如何在c#..中识别形状父对象 例如: BPMN命名的形状是来自BPMN的形状。 名为shape的任务是BPMN中的shape。 名为shape的计算机是来自网络的s

Hii我有一个visio文档,它是一个BPMN模板。在该BPMN文档中,我通过选择更多形状->

因此,我的BPMN visio文档如下所示

其中,BPMN和名为的任务是BPMN形状,计算机是网络->计算机中的形状,矩形是常规->基本形状中的形状,与其他形状类似。(即)在BPMN visio文档中,对于BPMN形状,我还有其他形状

如何在c#..中识别形状父对象

例如: BPMN命名的形状是来自BPMN的形状。 名为shape的任务是BPMN中的shape。 名为shape的计算机是来自网络的shape。
名为shape的矩形是来自General的形状。

我必须承认,这比我预期的要困难。模具实际上在文档集合中,它们不包含形状,只包含母版。无论如何:这是获取活动图形每个形状的父模具名称的方式:

using Visio = Microsoft.Office.Interop.Visio;

var visio = (Visio.Application) System.Runtime.InteropServices.Marshal.GetActiveObject("Visio.Application");
var vsd = visio.ActiveDocument;
foreach(Visio.Shape shape in vsd.Pages[1].Shapes) {
  foreach(Visio.Document stencil in visio.Documents) {
    if (stencil.Type == Visio.VisDocumentTypes.visTypeStencil) {
      foreach(Visio.Master sh in stencil.Masters) {
        if (sh.Name == shape.Name) {
          Console.WriteLine(stencil.Name);
          break;
        }
      }
    }
  }
}

形状和模板之间没有依赖关系;图形中的形状可能来自任何模具(例如,来自其他图形)。也就是说,形状不存储其“来源”模具的信息

例如,您可以创建自己的模具并在其中放置形状;因此,当您从该模具中放置形状时,它们将来自该模具

唯一的顺序是微软如何在模板之间排列它们。。请注意,同一形状可能出现在多个内置模具中

当您放下一个形状时,它的“主控形状”被复制到文档中,所有与“原始”模具的连接都会断开-形状不“知道”它来自何处


无论如何,您为什么需要此类信息?

What foreach(Visio.Documents中的Visio.Document模具){意思是..?就像我说的:模具是文档,这就是为什么你会在文档集合中找到它们。你不会在文档的任何集合中找到它们,因为它们是独立的文档。这就是为什么你必须迭代应用程序打开的文档。我需要获得特定形状的所有属性,例如:BPMN属性BPMN形状的属性但为什么不枚举形状中的所有属性呢?此外,您可以通过检查形状的“主控形状”(而不是模具)来检测“键入”形状,如下所示:shape.master.Name(或shape.master.NameU,如果您想独立于语言),谢谢您的帮助。。!