EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

Вопрос по виджету ElFigure


Author Message
Written on: 03. 03. 2020 [17:12]
zmulian
Дмитрий Злобин
Topic creator
registered since: 27.06.2016
Posts: 11
Доброго времени суток...
Вопрос по виджету ElFigure. Вернее с заливкой ElFigure.
Заливка замкнутой области по точкам ограниченной отрезками происходит нормально.
Но при использовании дуг происходит нечто невообразимое. Захочет зальется, не захочет не зальется.
Сегмент криволинейной фигуры заливается один. На пробу предлагаю тест. Круг разделен на 4 сегмента.
Каждый сегмент должен быть закрашен в свой цвет. Поначалу не красилось вовсе. Потом перенес синюю закраску наверх. И она закрасилась.
Потом вниз. Все равно осталась синяя. Как работает закраска - кто знает?! Вроде все делаю правильно. Пользуюсь стабильной версией.
Ошибиться просто негде. Тест. Может кто победит?

arc:(50|10):(90|50):(50|50):(50|90):(90|50):::::
arc:(90|50):(50|90):(50|50):(50|90):(90|50):::::
arc:(50|90):(10|50):(50|50):(50|90):(90|50):::::
arc:(10|50):(50|10):(50|50):(50|90):(90|50):::::
line:(50|50):(10|50):::::
line:(50|50):(50|10):::::
line:(50|50):(90|50):::::
line:(50|50):(50|90):::::
fill:(10|50):(50|50):(50|90):red:
fill:(50|10):(50|50):(10|50):green:
fill:(50|90):(50|50):(90|50):yellow:
fill:(90|50):(50|50):(50|10):blue:

Даже дуги окружности разбиты на части. Но или не красит вовсе или красит только синий. Попробуйте кто нибудь.
PS: Пробовал разное направление заливки - безрезультатно. Мои подозрения - дуга имеет разрывы. Но как это подтвердить или опровергнуть не знаю.
Может точки дуги улетают маленько не туда (хотя в редакторе все нормально). Кривые Безье пока не пробовал (они должны быть непрерывны по определению). И еще. Не могу добавить дополнительные цвета и точки на виджет для динамики. Цвета добавляются (присутствуют), но рисует только черным. Динамические точки добавляются, но не работают.
Приходится брать другие виджеты с большим количеством цветов и точек и править их .
Written on: 03. 03. 2020 [20:08]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
У меня всё работает!
Документацию читаем: http://oscada.org/wiki/Special:MyLanguage/Modules/Vision#ElFigure

А такое работать и не будет, из-за группы противоречивых контуров, стройте сектора из отдельных элементов, линий, как минимум в местах соединения с дугой, такое работает:
arc:(55|8):(95|48):(55|48):(55|88):(95|48):::::
arc:(95|53):(55|93):(55|53):(55|93):(95|53):::::
arc:(50|93):(10|53):(50|53):(50|93):(90|53):::::
arc:(10|51):(50|11):(50|51):(50|91):(90|51):::::
line:(50|49):(10|51):::::
line:(50|49):(50|11):::::
line:(95|48):(50|49):::::
line:(50|49):(50|93):::::
line:(50|49):(95|53):::::
line:(50|49):(55|8):::::
line:(50|49):(55|93):::::
line:(50|49):(10|53):::::
fill:(50|49):(10|53):(50|93):red:
fill:(50|49):(55|93):(95|53):green:
fill:(50|49):(55|8):(95|48):blue:
fill:(50|49):(50|11):(10|51):yellow:



Learn, learn and learn better than work, work and work.
Written on: 04. 03. 2020 [04:07]
zmulian
Дмитрий Злобин
Topic creator
registered since: 27.06.2016
Posts: 11
Роман, извините, все перечитал. И все перепробовал.
То что Вы нарисовали на сегментированный круг не походит совершенно.
Нужно использовать свою линию на каждый контур? Общие нельзя?
Attachment

ваш вариант.png (File type: image/png, Size: 35.76 kilobytes) — 1154 downloads
Written on: 04. 03. 2020 [06:42]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"zmulian" wrote:

Нужно использовать свою линию на каждый контур? Общие нельзя?

Я не автор кода этого примитива, поэтому если такое нужно Вам, то правьте, это OpenSource!

Задачи по этому примитиву тут: http://oscada.org/wiki/Special:MyLanguage/Works/To_do#TestOptFix

А вообще, это особенность не общих линий, а точек дуг, которые очень специфично обрабатываются и точки начала и конца неодинаковы.
С кривой Безье должно нормально работать, как с линиями на вложенном изображении!

Learn, learn and learn better than work, work and work.
Attachment

