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

Форум по вопросам применения и программирования в Visio
Текущее время: 23 сен 2019, 21:34

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


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


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



Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 15:11 
Не в сети
Бывалый

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

Добавить очки репутацииУменьшить очки репутации
Здравствуйте, товарищи специалисты. У меня вопрос обратный - как удалить Dynamic connector? В цикле For Each Shape In Shapes он не определяется. Как сделать его видимым я не нашел.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 15:28 
Не в сети
Content manager

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3685
Откуда: оттуда
Использую Visio c: 1998
Отрасль: -
Должность: Безработный
Уровнь квалификации: Ниже нуля
TheHeat писал(а):
В цикле For Each Shape In Shapes он не определяется

Странно, коннектор вполне себе штатная фигура!


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 15:30 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Dynamic connector - это обычный шейп. Нужно сильно постараться, чтобы сделать его невидимым (неопределяющимся).
Один из вариантов - включить в группу. Тогда он будет в коллекции Shapes группы, а не страницы.
--
Хороший вариант для получения помощи - выбросить из файла все (почти все), кроме этого коннектора, и выложить файл здесь. Вмиг найдем - почему.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 15:35 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
For Each Shape In Shapes

Еще хороший вариант получить ошибку - удалять несколько шейпов в прямом цикле. Тогда удаляемые шейпы "поддергивают" коллекцию кверху, чем сбивают нумерацию. В результате часть шейпов может быть пропущена.
Множественные удаления из коллекции принято делать в обратном порядке (по Step-1).


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

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

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


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 15:46 
Не в сети
Content manager

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3685
Откуда: оттуда
Использую Visio c: 1998
Отрасль: -
Должность: Безработный
Уровнь квалификации: Ниже нуля
Зачем так говорите? В чем хоть секрет был?


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

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

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
Зачем так говорите? В чем хоть секрет был?

Никакого секрета кроме GoTo :mrgreen:


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

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

Добавить очки репутацииУменьшить очки репутации
И конечно же новая проблема:
Код:
    For Each Shape In Shapes
        If Shape.Name Like "Dynamic connector*" Then Shape.Delete
    Next
    Exit Sub

Не удаляет все соединительные линии. После певого прогона осталась например Dynamic connector.856. После нескольких запусков макроса все удалилось. :?

Upd. Вышел из положения так:
Код:
Repeat:
    finded = False
    For Each Shape In Shapes
        If Shape.Name Like "Dynamic connector*" Then
            Shape.Delete
            finded = True
        End If
    Next
    If finded Then GoTo Repeat


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 16:37 
В сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 638
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100606

Добавить очки репутацииУменьшить очки репутации
Выше же Геннадий уже написал причину. Коллекция изменяется пока вы по ней циклом идете. Visio от этого клинит. Это как пилить сук, по которому идёшь.
Варианты:
- удалять в обратном порядке
- удалять по Id. Сначала собрать все id которые нужно удалять, а потом удалять.
- Удалять выделение. Сначала выделить все что нужно удалить, а потом удалять выделение.

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 16:42 
Не в сети
Content manager

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3685
Откуда: оттуда
Использую Visio c: 1998
Отрасль: -
Должность: Безработный
Уровнь квалификации: Ниже нуля
nbelyh писал(а):
- удалять в обратном порядке
- удалять по Id. Сначала собрать все id которые нужно удалять, а потом удалять.
- Удалять выделение. Сначала выделить все что нужно удалить, а потом удалять выделение.
полный список, шикарно !
но сюда GoTo не прикрутишь :roll:


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

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

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
Выше же Геннадий уже написал причину. Коллекция изменяется пока вы по ней циклом идете. Visio от этого клинит. Это как пилить сук, по которому идёшь.
Варианты:
- удалять в обратном порядке
- удалять по Id. Сначала собрать все id которые нужно удалять, а потом удалять.
- Удалять выделение. Сначала выделить все что нужно удалить, а потом удалять выделение.

А разве пункт 2 не должен опять изменить коллекцию? Или вы имеете ввиду, что надо как-то хитро разом удалить?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 17:06 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
А разве пункт 2 не должен опять изменить коллекцию?

Не путать идентификаторы с индексом коллекции.
Идентификаторы неизменны. Коллекция изменяется, но шейп с нужным идентификатором сидит в ней и будет найден.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 10 июн 2019, 23:02 
В сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 638
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100606

Добавить очки репутацииУменьшить очки репутации
С примерами / покажите мне код (с) :D

Это не работает:
Код:
For Each s In shapes
    s.Delete
Next

- удалять в обратном порядке
Код:
For i = shapes.Count To 1 Step -1
    shapes(i).Delete
Next

- удалять по Id. Сначала собрать все id которые нужно удалять, а потом удалять.
Код:
Set shapeIDs = New Collection
For Each s In shapes
    shapeIDs.Add s.ID
Next

For Each ShapeID In shapeIDs
    ActivePage.shapes.ItemFromID(ShapeID).Delete
Next

- Удалять выделение. Сначала выделить все что нужно удалить, а потом удалять выделение.
Код:
Set sel = ActivePage.CreateSelection(visSelTypeEmpty)
For Each s In shapes
    sel.Select s, visSelect
Next

sel.Delete

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


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

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

Добавить очки репутацииУменьшить очки репутации
nbelyh Круто. Люблю все в примерах
Не подскажете как изменить формат соединительной линии после того как создал ее автоконнектом?
Код:
Dim DConShapesID(100, 2) As String
For i = 0 To DConCount - 1
    ActivePage.Shapes.ItemFromID(DConShapesID(i, 0)).AutoConnect Application.ActivePage.Shapes.ItemFromID(DConShapesID(i, 1)), visAutoConnectDirNone
Next


Вообще возможно подцепиться к нему не перебирая все шейпы?
П.С. Прошу прощения, что опять не создал новую тему. Уровень моих знаний не позволяет понять, насколько мой вопрос глупый


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 11 июн 2019, 12:07 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
С учетом того, что новый шейп попадет в конец коллекции, можно пользоваться таким способом
Код:
    Set NewConnector = ActivePage.Shapes(ActivePage.Shapes.Count)
    Debug.Print NewConnector.Name


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

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

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
С примерами / покажите мне код (с) :D

- Удалять выделение. Сначала выделить все что нужно удалить, а потом удалять выделение.
Код:
Set sel = ActivePage.CreateSelection(visSelTypeEmpty)
For Each s In shapes
    sel.Select s, visSelect
Next

sel.Delete

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


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 17 июн 2019, 13:17 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Есть функции, собирающие шейпы по критерию относительно точки и относительно шейпа (SpatialSearch, SpatialNeighbors). Но условия там типа "касается", "принадлежит", "входит". Таких как "выше", "ниже" нет.
Можно накрыть какую-то область вспомогательным шейпом, и собрать все, что накрылось. Потом вспомогательный шейп удалить.
Или тупо перебирать шейпы и проверять PinX, PinY. Или BoundingBox вокруг шейпа.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Удаление коннекторов из коллекции
СообщениеДобавлено: 18 июн 2019, 00:36 
В сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 638
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100606

Добавить очки репутацииУменьшить очки репутации
TheHeat писал(а):
А если, допустим, я в цикле нашел нужный мне шейп и хочу выделить все шейпы выше него? Не нашел, есть ли вообще возможность програмно выделить область по координатам, как с помощью мыши?

Нетъ. И "выше" - вообще-то поняние несколько субьективное.. Вот на картинке нже, A "выше" чем B? Надо его выделять?

Изображение

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


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

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



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

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


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

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