All Forums
 Категория Visio
 Форум Вопросы и ответы
 Пересечение фигур
Author Previous Topic Topic Next Topic  

vis

47 Posts

Posted - 05/07/2010 :  06:05:18
У меня в документе много прямоугольников, которые я перемещаю вручную нужным мне способом. Как сделать так, чтобы эти шейпы не накладывались друг на друга? Должны быть примерно так: двигаю фигуру в направлении другой и как только они "соприкасаются" дальше уже шейп подвинуть в том же напралении нельзя. Аналогию можно провести с кубиками на столе-толкаешь кубик, он упирается в другой.

bdfy

Belarus
267 Posts

Posted - 05/07/2010 :  07:59:54
аналогичная задача есть. шейп в нем несколько надписей - сейчас я их руками растаскиваю за контролы чтобы не соприкасались. как растянуть программно ? как узнать что надпись/обьект на что-то накладываются (и желательно узнать с какой стороны накладывается чтобы знать куда смещать)

Edited by - bdfy on 05/07/2010 08:00:38
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/08/2010 :  08:20:15
quote:
Должно быть примерно так: двигаю фигуру в направлении другой и как только они "соприкасаются" дальше уже шейп подвинуть в том же направлении нельзя

В таком виде алгоритм не реализуется.
Однако есть две возможности добиться немного похожего поведения.
1. В Visio заложена возможность "отбрасывать" шейпы, на которые наезжает перемещаемый шейп. Включается такое поведение в двух местах:
- для страницы в File / Pege Setup / Layout and Routing галочкой Move other shapes away on drop на панели Other.
- для шейпов в Format / Behavior / Placement - выбрать в Placement behavior значение Lay out and route around и установить, например, в поле Move other shapes away on drop значение Plow every shape.
2. У шейпов Visio есть свойство, позволяющий найти шейпы, перекрывающиеся с заданным шейпом
expression.SpatialNeighbors(Relation, Tolerance, Flags, ResultRoot)
При этом задается тип отношения (перекрываюстя, касаются и т.д.). Свойство возвращает коллекцию Selection, содержащую отобранные шейпы.
Можно сделать обработчик события перемещения шейпов и проверять в нем, не перекрылись ли шейпы. В случае обнаружения перекрытия, двигать один из шейпов.
Это почти то, что надо, но с одним НО. Пока шейп перемещается, события не генерируются. То есть обработчик можно запустить не когда шейп приблизился к другому шейпу, а когда он уже "приехал" на место. То есть в результате получим примерно такое же поведение, как в первом варианте, но только чуть более управляемое. Например, макрос в обработчике может не расчищать дорогу перемещаемому шейпу, а отбросить его самого назад. Но только после остановки.
quote:
и желательно узнать с какой стороны накладывается

Вычислив перекрывающиеся шейпы, можно глянуть на их координаты (PinX, PinY) и решить, в какую сторону проще двигать.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)