УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

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


Автор Сообщение
Сообщение создано: 03. 03. 2020 [17:12]
zmulian
Дмитрий Злобин
Создатель темы
Зарегистрирован(а) с: 27.06.2016
Сообщения: 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: Пробовал разное направление заливки - безрезультатно. Мои подозрения - дуга имеет разрывы. Но как это подтвердить или опровергнуть не знаю.
Может точки дуги улетают маленько не туда (хотя в редакторе все нормально). Кривые Безье пока не пробовал (они должны быть непрерывны по определению). И еще. Не могу добавить дополнительные цвета и точки на виджет для динамики. Цвета добавляются (присутствуют), но рисует только черным. Динамические точки добавляются, но не работают.
Приходится брать другие виджеты с большим количеством цветов и точек и править их .
Сообщение создано: 03. 03. 2020 [20:08]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
Сообщение создано: 04. 03. 2020 [04:07]
zmulian
Дмитрий Злобин
Создатель темы
Зарегистрирован(а) с: 27.06.2016
Сообщения: 11
Роман, извините, все перечитал. И все перепробовал.
То что Вы нарисовали на сегментированный круг не походит совершенно.
Нужно использовать свою линию на каждый контур? Общие нельзя?
Вложенный файл

ваш вариант.png (Тип файла: image/png, Размер: 35.76 килобайт) — 1155 загрузок
Сообщение создано: 04. 03. 2020 [06:42]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"zmulian" wrote:

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

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

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

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

Learn, learn and learn better than work, work and work.
Вложенный файл

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

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

проба на бак.png (Тип файла: image/png, Размер: 10.43 килобайт) — 1164 загрузок
tt0.db (Тип файла: application/octet-stream, Размер: 72 килобайт) — 1194 загрузок
Сообщение создано: 09. 03. 2020 [08:25]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"roman" wrote:

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

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

Learn, learn and learn better than work, work and work.
Вложенный файл

wlb_test.wdg_test123.png (Тип файла: image/png, Размер: 758 байт) — 1151 загрузок
Сообщение создано: 09. 03. 2020 [08:56]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
Сообщение создано: 09. 03. 2020 [10:06]
zmulian
Дмитрий Злобин
Создатель темы
Зарегистрирован(а) с: 27.06.2016
Сообщения: 11
"roman" wrote:

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

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

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



15738