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

zhuravsky

Russia
115 Posts

Posted - 06/29/2008 :  15:46:36
Функция SETATREF позволяет перенаправить ввод пользователя из секции Custom Properties в другие ячейки, например в Width.
Т.е., если в Properties записать
setatref(Width)
то будет изменяться ширина шейпа при изменении соответствующего свойства.
Вопрос такой: нельзя ли перед тем как изменится Width произвести над введенным значением кое-какие расчеты?

zhuravsky

Russia
115 Posts

Posted - 06/29/2008 :  17:34:52
Небольшое дополнение:
необходимо управлять геометрией шейпа одновременно двумя путями - с помощью контролов или задавая конкретные числа через Custom Properties
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/29/2008 :  17:41:11
Вычисления можно производить за счет второго параметра - set_expression
SETATREF(reference [,set_expression [,ignore_eval]])
То есть, если написать в Custom
=SETATREF(Width,SETATREFEXPR()*2,TRUE)
то ширина будет равняться удвоенному введенному значению, а значение свойства будет нулевым.
А как совместить и то, и другое управление, пока не понял :(
Наверное что-то с If'ами...
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 06/30/2008 :  18:36:17
На самом деле, в секции Control есть ячейка XDynamics и туда, в приципе, можно записать setf(getref(width), ...), и это будет работать, но как только width будет изменено через custom properties, контролы окажутся в неверном положении. Вот если бы здесь было решение...
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 07/01/2008 :  18:16:39
Пока получилось вот как.
Сделал user-defined variable: w3d
В контроле XDyn записал так:

SETF(GetRef(User.w3d),Controls.XX)

В properties записал так:

SETATREF(User.w3d,SETATREF(Controls.XX))

Теперь user.w3d меняется как от пропертис, так и от контрола, изменения взаимно отслеживаются.

Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 07/24/2008 :  07:08:05
Пример использования, присланный zhuravsky, выложен на сайт.
http://visio.artberg.ru/store/test_3d.zip
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 07/24/2008 :  10:10:30
В присланном примере реализовано несколько способов управления псевдо-трехмерным параллелипипедом: через свойства, контролы и комбинированно.
При комбинированном способе изменения в положении контролов автоматически изменяют соответствующие свойства и наоборот.
Также реализовано управление видимостью граней, что позволяет получить некое подобие ящика вместо параллелипипеда.

Применение такого шейпа может быть разнообразным, например, можно рисовать мебель, компоновку электротехнических шкафов, схемы расположения оборудования и т.п. Нужно только добавить еще несколько шейпов (цилиндр, конус, пирамида ...)

Edited by - zhuravsky on 07/24/2008 10:16:20
Go to Top of Page

ESV

Ukraine
21 Posts

Posted - 08/17/2008 :  18:54:30
quote:
Originally posted by zhuravsky
Вопрос такой: нельзя ли перед тем как изменится Width произвести над введенным значением кое-какие расчеты?

Легко. Синтаксис формулы таков:

SATATREF([ссылка перенаправления],SATATREFEVAL([вычисления над SATATREFEXPR()])){выражение}

Собственно SATATREFEXPR() представляет введенное с помощью пользовательского интерфейса значение.

Пример из хелпа:
Следующая формула записывается в ячейку PinX шейпа Sheet.2, находящегося на одном уровне вложения с шейпом Sheet.1:

=SETATREF(User.DeltaX, SETATREFEVAL(SETATREFEXPR() - Sheet.1!PinX)) + Sheet.1!PinX

Соответственно у шейпа Sheet.1 существует ячейка User.DeltaX в которой хранится численное значение смещения координаты X шейпа Sheet.2 относительно координаты X шейпа Sheet.1.

Теперь механика:
При перетаскивании шейпа Sheet.1, новое значение координаты X подставляется замест SATATREFEXPR(). Далее происходит вычитание из нового значения X-ой координаты Sheet.1 (SETATREFEXPR() - Sheet.1!PinX). Полученная разница передается по перенаправлению в ячейку User.DeltaX шейпа Sheet.1. Новое значение User.DeltaX подставляестся замест функции SATATREF в формуле. Далее к полученному значению функции SATATREF прибавляется значение X-ой координаты шейпа Sheet.1. Итоговая сумма используется в качестве значения X-ой координаты шейпа
Sheet.2.

Итого: Перетаскивание шейпа Sheet.2 по оси X приводит к изменению смещения записанного в ячейке User.DeltaX шейпа Sheet.1. Последний при перетаскивании, автоматически тянет за собой Sheet.2.

Edited by - ESV on 08/17/2008 19:01:28
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)