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

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

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


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


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

Для форматирования ваших сообщений используйте BBCodes, описание используемых на форуме BBCodes.



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 09:51 
Не в сети

Зарегистрирован: 29 авг 2018, 09:49
Сообщений: 4
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Добрый день.
Есть документ visio с набором элементов. Как вывести количество объектов из этого набора расположенных на листе?
Через
Код:
ThisDocument.Masters.Count

выводит количество элементов в наборе, а на листе не могу посчитать.

В конечно счете мне нужно очистить лист от определенных элементов.
Как определить, что этот Shape является элементом Masters, а не просто объектом?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 10:15 
Нужно делать перебор всех фигур на листе, проверять у них имя родительского мастера. если совпадает с заданным произвести приращение счетчика
Код:
Dim shp As Shape, cnt As Integer
cnt = 0 ' счетчик
For Each shp In ActivePage.Shapes
If shp.MasterShape = "Circle" Then cnt = cnt + 1
Next
Debug.Print cnt

Главный нюанс, на листе могут быть фигуры которые нарисованы вручную (т.е. не перетащены из стенсила). на них данный код будет спотыкаться.
я не смог быстро нагуглить как выполнить эту проверку


Пожаловаться на это сообщение
Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 10:44 
Не в сети

Зарегистрирован: 29 авг 2018, 09:49
Сообщений: 4
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Не срабатывает. Все время пишет 0.
Пробовал и с набором элементов документа и с элементами по умолчанию.
Вложение:
.vsdm [126.56 Кб]
Скачиваний: 126


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 10:52 
Не в сети
Administrator

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

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

Код:
Set m = shp.Master
If Not m is Nothing Then
...
End If


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 10:55 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Если мастер-шейпы изменялись, то имя мастер-шейпа может быть не Circle, а, например, Circle.123.
Тогда лучше сравнивать до точки.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 11:04 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Master является родителем для MasterShape. Это совсем не одно и то же.
Код:
Sub fa()
Dim shp As Shape, cnt As Integer
cnt = 0 ' n?ao?ee
For Each shp In ActivePage.Shapes
'If shp.MasterShape.Name = "Virtual PC" Then cnt = cnt + 1
    Set m = shp.Master
    If Not m Is Nothing Then
        Debug.Print shp.Master.Name, shp.Master.NameU, shp.MasterShape
    End If
Next
Debug.Print cnt
End Sub


Код:
Master.10     Master.10     Sheet.5
Master.10     Master.10     Sheet.5
Master.10     Master.10     Sheet.5
Круг          Circle        Sheet.5
Virtual PC    Virtual PC    Sheet.5


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 11:35 
Tumanov писал(а):
Master является родителем для MasterShape. Это совсем не одно и то же.
виноват Изображение
(пишу по памяти с телефона)


Пожаловаться на это сообщение
Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 11:37 
Не в сети

Зарегистрирован: 29 авг 2018, 09:49
Сообщений: 4
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Спасибо.
А можете подробней рассказать про "родителем для MasterShape" или где почитать?

И еще почему shp.MasterShape у всех один и тот же?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 11:59 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Проводим аналогии...
Рисунок - это документ
Трафарет - тоже документ
Мастер подобен Странице рисунка. Страница имеет имя. Мастер имеет имя (это как раз имя мастера, которое мы сравниваем).
У Страницы есть коллекция Shapes. Такая же коллекция Shapes есть у мастера. (Только в мастере чаще всего один шейп.)
Отсюда MasterShape = Master.Shapes(1)
Попробуйте вот такую строку
Код:
Debug.Print shp.Master.Name, shp.MasterShape.Name, shp.Master.Shapes(1).Name

и получите такой вывод
Код:
Master.10     Sheet.5       Sheet.5
Master.10     Sheet.5       Sheet.5
Master.10     Sheet.5       Sheet.5
Круг          Sheet.5       Sheet.5
Virtual PC    Sheet.5       Sheet.5


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 12:17 
По-русски вы про это не найдете где прочесть. Вот что пишут в официальных справочных материалах
Each shape in an instance of a master (the group and all its subshapes) points to its corresponding shape in the master. The MasterShape property returns the Shape object in the master from which the parent Shape object inherits.

If the parent Shape object is not part of a master instance, the MasterShape property returns Nothing

Tumanov писал(а):
Только в мастере чаще всего один шейп
который по традиции имеет имя Sheet.5, этот шейп внутри мастера может содержать в себе вложенные шейпы (т.е. корневой шейп является группой). корневой шейп будет иметь имя Sheet.5 даже если имеет всего один вложенный шейп
iven4eg писал(а):
И еще почему shp.MasterShape у всех один и тот же?
но это его локальное имя внутри мастера.


Пожаловаться на это сообщение
Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 12:19 
Не в сети

Зарегистрирован: 29 авг 2018, 09:49
Сообщений: 4
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Спасибо за разъяснения.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 29 авг 2018, 12:47 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
И еще почему shp.MasterShape у всех один и тот же?

Не всегда.
Вот к примеру, рисуем три квадратика и отправляем их (вместе) в Document Stencil.
В таком мастере будет три шейпа.
Теперь переносим мастер на страницу рисунка. На странице он превращается в группу из трех шейпов.
А вот теперь анализируем свойство MasterShape.
У группы это будет Nothing. То есть нет в мастере такого шейпа (группы).
А у членов группы будут имена: Sheet.5, Sheet.6, Sheet.7
Это легко проверить вот такой инструкцией
Код:
Debug.Print shp.Shapes(1).MasterShape.Name, shp.Shapes(2).MasterShape.Name, shp.Shapes(3).MasterShape.Name

Промежуточный вывод: "Даже если шейп образован от мастера, то совсем не обязательно у него будет MasterShape!" (это в случае показанной выше группы).


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 02 июл 2019, 15:11 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 117
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
день добрый. А есть возможность прошерстить список мастеров потипу For Each Master in Masters?

Пока сделал перебором
Код:
Set dMaster = Application.ActiveDocument.Masters
For i = 1 To 9999
On Error Resume Next
Debug.Print dMaster.ItemFromID(i)
Next


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 02 июл 2019, 16:05 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
"Прошерстить" - это как?
Вот так пойдет?
Код:
    For Each m In ActiveDocument.Masters
        Debug.Print m.Name
    Next


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Объекты Masters: как вывести количество объектов из набора,
СообщениеДобавлено: 02 июл 2019, 16:21 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 117
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
"Прошерстить" - это как?
Вот так пойдет?
Код:
    For Each m In ActiveDocument.Masters
        Debug.Print m.Name
    Next

Да, точно. Также как In Shapes. Тупанул :)


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

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


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

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