initial
This commit is contained in:
70
templates/index.html
Normal file
70
templates/index.html
Normal file
@@ -0,0 +1,70 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>STEP Analyser (intern)</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, system-ui, sans-serif;
|
||||
margin: 40px;
|
||||
max-width: 900px;
|
||||
}
|
||||
.card {
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 12px;
|
||||
padding: 16px;
|
||||
}
|
||||
label {
|
||||
display: block;
|
||||
margin-top: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
input,
|
||||
select {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
margin-top: 6px;
|
||||
}
|
||||
button {
|
||||
margin-top: 16px;
|
||||
padding: 10px 14px;
|
||||
border-radius: 10px;
|
||||
border: 1px solid #333;
|
||||
background: #111;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
small {
|
||||
color: #666;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>STEP Analyser (intern)</h1>
|
||||
<div class="card">
|
||||
<form action="/analyse" method="post" enctype="multipart/form-data">
|
||||
<label>STEP Datei</label>
|
||||
<input type="file" name="stepfile" accept=".step,.stp" required />
|
||||
|
||||
<label>Material</label>
|
||||
<select name="material">
|
||||
{% for key, label in materials %}
|
||||
<option value="{{key}}">{{label}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
||||
<label
|
||||
>Blechstärke (mm)
|
||||
<small>(optional – leer lassen für Auto-Erkennung)</small></label
|
||||
>
|
||||
<input type="text" name="thickness_mm" placeholder="z.B. 1.0" />
|
||||
|
||||
<button type="submit">Analysieren</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<p style="margin-top: 14px">
|
||||
<small>Internes Tool. Läuft nur auf 127.0.0.1:5055.</small>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
322
templates/result.html
Normal file
322
templates/result.html
Normal file
@@ -0,0 +1,322 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Ergebnis – STEP Analyser</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, system-ui, sans-serif;
|
||||
margin: 40px;
|
||||
max-width: 1100px;
|
||||
}
|
||||
.card {
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 12px;
|
||||
padding: 16px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.ok {
|
||||
color: #0a7;
|
||||
font-weight: 700;
|
||||
}
|
||||
.bad {
|
||||
color: #c00;
|
||||
font-weight: 700;
|
||||
}
|
||||
pre {
|
||||
background: #111;
|
||||
color: #eee;
|
||||
padding: 12px;
|
||||
border-radius: 10px;
|
||||
overflow: auto;
|
||||
}
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
td {
|
||||
padding: 8px;
|
||||
border-bottom: 1px solid #eee;
|
||||
vertical-align: top;
|
||||
}
|
||||
.muted {
|
||||
color: #666;
|
||||
}
|
||||
a {
|
||||
color: #06c;
|
||||
}
|
||||
code {
|
||||
background: #f4f4f4;
|
||||
padding: 2px 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 16px;
|
||||
}
|
||||
@media (max-width: 1000px) {
|
||||
.grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.tip {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 999px;
|
||||
border: 1px solid #bbb;
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
margin-left: 6px;
|
||||
cursor: help;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.viewerWrap {
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
}
|
||||
.viewerHeader {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px 12px;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.viewer {
|
||||
width: 100%;
|
||||
height: 520px;
|
||||
background: #fff;
|
||||
}
|
||||
.viewer object {
|
||||
width: 100%;
|
||||
height: 520px;
|
||||
display: block;
|
||||
}
|
||||
.btn {
|
||||
display: inline-block;
|
||||
padding: 8px 10px;
|
||||
border-radius: 10px;
|
||||
border: 1px solid #333;
|
||||
background: #111;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
}
|
||||
.btn.secondary {
|
||||
background: #fff;
|
||||
color: #111;
|
||||
border-color: #bbb;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Ergebnis</h1>
|
||||
|
||||
<div class="card">
|
||||
{% if result.ok %}
|
||||
<div class="ok">OK</div>
|
||||
{% else %}
|
||||
<div class="bad">FEHLER</div>
|
||||
{% endif %}
|
||||
<p class="muted">Job: {{ result._job.id }} – {{ result._job.dir }}</p>
|
||||
</div>
|
||||
|
||||
{% if result.ok %}
|
||||
<div class="grid">
|
||||
<div class="card">
|
||||
<h2>Input</h2>
|
||||
<table>
|
||||
<tr>
|
||||
<td>Datei</td>
|
||||
<td>{{ result.input.step_filename }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Material</td>
|
||||
<td>{{ result.input.material }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Dichte (kg/m³)</td>
|
||||
<td>{{ result.input.density_kg_m3 }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Blechstärke (mm)</td>
|
||||
<td>{{ "%.3f"|format(result.input.thickness_mm) }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>K-Faktor</td>
|
||||
<td>{{ result.input.k_factor }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h2>Flächen & Bounding Box</h2>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
Nettofläche (m²)
|
||||
<span
|
||||
class="tip"
|
||||
title="Nettofläche der tatsächlichen Kontur (Innenkonturen/Lochausschnitte sind abgezogen). Das ist die 'wirkliche' Materialfläche."
|
||||
>?</span
|
||||
>
|
||||
</td>
|
||||
<td>{{ result.flat.area_net_m2 }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Bruttofläche BBox (m²)
|
||||
<span
|
||||
class="tip"
|
||||
title="Bruttofläche = Rechteck um die komplette Entfaltung (Bounding Box). Entspricht eurer ersten internen Näherung für Blechbedarf ohne Nesting."
|
||||
>?</span
|
||||
>
|
||||
</td>
|
||||
<td>{{ result.flat.area_bbox_m2 }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
BBox Breite X (mm)
|
||||
<span
|
||||
class="tip"
|
||||
title="X-Abmessung des umschreibenden Rechtecks der Entfaltung."
|
||||
>?</span
|
||||
>
|
||||
</td>
|
||||
<td>{{ result.flat.bbox_mm.width_mm }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
BBox Höhe Y (mm)
|
||||
<span
|
||||
class="tip"
|
||||
title="Y-Abmessung des umschreibenden Rechtecks der Entfaltung."
|
||||
>?</span
|
||||
>
|
||||
</td>
|
||||
<td>{{ result.flat.bbox_mm.height_mm }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
BBox Fläche (mm²)
|
||||
<span
|
||||
class="tip"
|
||||
title="BBox Fläche = X * Y in mm² (nur zur schnellen Plausibilitätsprüfung)."
|
||||
>?</span
|
||||
>
|
||||
</td>
|
||||
<td>{{ result.flat.area_bbox_mm2 }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid">
|
||||
<div class="card">
|
||||
<h2>Gewicht</h2>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
Netto (kg)
|
||||
<span
|
||||
class="tip"
|
||||
title="Gewicht aus Nettofläche * Dicke * Dichte."
|
||||
>?</span
|
||||
>
|
||||
</td>
|
||||
<td>{{ result.weight.net_kg }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Brutto BBox (kg)
|
||||
<span
|
||||
class="tip"
|
||||
title="Gewicht aus Bruttofläche (BBox) * Dicke * Dichte. Gut als Worst-Case ohne Nesting."
|
||||
>?</span
|
||||
>
|
||||
</td>
|
||||
<td>{{ result.weight.bbox_kg }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h2>Artefakte</h2>
|
||||
<table>
|
||||
<tr>
|
||||
<td>DXF Download</td>
|
||||
<td>
|
||||
<a class="btn" href="{{ result._job.dxf_download_url }}"
|
||||
>flat.dxf öffnen</a
|
||||
>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DXF Preview</td>
|
||||
<td class="muted">{{ result._job.svg_preview_url }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Log</td>
|
||||
<td class="muted">{{ result._job.log_file }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class="muted">
|
||||
Hinweis: Preview ist eine SVG-Renderung aus der DXF (für schnelle
|
||||
Sichtprüfung).
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card viewerWrap">
|
||||
<div class="viewerHeader">
|
||||
<div>
|
||||
<strong>DXF Preview</strong>
|
||||
<span class="muted">({{ result.input.step_filename }})</span>
|
||||
</div>
|
||||
<div>
|
||||
<a class="btn secondary" href="/">neue Analyse</a>
|
||||
<a class="btn" href="{{ result._job.dxf_download_url }}">DXF</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="viewer">
|
||||
<object data="{{ result._job.svg_preview_url }}" type="image/svg+xml">
|
||||
<div style="padding: 16px" class="muted">
|
||||
Preview konnte nicht geladen werden.
|
||||
</div>
|
||||
</object>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if result.warnings and result.warnings|length > 0 %}
|
||||
<div class="card">
|
||||
<h2>Warnings</h2>
|
||||
<ul>
|
||||
{% for w in result.warnings %}
|
||||
<li>{{ w }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %} {% else %}
|
||||
<div class="card">
|
||||
<h2>Fehlerdetails</h2>
|
||||
<p><strong>{{ result.error_type }}:</strong> {{ result.error }}</p>
|
||||
{% if result.traceback %}
|
||||
<pre>{{ result.traceback }}</pre>
|
||||
{% endif %} {% if result.log_tail %}
|
||||
<h3>Log Tail</h3>
|
||||
<pre>{{ result.log_tail }}</pre>
|
||||
{% endif %}
|
||||
<p class="muted">Log: {{ result._job.log_file }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<p><a href="/">← zurück</a></p>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user