function($prop) { $prop['id'] = !empty($prop['id']) ? $prop['id'] : 'needlegauge-' . uniqid(); $prop['style'] = (string)($prop['style'] ?? ''); $prop['items'] = (array)($prop['items'] ?? array()); $prop['scale'] = (array)($prop['scale'] ?? array()); $prop['size'] = first($prop['size'] ?? false, 200); $prop['subtitle'] = (string)($prop['subtitle'] ?? ''); $prop['scale']['angle_start'] = first($prop['scale']['angle_start'], -pi()); $prop['scale']['angle_end'] = first($prop['scale']['angle_end'], 0); $prop['img_height'] = first($prop['img_height'] ?? false, $prop['size'] * max(cos(first($prop['scale']['angle_start'], -pi())), cos(first($prop['scale']['angle_end'], 0)))); ?>

$item) { $item = array_merge($prop['scale'], $item); $item['min'] = first($item['min'] ?? false, 0); $item['max'] = first($item['max'] ?? false, 100); $item['tooltip'] = (string)($item['tooltip'] ?? ''); $item['unit'] = (string)($item['unit'] ?? ''); $item['color'] = $item['color'] ?? false; $item['label'] = (string)first($item['label'] ?? false, ucfirst((string)$item_id)); $vrange = ($item['max'] - $item['min']); $pct_value = clamp(($item['value'] - $item['min']) / $vrange, 0, 1); $needle_angle = -pi() + $item['angle_start'] + ($pct_value * ($item['angle_end'] - $item['angle_start'])); $needle_color = first($item['color'] ?? false, '#888888'); if(is_array($item['color'])) { $color_entry = pick_entry_from_range($item['color'], $item['value']); $needle_color = first($color_entry['color'] ?? false, '#888888'); } $tick_interval = first($item['ticks-every'], $vrange / 20); $label_interval = first($item['value-labels-every'], $vrange / 4); $tick_number = 0; $ticks_html = ''; $min_angle = first($item['angle_start']); $max_angle = first($item['angle_end']); $tick_color = first($item['tick-color'], '#888888'); for($v = $item['min']; $v <= $item['max']; $v += $tick_interval) { $tick_number++; $angle = $min_angle + (($v-$item['min'])/$vrange) * ($max_angle - $min_angle); $x1 = $prop['size']/2 + cos($angle) * $prop['size']*0.38; $y1 = $prop['size']/2 + sin($angle) * $prop['size']*0.38; $x2 = $prop['size']/2 + cos($angle) * $prop['size']*0.41; $y2 = $prop['size']/2 + sin($angle) * $prop['size']*0.41; $ticks_html .= ''; } for($v = $item['min']; $v <= $item['max']; $v += $label_interval) { $tick_number++; $angle = $min_angle + (($v-$item['min'])/$vrange) * ($max_angle - $min_angle); $x1 = $prop['size']/2 + cos($angle) * $prop['size']*0.35; $y1 = $prop['size']/2 + sin($angle) * $prop['size']*0.35; $x2 = $prop['size']/2 + cos($angle) * $prop['size']*0.41; $y2 = $prop['size']/2 + sin($angle) * $prop['size']*0.41; $ticks_html .= ''; $lx = $prop['size']/2 + cos($angle) * $prop['size']*0.45; $ly = $prop['size']/2 + sin($angle) * $prop['size']*0.45; $ticks_html .= ''.($v == 0 ? '0' : $v).''; } ?>