是否可以在Visio中从Stencil获取Shapes?

时间:2011-06-09 19:24:39

标签: c# visio

假设我在Visio中打开了一个文档,并且在Visio插件代码中有一个指向此文档的指针。是否可以从模板中获取以下信息:

  1. 形状名称(我的意思是类型,不是唯一名称)
  2. 图片
  3. 据我所知,图表和模板是当前文档的一部分。那么如何从文档指针移动到可用的模板表单?

    (通过模板我的意思是左侧的面板,用户可以看到所有可用的形状)

    提前致谢。 丹

2 个答案:

答案 0 :(得分:2)

您可以在页面上删除的形状的定义称为Master。将Shapes和Masters视为类似于OOP中的实例化对象和类。 Visio文档具有Masters集合。您在左窗格中查看的母版可能不在活动文档的Masters集合中。左侧的每个窗格都是一个不同的文档,称为模板。使用模板创建新图表时,可以打开多个模具。要了解有关文档,模板,大师和形状之间关系的更多信息,请参阅Chapter 3 of Developing Microsoft Visio Solutions

要访问其中一个打开的模板,请使用Application的Documents集合。然后,您可以使用Document的Masters集合访问各个Masters。 Master对象具有NameIcon属性。

在.Net中使用Icon属性存在许多挑战。 Icon属性是IPictureDisp,您需要找到一种将其转换为可在.Net中使用的图像类型的方法。 VB6库中的IPictureDispToImage方法是一种方法,但它只适用于32位可执行文件。

如果您在进程外调用,即从外部可执行文件而不是加载项调用,则Icon属性将抛出COM异常。我从未在C#中实际使用过它,所以我不确定是否可以在COM和.Net之间编组IPictureDisp属性。

如果您无法使用Icon属性,您仍然可以通过调用ExportIcon方法将图标写入文件或剪贴板来获取图标。

以下代码显示如何获取主服务器的名称以及如何将主服务器图标导出到文件。

using Visio = Microsoft.Office.Interop.Visio;

...

// Create a new Basic Flowchart diragram ("_U" specifies the US units version).
Visio.Document docDiagram = app.Documents.Add("BASFLO_U.VST");

// Get a reference to the Basic Flowchart Shapes Stencle which was opened by
// the template above.
Visio.Document docStencle = app.Documents["BasFlo_U.vss"];

// Get the Decision master from the Stencil.
Visio.Master master = docStencle.Masters["Decision"];

// Get the name of the Decision master
string masterName = master.Name;

// Export the Icon from the Decision Master. 
// You could use GetTempFileName here.
master.ExportIcon(
    @"c:\temp\icom.bmp", 
    (short) Visio.VisMasterProperties.visIconFormatBMP);

答案 1 :(得分:0)

我明白了这一点:

     Visio.Application app = Globals.ThisAddIn.Application;
     Visio.Documents docs = app.Documents;
     ArrayList masterArray_0 = new ArrayList();
     ArrayList masterArray_1 = new ArrayList();
     Visio.Document doc_0 = docs[1];    // HERE IS THE MAIN POINT
     Visio.Document doc_1 = docs[2];    // HERE IS THE MAIN POINT
     Visio.Masters masters_0 = doc_0.Masters;
     Visio.Masters masters_1 = doc_1.Masters;
     foreach (Visio.Master master in masters_0)
     {
        masterArray_0.Add(master.NameU);   // THIS WILL CONTAIN DIAGRAM FIGURES
     }
     foreach (Visio.Master master in masters_1)
     {
        masterArray_1.Add(master.NameU);  // THIS WILL CONTAIN STENCIL FIGURES
     }

“docs”数组成员编号中有一个关键点,它们从1开始,而不是从0开始,就像它用于数组一样。 谢谢你的帮助。这个问题应该被关闭。