Посторонним В.


Следопыт



правда, это далеко не последняя версия


@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[]]