Посторонним В.Следопыт |
правда, это далеко не последняя версия @mainInConnect[] $DATA[^sqlite::initBase[]] $dt[^date::now[]] ^switch[$form:type]{ ^case[daily]{ ^plotDaily[ $.data[^DATA.getValuesThermo[ 1; ^eval(^dt.unix-timestamp[]-$dt.hour*3600-$dt.minute*60-$dt.second); ^dt.unix-timestamp[] ]] $.minY(-20) $.maxY(20) $.scaleY(8) $.countLabelY(8) $.countY(16) $.minX(0) $.maxX(24) $.scaleX(20) $.countX(24) $.scaleValueX(60) # values per scale pixels $.countLabelX(24) $.offsetX(30) $.offsetY(20) ]} ^case[DEFAULT]{ ^plotDaily[ $.data[^DATA.getValuesThermo[ 1; ^eval(^dt.unix-timestamp[]-$form:hour*3600-$dt.minute*60-$dt.second); ^eval(^dt.unix-timestamp[]-($form:hour-1)*3600) ]] $.minY(-20) $.maxY(20) $.scaleY(8) $.countLabelY(8) $.countY(16) $.minX(0) $.maxX(60) $.scaleX(30) $.countX(12) $.scaleValueX(4) # values per scale pixels $.countLabelX(12) $.offsetX(30) $.offsetY(20) ]} } } ##################################################################### # # @plotDaily[p][trend;trendPixels;height;width;zero;stepY;median;tempValue;statMed;statMax;statMin] $height(^eval(($p.maxY - $p.minY) * $p.scaleY)) $width(^eval($p.scaleX * $p.countX)) $zero(^eval($p.maxY * $p.scaleY)) $stepY(^eval(($p.maxY - $p.minY) / $p.countY * $p.scaleY * ($p.countY / $p.countLabelY) )) $trend[^image::create(^eval($p.offsetX + $width + 20);^eval(50 + $p.offsetY + $height))] # Fonts and text ^trend.font[абвгдежзиклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz1234567890/()!?%.:,-;fonts.gif](5) ^trend.text($p.offsetX;10)[^p.data.count[] точек, шаг по y - $stepY] ^for[i](0;$p.countLabelY){ $t[^eval($p.maxY - $i * (($p.maxY - $p.minY) / $p.countLabelY))] ^trend.text( ^eval($p.offsetX - ^trend.length[$t] - 3) ; ^eval($p.offsetY + $i * $stepY - 2) )[$t] } ^for[i](0;$p.countX){ ^trend.text(^eval($i * $p.scaleX + $p.offsetX);^eval($p.offsetY + $height + 5))[^eval(($p.maxX - $p.minX) / $p.countLabelX * $i)] } # Draw lines ^trend.rectangle($p.offsetX;$p.offsetY;^eval($p.offsetX + $width);^eval($p.offsetY + $height);0x000000) $trend.line-style[* ] ^for[i](1;^eval($p.countX - 1)){ ^trend.line(^eval($p.offsetX + $i * $p.scaleX); $p.offsetY; ^eval($p.offsetX + $i * $p.scaleX); ^eval($p.offsetY + $height); 0xAAAAAA) } ^for[i](1;^eval($p.countY - 1)){ ^trend.line($p.offsetX; ^eval($p.offsetY + $i * ($p.maxY - $p.minY) / $p.countY * $p.scaleY); ^eval($p.offsetX + $width); ^eval($p.offsetY + $i * ($p.maxY - $p.minY) / $p.countY * $p.scaleY); 0xAAAAAA) } $trend.line-style[*] # Zero line ^trend.line($p.offsetX;^eval($p.offsetY + $zero);^eval($p.offsetX + $width);^eval($p.offsetY + $zero);0x000000) # рисуем график # количество точек в пикселе (если >1 - округление значений в точке) $median(^eval($p.scaleValueX \ $p.scaleX)) ^if($median == 0){$median(1)} $i(0) $tempValue(0) $statMed(0) $statMax(0) $statMin(1000) $trendPixels[^table::create{x y }] ^trend.text($p.offsetX + 200;^eval($p.offsetY + $height + 20))[$median точек на пиксел] ^p.data.menu{ ^tempValue.inc($p.data.value) ^statMed.inc($p.data.value) ^i.inc[] ^if($p.data.value > $statMax){$statMax($p.data.value)} ^if($p.data.value < $statMin){$statMin($p.data.value)} ^if($i >= $median){ ^trendPixels.append{^eval(^p.data.offset[] / ($p.scaleValueX / $p.scaleX) + $p.offsetX)[%d] ^eval($p.offsetY + $zero - $tempValue / $median * $p.scaleY)[%d]} $i(0) $tempValue(0) } } # выводим статистику ^trend.text($p.offsetX;^eval($p.offsetY + $height + 20))[ средняя: ^statMed.div(^p.data.count[]) ^statMed.format[%.1f] град] ^trend.text($p.offsetX;^eval($p.offsetY + $height + 30))[ минимум: ^statMin.format[%.1f] град] ^trend.text($p.offsetX;^eval($p.offsetY + $height + 40))[максимум: ^statMax.format[%.1f] град] $trend.line-width[2] ^trend.polyline(0x009911)[$trendPixels] # Возврат картинки $response:body[^trend.gif[]] |