wlb_test.wdg_test123.png (File type: image/png, Size: 809 bytes) — 1150 downloads
Written on: 04. 03. 2020 [08:07]
zmulian
Дмитрий Злобин
Topic creator
registered since: 27.06.2016
Posts: 11
Спасибо Роман за ответ. Тем более такой оперативный. Что то такое подобное я и предполагал.
А можете ради примера кривыми Безье сделать то же самое (сегментированный груг) и выложить в виде текста?
Written on: 04. 03. 2020 [09:37]
zmulian
Дмитрий Злобин
Topic creator
registered since: 27.06.2016
Posts: 11
Все замечательно получилось. Это я про заливку.
Просто не знал как кривые Безье использовать. Пришлось вначале в редакторе (не могу его терпеть, проще ручками).
Теперь стоит задача поиска точки пересечения кривой Безье с прямой. С эллипсом все просто, поэтому и хотел использовать поначалу эллиптическую дугу.
Пожалуй Безье лучше использовать. Четырех точечная Безье легко вырождается в радиальную дугу и вообще замечательно работает как четверть эллипса.....
Written on: 09. 03. 2020 [00:01]
zmulian
Дмитрий Злобин
Topic creator
registered since: 27.06.2016
Posts: 11
Попробовал сделать динамическую заливку. На примере бака для воды с кривыми Безье.
Заполнение бака от 0 до 100%.
Ничего проще не придумал, как разбить кривую на две.
В принципе получилось. Но тормозит жутко. Виджет обрабатывается за полторы - две секунды.
Тормозит JavaLikeCalc. Три четверти из виджета можно выбросить. Но формулы нужно оставить.
На разбивку кривой Безье уходит чуть меньше 0,2 секунды. Плюс 1 - 2 миллисекунды на каждое присвоение. Плюс сама заливка.
Точки специально оставил все. А их там куча. Если что то подобное делать то только на Сях. Останутся только присвоения. Но это будет уже меньше по времени.
Кстати как на JavaLikeCalc выполнить при возврате из функции выдачу нескольких переменных. (если можно примерчик)
Пробовал подобным образом
fn = function (a, b) {
return [a, b];
};
Не проканало. Пришлось массивами.

В вложении картинка и база с виджетом.
Какие есть соображения по ускорению подобных виджетов?
Attachment

проба на бак.png (File type: image/png, Size: 10.43 kilobytes) — 1164 downloads
tt0.db (File type: application/octet-stream, Size: 72 kilobytes) — 1193 downloads
Written on: 09. 03. 2020 [08:25]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"roman" wrote:

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

Да, заполнение отключалось для общих точек с разных дуг, причём в WebVision такого не было — убрал, теперь работает.

Learn, learn and learn better than work, work and work.
Attachment

wlb_test.wdg_test123.png (File type: image/png, Size: 758 bytes) — 1151 downloads
Written on: 09. 03. 2020 [08:56]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"zmulian" wrote:

В принципе получилось. Но тормозит жутко. Виджет обрабатывается за полторы - две секунды.

В нотациях циклического исполнения это не тормозит, а задача объективно продолжительная, для которой период обновления мал, поставить в 10 секунд!

"zmulian" wrote:

Точки специально оставил все. А их там куча. Если что то подобное делать то только на Сях. Останутся только присвоения. Но это будет уже меньше по времени.

Такого рода неоптимальные алгоритмы и методы преодоления ограничения декларативности на любом языке медленны, относительно их уровня и масштаба!

Кроме того, вовсе не факт, что передача большой кучи данных и рендеринг всего этого визуализатором примитива ElFigure не занимает больше время, чем формирование, что кстати наблюдается на примитиве "Документ" при формировании больших отчётов, когда и JavaLikeCalc генерирует это быстро и передаётся оно визуализатору быстро, а WebKit рендерит всё это на порядок дольше, и что точно будет с SVG.

"zmulian" wrote:

Кстати как на JavaLikeCalc выполнить при возврате из функции выдачу нескольких переменных. (если можно примерчик)

В документации, кстати, всё это написано! Начну брать деньги за консультацию или прекращу отвечать, как обычно!

В объекте, хотя аргументы функции вообще RW, т.е.:
JAVASCRIPT
fn = function (a, b) {
   a = b = 1.34;
};


"zmulian" wrote:

Какие есть соображения по ускорению подобных виджетов?

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

В любом случае, мне достаточно того что есть, да и задач таких нет, чтобы придумывать-расширять декларативность концепции ElFigure, например — процентом заполнения цветом по горизонтали и вертикали!

"zmulian" wrote:

Пришлось вначале в редакторе (не могу его терпеть, проще ручками).

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

Learn, learn and learn better than work, work and work.
Written on: 09. 03. 2020 [10:06]
zmulian
Дмитрий Злобин
Topic creator
registered since: 27.06.2016
Posts: 11
"roman" wrote:

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

В любом случае, мне достаточно того что есть, да и задач таких нет, чтобы придумывать-расширять декларативность концепции ElFigure, например — процентом заполнения цветом по горизонтали и вертикали!

Спасибо, Роман, за быстрый ответ.
С Уровнем буду пробовать.
В своем случае объясню. Пришел заказчик ткнул пальцем в экран с MasterScada и OpenScada (стоит несколько мониторов, на которых крутиться и MasterScada и OpenScada). На MasterScada имеется бак с процентным заполнением (не знаю что там стоит, но датчик выдает float). На OpenScada бак с электродными датчиками (НАУ, ВАУ, НРУ, ВРУ). Так вот заказчик спросил почему так. Объяснил ему что баки разные, один меряет уровень давлениями, другой четырмя электродами. Одним словом решил пойти на опережение. Бак заполняется медленно, можно и 10 секунд поставить на виджет. Да ещё и лишнее обрезать. Одним словом попробовал. Хотел шкалы приборов нарисовать (типа стрелочных вольтметров), но это наверно лишнее. Хотя все решаемо. На шкалы приборов можно просто использовать толстую дугу.



10445