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

Idaho

Russia
3 Posts

Posted - 03/04/2009 :  10:40:49
Задача формулируется легко:
Прямоугольник, который можно перемещать, должен сохранять позицию своего центра при его растяжении с помощью контролов.

Разумеется, достачно решить задачу, скажем, для оси Y. Легко можно добиться сохранения Y координаты центра используя GUARD, например, PinY=GUARD(Y_координата_центра mm). Тогда он будет симметрично растягиваться вдоль оси Y, но при этом его уже нельзя переместить вдоль оси.
Можно ли решить эту задачу используя ShapeSheet?

Digitall

Russia
389 Posts

Posted - 03/04/2009 :  13:59:25  Visit Digitall's Homepage
У меня получилось такое поведение, но, почему-то, срабатывает не каждый раз. Видимо что-то не так. То работает, то нет.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 03/06/2009 :  16:18:32
Еще вариант. Из двух формул.
Формально соответствует условиям, но мне не нравится. Как-то он дергается в процессе. Чувствуется напряжение и неестественность :)

SETF(GetRef(PinX),"=Guard(User.Row_1)")+SETF(GetRef(User.Row_2),1)+SETF(GetRef(User.Row_1),PinX)+DEPENDSON(Width)
IF(User.Row_2=1,SETF(GetRef(PinX),User.Row_1)+SETF(GetRef(User.Row_2),0),TRUE)
Надо бы взамен EventXFMod найти другой выключатель режима Guard...
А лучше наверное пойти по другому пути и поискать решение с группой из одного шейпа.
Go to Top of Page

Idaho

Russia
3 Posts

Posted - 03/10/2009 :  12:40:37
Всем спасибо. Ваши предложения подтолкнули меня к решению.

Общее описание алгоритма
При перемещении, ширина прямоугольника не меняется, и мы разрешаем изменение координат его центра.
При симметричном растяжении прямоугольника менятся его ширина, а изменение координат центра должно блокироваться. Блокировка осуществляется восстановлением ранее сохраненного значения координаты центра.

Реализация
При реализации использовалось событие EventXFMod и свойство Visio, если при обновлении ячейки,новое значение равно предыдущему, то зависимые ячейки обновляться не будут.
Созданы три пользовательских ячейки:
  • User.W - "предыдущее" значения ширины
  • User.Px - "предыдущее" значения центра
  • User.setPX - контейнер для функции, восстанавливающей координаты центра.

Функции:
Ячейка User.setPX
SETF(GetRef(User.pX),IF(Width=User.W,PinX,User.pX))+SETF(GetRef(User.W),Width)

Описание работы
При передвижении или растяжении прямоугольника происходит событие Events.EventXFMod. В ячейке EventXFMod сумма двух функций SETF. Сумма смысла не имеет. Функция SETF всегда возвращает значение 0. Цель - возможность обновления нескольких ячеек.

1.Перемещение прямоугольника
Первая функция SETF(GetRef(User.pX),IF(Width=User.W,PinX,User.pX)) только устанавливает User.pX и обработка прекращается. Действительно, поскольку при перемещении Width=User.W функция IF(Width=User.W, PinX, User.pX) вернет значение PinX, которое SETF заносит в User.Px.
Не производится и перерасчет ячейки User.setPX, хотя в ней и используется User.Px, но оно обернуто функцие GetVal.
Вторая функция SETF(GetRef(User.W),Width) не срабатывает, поскольку значение Width не меняется (свойство).


2.Растяжение прямоугольника
При растяжении "новая" ширина не равна старой. Функция IF(Width=User.W, PinX, User.pX) вернет User.pX, поэтому функция SETF заносит в User.Px то же значение.
Вторая функция SETF(GetRef(User.W),Width) обновит значение ширины в User.W, что вызовет в ячейке User.setPX запуск функции SETF(GetRef(PinX),GetVal(User.pX))+User.W*0, устанавливающей PinX в предыдущее значение. Срабатывание происходит из-за искусственной зависимости добавлением слагаемого User.W*0 [можно заменить на DEPENDSON(User.W)]

P.S.
Вместо добавления трех строк-ячеек, можно обойтись одной строкой раздела Scratch и рассовать значения и функцию по ее ячейкам.

Моя промежуточная цель, получить удобную толстую NURBS стрелку, причем с окантованным наконечником, так, чтобы такие стрелки одного цвета можно было бы соединять друг за другом, а наконечник предыдущей не терялся бы на фоне последующей стрелки.
Конечная цель, построить диаграмму нынешнего кризиса
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 03/10/2009 :  16:06:57
quote:
...из-за искусственной зависимости добавлением слагаемого User.W*0 [можно заменить на DEPENDSON(User.W)]

А что-то я не припомню, чтобы встречал упоминание о таком приеме в литературе... Если не секрет, откуда это? Или найдено самостоятельно?
Go to Top of Page

Idaho

Russia
3 Posts

Posted - 03/10/2009 :  16:49:36
Информация взята из книги "Набор для выживания разработчика Visio 2003" (заголовок в моем переводе), с.132.

Visio 2003 Developer's Survival Pack
Авторы: Graham Wideman
Edition: illustrated
Опубликовано издательством Trafford Publishing, 2003
ISBN 1412011124, 9781412011129
Всего страниц: 522

На русский она не переводилась. В интернете и на торрентах я ее не нашел. Находится она в библиотеке Google - для меня это была единственная возможность. Число страниц для просмотра ограниченно. Потом падает резкость и иногда страницы выводятся через одну :).
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 03/10/2009 :  20:11:03
Спасибо.
Go to Top of Page

Digitall

Russia
389 Posts

Posted - 03/11/2009 :  08:15:57  Visit Digitall's Homepage
Кстати, у меня эта книга есть в печатном варианте. Надо как-нибудь отсканировать её и выложить, т. к. в русском варианте её нет, а книга полезная.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 03/11/2009 :  15:32:31
Правильная мысль, хорошая :)
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)