Форум пользователей Visio
http://visio.getbb.ru/

Удаление коннекторов из коллекции
http://visio.getbb.ru/viewtopic.php?f=6&t=1466
Страница 1 из 1

Автор:  TheHeat [ 10 июн 2019, 15:11 ]
Заголовок сообщения:  Удаление коннекторов из коллекции

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

Автор:  Surrogate [ 10 июн 2019, 15:28 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

TheHeat писал(а):
В цикле For Each Shape In Shapes он не определяется

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

Автор:  Tumanov [ 10 июн 2019, 15:30 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

Автор:  Tumanov [ 10 июн 2019, 15:35 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

Цитата:
For Each Shape In Shapes

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

Автор:  TheHeat [ 10 июн 2019, 15:44 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

Автор:  Surrogate [ 10 июн 2019, 15:46 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

Зачем так говорите? В чем хоть секрет был?

Автор:  TheHeat [ 10 июн 2019, 16:04 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

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

Автор:  TheHeat [ 10 июн 2019, 16:27 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

И конечно же новая проблема:
Код:
    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

Автор:  nbelyh [ 10 июн 2019, 16:37 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

Автор:  Surrogate [ 10 июн 2019, 16:42 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

nbelyh писал(а):
- удалять в обратном порядке
- удалять по Id. Сначала собрать все id которые нужно удалять, а потом удалять.
- Удалять выделение. Сначала выделить все что нужно удалить, а потом удалять выделение.
полный список, шикарно !
но сюда GoTo не прикрутишь :roll:

Автор:  TheHeat [ 10 июн 2019, 16:52 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

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

Автор:  Tumanov [ 10 июн 2019, 17:06 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

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

Автор:  nbelyh [ 10 июн 2019, 23:02 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

С примерами / покажите мне код (с) :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

Автор:  TheHeat [ 11 июн 2019, 11:34 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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


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

Автор:  Tumanov [ 11 июн 2019, 12:07 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

Автор:  TheHeat [ 17 июн 2019, 11:26 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

nbelyh писал(а):
С примерами / покажите мне код (с) :D

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

sel.Delete

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

Автор:  Tumanov [ 17 июн 2019, 13:17 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

Автор:  nbelyh [ 18 июн 2019, 00:36 ]
Заголовок сообщения:  Re: Удаление коннекторов из коллекции

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

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

Изображение

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/