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

Движение маркера(Controls) вдоль кривой/пути
http://visio.getbb.ru/viewtopic.php?f=5&t=727
Страница 1 из 2

Автор:  Tanatos [ 23 янв 2015, 17:38 ]
Заголовок сообщения:  Движение маркера(Controls) вдоль кривой/пути

День добрый уважаемые форумчане!

Есть линейный объект. К нему есть подпись и маркер (Controls) задающий положение подписи. Мне необходимо привязать перемещение маркера к контуру линейного объекта, нужным мне образом работает функция POINTALONGPATH(<Фигура>,<Смещение от 0 до 1>), но как использовать маркер для указания того самого положения!? Желательно при этом координаты этого самого маркера привязать к самому контуру фигуры ... чтобы он двигался как ползунок на регуляторе (не забываем, что фигура не обязательно прямолинейная)

Заранее всем спасибо!

Автор:  Tumanov [ 24 янв 2015, 15:33 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

До меня не дошло, что от чего зависит.
1. В зависимости от некоторого числа устанавливается положение маркера, а затем и надписи?
2. Или наоборот - мышкой тянется маркер-ползунок и нужно, чтобы он шел по нужной кривой?

Автор:  Tanatos [ 26 янв 2015, 14:36 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Второй вариант в точку на 100%. Тянем за маркер, но он тянется не в любую сторону а только вдоль кривой.

Автор:  Tanatos [ 03 фев 2015, 15:43 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Нет идей как это можно реализовать? Не обязательно готовое решение, достаточно идеи как это сделать.

Автор:  Qwertiy [ 03 фев 2015, 16:33 ]
Заголовок сообщения: 

У меня есть 2 идеи, что можно сделать:
1. Пересчитывать координаты маркера в координаты на линии (проекция) и использовать их.
2. Разрешить движение только по одной из осей, а вторую задать формулой.
А способа сказать маркеру двигаться только по конкретной линии я не видел.

Автор:  Tumanov [ 03 фев 2015, 20:16 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Цитата:
Нет идей как это можно реализовать? Не обязательно готовое решение, достаточно идеи как это сделать.

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

Автор:  nbelyh [ 03 фев 2015, 22:04 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Привет.
Можно попробовать так. см. аттачмент (вроде работает)!

Что происходит:
1. На измение control point срабатывает User.SetPos (из-за DEPENDSON) -> в ячейку User.Pos записывается текущая ближайшая точка вдоль пути
2. На изменение этой позиции (опять же из-за DEPENDSON) срабатывают User.SetX и User.SetY, которые переписывают позицию control point

Угол текста задается через ANGLEALONGPATH(User.Pos)

Вложения:
2-3-2015 6-59-11 PM.png
2-3-2015 6-59-11 PM.png [ 32.06 Кб | Просмотров: 3082 ]
test.gif
test.gif [ 24.33 Кб | Просмотров: 3084 ]
Drawing1.vsd [17 Кб]
Скачиваний: 242

Автор:  Tanatos [ 05 фев 2015, 10:37 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

nbelyh писал(а):
Привет.
Можно попробовать так. см. аттачмент (вроде работает)!


Примного благодарен! Теперь работа с маркерами стала гораздо удобней.

P.S.
Может кто-то знает как сделать позиционирование меню "Action Tags", зависимым от масштаба страницы?
У меня пока получается, что при уменьшении масштаба иконка "Action Tags" перекрывает фигуру и маркеры и с ней ничего не сделать. Приходиться приближать, брать за маркер и отдалять. Иллюстрация во вложении. Хотелось бы добиться фиксированного расстояния (в пикселях) от иконки до маркера при всех масштабах.

Вложения:
Sample.png
Sample.png [ 5.38 Кб | Просмотров: 3161 ]

Автор:  Tanatos [ 05 фев 2015, 14:19 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

У меня в документе используется единица измерения миллиметры, а в примере дюймы. Подозреваю, что одна из функций работает только с дюймами, так как при повторном присвоении значения ячейке у меня маркер скачет между двумя положениями (нажали два раза Enter на ячейке в ShapeShet и маркер переместился, еще раз нажали - вернулся обратно)
Перерыл весь хелп но не смог найти явного упоминания в каких единицах параметры и результат в используемых функциях ... хотя может я не совсем верно перенес формулы!? ... я не использую раздел User& а все разместил в Scratch.

И еще один момент: если маркер стоит в начале или в конце линии, то перемещение маркера за пределы фигуры соответственно не обновляет "Pos" и маркер благополучно вылетает за пределы линии. Для меня это не критично, но хочется красивого решения

И спасибо всем откликнувшимся :) !

Автор:  Tanatos [ 06 фев 2015, 12:22 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Не хватает моих познаний в Visio чтобы понять почему предложенный уважаемым "nbelyh" способ периодически не работает. Что в какой последовательности происходит понятно, формулы понятны, а результат непредсказуем. Маркеры, то выходят за границы фигуры, то вовсе зависимость формул рушится (будто dependson не прописан), и все это происходит без единого вмешательства в ShapeSheet - достаточно просто подольше потягать маркер туда-сюда, нет-нет да и произойдет какой ни будь глюк.

Пока сделал реализацию через смесь ShapeSheet и VBA:
В секцию Scratch в строку 8 в ячейки X Y A записал следующие формулы:
Код:
=POINTALONGPATH(Geometry1.Path,Scratch.A8)
=POINTALONGPATH(Geometry1.Path,Scratch.A8)
=NEARESTPOINTONPATH(Geometry1.Path,Controls.Label1,Controls.Label1.Y)

и соответственно в коде документа обработчик:
Код:
Public WithEvents MyPage As Visio.Page
Public WithEvents MyApplication As Visio.Application

' Для связи между обработчиками
Private Sub Document_DocumentOpened(ByVal Doc As IVDocument)
    Set MyApplication = Application
End Sub

' Для связи между обработчиками
Private Sub MyApplication_ViewChanged(ByVal Window As IVWindow)
    Set MyPage = ActivePage
End Sub

' Непосредственно наш обработчик
Private Sub MyPage_CellChanged(ByVal Cell As IVCell)
    Dim X, XOld As Cell
    Dim Y, YOld As Cell
    If Cell.Name = "Controls.Label1" Or Cell.Name = "Scratch.X8" Then
        Set XOld = Cell.Shape.CellsSRC(visSectionControls, Cell.Shape.CellsRowIndexU("Controls.Label1.X"), visX)
        Set X = Cell.Shape.CellsSRC(visSectionScratch, Cell.Shape.CellsRowIndexU("Scratch.X8"), visScratchX)
        If XOld.FormulaU <> X.FormulaU Then
            XOld.FormulaForceU = X.FormulaU
        End If
    End If
    If Cell.Name = "Controls.Label1.Y" Or Cell.Name = "Scratch.Y8" Then
        Set YOld = Cell.Shape.CellsSRC(visSectionControls, Cell.Shape.CellsRowIndexU("Controls.Label1.Y"), visY)
        Set Y = Cell.Shape.CellsSRC(visSectionScratch, Cell.Shape.CellsRowIndexU("Scratch.Y8"), visScratchY)
        If YOld.FormulaU <> Y.FormulaU Then
            YOld.FormulaForceU = Y.FormulaU
        End If
    End If
End Sub


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

Автор:  nbelyh [ 06 фев 2015, 13:01 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Похоже что дело в том как оно зависимости пересчитывает - надо чтобы одновременно X и Y пересчитывало, похоже что это сейчас не так (или не всегда так?).
У тебя есть какой-нибудь файлик где этот глюк с левым позиционированием стабильно воспроизводится?

Автор:  Tanatos [ 06 фев 2015, 15:19 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

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

Автор:  nbelyh [ 06 фев 2015, 23:14 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Я запощу вопрос на visguy. Может что предложат.

Автор:  nbelyh [ 07 фев 2015, 03:18 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Упрощенная версия (по совету visguy)!

Просто проставляются координаты надписи, control point обратно не снапится. Вроде все просто тогда получается и работать должно быстро и надежно.

Вложения:
Drawing1.vsd [24 Кб]
Скачиваний: 239

Автор:  Tumanov [ 07 фев 2015, 13:04 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Типа, "простенько и со вкусом"...
Красиво.

Автор:  Tumanov [ 07 фев 2015, 15:01 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

:(
Однако, кажется и здесь есть проблемы.
Шейп получается каким-то не очень копируемым. Возможно потому, что это не просто шейп, а еще и динамический коннектор.
Ячейки TxtPinX, TxtPinY при копировании вместо формул принимают значения, поэтому поведение дубля становится не таким, как у эталона.
(Обнаружено в Visio 2013).

Автор:  nbelyh [ 07 фев 2015, 15:47 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Достаточно просто GUARD() на TxtPinX, TxtPinY поставить. Пофиксил.

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

Автор:  nbelyh [ 08 фев 2015, 14:45 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Топик тут кстати:
http://visguy.com/vgforum/index.php?topic=6279

Там еще один импрувмент сделали: чтобы маркер не дергался, а двигался плавно, можно выключить Misc.LiveDynamics.

Автор:  nbelyh [ 09 фев 2015, 19:06 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Еще одно улучшение (там же). Чтобы не сбрасывалось непонятно как (из-за зависимостей), можно пользовать черную магию вроде SETATREEXPR() и типа того.
Вроде в последней версии http://visguy.com/vgforum/index.php?top ... 5#msg25745 все красиво, и маркер ползает точно по кривой.

Автор:  Tim Umix [ 04 янв 2023, 22:16 ]
Заголовок сообщения:  Re: Движение маркера(Controls) вдоль кривой/пути

Сделал фигуру с маркером , который ползает по кругу, все работает. Но если эту фигуру сохранить в набор элементов и вытащить на страницу, то перестает работать, чтобы заработало нужно переписать формулу в User.Pos. В чем может быть проблема? Я где то ошибся или опять косяк моей версии визио 2021?
Содержимое спрятано под спойлер ↓
Спойлер:
Вложение:
test.gif
test.gif [ 1.41 Mб | Просмотров: 330 ]


Вложения:
test.vsd [48.5 Кб]
Скачиваний: 23

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