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

Форум по вопросам применения и программирования в Visio
Текущее время: 09 апр 2020, 09:11

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


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме не используйте имена файлов содержащих кириллицу, в противном случае файл будет иметь имя .<расширение файла> !



Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 13 мар 2020, 06:51 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 90
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Здравствуйте! Я в очередной раз взываю к коллективной помощи решения задачи. Уже неделю пытаюсь придумать универсальный способ как закрепить текст вертикально. Знаю что уже была похожая тема (https://visio.getbb.ru/viewtopic.php?f=29&t=837), где формула была предложена вида:
Код:
IF(BITXOR(Sheet.3!FlipX,Sheet.3!FlipY),1,-1)*Sheet.3!Angle

Эта формула работает и учитывает операции отражения (Flip). Однако всегда необходимо знать внешний шейп группы, то есть всегда модифицировать формулу.
Если хорошо поискать, то можно найти следующий способ, а именно записать в ячейку TxtAngle формулу
Код:
-ANGLETOLOC(0 deg,Angle,ThePage!AvenueSizeX)

С такой формулой мы уже можем не беспокоиться сколько раз наш Шейп с текстом был "обернут" в группу. Всё бы ничего, но если сделать Flip группы, то все ломается. И вот уже неделю пытаюсь найти за, что можно зацепится, чтобы можно было универсально понять был ли сделан Filp или нет.
Ситуация усложняется тем, что если сделать FlipX, то фигура как бы перевернётся на 180 относительно страницы, а текст нет. Если сделать FlipY, то фигура не переворачивается относительно страницы и текст тоже, но если эту фигуру повернуть на 180, то текст будет вверх ногами, и оба этих варианта между собой вообще никак не отличаются

В приложенном файле есть Группа, в которой находиться прямоугольник с текстом. Его то я и пытаюсь защитить от вращения


Вложения:
Anti_Rotate.vsdx [15.41 Кб]
Скачиваний: 5
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 13 мар 2020, 14:54 
Machestro писал(а):
С такой формулой мы уже можем не беспокоиться сколько раз наш Шейп с текстом был "обернут" в группу.
1. Зачем нужно создавать такую "матрешку"
Machestro писал(а):
Всё бы ничего, но если сделать Flip группы, то все ломается.
2. Крутить то ее как кубик-рубик зачем ?


Пожаловаться на это сообщение
Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 13 мар 2020, 15:04 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 90
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Бывают ситуации, когда это необходимо. Вообще я создаю универсальный Шейп Аннотации, который будет настраиваться через свойства. Остался только вопрос с горизонтальностью.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 13 мар 2020, 16:41 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3815
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Сбор вторичного сырья
Должность: Безработный
Уровнь квалификации: Отсутствует
Похоже это тупиковая ветвь!
Изображение
при размещении такой фигуры внутри группы, с последующим флипом группы.
Флипа целевой фигуры внутри группы не происходит, т.к. она отображается
только вместе с группой! Не уверен, что получится через координаты выразить


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 13 мар 2020, 18:06 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 682
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100607

Добавить очки репутацииУменьшить очки репутации
(в качестве идеи) можно в самой фигуре сделать 2 точки например, и преобразовывать их в экранные координаты (типа LOCTOPAR для страницы)
Потом от них счтиать что-то типа SIGN или IF

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 13 мар 2020, 19:00 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3815
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Сбор вторичного сырья
Должность: Безработный
Уровнь квалификации: Отсутствует
nbelyh писал(а):
в самой фигуре сделать 2 точки например, и преобразовывать их в экранные координаты (типа LOCTOPAR для страницы)
была такая же идея, но что-то не с синтаксисом этой функции не могу разобраться ! :wall:


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 14 мар 2020, 06:31 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 90
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
С точками я тоже игрался, но что-то не получилось (скорее всего я туплю). Методом тыка я понял как можно определить что произошел один из "Флипов" - Допусти в одной ячейке запишем формулу
Код:
ANGLETOLOC(0 deg,Angle,ThePage!AvoidPageBreaks)
, а в другую
Код:
ANGLETOLOC(0 deg,ThePage!AvoidPageBreaks,Angle)

Если Флипа не было, то Формулы имеют разные знаки, но по модулю равны. Если произошел любой Один флип, то углы будут полностью одинаковыми, то есть можно сравнивать знаки
По поводу доп точек. Как я ранее писал, что при FlipX, что при FlipY по ShapeSheet нет никаких изменений (геометрически), то есть это одно состояние. Однако чисто визуально в одном случае текст перевернут, в другом нет


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

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3815
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Сбор вторичного сырья
Должность: Безработный
Уровнь квалификации: Отсутствует
как с фигурой может обращаться пользователь:
  • может зеркалить по осям x/y;
  • поворачивать на угол кратный 90 градусов;
  • поворачивать на произвольный угол.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 15 мар 2020, 06:48 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 90
Использую Visio c: 2016
Очков репутации: 4

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


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

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3815
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Сбор вторичного сырья
Должность: Безработный
Уровнь квалификации: Отсутствует
У меня тоже почти получилось все вместе.
Но иногда после нескольких последовательностей флипов, поворот на произвольный угол даёт переворот текста вверх тормашками! Пока не отловил эту очередность...


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 19 мар 2020, 13:18 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3815
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Сбор вторичного сырья
Должность: Безработный
Уровнь квалификации: Отсутствует
Руки не доходили довести до ума. И тут внезапно наткнулся на видео от Obsidian
phpBB [media]

прямая ссылка непосредственно на этот момент


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 19 мар 2020, 14:04 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 682
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100607

Добавить очки репутацииУменьшить очки репутации
Это да, но вопрос же про FLIP. Этот метод топикстартер в первом же посте упоминает. Да, тут случайно нашел такую вот прикольную функцию - GRAVITY() в этом контексте.

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 19 мар 2020, 14:43 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
(в качестве идеи) можно в самой фигуре сделать 2 точки например, и преобразовывать их в экранные координаты (типа LOCTOPAR для страницы) Потом от них считать что-то типа SIGN или IF

Эта идея позволяет достаточно легко вычислить, как нужно повернуть текст относительно страницы.
НО беда в том, что угол поворота текста нужно задать относительно шейпа, а не страницы. А вот тут-то все и рушится. Flip шейпа неотличим от Flip'а содержащей его группы (по данным шейп-листа). То есть по содержимому шейп листа нельзя уверенно вычислить одно из трех состояний: отсутствие Flip, Flip внутреннего шейпа, Flip группы.
Даже хуже - его можно вычислить всегда, кроме двух состояний: Angle=0 и Angle=180deg. И в них возможна ошибка :(


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 19 мар 2020, 15:00 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 90
Использую Visio c: 2016
Очков репутации: 4

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


Вложения:
Rotate.vsdx [14.76 Кб]
Скачиваний: 3
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 19 мар 2020, 15:58 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
Кажется получилось

Все равно найдется пользователь, который это сломает.


Вложения:
ro001.gif
ro001.gif [ 213.01 Кб | Просмотров: 129 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Всегда горизонтальный текст. Универсальный метод
СообщениеДобавлено: 20 мар 2020, 07:19 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 90
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Хоть работает и не полноценно, все равно опишу как это работает, может кто-то предложит улучшения.
Как уже было выше сказано необходимо решить задачу - было ли и отражение и какое оно FlipX или FlipY

User.Angle = ANG360(ANGLETOLOC(0 deg,Angle,ThePage!AvenueSizeX)) //Возвращает угол фигуры относительно страницы

User.Angle_1Rad =ANG360(ANGLETOLOC(1 rad,Angle,ThePage!AvenueSizeX)) //Возвращает угол фигуры относительно страницы но со сдвигом в 1 радиан. Почему 1 радиан? Выше тоже уже подметили, что на углах 0, 90, 180, 270 происходят неопределенности. Это позволило сместить эти углы неопределенности на 1 радиан = 57.23...градуса. Сомневаюсь, что кто-то введет такой угол поворота в Visio.

Далее заметил закономерность, что при FlipX сумма старого угла и нового угла (речь про User.Angle_1Rad) будет равной 180 град. Для FlipY сумма будет равна 0 град. То есть нужно как-то запоминать старое значение угла и прибавлять ему новое значение. Для этого в ячейке User.Angle_1Rad.Prompt записана формула, которая берет Старое значение угла из User.Angle_Temp прибавляет ему новое значение угла из User.Angle_1Rad, сумма проверяется и если 180 то в ячейку User.Sum_Angles запишем 1, если 0 то запишем 0, иначе будет -1. Обновляем новым значением угла User.Angle_Temp. Таким образом мы можем понять какой из Flip произошел. (Если кто знает как более правильно в Visio сравнивать старое и новое значение, буду рад прочитать, так как именно на этом месте я конкретно застрял)

Следующая закономерность. Оказывается разность User.Angle-User.Angle_1Rad при ОДНОМ из любых Flip'ов дает постоянные два числа 1 рад, и что-то -5 рад. Ячейка User.FlipEvent это детектирует и сработает при любом изменении состояния Flip - то есть при срабатывании мы знаем , что произошло отражение. Самая важная формула в ячейке User.OLD_Flip.Prompt. Там идёт сравнение старого значения User.OLD_Flip c новым значением из User.FlipEvent через BITXOR (хотя сейчас думаю, что это излишне, можно было просто задействовать DEPENDSON, так как детектируется только изменение). Если произошло изменение смотрим на ячейку User.Sum_Angles, если 1, то меняем состояние User.FlipX на противоположное, если 0, то меняем состояние User.FlipY на противоположное. Затем обновляем значение в User.OLD_Flip.

Теперь зная FlipX и FlipY можно устанавливать нужную формулу в TxtAngle, Что и делает ячейка SetAngle


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

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
Если кто знает как более правильно в Visio сравнивать старое и новое значение, буду рад прочитать, так как именно на этом месте я конкретно застрял

Можно попробовать нечто в таком духе
=IF(PinX<>Scratch.A1,SETF(GetRef(Scratch.B1),GetVal(Scratch.A1))+SETF(GetRef(Scratch.A1),GetVal(PinX)),0)
Здесь Scratch.A1 - задержанная копия PinX
Scratch.B1 - предыдущее значение
Если новое значение не равно задержанной копии, то производятся два действия: 1 - задержанная копия переписывается в ячейку предыдущего значения; 2 - обновляется задержанная копия.
Разница между Scratch.B1 и Scratch.A1 будет разницей между старым и новым значением.
Я не уверен, что это "более правильно", но вроде бы работает.


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

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 90
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Я, по сути, так же сделал.


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

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



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

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


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

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