Author |
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 |
|
|
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) и решить, в какую сторону проще двигать. |
|
|
|
Topic |
|
|
|