Можно ли получить фигуры из трафарета в Visio? - PullRequest
0 голосов
/ 09 июня 2011

Допустим, у меня есть документ, открытый в Visio, и у меня есть указатель на этот документ в моем коде надстройки Visio.Можно ли извлечь из трафарета следующую информацию:

  1. Имя фигуры (я имею в виду тип, а не уникальное имя)
  2. Изображение

КакНасколько я знаю, схема и трафарет являются частями текущего документа.Итак, как мне перейти от указателя документа к доступным шаблонам трафарета?

(под трафаретом я имею в виду панель слева, где пользователь может видеть все доступные формы)

Заранее спасибо.Дан

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Определение форм, которые вы можете разместить на странице, называется «Мастер». Думайте о формах и мастерах как об аналогичных объектах и ​​классах в ООП. Документ Visio имеет коллекцию мастеров. Мастера, которых вы видите на левой панели, вероятно, не входят в коллекцию Мастеров активного документа. Каждая панель слева - это отдельный документ, называемый трафаретом. Несколько трафаретов могут быть открыты при создании новой диаграммы с использованием шаблона. Чтобы узнать больше об отношениях между документами, трафаретами, мастерами и фигурами, см. Глава 3 Разработка решений Microsoft Visio .

Для доступа к одному из открытых трафаретов используйте коллекцию документов Приложения. Затем вы можете перейти к отдельным мастерам, используя коллекцию мастеров документа. Главный объект имеет свойство Name и свойство Icon .

Существует ряд проблем при использовании свойства Icon в .Net. Свойство Icon является IPictureDisp, вам нужно будет найти способ преобразования его в тип изображения, который вы можете использовать в .Net. Метод IPictureDispToImage в библиотеке VB6 является односторонним, но он работает только в 32-битных исполняемых файлах.

Свойство Icon будет выдавать исключение COM, если вы вызываете вне процесса, то есть из внешнего исполняемого файла, а не надстройки. На самом деле я никогда не использовал его из C #, поэтому не уверен, что свойство IPictureDisp можно маршалировать между COM и .Net.

Если вы не можете использовать свойство 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);
0 голосов
/ 10 июня 2011

Я получил точку:

     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, как это было раньше для массивов.Спасибо за помощь.Этот вопрос должен быть закрыт.

Дан

...