Форум пользователей 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 |
Автор: | 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 не прикрутишь |
Автор: | TheHeat [ 10 июн 2019, 16:52 ] |
Заголовок сообщения: | Re: Удаление коннекторов из коллекции |
nbelyh писал(а): Выше же Геннадий уже написал причину. Коллекция изменяется пока вы по ней циклом идете. Visio от этого клинит. Это как пилить сук, по которому идёшь. Варианты: - удалять в обратном порядке - удалять по Id. Сначала собрать все id которые нужно удалять, а потом удалять. - Удалять выделение. Сначала выделить все что нужно удалить, а потом удалять выделение. А разве пункт 2 не должен опять изменить коллекцию? Или вы имеете ввиду, что надо как-то хитро разом удалить? |
Автор: | Tumanov [ 10 июн 2019, 17:06 ] |
Заголовок сообщения: | Re: Удаление коннекторов из коллекции |
Цитата: А разве пункт 2 не должен опять изменить коллекцию? Не путать идентификаторы с индексом коллекции. Идентификаторы неизменны. Коллекция изменяется, но шейп с нужным идентификатором сидит в ней и будет найден. |
Автор: | nbelyh [ 10 июн 2019, 23:02 ] |
Заголовок сообщения: | Re: Удаление коннекторов из коллекции |
С примерами / покажите мне код (с) Это не работает: Код: 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 писал(а): С примерами / покажите мне код (с) - Удалять выделение. Сначала выделить все что нужно удалить, а потом удалять выделение. Код: 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/ |