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

Форум по вопросам применения и программирования в Visio
Текущее время: 23 окт 2018, 09:31

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


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


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Какой должна быть функция отслеживания соединений
СообщениеДобавлено: 24 окт 2009, 08:29 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Попытался представить, какой должна бы быть функция для выбора соединенных шейпов. Как показывают обсуждения на форуме, работа со специализированными коллекциями соединений несколько сложновата. А в общем случае требуется использовать еще и какие-нибудь фильтры... Вот и захотелось сделать функцию "более прикладного" типа. Например такую.
Функция возвращает коллекцию шейпов, соединенных с заданным шейпом.
Public Function tstConn(ByVal tar As Visio.Shape, _
ByVal cIn As Integer, _
ByVal tunn As Integer, _
ByVal Uni As Integer, _
ByVal Grou As Integer, _
ByVal Part As Integer, _
ByVal Lay As String, _
ByVal Mas As String) As Collection
Параметры:
tar - исходный шейп (подразумевается 2D)
cIn - направление выбираемых коннекторов: 0 - без коннекторов, 1 - входящие, 2 - исходящие, 3 - входящие+исходящие
tunn - туннель через 1D шейпы: 0 - отсутствует, 1 - на 1 уровень
Uni - петли через туннель: 0 - не включать, 1 - включать
Grou - действия при коннекте с группой: 0 - учитывать шейп, 1 - пытаться учитывать группу
Part - собираются только коннекты к заданной точке, если задать не 0
Lay - слой: пустая строка или имя слоя, с которого собираются шейпы
Mas - мастер: пустая строка или имя мастера для собираемых шейпов
Пример обращения:
Set Shc = Module1.tstConn(sh, 0, 1, 1, 1, 0, "frs", "tstName")
Пояснять лучше на примере. Пусть имеем вот такую комбинацию шейпов и в качестве исходного задан шейп 2. Начинаем играть параметрами и перечисляем шейпы, которые войдут в коллекцию.
Вложение:
Conn.png
Conn.png [ 4.55 Кб | Просмотров: 1951 ]

Если cIn = 0, коннекторы в коллекцию не войдут
cIn = 1, войдут коннекторы 1, 6
cIn = 2, войдут коннекторы 2, 3, 5, 6
cIn = 3, войдут коннекторы 1, 2, 3, 5, 6
Если tunn = 0, шейпы 1, 3, 4, 5, 6, 7 в коллекцию не войдут. Шейп 8 - в зависимости от фильтров
tunn = 1, могут войти все 2D шейпы, кроме 6. В зависимости от фильтров
Если Uni = 0, шейпа 2 в коллекции не будет
Uni = 1, шейп 2 в коллекции
Если Grou = 0, в коллекцию войдет шейп 5 (коннектор подключен к члену группы)
Grou = 1, вместо шейпа 5 в коллекции будет шейп 7 (группа)
Если Part = 100, в коллекцию будет допущен только шейп 8 - подключен к первой Connection Point
Part = 3, могут быть включены шейпы 1, 3, 4, 5, связанные динамическими коннекторами
Если Lay = "frs", может включиться только шейп 3, отнесенный к слою frs
Lay = "", фильтр по слою не участвует в отборе
Если Mas = "tstName", может включиться только шейп 3, образованный от мастер-шейпа "tstName"
Mas = "", фильтр по имени мастера не участвует в отборе.
Вот примерно так. А что еще хотелось бы видеть в такой функции, может я что нужное упустил?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Какой должна быть функция отслеживания соединений
СообщениеДобавлено: 26 окт 2009, 20:29 
Не в сети
Постоянный участник

Зарегистрирован: 07 сен 2009, 00:09
Сообщений: 62
Очков репутации: 20

Добавить очки репутацииУменьшить очки репутации
с виду неплохо :) а что конкретно надо никогда не поймешь пока не станешь решать реальную задачу.
мое имхо:
Цитата:
cIn = 1, войдут коннекторы 1, 6
cIn = 2, войдут коннекторы 2, 3, 5, 6
cIn = 3, войдут коннекторы 1, 2, 3, 5, 6

надо бы при необходимости выдавать два массива сразу [1, 6] и [2, 3, 5, 6]. или по скорости будет то же самое что дважды запустить функцию ?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Какой должна быть функция отслеживания соединений
СообщениеДобавлено: 27 окт 2009, 08:35 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Да тут, как мне кажется, не столько скорость важна, сколько удобство. Для того, чтобы скорость ощутить, нужны тысячи элементов, а такое редко бывает.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Какой должна быть функция отслеживания соединений
СообщениеДобавлено: 28 ноя 2009, 20:22 
Не в сети
Аватара пользователя

Зарегистрирован: 28 ноя 2009, 18:07
Сообщений: 4
Откуда: Нефтеюганск
Очков репутации: 0

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


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Какой должна быть функция отслеживания соединений
СообщениеДобавлено: 16 май 2012, 13:49 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 24 апр 2012, 12:36
Сообщений: 180
Очков репутации: 11

Добавить очки репутацииУменьшить очки репутации
Всё намного проще, вот мой метод считывания соединений 2d шейпов.

Код:
using System;
using System.Collections.Generic;
using Microsoft.Office.Interop.Visio;

namespace VisioEditor
{
    public class ShapeConnections
    {
        /// <summary>
        /// Id аппарата
        /// </summary>
        public int ApparatId { get; set; }

        /// <summary>
        /// Имя аппарата
        /// </summary>
        public string ApparatName { get; set; }

        /// <summary>
        /// Коллекция и Id входящих потоков
        /// </summary>
        public Dictionary<int ,string > InFlow {get; private set;}

        /// <summary>
        /// Коллекция и Id исходящих потоков
        /// </summary>
        public Dictionary<int, string> OutFlow { get; private set; }

        // Конструктор класса ShapeConnections
        public ShapeConnections()
        {
            InFlow = new Dictionary<int, string>();
            OutFlow = new Dictionary<int, string>();
        }

        // Метод определения связностей аппарата
        public ShapeConnections(Shape shape)
        {
            Shapes shapes = Globals.ThisAddIn.Application.ActivePage.Shapes;

            // Массивы для временного хранения ID потоков
            Array arrIn;
            Array arrOut;
           
            InFlow = new Dictionary<int, string>();
            OutFlow = new Dictionary<int, string>();
           
            // Определение ID аппарата
            ApparatId = shape.ID;

            // Определение названия аппарата
            ApparatName = shape.Name;

            // Добавление входящего потока в массив
            arrIn = shape.GluedShapes(VisGluedShapesFlags.visGluedShapesIncoming1D, "", null);

            // Добавление исходящего потока в массив
            arrOut = shape.GluedShapes(VisGluedShapesFlags.visGluedShapesOutgoing1D, "", null);

            // Добавление id и имени входящего потока в коллекцию
            for (int i = 0; i < arrIn.Length; i++)
            {
               InFlow.Add((int)arrIn.GetValue(i), shapes.ItemFromID[(int)arrIn.GetValue(i)].Name);
            }

            // Добавление id и имени входящего потока в коллекцию
            for (int i = 0; i < arrOut.Length; i++)
            {
                OutFlow.Add((int)arrOut.GetValue(i), shapes.ItemFromID[(int)arrOut.GetValue(i)].Name);
            }

        }
    }
}
   


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

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



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

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


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

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