Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 14 авг 2020, 15:34

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме не используйте имена файлов содержащих кириллицу, в противном случае файл будет иметь имя .<расширение файла> !
Для форматирования ваших сообщений используйте BBCodes, описание используемых на форуме BBCodes.



Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 31 дек 2019, 19:57 
Не в сети
Постоянный участник

Зарегистрирован: 25 янв 2017, 11:40
Сообщений: 85
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Как поместить выбранные фигуры в отдельные контейнеры?

Логика:
1. Пользователь. Выбрать фигуры;
2. Пользователь. Запустить макрос;
3. Код. Добавить для выбранных фигур отдельные контейнеры.


Сделал так.
Код
Код:
Sub GetSelectedFigures()
    Dim x As Integer
    Dim sel As Visio.Selection
    Dim shp As Visio.Shape
   
    Set sel = ActiveWindow.Selection
   
    Dim countSelect As Integer
    countSelect = sel.Count

    For x = 1 To sel.Count
        Set shp = sel.Item(x)
        Call AddContainer(shp)
        ' Debug.Print shp.name
        ' Debug.Print shp.ID
       
    Next

End Sub


Sub AddContainer(shp As Visio.Shape)
     Dim vsoDoc1 As Visio.Document
     Set vsoDoc1 = Application.Documents.OpenEx(Application.GetBuiltInStencilFile(visBuiltInStencilContainers, visMSMetric), visOpenHidden)
   
    Dim UndoScopeID1 As Long
     ' Application.ActivePage.DropContainer vsoDoc1.Masters.ItemU("Plain"), Application.ActiveWindow.Selection
     Application.ActivePage.DropContainer vsoDoc1.Masters.ItemU("Plain"), shp
     
     vsoDoc1.Close
End Sub



По моим ощущениям, работает как-то с задержкой.
Вопросы.
1. Так сойдёт или можно сделать код лучше?
Чтобы работал быстрее.


