Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 25 янв 2021, 17:48

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Ограничить размеры фигуры
СообщениеДобавлено: 07 сен 2018, 10:56 
Не в сети
Бывалый

Зарегистрирован: 19 июн 2015, 22:18
Сообщений: 113
Использую Visio c: 2013
Очков репутации: 21

Добавить очки репутацииУменьшить очки репутации
Можно добавить в любую ячейку формулу ShapeSheet, например, можно в секции User.
Код:
User.Row_1= IF(Width<8.2 mm,Width+SETF("Width",8.2 mm),Width)

Но в этом случае появляется эффект убегания – когда мы пытаемся уменьшить размер фигуры слева – фигура начинает убегать влево.
Есть другой хитрый способ подсказанный господином Тумановым
Код:
EventXFMod = IF(Width<8.2 mm, SETF(GetRef(Width), 8.2 mm), 0)

Но в этом случае появляется эффект сдвижения фигуры. Мы будем двигать фигуру, уменьшая ее размер, и, при достижении минимума, фигура начнет двигаться. Можно изменить это поведение, назначив PinX=Width*0 или PinX=Width*1. В этом случае сдвиг будет только с одной стороны.

Другой способ, который позволяет полностью освободиться от посторонних эффектов – использовать функцию SETATREF.
SETATREF(reference [,set_expression [,ignore_eval ]])

Эта функция позволяет передавать изменение значений в другую ячейку при изменении через графический интерфейс. При этом, используя set_expression можно пересчитывать эти значения «налету». Для этих пересчетом используются еще две функции SETATREFEVAL и SETATREFEXPR.

Заводим в секции User ячейку User.DeltaX – сюда будем передавать значения Width.
Код:
Width = SETATREF(User. DeltaX, SETATREFEVAL(IF(SETATREFEXPR()<8.2 mm, 8.2 mm,SETATREFEXPR())))

Здесь SETATREF используется в формате SETATREF(reference ,set_expression). В качестве set_expression выступает функция SETATREFEVAL.
Эта функция умеет работать с текущим значением. В качестве текущего значения выступает SETATREFEXPR().
Поэтому мы используем функцию IF: если текущее значение меньше нашего значения – возвращаем наше значение, иначе возвращаем переданное текущее значение
IF( SETATREFEXPR() < 8.2 mm, 8.2 mm, SETATREFEXPR() )
Ограничения удобнее указывать в отдельной ячейке:
Код:
User.RestrictWidth = 8.2 mm

Тогда:
Код:
IF( SETATREFEXPR() < User.RestrictWidth,  User.RestrictWidth, SETATREFEXPR() )

В качестве ограничения может выступать ширина текста:
Код:
User.TextWidth = TEXTWIDTH(TheText)
User.RestrictWidth = User.TextWidth


И, наконец, самый простой способ - использовать функцию BOUND

Width = BOUND(,0,FALSE,0,40 mm)

Напомню, что BOUND имеет следующий синтаксис:
BOUND (value, type, ignore, value1, value2 [,ignore(n), value1(n), value2(n),...])

Так как мы хотим ограничить значение самой ячейки, где прописана формула, то первый параметр мы опускаем. В дальнейшем Visio сама поставит туда текущее значение ширины, а можем и сами туда подставить текущее значение, чтобы при вводе формулы ширина фигуры не схлопывалась к минимальному значению.
Второй параметр 0 - означает - включить действие формулы. Если мы поставим 2, то формула работать не будет. Этот параметр служит для отключения всех ограничений.
Далее идет список ограничений, каждый элемент представлен тремя параметрами:
- Первый параметр в этом списке - это игнорировать\не игнорировать ограничение
- Второй - нижняя граница ограничения
- Третий верхняя граница ограничения
То есть FALSE,0,40 mm - это Ограничение не игнорировать, нижний диапазон 0, верхний - 40 mm.


Последний раз редактировалось vin 07 сен 2018, 12:44, всего редактировалось 2 раз(а).

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ограничить размеры фигуры
СообщениеДобавлено: 07 сен 2018, 11:32 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1751
Очков репутации: 100619

Добавить очки репутацииУменьшить очки репутации
А функцию BOUND впихнуть нельзя?
Вроде бы она и предназначена для ограничения.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ограничить размеры фигуры
СообщениеДобавлено: 07 сен 2018, 12:20 
Не в сети
Бывалый

Зарегистрирован: 19 июн 2015, 22:18
Сообщений: 113
Использую Visio c: 2013
Очков репутации: 21

Добавить очки репутацииУменьшить очки репутации
Да, конечно!
Попробовал с BOUND - работает. В конце статьи обязательно допишу как самый простой способ.
Но статью нужно оставить, так как пользователи постоянно натыкаются на грабли, пытаясь решить ограничение двумя первыми способами.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ограничить размеры фигуры
СообщениеДобавлено: 05 янв 2021, 21:44 
Не в сети
Бывалый

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 115
Использую Visio c: 2019
Очков репутации: 3

Добавить очки репутацииУменьшить очки репутации
vin писал(а):
В качестве ограничения может выступать ширина текста:
Код:
User.TextWidth = TEXTWIDTH(TheText)
User.RestrictWidth = User.TextWidth



А можно сделать наоборот, чтобы текст ограничивался фигурой, чтобы например в фигуре не вмещалось больше 2 символов?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ограничить размеры фигуры
СообщениеДобавлено: 05 янв 2021, 23:15 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 4078
Откуда: оттуда
Использую Visio c: 1998
Уровнь квалификации: Отсутствует
Tim Umix писал(а):
А можно сделать наоборот, чтобы текст ограничивался фигурой, чтобы например в фигуре не вмещалось больше 2 символов?
Можно сделать дополнительную фигуру, внутри группы. В этой фигуре сделать поле, в котором будет отображаться 2 символа left(shapetext(sheet.5!thetext),2)
Где sheet.5 - групповая фигура (мастер).
А текст самой группы сделать невидимым
Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ограничить размеры фигуры
СообщениеДобавлено: 05 янв 2021, 23:41 
Не в сети
Бывалый

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 115
Использую Visio c: 2019
Очков репутации: 3

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
Можно сделать дополнительную фигуру, внутри группы. В этой фигуре сделать поле, в котором будет отображаться 2 символа left(shapetext(sheet.5!thetext),2)
Где sheet.5 - групповая фигура (мастер).
А текст самой группы сделать невидимым
Спасибо, получилось.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB