Мне показалось интересным написать что-то подобное на AHK.
#NoEnv
SetWinDelay, 0
SetBatchLines, -1
Gui, Color, 7A92EB
Gui, Font, S13, Verdana
Gui, Add, Text, x95 cWhite, Диаграмма PIE
Gui, Add, GroupBox, x15 y37 w305 h50
Gui, Font, S10 italic
Gui, Add, Text, x40 yp+20 cWhite, Вид:
Gui, Add, Radio, vView xp+75 yp+2, Плоская
Gui, Add, Radio, xp+90 yp Checked, Объёмная
Gui, Add, Text, x10 yp+45 cWhite, %A_space%Заголовок
, размер шрифта в пикселах,`n цвет текста в RGB. Все параметры через "|"
Gui, Font, norm
Gui, Add, Edit, vTitle x15 yp+43 w305 h23 -Wrap
Gui, Font, italic
Gui, Add, Text, x10 yp+40 cWhite, %A_space%Значения и названия меток через запятую
, `n каждая пара с новой строки:
Gui, Font, norm
Gui, Add, Edit, vLabels x15 yp+43 w305 r5 -Wrap
Gui, Font, italic
Gui, Add, Text, x17 yp+105 cWhite, Цвета меток в RGB через запятую:
Gui, Font, norm
Gui, Add, Edit, vColors x15 yp+27 w305 h23 -Wrap
Gui, Font, italic
Gui, Add, GroupBox, x15 yp+35 w305 h86
Gui, Add, Text, xp+32 yp+20 cWhite, Размеры изображения в пикселах
Gui, Add, Text, xp yp+30, Ширина:
Gui, Add, Text, xp+132 yp, Высота:
Gui, Font, norm
Gui, Add, Edit, vWidth xp-65 yp-3 w44 h23 Limit4 Number
Gui, Add, Edit, vHeight xp+127 yp w44 h23 Limit4 Number
Gui, Add, Button, gGo x15 yp+60 w150 h23, Сгенерировать URL
Gui, Add, Button, gGo1 xp+155 yp wp hp, Показать картинку
Gui, Show, w335 h546, Google Chart
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0x203, "WM_LBUTTONDBLCLK")
Return
Go:
Go1:
Values := Names := Title1 := Title2 := Title3 := ""
Gui, 2:Destroy
Gui, Submit, NoHide
Loop, parse, Labels,`n,`r
{
Pos := InStr(A_LoopField, ",")
Values .= (Pos ? SubStr(A_LoopField, 1, Pos - 1) : A_LoopField) . ","
Names .= (Pos ? SubStr(A_LoopField, Pos + 1) : "") . "|"
}
StringTrimRight, Values, Values, 1
StringSplit, Values, Values,`,
max = 0
Loop % Values0
if (Values%a_index% > max)
max := Values%a_index%
if max > 100
{
Values =
div := max / 100
Loop % Values0
Values .= (Values%a_index% / div) ","
StringTrimRight, Values, Values, 1
}
StringTrimRight, Names, Names, 1
Names := CyrToUtf8(Names)
StringSplit, Title, Title,|
Title1 := CyrToUtf8(Title1)
if Title3 =
Title3 = 808080
View := View = 1 ? "p" : "p3"
if !Width
Width = 550
if !Height
Height = 300
if Width > 1000
Width = 1000
if Height > 1000
Height = 1000
if Height * Width > 300000
{
MsgBox,
(LTrim Join
Произведение ширины и высоты не должно пре
вышать 300 000.`nВыберите другие значения!
)
Return
}
if !Values
Values = 3,2,4
Clipboard =
(LTrim Join
http://chart.apis.google.com/chart?cht=%View%&chd=t:%Values%&chs=%Width%
x%Height%&chl=%Names%&chtt=%Title1%&chts=%Title3%,%Title2%&chco=%Colors%
)
if A_ThisLabel = Go
Return
URLDownloadToFile, % Clipboard, %A_ScriptDir%\temp.png
if ErrorLevel
{
MsgBox, Невозможно загрузить изображение!
Return
}
Gui, 2:-Caption +Border +Owner
Gui, 2:Add, Picture, x0 y0 AltSubmit, %A_ScriptDir%\temp.png
GuiControlGet, Pos, 2:Pos, Static1
Gui, 2:Show, w%PosW% h%PosH%, Diagram
Return
2GuiClose:
Gui, 2:Destroy
Return
GuiClose:
ExitApp
#IfWinExist Diagram ahk_class AutoHotkeyGUI
Esc:: Goto, 2GuiClose
#IfWinExist Google Chart ahk_class AutoHotkeyGUI
Esc:: Goto, GuiClose
WM_LBUTTONDBLCLK()
{
if A_Gui = 2
Gosub, 2GuiClose
}
WM_LBUTTONDOWN()
{
WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
if A_Gui = 2
PostMessage, WM_NCLBUTTONDOWN, HTCAPTION
}
CyrToUtf8(String)
{
Cyr = абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
Utf8 =
(LTrim Join %
%D0%B0%D0%B1%D0%B2%D0%B3%D0%B4%D0%B5%D1%91%D0%B6%D0%B7%D0%B8%D0%B9
%D0%BA%D0%BB%D0%BC%D0%BD%D0%BE%D0%BF%D1%80%D1%81%D1%82%D1%83%D1%84
%D1%85%D1%86%D1%87%D1%88%D1%89%D1%8A%D1%8B%D1%8C%D1%8D%D1%8E%D1%8F
%D0%90%D0%91%D0%92%D0%93%D0%94%D0%95%D0%81%D0%96%D0%97%D0%98%D0%99
%D0%9A%D0%9B%D0%9C%D0%9D%D0%9E%D0%9F%D0%A0%D0%A1%D0%A2%D0%A3%D0%A4
%D0%A5%D0%A6%D0%A7%D0%A8%D0%A9%D0%AA%D0%AB%D0%AC%D0%AD%D0%AE%D0%AF
)
Loop, parse, String
{
if (A_LoopField = " ")
StringUtf8 .= "+"
else if A_LoopField = `%
StringUtf8 .= "`%25"
else if !(pos := InStr(Cyr, A_LoopField))
StringUtf8 .= A_LoopField
else StringUtf8 .= SubStr(Utf8, pos * 6 - 5, 6)
}
Return StringUtf8
}
Можно ввести и только один цвет.
Устанавливаем ширину и высоту, скажем, 550 и 300.
Затем, если нажать левую кнопку, будет сгенерирован нужный URL и помещён в буфер обмена. Если правую, то, если есть доступ в интернет, изображение будет скачано с сервера, сохранено в директории скрипта как temp.png и отображено на экране в натуральную величину. Перемещается изображение левой кнопкой мыши, закрывается двойным щелчком или нажатием Esc. Файл сохранится до следующей "закачки".
Все обязательные параметры имеют умолчания: значения меток — 3, 2, 4; ширина — 550, высота — 300, т. е. для тестирования можно жать на кнопку, не вводя в поля ничего.
Я так понял, сервер принимает значения меток до 100 включительно (каждая), если значение больше, оно приравнивается к 100 и пропорции графика искажаются. В скрипте этот недостаток исправлен, можно вводить любые положительные значения.
В принципе, можно развить идею, и написать скрипт для любых видов графиков (там их пять).