Вверх ↑
Этот топик читают: Гость
Ответов: 18
Рейтинг: 0
#1: 2024-10-06 22:35:57 ЛС | профиль | цитата
На график выводятся две одинаковые линии разного цвета от двух кнопок Red и Blue. По логике вещей, та линия, которая рисуется на графике первой, должна визуально закрываться второй линией, которая прорисовывается поверх первой линии. Но на практике одна из линий (в данном случае красного цвета) будет постоянно сверху вне зависимости от порядка нажатия кнопок Red и Blue. От чего это зависит? Оба канала автономные и содержат одинаковые элементы. Как назначить порядок перекрытия линий при большем количестве цветных линий на графике?

Add(MainForm,5423394,245,350)
{
Caption="Linear graph"
}
Add(Plotter,11338811,392,343)
{
Width=384
Height=262
Align=5
Name="plotter"
}
Add(For,10143007,336,399)
{
End=97
link(onEvent,6267160:doAdd,[(380,405)(380,391)])
}
Add(PlotLines,6267160,392,385)
{
Grapher="plotter"
Color=16711680
Size=2
Step=1
}
Add(Button,13087410,245,392)
{
Left=50
Top=20
Caption="Blue"
link(onClick,5740058:doEvent1,[])
}
Add(Hub,5740058,294,392)
{
link(onEvent1,6267160:doClear,[])
link(onEvent2,10143007:doFor,[])
}
Add(PlotLines,10671936,392,434)
{
Grapher="plotter"
Size=2
Step=1
}
Add(For,4511630,336,448)
{
End=97
link(onEvent,10671936:doAdd,[(380,454)(380,440)])
}
Add(Hub,10872676,301,441)
{
link(onEvent1,10671936:doClear,[])
link(onEvent2,4511630:doFor,[])
}
Add(Button,8303377,245,441)
{
Left=50
Top=50
Caption="Red"
link(onClick,10872676:doEvent1,[])
}

карма: 0

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#2: 2024-10-06 23:43:36 ЛС | профиль | цитата
RomanRoman писал(а):
От чего это зависит?

От того, какой элемент инициализируется первым при старте программы. Попробуй элементы PlotLine по очереди отправить на задний план и проверить отрисовку линий. В одном случае это будет красная, в другом -- синяя.

--- Добавлено в 2024-10-06 23:45:14

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

--- Добавлено в 2024-10-07 00:09:20

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

Схема

Add(MainForm,5423394,245,322)
{
Caption="Linear graph"
}
Add(Plotter,11338811,308,322)
{
Width=384
Height=262
Align=5
Name="plotter"
}
Add(Button,13087410,245,413)
{
Left=50
Top=20
Caption="Blue"
link(onClick,8337345:doWork1,[])
}
Add(Button,8303377,245,455)
{
Left=50
Top=50
Caption="Red"
link(onClick,8337345:doWork2,[(284,461)(284,426)])
}
Add(MultiElementEx,16305805,504,434)
{
Mode=1
}
BEGIN_SDK
Add(EditMultiEx,1093061,21,21)
{
WorkCount=#5:##add|8:##select|7:##clear|
Point(##add)
Point(##select)
Point(##clear)
link(##add,1485132:doEvent1,[(102,27)(102,41)])
link(##select,5582304:doFor,[(59,34)(59,132)])
}
Add(PlotLines,3011000,245,70)
{
Grapher="parent.plotter"
Size=2
Step=1
Point(doColor)
}
Add(For,5582304,154,126)
{
End=97
link(onEvent,3011000:doAdd,[(198,132)(198,76)])
}
Add(Hub,1485132,112,35)
{
link(onEvent1,3011000:doClear,[(207,41)(207,83)])
link(onEvent2,3011000:doColor,[(193,48)(193,90)])
}
END_SDK
Add(StrList,12081361,406,364)
{
Strings=#8:16711680|3:255|
}
Add(ArrayEnum,9854582,420,434)
{
link(onItem,16305805:##add,[])
link(Array,12081361:Array,[])
}
Add(ChanelToIndex,8337345,315,413)
{
link(onIndex,8375845:doEvent1,[])
}
Add(Hub,8375845,371,413)
{
OutCount=3
link(onEvent1,16305805:##clear,[(459,419)(459,454)])
link(onEvent2,9854582:doEnum,[(410,426)(410,440)])
link(onEvent3,16305805:##select,[(403,433)(403,475)(466,475)(466,447)])
}


Если используются разные алгоритмы отрисовки, то тогда надо применить полиморфный контейнер.
P.S. Все это только пример для понимания. И тут получится довольно сложная динамическая схема, с кэшированием, если требуется мгновенно перенести графики в разные слои. И графики придется перерисовать в той цветовой последовательности, в которой необходимо, при помощи последовательного вызова нужных контейнеров. Все это можно сделать, конечно, и без контейнеров, но схема получится аховой, с кучей повторяющихся элементов. С контейнерами проще, тк можно все их разом уничтожить и пересоздать в нужной последовательности.

Редактировалось 7 раз(а), последний 2024-10-07 03:11:00
карма: 22

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#3: 2024-10-07 03:15:43 ЛС | профиль | цитата
Можешь посмотреть пример динамической отрисовки графиков в примере из вот этой темы. Там не самая последняя версия программы, но она пойдет в качестве примера -- https://forum.hiasm.com/topic/68014

Редактировалось 1 раз(а), последний 2024-10-07 03:16:36
карма: 22

0
Ответов: 773
Рейтинг: 168
#4: 2024-10-07 06:15:19 ЛС | профиль | цитата
RomanRoman писал(а):
От чего это зависит?

nesco писал(а):
От того, какой элемент инициализируется первым при старте программы.

Я немного добавлю.
У каждого визуального элемента есть три координаты
X(Left) – Отступ элемента слева.
Y(Top) - Отступ элемента от верха.
Z – Порядок отрисовки элемента на форме
Посмотреть Z координату можно открыв "Дерево проекта". https://forum.hiasm.com/wiki/5069
Перемещать элементы по дереву можно стрелочками (расположены внизу) или обычным перетаскиванием мышкой.
Элементы, находящиеся ниже на этом дереве находятся выше на форме.

Редактировалось 1 раз(а), последний 2024-10-07 06:24:25
карма: 15

1
Голосовали:nesco
Разработчик
Ответов: 26113
Рейтинг: 2126
#5: 2024-10-07 14:15:20 ЛС | профиль | цитата
Gunta, все правильно. Отличное уточнение.
карма: 22

0
Ответов: 18
Рейтинг: 0
#6: 2024-10-07 18:23:34 ЛС | профиль | цитата
Спасибо всем за обсуждение. В моём случае надо было из четырёх линий прорисовывать поверх остальных лишь одну главную (порядок других линий без разницы). Проблему решил нажатием на элемент PlotLines, затем правой кнопкой мыши через контекстное меню указал «Передний план», всё получилось.
карма: 0

0
6
Сообщение
...
Прикрепленные файлы
(файлы не залиты)