Вложения:
.vsd [54.5 Кб]
Скачиваний: 19
2019-12-31_18-44-09.png
2019-12-31_18-44-09.png [ 17.35 Кб | Просмотров: 382 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 31 дек 2019, 20:11 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3969
Откуда: оттуда
Использую Visio c: 1998
Уровнь квалификации: Отсутствует
А почему зелёный кружок справа не покрашен не помещен в контейнер?
Цитата:
По моим ощущениям, работает как-то с задержкой
лично, я практически не использую контейнеры. На мой взгляд в коде нет ничего лишнего...
проглядел, не надо vsoDoc1 в цикле открывать/закрывать :wall:

А на сколько быстрее происходит добавление в контейнер отдельной фигуры? При ручном добавлении


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 31 дек 2019, 21:00 
Не в сети
Постоянный участник

Зарегистрирован: 25 янв 2017, 11:40
Сообщений: 85
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Surrogate
1.
Цитата:
А почему зелёный кружок справа не покрашен не помещен в контейнер?

Просто так..
Рассматривал ситуацию, когда выбрано часть фигур.

2.
Цитата:
не надо vsoDoc1 в цикле открывать/закрывать

Так?
Код:
Sub AddContainer()
    Dim x As Integer
    Dim sel As Visio.Selection
    Dim shp As Visio.Shape
   
    Set sel = ActiveWindow.Selection
   
    Dim countSelect As Integer
    countSelect = sel.Count

    Dim vsoDoc1 As Visio.Document
     Set vsoDoc1 = Application.Documents.OpenEx(Application.GetBuiltInStencilFile(visBuiltInStencilContainers, visMSMetric), visOpenHidden)
    For x = 1 To sel.Count
        Set shp = sel.Item(x)
        Application.ActivePage.DropContainer vsoDoc1.Masters.ItemU("Plain"), shp
    Next
    vsoDoc1.Close
End Sub


Скорость вроде не изменилась.

3.
Цитата:
А на сколько быстрее происходит добавление в контейнер отдельной фигуры? При ручном добавлении

Мгновенно....
Говоря простым языком.
Скорость при добавлении кнопкой - хоп и готово.
Скорость при добавлении VBA - хо-о-оп и готово. (2сек.)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 31 дек 2019, 21:15 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3969
Откуда: оттуда
Использую Visio c: 1998
Уровнь квалификации: Отсутствует
Цитата:
Скорость вроде не изменилась.
а сейчас на каком количестве фигур тестировали? 2, 5
10 или 100500?

Самая медленная операция - открытие внешнего набора элементов, содержащего фигуры контейнеров


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 31 дек 2019, 21:27 
Не в сети
Постоянный участник

Зарегистрирован: 25 янв 2017, 11:40
Сообщений: 85
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Surrogate
1.
Цитата:
а сейчас на каком количестве фигур тестировали? 2, 5
10 или 100500?

Испытывал на 1(одной) фигуре.
Требуемая логика:
1. Выбрал несколько фигур.
2. Нажал кнопку.
3. Каждая фигура, вписывается в отдельный контейнер.

Если добавлять контейнер через кнопку для нескольких выбранных фигур, то контейнер создаётся один на все выбранные фигуры, т.е. все выбранные фигуры вписаны в один контейнер.

А мне нужно, чтобы контейнер создавался для каждой фигуры по отдельности.
Для этого пробую использовать VBA.

2.
Цитата:
Самая медленная операция - открытие внешнего набора элементов, содержащего фигуры контейнеров

Как-то по другому это можно сделать?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 31 дек 2019, 21:58 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3969
Откуда: оттуда
Использую Visio c: 1998
Уровнь квалификации: Отсутствует
Цитата:
все выбранные фигуры вписаны в один контейнер.
вон оно чё!
Цитата:
А мне нужно, чтобы контейнер создавался для каждой фигуры по отдельности.
не совсем понятна цель, создавать множество контейнеров, содержащих одну фигуру?
Потом будет непросто к ним программно обращаться!

Цитата:
Как-то по другому это можно сделать?
так сразу не скажу!
1. Я не понял какие преимущества даёт использование контейнеров (поэтому не имею большого опыта их использования).
2. Сейчас нет визио под рукой, пишу вам ответы с телефона, поднимая лицо из тарелки с салатом.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 01 янв 2020, 21:40 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 927
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 124

Добавить очки репутацииУменьшить очки репутации
andr писал(а):
Как-то по другому это можно сделать?

ну можно вот эту строчку
Код:
Set vsoDoc1 = Application.Documents.OpenEx(Application.GetBuiltInStencilFile(visBuiltInStencilContainers, visMSMetric), visOpenHidden)

вынести в отдельный Sub и запускать при старте визио один раз, а не каждый раз при дропе контейнера пользователем.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 01 янв 2020, 22:31 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1672
Очков репутации: 100613

Добавить очки репутацииУменьшить очки репутации
А еще быстрее будет, если мастер-шейп контейнера поместить в Document Stencil и вообще не открывать дополнительных документов.
Типа так:
Код:
Sub AddContainer(shp As Visio.Shape)
     Application.ActivePage.DropContainer ActiveDocument.Masters.ItemU("Plain"), shp
End Sub

Мои замеры:
1. Исходный макрос
Код:
2 шейпа -  0.7734375 сек.
6 шейпов -  2.375 сек.
12 шейпов - 4.695313 сек.

То есть на открытие документа и добавление контейнера уходит порядка 0.4 сек.
2. С контейнером в Document Stencil
Код:
12 шейпов - 0.484375 сек.

Примерно в 10 раз быстрее.
Если все-таки контейнер нужно обязательно брать из внешнего трафарета, то да, лишних полсекунды придется потратить. Причем не обязательно при открытии файла, можно и перед циклом обращения к подпрограмме AddContainer. Или просто проверять, имеется ли нужный контейнер в Document Stencil. Если нет, то копировать его туда из внешнего трафарета. А если есть, брать готовенький.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 03 янв 2020, 18:54 
Не в сети
Постоянный участник

Зарегистрирован: 25 янв 2017, 11:40
Сообщений: 85
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov
1.Я плохо понимаю терминологию.

Сделал так:
Код:
Sub GetSelectedFigures()
    Dim x As Integer
    Dim sel As Visio.Selection
    Dim shp As Visio.Shape
   
    Set sel = ActiveWindow.Selection
   
    Dim countSelect As Integer
    countSelect = sel.Count

    For x = 1 To sel.Count
        Set shp = sel.Item(x)
        Call AddContainer(shp)
        ' Debug.Print shp.name
        ' Debug.Print shp.ID
       
    Next

End Sub


Sub AddContainer(shp As Visio.Shape)
'     Dim vsoDoc1 As Visio.Document
'     Set vsoDoc1 = Application.Documents.OpenEx(Application.GetBuiltInStencilFile(visBuiltInStencilContainers, visMSMetric), visOpenHidden)
   
    Dim UndoScopeID1 As Long
     ' Application.ActivePage.DropContainer vsoDoc1.Masters.ItemU("Plain"), Application.ActiveWindow.Selection
     ' Application.ActivePage.DropContainer vsoDoc1.Masters.ItemU("Plain"), shp
     Application.ActivePage.DropContainer ActiveDocument.Masters.ItemU("Plain"), shp

     
     ' vsoDoc1.Close
End Sub



Работает отлично.


2. Не могли бы вы, более менее, примерно или подробно показать на примере кода, то о чём вы говорили в этом тексте.
Цитата:
Цитата:
2. С контейнером в Document Stencil
Код:
12 шейпов - 0.484375 сек.

Примерно в 10 раз быстрее.
Если все-таки контейнер нужно обязательно брать из внешнего трафарета, то да, лишних полсекунды придется потратить. Причем не обязательно при открытии файла, можно и перед циклом обращения к подпрограмме AddContainer. Или просто проверять, имеется ли нужный контейнер в Document Stencil. Если нет, то копировать его туда из внешнего трафарета. А если есть, брать готовенький.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 03 янв 2020, 22:26 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1672
Очков репутации: 100613

Добавить очки репутацииУменьшить очки репутации
Цитата:
2. Не могли бы вы, более менее, примерно или подробно показать на примере кода, то о чём вы говорили в этом тексте.

Код:
Application.ActivePage.DropContainer ActiveDocument.Masters.ItemU("Plain"), shp

Метод DropConteaier принимает в качестве первого параметра контейнер. Он может быть взят из внешнего трафарета или из трафарета документа. Внешний трафарет - это отдельный документ Visio с расширением VSS или VSSX или VSSM. Его как правило нужно открывать дополнительно, что и делается в исходном макросе.
Трафарет документа - это специальный трафарет, который встроен в документ Visio. Раз встроен, то его не требуется открывать каждый раз. Он уже существует всегда. Но содержимое этого трафарета формируется по мере использования внешних трафаретов. Достаточно один раз переместить мастер из внешнего трафарета на страницу рисунка, как его копия будет помещена в трафарет документа и останется там навсегда.
Метод ActiveDocument.Masters.ItemU("Plain") возьмет мастер из трафарета документа. Но он не обязан там быть. Если такой мастер отсутствует, то будет ошибка. И тогда нужно хотя бы один раз взять мастер из внешнего трафарета.
В коде это должно выглядеть примерно так:
Код:
Sub GetSelectedFigures()
    Strt = Timer()
    Dim x As Integer
    Dim sel As Visio.Selection
    Dim shp As Visio.Shape
   
    Set sel = ActiveWindow.Selection
   
    Dim countSelect As Integer
    countSelect = sel.Count

    Set Mas = Nothing
    On Error Resume Next
    Set Mas = ActiveDocument.Masters.ItemU("Plain")
    If Mas Is Nothing Then
        Dim vsoDoc1 As Visio.Document
        Set vsoDoc1 = Application.Documents.OpenEx(Application.GetBuiltInStencilFile(visBuiltInStencilContainers, visMSMetric), visOpenHidden)
        Set shp = Application.ActivePage.Drop(vsoDoc1.Masters.ItemU("Plain"), 1, 1)
        shp.Delete
        vsoDoc1.Close
    End If
    On Error GoTo 0
   
    For x = 1 To sel.Count
        Set shp = sel.Item(x)
        Call AddContainer(shp)
    Next
    Debug.Print Timer() - Strt
End Sub

Sub AddContainer(shp As Visio.Shape)
     Application.ActivePage.DropContainer ActiveDocument.Masters.ItemU("Plain"), shp
End Sub

Перед основным циклом For x = 1 To sel.Count пытаемся взять контейнер из ActiveDocument.Masters. Если нарываемся на ошибку, то копируем контейнер в документ и тут же удаляем его. Теперь контейнер гарантировано появится в Document Stencil и далее вместо обращения к внешнему трафарету можно будет использовать ActiveDocument.Masters, то есть встроенный Document Stencil.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 07 янв 2020, 20:08 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3969
Откуда: оттуда
Использую Visio c: 1998
Уровнь квалификации: Отсутствует
за неделю я так и не получил ответа на вопросы. наверно так и помру неразумным !
Surrogate писал(а):
Я не понял какие преимущества даёт использование контейнеров (поэтому не имею большого опыта их использования)
в официальном блоге за 7 лет было больше 20 постов про темы
тэг контейнер
в основном там повторялись одни и те же слова.
из того что я нашел, в контейнер можно легко добавить фигуру перетаскиванием
Surrogate писал(а):
не совсем понятна цель, создавать множество контейнеров, содержащих одну фигуру?
по этой задаче вообще не могу придумать зачем это нужно делать?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 07 янв 2020, 20:46 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1672
Очков репутации: 100613

Добавить очки репутацииУменьшить очки репутации
Цитата:
Я не понял какие преимущества даёт использование контейнеров

Так это был вопрос?!
Контейнеры хороши в сложных диаграммах. Там где требуется группировать какие-то блоки шейпов. Причем часто такая группировка - временная. По мере уточнения бывает нужно либо перебросить что-то из одной группы в другую, либо переместить и уложить поудобнее группы друг относительно друга. То есть коробками оперировать бывает удобнее, чем их содержимым россыпью.
Да, они похожи на группы, но в тех же кросс-функциональных диаграммах применение групп выглядело бы смешно. А контейнеры - нормально.
В электрике это малоприменимо.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 07 янв 2020, 20:55 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3969
Откуда: оттуда
Использую Visio c: 1998
Уровнь квалификации: Отсутствует
Геннадий спасибо за развернутый ответ!
Tumanov писал(а):
Контейнеры хороши в сложных диаграммах. Там где требуется группировать какие-то блоки шейпов. Причем часто такая группировка - временная.
Дополнено позднее: стало ещё интереснее про необходимость создания контейнеров содержащих единичные фигуры внутри :mrgreen:
сложные диаграммы это не наш профиль !


Последний раз редактировалось Surrogate 07 янв 2020, 21:32, всего редактировалось 2 раз(а).
Вопрос переведен в категорию риторических


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 23 янв 2020, 23:25 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1672
Очков репутации: 100613

Добавить очки репутацииУменьшить очки репутации
Цитата:
В электрике это малоприменимо.

Хотя, кто его знает...
Вот, например, как красиво устройства в контейнер набираются. Исключительно штатными средствами. Правда, контейнер типа List.
Надо только не забыть Din-рейку поставить в исключаемые категории, чтобы она сама в контейнер не влипла.


Вложения:
cont22.gif
cont22.gif [ 449.6 Кб | Просмотров: 284 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 24 янв 2020, 19:00 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3969
Откуда: оттуда
Использую Visio c: 1998
Уровнь квалификации: Отсутствует
Tumanov писал(а):
Вот, например, как красиво устройства в контейнер набираются.
ну шейпы они и в Африке в электрике те же шейпы! Т.е. шейпы для создания электрических схем ни чем не отличаются от шейпов для других родов схем!
Tumanov писал(а):
Надо только не забыть Din-рейку поставить в исключаемые категории, чтобы она сама в контейнер не влипла.
рейку я что-то совсем не увидел.
Tumanov писал(а):
Правда, контейнер типа List.
а какие еще типы контейнеров бывают ?
PS
с перестановкой методом перетаскивания содержимого - хороший трюк :)
PPS Судя по бирке автоматы у вас ABB, значит не для Назаренко работаете :!:


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 24 янв 2020, 19:29 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1672
Очков репутации: 100613

Добавить очки репутацииУменьшить очки репутации
Цитата:
рейку я что-то совсем не увидел.

Тогда ее еще не было. Появилась потом.
Сначала была мысль сделать заливку контейнера, похожую на рейку. Оказалось неудобно.
Сделал рейку, которую можно положить под контейнер. Вот тут и понадобились категории.
Цитата:
Судя по бирке автоматы у вас ABB, значит не для Назаренко работаете

Я сейчас вообще ни на кого не работаю. Но время от времени с автоматами приходилось сталкиваться. Вот и подумал контейнеры приспособить. Балуюсь, короче...
Цитата:
а какие еще типы контейнеров бывают ?

Бывают просто контейнеры и более сложные - типа List. List упорядочивает содержимое, а обычный контейнер просто хранит.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как эффективно поместить фигуры в отдельные контейнеры?
СообщениеДобавлено: 26 янв 2020, 13:19 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1672
Очков репутации: 100613

Добавить очки репутацииУменьшить очки репутации
Цитата:
не совсем понятна цель, создавать множество контейнеров, содержащих одну фигуру?
по этой задаче вообще не могу придумать зачем это нужно делать?

Придумал! Вернее вспомнил один из случаев :)
Известно, что поместить List в другой List напрямую нельзя. Ну не вставляются они.
Но можно поместить List в Container и наоборот.
Значит при желании поместить List в List нужно сначала каждый List нижнего уровня поместить в свой Container. Как раз один шейп (List) в один контейнер.
А потом уже эти контейнеры всовывать в List верхнего уровня.
Не уверен, что исходный вопрос относился именно к такой задаче, но описанная конструкция действительно применяется.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: fixer6, Yandex [bot] и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB