вторник, 15 марта 2011 г.

Графические индикаторы LUA+CAIRO

Индикаторы созданные с помощью LUA+CAIRO очень разнообразны, в отличии от индикаторов классических конок.

Всё, что связано с временем, процентами, размерами и подобными величинами, можно вывести в окно конки. Принцип создания индикаторов, с помощью lua+cairo один и тот же, это просто перевод выводимого параметра в линейную величину. Во время создания любого индикатора я беру за основу вывод секунд, это самый быстрый способ увидеть результат буквально в течении минуты, так как не надо ждать когда, например, процессор нагрузится на 100%.

Для работы индикатора необходимо забрать выводимый параметр. Это можно сделать присваивая значения выводимого параметра (все примеры будут основаны на выводе секунд)

seconds = os.date("%S")

или

seconds = conky_parse ("${time %S}")

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

назначаем начальную точку вывода бара

cairo_move_to (cr, x, y)

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

cairo_line_to (cr, x + seconds, y)

всё работает, но при выводе такой командой длина бара зависит от выводимого параметра. Если таким способом вывести скорость интернета, то при наибольшей скорости может не хватить не только окна конки, но и экрана монитора. Это можно решить следующим образом.

Задаем длину бара

width = 200

Добавляем максимальное значение выводимого параметра, для секунд равное 60

max = 60

Длину выводимого параметра вычисляем простой пропорцией

width * seconds / max

Теперь команда вывода бара выглядит так

cairo_line_to (cr, x + width * seconds / max)

Немного сложнее вывод кругового индикатора. Сначала нужно перевести значения начального и конечного углов в радианную меру и заодно сместим начало вывода окружности на 90 градусов.

angle_0 = start_angle * (math.pi / 180) - math.pi / 2
angle_f = finish_angle * (math.pi / 180) - math.pi / 2

Так как команда вывода окружности (дуги) имеет вид

cairo_arc (cr, x, y, radius, angle_0, angle_f)

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

angle_f - angle_0

получаем подобие width в баре и по аналогии задаём вывод дуги

cairo_arc(cr, x, y, radius, angle_0, angle_0 + (angle_f - angle_0) * secongs / max)

Лучшие, по моему личному мнению, скрипты выводящие бары и кольца, были созданы любителем конок из франции wlourf.

Ссылка на его статьи в его блоге  bargraph-widget и rings-sectors-widgets. Статьи на английском, но преимущественно состоят из примеров. Там же ссылки на его скрипты.

2 комментария:

  1. как к этим индикаторам привязать датчики?
    Как сделать поверхность индикаторов "в виде пилы"http://itmages.ru/image/view/81344/2f980322 ?

    ОтветитьУдалить
  2. Начал описание, как закончу, выложу.

    ОтветитьУдалить