All Forums
 Категория Visio
 Форум Вопросы и ответы
 автовыравнивание группы элементов по кривой
Author Previous Topic Topic Next Topic  

TuzhibaevTA

Russia
85 Posts

Posted - 01/18/2005 :  07:46:27
Есть много, например, прямоугольников, которые находятся рядом друг с другом по оси Х. Я пытаюсь програмно реализовать следующий сценарий:
Я помещаю кривую линию, овал или какую то другую сложную фигуру на эти прямоугольники и их нижние части прилипают к верхней части фигуры или просто к линии, вытягиваясь или стягиваясь, одним словом подстраиваясь под фигуру. Можно такое сделать?

Тужибаев Тимур

immortal

Russia
391 Posts

Posted - 01/19/2005 :  08:49:31  Visit immortal's Homepage
по идее все что можно сделать в ручную, можно сделать и автоматически,
алгоритм: вычисляем X прямоугольника, далее вычисляем Y кривой при Х кривой = Х прямоугольника (как сделать последнее незнаю), потом делаем Y прямоугольника = Y кривой, вот и все

остался невыясненным вопрос: как вычислить координату кривой Y при фиксированном Х, т.е вычисление координат в середине кривой


визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

TuzhibaevTA

Russia
85 Posts

Posted - 01/19/2005 :  08:55:01
Я тоже так рассуждал и тоже пришел к этому тупику. :)
Я вот думаю, у Visio есть свойство прилипания, можно его какнибудь использовать при решении этой задачи?

Тужибаев Тимур
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/19/2005 :  15:29:08  Visit immortal's Homepage
с коннекторами не выйдет

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/19/2005 :  20:58:17
В тупиках мысли завихряются, иногда весьма причудливо :)
Демонстрирую такой выверт:
Считаем, что прямоугольники и кривая фигура известны, то есть их можно селектировать.
Имеем право выполнить такую операцию
Set sel = ActiveWindow.Selection
sel.Trim
При этом все селектированное разлетится на мелкие компоненты, непересекающиеся, но соприкасающиеся. Правда это произойдет только в том случаае, когда все прямоугольники достаточно высокие, но это вроде в наших руках...
Чтобы их не приходилось собирать по всему документу, хорошо бы предварительно создать специальный слой и непосредственно перед этой операцией назначить его активным. Тогда на этом слое появятся только результаты этой операции и ничего больше.
Так как координаты нижних частей прямоугольников нам известны, то среди новых шейпов мы можем вычислить их нижние остатки. Верх определяется либо по секции геометрии, либо непосредственно по высоте шейпа-стакана.
Зная верхнюю точку стакана можно даже вычислить прилегающие отрезки режущей кривой. Хоть все три. Если захотим, то можно и склеить средний отрезок со стаканом - получим замкнутый стакан с кривой крышей, но этого вроде не надо...
Таким образом мы можем вычислить и сохранить все нужные координаты.
Теперь выполняем
Visio.Application.Undo
и рисунок возвращается в исходное состояние. Причем довольно быстро.
После этого берем наш массив с координатами и начинаем менять высоты восстановившихся прямоугольников :)

Конечно, у задачи обязательно должно быть и нормальное решение, но и это интересно :)
Go to Top of Page

TuzhibaevTA

Russia
85 Posts

Posted - 01/20/2005 :  07:13:10
quote:
Originally posted by Tumanov

В тупиках мысли завихряются, иногда весьма причудливо :)
Демонстрирую такой выверт:
Считаем, что прямоугольники и кривая фигура известны, то есть их можно селектировать.
Имеем право выполнить такую операцию
Set sel = ActiveWindow.Selection
sel.Trim
При этом все селектированное разлетится на мелкие компоненты, непересекающиеся, но соприкасающиеся. Правда это произойдет только в том случаае, когда все прямоугольники достаточно высокие, но это вроде в наших руках...
Чтобы их не приходилось собирать по всему документу, хорошо бы предварительно создать специальный слой и непосредственно перед этой операцией назначить его активным. Тогда на этом слое появятся только результаты этой операции и ничего больше.
Так как координаты нижних частей прямоугольников нам известны, то среди новых шейпов мы можем вычислить их нижние остатки. Верх определяется либо по секции геометрии, либо непосредственно по высоте шейпа-стакана.
Зная верхнюю точку стакана можно даже вычислить прилегающие отрезки режущей кривой. Хоть все три. Если захотим, то можно и склеить средний отрезок со стаканом - получим замкнутый стакан с кривой крышей, но этого вроде не надо...
Таким образом мы можем вычислить и сохранить все нужные координаты.
Теперь выполняем
Visio.Application.Undo
и рисунок возвращается в исходное состояние. Причем довольно быстро.
После этого берем наш массив с координатами и начинаем менять высоты восстановившихся прямоугольников :)

Конечно, у задачи обязательно должно быть и нормальное решение, но и это интересно :)



Браво :)

Тужибаев Тимур
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/20/2005 :  11:44:51  Visit immortal's Homepage
делаем следующее: прямоугольники делаем в слое 1, линия в слое 2
вычисляем координаты всех прямоугольников нижний правый угол (например)
далее чертим прямые, с коорд Х1прямой = Х2прямой = Хпрямоугольника Y1прямой = начало листа Y2прямой = конец листа, делаем прямые в слое 3

теперь мы имеем что все прямые пересекают нашу кривую
выделяем все элементы слоя 2 и 3 (т.е. кривую и прямые)
далее даем команду Trim
потом удаляем все элементы слоя 3 (все наши созданные прямые)
в итоге получается что кривая разбита на кривые где Xконца кривой = Хниза прямоугольника
задаем циклы если Хниза прямоугольника = Xконца кривой то Yниза прямоугольника = Yконца кривой

вот и все

надеюсь понятно


визио 2003 форэвер

...а вобще-то я белый и пушистый.

Edited by - immortal on 01/20/2005 11:46:43
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)