Форум пользователей Visio
http://visio.getbb.ru/

Изменение размера фигуры в группе
http://visio.getbb.ru/viewtopic.php?f=3&t=385
Страница 1 из 2

Автор:  Qwertiy [ 14 июн 2013, 19:50 ]
Заголовок сообщения:  Изменение размера фигуры в группе

Можно ли сделать, чтобы при изменении размера фигуры внутри группы, она получала числовые значения размера, а не пропорциональные соответствующему размеру группы?

Автор:  9rey [ 14 июн 2013, 21:59 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

если это надо, чтобы фигура не меняла размеры при изменении размеров группы, то можно просто ставить свойство в меню "поведение":

Изображение

это в визио 2003 англ. как в более новых не знаю, но наверно примерно так же.

можно после добавления в группу вручную или макросом задавать реальные размеры например так:
shape.cells("width").formula=shape.cells("width").result("mm") & " mm"
это всё повесить на событие группировки например, чтоб само делалось.

Автор:  Qwertiy [ 14 июн 2013, 22:26 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

9rey писал(а):
если это надо, чтобы фигура не меняла размеры при изменении размеров группы

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

9rey писал(а):
можно после добавления в группу вручную или макросом задавать реальные размеры

После добавления у меня всё делается как надо. Эта сгруппированная штука становится трафаретом и мне бы хотелось, чтобы никакой программный код не требовался для его использования.

Автор:  9rey [ 15 июн 2013, 08:24 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

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

Автор:  Qwertiy [ 15 июн 2013, 16:46 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

9rey писал(а):
если ты задашь числовое значение (а это видимо можно сделать либо руками, либо кодом, причем разово)

Оно и есть числовое.

9rey писал(а):
то фигура перестанет масштабироваться вместе с группой

На размер группы у меня и так стоит формула и GUARD.

9rey писал(а):
вот мне и интересно, зачем это все?

Если выделить фигуру в группе и мышкой поменять её размер, то визио поставит этот размер пропорционально размеру группы.
После этого группа пересчитывает свой размер по формуле, что приводит к следующему резайзу фигуры и в итоге полная фигня с огромными размерами.
Как с этим бороться?

Автор:  9rey [ 15 июн 2013, 17:17 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

никак. подстраиваться под правила визио и менять свой подход

Автор:  Surrogate [ 15 июн 2013, 17:54 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

Если таких шейпов в группе немного можно решить в шейпшите так. Например есть группа в ее составе есть sheet.4. В групповой шейп в секцию юзер
user.d = width * k
добавить где k коэффициент. В секцию events fx добавить формулу.
=setf("sheet.4!width",user.d)
Это заменит размеры дочернего шейпа на значения

Автор:  9rey [ 15 июн 2013, 18:05 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

кстати если ячейку ResizeMode сделать =1 то при масштабировании фигуры в группе, ее размеры будут числовыми и отвяжутся от группы, только что проверил

Автор:  Qwertiy [ 17 июн 2013, 15:25 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

Qwertiy писал(а):
9rey писал(а):
если это надо, чтобы фигура не меняла размеры при изменении размеров группы
Параметр в ПН проверю, может и поможет...

9rey писал(а):
кстати если ячейку ResizeMode сделать =1 то при масштабировании фигуры в группе, ее размеры будут числовыми и отвяжутся от группы, только что проверил

Да, всё получилось так как и было нужно, спасибо :)

Автор:  Surrogate [ 17 июн 2013, 16:08 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

где хоть это ResizeMod находится ?

Автор:  Qwertiy [ 17 июн 2013, 16:58 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

Surrogate писал(а):
где хоть это ResizeMod находится ?

Руками: Developer -> Behavior -> Behavior -> Resize Behavior -> Reposition only.
Программно: .CellsSRC(visSectionObject, visRowXFormOut, visXFormResizeMode).FormulaU = "1"

Автор:  LuxCore [ 14 апр 2017, 12:28 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

Попробовал в своём случае устанавливать ResizeMode, но действия никакого не возымело. Возможно что-то не понял по обсуждению выше. Надеюсь, что здесь проясню все моменты.
  1. Есть группа объектов:
    Изображение
    При изменении размеров стрелочки не становятся не пропорциональными:
    ИзображениеИзображение
    Пробовал Hieght=GUARD(35 pt) и Width=GUARD(Hieght), но видимо не то, потому как не помогло.
  2. Есть ли различие между смартшейпом и группой объектов? Или это одно и то же?

Автор:  Surrogate [ 14 апр 2017, 12:51 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

LuxCore писал(а):
  • Есть ли различие между смартшейпом и группой объектов? Или это одно и то же?
нет, не одно и тоже.
Групповой объект получается путем объединения нескольких фигур в новую сущность. Создавать группы можно если на включена лента Разработчик на ленте.
А смарт-шейп - это фигура с интерактивным поведением. Это поведение может изменяться по событиям (двойной клик, дроп, изменение размеров/координат, изменение текста шейпа), по определенным значениям различных свойств (с очень гибкими возможностями настройки).
Смарт-шейпом может быть и одиночный шейп и групповой шейп
почитать про смартшейпы можно здесь:
Методы создания интерактивных объектов.
SmartShape Tutorial: Fading Trees
LuxCore писал(а):
При изменении размеров стрелочки не становятся не пропорциональными
а какие стрелки используются ?
Штатный набор из 45 штук. Можно рисовать и добавлять свои (пользовательские).
Изображение
В режиме без масштабирования в качестве опоры берется основная линия (та, к которой крепится наконечник). Расчеты ведутся от ее толщины. Сильно влияет также переключатель размеров. Размеры образца практически не принимаются во внимание.
В режиме с масштабированием отсчет начинается от размеров образца. И этот размер сохраняется постоянным во всех образованных от него экземплярах. Свои наборы можно делать как с масштабированием, так и без него.

Автор:  LuxCore [ 14 апр 2017, 13:07 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

Surrogate писал(а):
а какие стрелки используются ?

Забыл файлик приложить. Мои лично нарисованные стрелочки использую (две дуги и две линии)

Вложения:
VButton.vsd [30 Кб]
Скачиваний: 308

Автор:  nbelyh [ 14 апр 2017, 13:32 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

LuxCore писал(а):
Попробовал в своём случае устанавливать ResizeMode, но действия никакого не возымело
Есть ли различие между смартшейпом и группой объектов? Или это одно и то же?

Чтобы запретить шейпу "деформироваться", достаточно явно это указать (работать должно как для составного шейпа, так и для группы):
Shape -> Protection -> Aspect Ratio = Yes

Можно сделать и через Resize Mode и формулы Shape Sheet, но это будет намного хитрее,
и скорее всего это будет никому кроме гиков не нужно :)

Насчет смарт-шейпов.. В визио любой шейп является "смарт", в том числе и группа.
Возможно ты хотел спросить, есть ли разница между группой шейпов и составным шейпом.

Она есть. В группе у каждого элемента (вложенного шейпа), входящего в нее, могут быть свои настройки толщины линий, текста, заливки, цвета, и т.п. а у "составного" шейпа эти настройки общие для всех элементов, в него входящих (общие для всех "геометрий"). К "интерактивности" или "умности" эта разница IMHO не особо относится :)

Чтобы получить один составной шейп вместо группы нужно объединить эту самую группу,
Shape -> Operations -> Join (или Combine)
Получится 1 шейп с несколькими геометриями (составной) вместо иерархии вложенных шейпов.

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

Изображение

Автор:  LuxCore [ 14 апр 2017, 14:11 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

Ситуация вроде проясняется, но не до конца, потому как есть ещё вопрос, перекликающийся с темой создания смартшейпов.
Хочу сделать смартшейп "Button". В приложенном файле (предыдущее сообщение моё) есть группа:
Изображение

Для неё в ShapeSheet задал пользовательские ячейки и Actions:
Изображение
Не могу понять, как сделать невидимыми нужные фигуру и соответствующий текст. Подскажите, пожалуйста, что дальше делать. Спасибо

Автор:  nbelyh [ 14 апр 2017, 14:23 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

Если это диаграмма (рисунок), просто создай 2 кнопки, одна "Update" другая "Run"
Сэкономишь кучу времени.

Если ты хочешь, чтобы они таки нажимались (?), то это значит что у тебя есть какой-то код (VBA-макросы или что-то еще)
Тогда проще через код сделать (так же 2 кнопки, ставить им .Visible в зависимости от того какая должна быть видна)

Можно сделать чисто на формулах, через контекстное меню, но в Visio это будет к сожалению нетривиально.

Автор:  LuxCore [ 14 апр 2017, 15:08 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

nbelyh писал(а):
Если ты хочешь, чтобы они таки нажимались (?), то это значит что у тебя есть какой-то код (VBA-макросы или что-то еще)
Нет, нажиматься мне не нужно. Просто смартшейп-кнопка, который будет меняться в зависимости от состояния: цвет, иконка-фигура и текст.
nbelyh писал(а):
Можно сделать чисто на формулах
Ага, вот это я и пытался сварганить в ShapeSheet. Но знаний мало. Actions, которые я сделал, не работают. Подозреваю потому, что нет связи между ячейками User.Update/User.Run и соответствующими иконками-фигурами (стрелочки и треугольник).
Думал, что можно обойтись без VBA. VBA мне нравится, но пока смысла не вижу в нём, потому что нужно со смартшейпами без него разобраться.

Автор:  Surrogate [ 14 апр 2017, 15:10 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

LuxCore писал(а):
Actions, которые я сделал, не работают
0. в проводнике объекта присвоил всем составляющим фигурам осмысленные имена
Изображение
1. эти две кнопки взаимоисключающие. значит можно обойтись одной строкой в Actions и в User-defined cells
Изображение
если в ячейке user.state - 1 то состояние Run, иначе Update
2. внутри самой группы кнопки. я сначала разобрался с видимостью надписей
Изображение
Изображение
3. а потом настроил видимость фигур в соответствии с видимостью надписи
Изображение

Вложения:
VButton_V2.vsd [21 Кб]
Скачиваний: 313

Автор:  nbelyh [ 14 апр 2017, 23:52 ]
Заголовок сообщения:  Re: Изменение размера фигуры в группе

LuxCore писал(а):
Ага, вот это я и пытался сварганить в ShapeSheet.
Думал, что можно обойтись без VBA. VBA мне нравится, но пока смысла не вижу в нём, потому что нужно со смартшейпами без него разобраться.

Можно обойтись без VBA, но это путь самурая :)

План:
- Делаем из твоей кучи шейпов 3 шейпа: (кнопка - группа с границами), (стрелки с текстом), и (треугольник с текстом).
- Делаем группу (прямоугольник)
- В группе определяем действия, и 1 ячейку которая будет содержать текущий тип кнопки. Я предлагаю как строчку.
Это даст возможность добавлять новые варианты без глобальной переделки (например, "Стоп"). Пусть это будет User.ActionType
Лучше такие служебные штуки определять в User., а не в Prop. потому что Prop виден юзеру, и может использоваться для привязки к данным (чтобы он там не болтался)
- Стрелки конвертируем в 1 шейп
- Добавляем стрелки и треугольник в группу (не группируем - добавляем в группу. Это разные операции).
- Доававляем текст к стрелкам и треугольнику, устанавливаем правильное положение текста.
- Настраиваем поведение (показывать - прятать). В ячейки которые контролируют видимость (NoShow / HideText) прописываем зависимость от группы (User.ActionType)
- Подправляем и координаты Width/Height. Чтобы при растягивании и сжимании не происходило ничего странного, лучше брать координаты родителя (группы)
- Подправляем масштабирование шрифта.
- Настраиваем поведение группы (блокируем выбор суб-шейпов)

У меня заняло примерно полчаса возни (пример приаттачен).
В общем что я хотел сказать - изготовление нормальных "умных" шейпов в Visio в общем случае оказывается довольно трудоемким процессом.
Если можно этого избежать - лучше избежать.

Возможные проблемы - это в качестве домашнего задания :D
- Проверить что заливка как надо работает (если ты захочешь перекрасить кнопку). Если нет - починить (с помощью GUARD и NoFill / FillFgnd например)
- Проверить что темы нормально работают (если ты захочешь использовать этот шейп с встроенным шаблоном). Если нет - починить (с помощью THEMEGUARD например)
- Проверить что работает выравнивание текста (справа - слева - по центру). Если нет - починить.
- Сделать чтобы толщина линий окантовки кружка/треугольника менялась от размера.

Вложения:
VButton (1).vsd [16.5 Кб]
Скачиваний: 344

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/