Author |
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
|
У меня получилось такое поведение, но, почему-то, срабатывает не каждый раз. Видимо что-то не так. То работает, то нет.
|
|
|
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... А лучше наверное пойти по другому пути и поискать решение с группой из одного шейпа. |
|
|
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 стрелку, причем с окантованным наконечником, так, чтобы такие стрелки одного цвета можно было бы соединять друг за другом, а наконечник предыдущей не терялся бы на фоне последующей стрелки. Конечная цель, построить диаграмму нынешнего кризиса |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/10/2009 : 16:06:57
|
quote: ...из-за искусственной зависимости добавлением слагаемого User.W*0 [можно заменить на DEPENDSON(User.W)]
А что-то я не припомню, чтобы встречал упоминание о таком приеме в литературе... Если не секрет, откуда это? Или найдено самостоятельно?
|
|
|
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 - для меня это была единственная возможность. Число страниц для просмотра ограниченно. Потом падает резкость и иногда страницы выводятся через одну :). |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/10/2009 : 20:11:03
|
Спасибо. |
|
|
Digitall
Russia
389 Posts |
Posted - 03/11/2009 : 08:15:57
|
Кстати, у меня эта книга есть в печатном варианте. Надо как-нибудь отсканировать её и выложить, т. к. в русском варианте её нет, а книга полезная. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/11/2009 : 15:32:31
|
Правильная мысль, хорошая :) |
|
|
|
Topic |
|
|
|