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

Текст шейпа. Как сделать такое поведение?
http://visio.getbb.ru/viewtopic.php?f=5&t=784
Страница 1 из 1

Автор:  9rey [ 30 июн 2015, 14:26 ]
Заголовок сообщения:  Текст шейпа. Как сделать такое поведение?

Нужно чтоб текст шейпа вел себя вот так при изменении положения "ручек"-контролов:

Изображение

первая ручка задает положение текста, вторая ручка ездит только вдоль текста, задавая ширину. при этом шейп можно поворачивать, текст всегда горизонтален!
что у меня и не получилось! - ручки ведут себя некорректно при повороте шейпа:

Изображение

нужно чтоб ручки вместе с текстом оставались горизонтальными.
для того, чтоб текст был всегда горизонтален, использую формулу в ячейке TxtAngle: IF(BITXOR(FlipX,FlipY),1,-1)*Angle

как добиться корректного поведения?

Автор:  Surrogate [ 30 июн 2015, 14:44 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

9rey писал(а):
нужно чтоб ручки вместе с текстом оставались горизонтальными.
не уверен, что ручки при таком раскладе можно сделать ТОЛЬКО горизонтально расположенными

Автор:  Tumanov [ 30 июн 2015, 14:48 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Может быть текст задать в отдельном шейпе, чтобы им было легче управлять. Не через TxtAngle, а через Angle.
Тогда весь этот шейп можно сделать не поворачиваемым. И вторую "ручку" привязывать не к основному шейпу, а к этому внутреннему.
(Это только возникшая мысль, сам пока не пробовал).

Автор:  9rey [ 30 июн 2015, 14:53 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Surrogate писал(а):
не уверен, что ручки при таком раскладе можно сделать ТОЛЬКО горизонтально расположенными

верю, что можно!
нужную формулу придумать надо :)
и вообще может гуру шейпшита подскажут как такое с нуля сделать. может я не туда зашел с реализацией...

Tumanov писал(а):
Может быть текст задать в отдельном шейпе, чтобы им было легче управлять. Не через TxtAngle, а через Angle.

этот вариант оставлю на крайний случай, ибо много переделывать придется.

Автор:  Surrogate [ 30 июн 2015, 15:02 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

9rey писал(а):
верю, что можно!
нужную формулу придумать надо :)
с фиксированными точками конечно можно вспомнив из школы формулы тригонометрии добиться горизонтального положения! а вот для двух точек, которые могут двигаться произвольно плюс шейп еще может быть повернут на некий угол, наверно надо быть Лобачевским чтоб формулу составить Изображение

Автор:  Tumanov [ 30 июн 2015, 15:02 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Может быть придется придумывать что-то с пересчетом через родительские координаты (в данном случае - страницы). Ведь это относительно нее точки должны быть горизонтальны.
Вообще-то тяжело теоретически советовать...
Надо самому сделать, а потом уже другим рассказывать :)

Автор:  9rey [ 30 июн 2015, 15:28 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

если "победю" формулу, то напишу сюда. но есть опасения, что формула победит меня :(

Автор:  Tumanov [ 30 июн 2015, 16:30 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Вот, вроде получилось
https://www.dropbox.com/s/ndgu95wz7mf7m ... 8.avi?dl=0
Так?
Сейчас формулы покопирую

Автор:  9rey [ 30 июн 2015, 16:36 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

да, именно! но там еще должен быть текст :)

Автор:  Tumanov [ 30 июн 2015, 16:38 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Оптимизировать не пытался. Просто получил первый результат, похожий на нужный.
Вторая точка должна всегда быть правее на 1 дюйм.
Это перевод в координаты листа. В этих координатах добавляется 1 к X.
Код:
Scratch.X1 =PNTX(PAR(PNT(Controls.Row_1,Controls.Row_1.Y))) + 1
Scratch.Y1 =PNTY(PAR(PNT(Controls.Row_1,Controls.Row_1.Y)))

Это обратный перевод
Код:
Scratch.X2 =PNTX(LOCTOLOC(PNT(Scratch.X1,Scratch.Y1),ThePage!PageWidth,Width))
Scratch.Y2 =PNTY(LOCTOLOC(PNT(Scratch.X1,Scratch.Y1),ThePage!PageWidth,Width))

Это просто ссылка
Код:
Controls.Row_2.X =Scratch.X2
Controls.Row_2.Y =Scratch.Y2

Годится?

Автор:  Tumanov [ 30 июн 2015, 16:40 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Цитата:
да, именно! но там еще должен быть текст

Я думал затык именно в управлении второй управляющей точкой...
Про текст и не думал.
Но принцип-то наверное можно использовать?

Автор:  Tumanov [ 30 июн 2015, 17:58 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Да, с таким пересчетом SetAtRef что-то не дружит. Значит быстро не получилось.

Автор:  nbelyh [ 30 июн 2015, 18:13 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Моя попытка Изображение. Содом и гомора блин :D

Вложения:
default12.vsd [14 Кб]
Скачиваний: 149
default12.gif
default12.gif [ 41.42 Кб | Просмотров: 1494 ]

Автор:  9rey [ 30 июн 2015, 19:03 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Tumanov
спасибо! на этой основе можно попробовать сделать. как руки дойдут, отпишу!

nbelyh
и тебе спасибо! тут уже почти рабочий вариант! только осталось прикрутить второй контрол для позиционирования текста...

Автор:  9rey [ 23 июл 2015, 16:05 ]
Заголовок сообщения:  Re: Текст шейпа. Как сделать такое поведение?

Наконец руки дошли доделать этот шейп.
Сделал на основе метода nbelyh. Спасибо ему за это.
Работает, хоть и непонятно как :D
Вложение:
cnt.vsd [21.5 Кб]
Скачиваний: 178

Не въезжаю как работают эти формулы:
для X
=SETATREF(Scratch.X1,(SETATREFEVAL(SQRT((SETATREFEXPR(Width*0.8967)-Controls.Row_1)^2+(Controls.Row_2.Y-Controls.Row_1.Y)^2)))*COS(-Angle)+Controls.Row_1)
для Y
=SETATREF(Scratch.Y1,(SETATREFEVAL(SQRT((SETATREFEXPR(Height*0.0123)-Controls.Row_1.Y)^2+(Controls.Row_2-Controls.Row_1)^2)))*SIN(-Angle)+Controls.Row_1.Y)

Выше моего понимания :wall: но работает как надо

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