Модуль Python pywin32 Автоматизация Visio

У меня есть шаблон Visio со своим трафаретом (библиотекой фигур). Представьте, у меня есть трафарет, в котором фигур больше; поэтому я хочу удалить трафарет шаблона Visio и хочу добавить свой. Я много искал это в Интернете, но не смог найти решение. Я могу просто добавить свои формы в трафарет документа шаблона, однако я хочу сделать это с помощью Python, так как я хочу автоматизировать вещи, и в каждом шаблоне я не хочу этого делать.

На странице Office VBA я нашел это, но не смог реализовать свой скрипт. (Добавление объекта документа на основе как шаблона, так и трафарета.)

Вот ссылка: https://docs.microsoft.com/en-us/office/vba/api/visio.documents.add

Public Sub AddDocument_Example() 
 
 Dim vsoDocument As Visio.Document 
 
 'Add a Document object based on the Basic Diagram template. 
 Set vsoDocument = Documents.Add("Basic Diagram.vst") 
 
 'Add a Document object based on a drawing (creates a copy of the drawing). 
 Set vsoDocument = Documents.Add("Myfile.vsd ") 
 
 'Add a Document object based on a stencil (creates a copy of the stencil). 
 Set vsoDocument = Documents.Add("Basic Shapes.vss") 
 
 'Add a Document object based on no template. 
 Set vsoDocument = Documents.Add("") 
 
End Sub

Я не знаю, может быть, удаление текущего набора элементов может быть проблематичным, потому что в шаблоне Visio уже есть фигуры из этого набора элементов.

Я открыт для новых идей или решений. Если вы поможете мне, я был бы очень признателен.

Мой текущий код:

import win32com.client

app = win32com.client.Dispatch("Visio.Application")
app.Visible = True

doc = app.Documents.Open("d:\\X.vsd") #Open template document 
custom_stencil = app.Documents.Add("d:\\custom_stencil.vssx") #Trying to add custom stencil

page = app.ActivePage

#Show the all items in stencil
for shape in doc.Masters:
    print(shape)

person Talat Özmüslüman    schedule 13.05.2021    source источник


Ответы (1)


У каждого документа есть свои мастера. Когда вы просто открываете документ трафарета, он не переносит мастера из этого документа трафарета в ваш документ шаблона, а просто открывает этот документ трафарета (или, точнее, копию этого трафарета в вашем коде). Если бы вы сделали что-то вроде этого цикла, вы, вероятно, увидели бы мастеров:

for shape in custom_stencil.Masters:
    print(shape)

Обратите внимание, что Python не является распространенным выбором при автоматизации Office (Visio). Вы обычно делаете это с VBA. Это может быть причиной того, что вы не найдете так много образцов.

Несколько лет назад я опубликовал пример создания формы с использованием Python: Использовать файл трафарета .vss для создания фигур с помощью кода Python (использовать .vdx?)

person Nikolay    schedule 13.05.2021
comment
Спасибо за ответ @Nikolay Поскольку я изучаю Python уже 6 месяцев, сейчас это единственный вариант для меня :( Итак, насколько я понимаю, я должен каждый раз вручную открывать трафаретный документ и использовать его формы в текущем документе. Вы предвидите какие-то проблемы, если я буду делать это в каждой программе?Более того, я должен открыть этот трафарет с помощью OpenEx, верно? - person Talat Özmüslüman; 13.05.2021
comment
Нет никакой разницы, как вы его откроете. Вы также можете заранее скопировать свои образцы в документ-шаблон (например, вручную), тогда вам вообще не понадобится документ-трафарет. Мастера, существующие в документе, можно увидеть в окне Document Stencil, которое можно включить на вкладке Разработчик (флажок). VBA действительно прост, он был разработан, чтобы быть простым. Вы, вероятно, можете сделать это всего за несколько дней. - person Nikolay; 14.05.2021
comment
К сведению: Visio Stencils, Masters и Shapes: как они связаны? эксперты- exchange.com/articles/2680/ (здесь также объясняется, что такое трафарет документа) - person Nikolay; 14.05.2021
comment
Спасибо за четкое объяснение. Я полностью понимаю идею мастера, формы и так далее. Я думаю, что буду продолжать использовать Python, пока не застряну очень сильно :) Я также искал процесс обучения VBA, он кажется очень простым, как вы предложили. У меня есть еще один вопрос к вам, я попробовал OpenEx и добавил константы, которые являются visOpenRO и visOpenDocked; однако я не мог понять их влияние, я удаляю эти константы и перезапускаю, но вроде без разницы :( Чтобы проверить, работают ли мои константы, я попробовал visOpenHidden, он работает отлично. Итак, visOpenRO и visOpenDocked? - person Talat Özmüslüman; 14.05.2021
comment
Кстати, я пытался прокомментировать ваш пост, чтобы задать свой вопрос, который я написал выше, но у меня недостаточно представителей, чтобы прокомментировать, сайт не позволяет мне, так как я новичок :( stackoverflow.com/questions/33488183/ - person Talat Özmüslüman; 14.05.2021
comment
@Talat, вы можете найти эти видео полезными для понимания того, как работает Visio. Они не имеют дело с Python конкретно, но объектная модель и подход примерно одинаковы, независимо от языка visualsignals.typepad.co.uk/vislog/2016/04/ - person JohnGoldsmith; 14.05.2021