{% extends "base.html" %} {% block title %}SPC · {{ summary.template_name }}{% endblock %} {% block heading %}📊 SPC · {{ summary.template_name }}{% endblock %} {% block breadcrumb %}

SPC / {{ summary.template_name }}

{% endblock %} {% block content %}
{% for p in summary.points %} {{ p.name }} {% if p.cpk is not none %} · Cpk {{ "%.2f"|format(p.cpk) }} {% endif %} {% endfor %}
Stichprobe
{{ chart.n }}
Mittelwert
{% if chart.mean is not none %}{{ "%.4f"|format(chart.mean) }}{% else %}—{% endif %}
σ (Sigma)
{% if chart.sigma is not none %}{{ "%.4f"|format(chart.sigma) }}{% else %}—{% endif %}
Cp
{% if chart.cp is not none %}{{ "%.2f"|format(chart.cp) }}{% else %}—{% endif %}
Cpk
{% if chart.cpk is not none %}{{ "%.2f"|format(chart.cpk) }}{% else %}—{% endif %}
Außer Spec
{{ chart.out_of_spec_count }}

{{ chart.point_name }} {% if chart.unit %}[{{ chart.unit }}]{% endif %}

Sollwert: {{ chart.nominal }} · USL: {{ chart.usl }} · LSL: {{ chart.lsl }} {% if chart.ucl is not none %} · UCL (3σ): {{ "%.4f"|format(chart.ucl) }} · LCL (3σ): {{ "%.4f"|format(chart.lcl) }} {% endif %}

{% if chart.n == 0 %}

Keine Mess-Werte für diesen Punkt vorhanden.

{% else %} {# Spannweite y-Achse: max(USL+10%, max-Wert) bis min(LSL-10%, min-Wert) #} {% set min_v_data = chart['values'] | map(attribute='value') | min %} {% set max_v_data = chart['values'] | map(attribute='value') | max %} {% set span = chart.usl - chart.lsl %} {% set pad = (span * 0.20) if span > 0 else 1 %} {% set y_min = [chart.lsl - pad, min_v_data]|min %} {% set y_max = [chart.usl + pad, max_v_data]|max %} {% set y_range = y_max - y_min if y_max > y_min else 1 %} {% set chart_w = 1000 %} {% set chart_h = 360 %} {% set padding_left = 70 %} {% set padding_right = 30 %} {% set padding_top = 20 %} {% set padding_bottom = 50 %} {% set inner_w = chart_w - padding_left - padding_right %} {% set inner_h = chart_h - padding_top - padding_bottom %} {% macro y_pos(v) -%} {{- padding_top + ((y_max - v) / y_range * inner_h) -}} {%- endmacro %} {% macro x_pos(i, total) -%} {{- padding_left + ((i / [total-1, 1]|max) * inner_w) -}} {%- endmacro %}
{% for frac in [0, 0.25, 0.5, 0.75, 1] %} {% set y = padding_top + (frac * inner_h) %} {% set v_at = y_max - (frac * y_range) %} {{ "%.3f"|format(v_at) }} {% endfor %} USL: {{ "%.4f"|format(chart.usl) }} LSL: {{ "%.4f"|format(chart.lsl) }} Nominal: {{ chart.nominal }} {% if chart.mean is not none %} x̄: {{ "%.4f"|format(chart.mean) }} {% endif %} {% if chart.ucl is not none %} UCL LCL {% endif %} {% for v in chart['values'] %} #{{ loop.index }} · {{ v.ts[:16] }} · {{ v.value }}{{ chart.unit }}{% if not v.in_spec %} (außer Spec){% endif %}{% if v.serial_no %} · S/N {{ v.serial_no }}{% endif %} {% endfor %} {# X-Tick alle 10. Wert (oder bei n<=20 jeden) #} {% set step = 1 if chart.n <= 20 else (chart.n // 10) %} {% for v in chart['values'] %} {% if loop.index0 % step == 0 or loop.last %} {{ loop.index }} {% endif %} {% endfor %} Mess-Index (chronologisch)

🔴 = außerhalb Spec · 🔵 = innerhalb Spec · Rot gestrichelt = USL/LSL (Toleranz-Grenzen) · Orange gestrichelt = UCL/LCL (statistische 3σ-Grenzen) · Grün durchgezogen = Mittelwert · Blau gestrichelt = Sollwert

{% endif %}
{% if chart['values'] %}

Letzte Mess-Werte

{{ chart['values']|length }} Stichproben

{% for v in chart['values'] | reverse %} {% endfor %}
# Zeitstempel Serien-Nr Wert In Spec?
{{ chart['values']|length - loop.index0 }} {{ v.ts[:16] }} {{ v.serial_no or '—' }} {{ v.value }} {{ chart.unit }} {% if v.in_spec %} {% else %} ✗ außer Spec {% endif %}
{% endif %} {% endblock %}