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

Наложение фигур
http://visio.getbb.ru/viewtopic.php?f=6&t=1319
Страница 1 из 1

Автор:  is308 [ 04 апр 2018, 14:23 ]
Заголовок сообщения:  Наложение фигур

Уважаемые форумчане.
Подскажите, пожалуйста, каким образом можно реализовать отбор среди всех фигур листа по следующему условию:
отбираемая фигура должна находиться в пределах площади искомой фигуры?
Пример. Отбираются круги (красные), находящиеся в пределах квадрата.
Изображение

Вариант с группировкой и контейнером не подходят.

Спасибо

Автор:  Shishok [ 04 апр 2018, 14:27 ]
Заголовок сообщения:  Re: Наложение фигур

На основе вот этого:
http://visio.getbb.ru/viewtopic.php?f=15&t=671

Автор:  nbelyh [ 04 апр 2018, 15:17 ]
Заголовок сообщения:  Re: Наложение фигур

shape.SpatialSearch / shape.SpatiaRelation / shape.SpatialNeighbors ?

Если надо быстро и фигуры прямоугольные, то лучше руками по координатам (как подсказал Shishok)

Автор:  9rey [ 04 апр 2018, 15:29 ]
Заголовок сообщения:  Re: Наложение фигур

Скорее всего SpatialNeighbors применительно к прямоугольнику, в котором идет поиск. Будет сформирован список шейпов, попавших в его границы. Пройти по ним в цикле и найти красные.

Автор:  nbelyh [ 04 апр 2018, 15:32 ]
Заголовок сообщения:  Re: Наложение фигур

9rey писал(а):
Скорее всего SpatialNeighbors применительно к прямоугольнику, в котором идет поиск. Будет сформирован список шейпов, попавших в его границы. Пройти по ним в цикле и найти красные.


SpatialXXX - меееедленные.
Если фигур много (сотни), и их можно считать прямоугольниками, то просто по координатам (PinX/Width/PinY/Height) сильно быстрее

Автор:  Shishok [ 04 апр 2018, 15:53 ]
Заголовок сообщения:  Re: Наложение фигур

Код:
Option Explicit

Sub StartSelect() 'старт
If Not (ActiveWindow.Type = visDrawing And ActiveWindow.SubType = visPageWin And ActiveWindow.Selection.Count <> 1) Then Call SelectShapes(ActiveWindow.Selection.PrimaryItem)
End Sub

Private Sub SelectShapes(sh As Visio.Shape)
Dim sel As Visio.Selection, sht As Visio.Shape

Set sel = sh.SpatialNeighbors(visSpatialContain, 0, 0)  'определение соседей целевого шейпа

ActiveWindow.DeselectAll

For Each sht In sel 'выделение на экране всех найденных шейпов попадающих под целевой прямоугольник
    ActiveWindow.Select sht, visSelect
Next sht

End Sub

Автор:  Shishok [ 05 апр 2018, 10:04 ]
Заголовок сообщения:  Re: Наложение фигур

Если нужно все шейпы выделить, то можно цикл заменить на:
Код:
ActiveWindow.Selection = sel

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