This commit is contained in:
2026-01-07 10:19:58 +01:00
27 changed files with 1003 additions and 427 deletions
+150
View File
@@ -0,0 +1,150 @@
#!/usr/bin/env python3
"""
Filtert ein ZIP-Archiv und entfernt alle .stl Dateien.
Ausgabe: originalname_heute.zip (oder ersetzt Original mit --replace)
"""
import zipfile
import sys
import argparse
import shutil
import struct
import zlib
from pathlib import Path
def filter_zip_no_stl(source_zip_path: str, replace: bool = False) -> str:
"""
Öffnet ein ZIP und erstellt ein neues ohne .stl Dateien.
Args:
source_zip_path: Pfad zur Quell-ZIP-Datei
replace: Wenn True, wird das Original ersetzt
Returns:
Pfad zur erstellten/ersetzten ZIP-Datei
"""
source_path = Path(source_zip_path)
if not source_path.exists():
raise FileNotFoundError(f"Datei nicht gefunden: {source_zip_path}")
if not source_path.suffix.lower() == '.zip':
raise ValueError(f"Keine ZIP-Datei: {source_zip_path}")
# Temporäres Ziel-ZIP
temp_path = source_path.with_name(f"{source_path.stem}_heute.zip")
copied_count = 0
skipped_count = 0
print("Filtere ZIP und erstelle neues Archiv mit UTF-8 Encoding...")
with zipfile.ZipFile(source_path, 'r') as src_zip:
with zipfile.ZipFile(temp_path, 'w', zipfile.ZIP_DEFLATED) as dst_zip:
# Iteriere über alle Dateien im Quell-ZIP
for info in src_zip.infolist():
# Verzeichnisse überspringen
if info.is_dir():
continue
# .stl Dateien überspringen
if info.filename.lower().endswith('.stl'):
skipped_count += 1
print(f" - {info.filename}")
continue
# Kopiere Datei ins neue ZIP
try:
# Lese Dateiinhalt
with src_zip.open(info, 'r') as source:
file_data = source.read()
# Schreibe ins neue ZIP (mit UTF-8 Encoding)
dst_zip.writestr(info.filename, file_data, compress_type=zipfile.ZIP_DEFLATED)
copied_count += 1
except Exception as e:
# Fallback: Low-Level Extraktion für problematische Dateien
try:
# Lese direkt aus der ZIP-Datei ohne Validierung
with open(source_path, 'rb') as f:
# Gehe zu Local File Header
f.seek(info.header_offset)
# Lese Local File Header (30 Bytes)
fheader = f.read(30)
if len(fheader) != 30:
raise Exception("Kann Local File Header nicht lesen")
# Parse Header (ZIP Local File Header format)
sig, ver, flags, comp_method, mod_time, mod_date, crc, comp_size, uncomp_size, fname_len, extra_len = struct.unpack('<4s5H3I2H', fheader)
if sig != b'PK\x03\x04':
raise Exception("Ungültiger Local File Header")
# Lese raw filename bytes aus Header
raw_filename_bytes = f.read(fname_len)
# Überspringe Extra Field
f.seek(info.header_offset + 30 + fname_len + extra_len)
# Lese komprimierte Daten
compressed_data = f.read(comp_size)
# Dekomprimiere
if comp_method == 8: # DEFLATE
file_data = zlib.decompress(compressed_data, -zlib.MAX_WBITS)
elif comp_method == 0: # STORED
file_data = compressed_data
else:
raise Exception(f"Unbekannte Kompression: {comp_method}")
# Dekodiere Dateinamen mit latin-1 (ISO-8859-1)
# latin-1 unterstützt deutsche Umlaute korrekt (\xf6 = ö)
correct_filename = raw_filename_bytes.decode('latin-1', errors='replace')
# Schreibe ins neue ZIP mit korrigiertem Namen
dst_zip.writestr(correct_filename, file_data, compress_type=zipfile.ZIP_DEFLATED)
copied_count += 1
print(f" + {correct_filename} (re-encoded)")
except Exception as e2:
print(f" ! Warnung: Konnte {info.filename} nicht kopieren: {e2}")
skipped_count += 1
print(f"\nErgebnis: {copied_count} Datei(en) kopiert, {skipped_count} STL-Datei(en) entfernt")
if replace:
shutil.move(str(temp_path), str(source_path))
print(f"Original ersetzt: {source_path}")
return str(source_path)
else:
print(f"Ziel-ZIP: {temp_path}")
return str(temp_path)
def main():
parser = argparse.ArgumentParser(
description="Filtert ZIP-Archive und entfernt alle .stl Dateien."
)
parser.add_argument(
"zipfile",
help="Pfad zur Quell-ZIP-Datei"
)
parser.add_argument(
"--replace",
action="store_true",
help="Original-ZIP durch gefilterte Version ersetzen"
)
args = parser.parse_args()
try:
filter_zip_no_stl(args.zipfile, args.replace)
except (FileNotFoundError, ValueError, zipfile.BadZipFile) as e:
print(f"Fehler: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
+10
View File
@@ -0,0 +1,10 @@
echo === EXE erstellen ===
@echo off
call .venv\Scripts\activate.bat
pyinstaller --onefile filter_zip_no_stl.py
echo.
echo === Fertig! ===
move dist\filter_zip_no_stl.exe ..\..\Sessions\removeStls.exe
pause
+2
View File
@@ -0,0 +1,2 @@
# Für EXE-Erstellung
pyinstaller>=6.0
+32
View File
@@ -0,0 +1,32 @@
@echo off
echo === Virtuelle Umgebung einrichten ===
REM Prüfen ob Python verfügbar ist
python --version >nul 2>&1
if errorlevel 1 (
echo Fehler: Python nicht gefunden!
echo Bitte Python installieren und zum PATH hinzufügen.
pause
exit /b 1
)
REM Virtuelle Umgebung erstellen
echo Erstelle .venv ...
python -m venv .venv
REM Aktivieren und Dependencies installieren
echo Aktiviere .venv und installiere Abhängigkeiten ...
call .venv\Scripts\activate.bat
python -m pip install --upgrade pip
pip install -r requirements.txt
echo.
echo === Fertig! ===
echo.
echo Zum Aktivieren der Umgebung:
echo .venv\Scripts\activate
echo.
echo Zum Erstellen der EXE:
echo pyinstaller --onefile filter_zip_no_stl.py
echo.
pause
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,2 @@
<palette><div class="paletteItem"><div><img id="s_Kette" class="shape" title="" family="KettenFoerderer" shapeMode="0" src="SSG/shapes/img/Kettenfoerderer_32px.png" /></div><div>Kettenförderer</div></div>
</palette>
@@ -19,4 +19,6 @@
<div class="paletteItem"><div><img id="s_Gefaellestrecke2D" class="shape" title="" family="Gefaellestrecke" shapeMode="0" src="SSG/shapes/img/Gefaellestrecke.png" /></div><div>Gefällestrecke2D</div></div>
<div class="paletteItem"><div><img id="s_ap110_2d" class="shape" title="" family="OFGerade" shapeMode="0" /></div><div>AP110_2D</div></div>
<div class="paletteItem"><div><img id="s_ap110" class="shape" title="" shapeMode="0" /></div><div>AP110</div></div>
<div class="paletteItem"><div><img id="s_TEFGerade" class="shape" title="" shapeMode="0" /></div><div>TEFGERADE</div></div>
<div class="paletteItem"><div><img id="s_TEFGerade_2d" class="shape" title="" family="TEFGerade" shapeMode="0" /></div><div>TEFGerade_2D</div></div>
</palette>
@@ -2,4 +2,5 @@
<div class="paletteItem"><div><img id="Umlenk_links_TEF_rechts" class="shape" title="" family="TEFUmlenk" shapeMode="0" src="SSG/shapes/img/Umlenkspannst.links_TEF_rechts_32px.png" /></div><div>Umlenkspannst. links für TEF rechts</div></div>
<div class="paletteItem"><div><img id="0_B10010" class="shape" title="" family="TEFUmlenk" shapeMode="0" src="SSG/shapes/img/Antriebst.links_TEF_links_32px.png" /></div><div>Antriebst. links für TEF links</div></div>
<div class="paletteItem"><div><img id="0_B10020" class="shape" title="" family="TEFUmlenk" shapeMode="0" src="SSG/shapes/img/Antriebst.rechts_TEF_rechts_32px.png" /></div><div>Antriebst. rechts für TEF rechts</div></div>
</palette>
<div class="paletteItem"><div><img id="s_Gerade_TEF" class="shape" title="" family="TEFGerade" shapeMode="0" src="SSG/shapes/img/AP_32px.png" /></div><div>TEF Gerade</div></div>
</palette>
@@ -25,7 +25,7 @@
"zStep": "",
"direction": 270.0,
"linkClass": "OmnifloTEF",
"label": "",
"label": "TEF",
"isDimension": true
},
{
@@ -44,7 +44,7 @@
"zStep": "",
"direction": 270.0,
"linkClass": "Omniflo",
"label": "",
"label": "Fahrstrecke",
"isDimension": true
}
],
@@ -25,7 +25,7 @@
"zStep": "",
"direction": 90.0,
"linkClass": "OmnifloTEF",
"label": "",
"label": "TEF",
"isDimension": true
},
{
@@ -44,7 +44,7 @@
"zStep": "",
"direction": 90.0,
"linkClass": "Omniflo",
"label": "",
"label": "Fahrstrecke",
"isDimension": true
}
],
@@ -25,7 +25,7 @@
"zStep": "",
"direction": 270.0,
"linkClass": "OmnifloTEF",
"label": "",
"label": "TEF",
"isDimension": true
},
{
@@ -44,7 +44,7 @@
"zStep": "",
"direction": 270.0,
"linkClass": "Omniflo",
"label": "",
"label": "Fahrstrecke",
"isDimension": true
}
],
@@ -25,7 +25,7 @@
"zStep": "",
"direction": 90.0,
"linkClass": "OmnifloTEF",
"label": "",
"label": "TEF",
"isDimension": true
},
{
@@ -44,7 +44,7 @@
"zStep": "",
"direction": 90.0,
"linkClass": "Omniflo",
"label": "",
"label": "Fahrstrecke",
"isDimension": true
}
],
+69
View File
@@ -0,0 +1,69 @@
{
"shapeMode": 0,
"name": "TEF Gerade",
"family": "TEF_Gerade",
"icon": "SSG/shapes/img/TEFGerade_32px.png",
"iconBig": "SSG/shapes/img/TEFGerade_64px.png",
"srcSVG": "SSG/shapes/svg/s97.xml",
"width": 158.7402,
"height": 3779.5276,
"depth": 415.748,
"behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)",
"group3d": [
{
"source": "s_ap110",
"id": "g0",
"width": 158.7402,
"height": 3779.5276,
"depth": 415.748,
"x": 0.0,
"y": 0.0,
"z": 207.874,
"rotation": "0;0;0",
"data": "",
"color": "#FFFF00",
"colorOpacity": 1.0
}
],
"connectionPoints": [
{
"id": "cp1",
"x": 500.0,
"y": 0.0,
"z": 0.0,
"xMin": "",
"xMax": "",
"xStep": "",
"yMin": "",
"yMax": "",
"yStep": "",
"zMin": "",
"zMax": "",
"zStep": "",
"direction": 0.0,
"linkClass": "OmnifloTEF",
"label": "",
"isDimension": true
},
{
"id": "cp2",
"x": 500.0,
"y": 1000.0,
"z": 0.0,
"xMin": "",
"xMax": "",
"xStep": "",
"yMin": "",
"yMax": "",
"yStep": "",
"zMin": "",
"zMax": "",
"zStep": "",
"direction": 180.0,
"linkClass": "OmnifloTEF",
"label": "",
"isDimension": true
}
],
"eventClass": "OnInserted,OnDoubleclick,OnPasted,OnLinked,OnRemoved"
}
@@ -1,69 +1,12 @@
{
"shapeMode": 0,
"name": "TEF Gerade",
"family": "TEFGerade",
"icon": "SSG/shapes/img/TEFGerade_32px.png",
"iconBig": "SSG/shapes/img/TEFGerade_64px.png",
"name": "TEFGERADE",
"icon": "SSG/shapes/img/",
"srcSVG": "SSG/shapes/svg/s_TEFGerade.xml",
"width": 158.7402,
"src3D": "SSG/shapes/obj/s_TEFGerade.stl",
"width": 236.5984,
"height": 3779.5276,
"depth": 415.748,
"behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)",
"group3d": [
{
"source": "s_ap110",
"id": "g0",
"width": 158.7402,
"height": 3779.5276,
"depth": 415.748,
"x": 0.0,
"y": 0.0,
"z": 207.874,
"rotation": "0;0;0",
"data": "",
"color": "#FFFF00",
"colorOpacity": 1.0
}
],
"connectionPoints": [
{
"id": "cp1",
"x": 500.0,
"y": 0.0,
"z": 0.0,
"xMin": "",
"xMax": "",
"xStep": "",
"yMin": "",
"yMax": "",
"yStep": "",
"zMin": "",
"zMax": "",
"zStep": "",
"direction": 0.0,
"linkClass": "OmnifloTEF",
"label": "",
"isDimension": true
},
{
"id": "cp2",
"x": 500.0,
"y": 1000.0,
"z": 0.0,
"xMin": "",
"xMax": "",
"xStep": "",
"yMin": "",
"yMax": "",
"yStep": "",
"zMin": "",
"zMax": "",
"zStep": "",
"direction": 180.0,
"linkClass": "OmnifloTEF",
"label": "",
"isDimension": true
}
],
"eventClass": "OnInserted,OnDoubleclick,OnPasted,OnLinked,OnRemoved"
"depth": 264.5669,
"behaviour": "(ORIGIN=CENTER)",
"color3D": "#FF0000"
}
+1 -1
View File
@@ -1 +1 @@
{"categories":{"c_ILS":{"expanded":true},"c_Kreiselmodule":{"expanded":true},"c_Zusatzmodul":{"expanded":false},"c_Foerderer":{"expanded":true},"c_Kurven":{"expanded":true},"c10":{"expanded":true},"c_Background":{"expanded":true},"c_Parts":{"expanded":true},"c_Session":{"expanded":false},"c_Omniflo":{"expanded":true},"c_Boegen":{"expanded":true},"c_Gerade":{"expanded":true},"c_Weichen_90":{"expanded":true},"c_Weichen_45":{"expanded":true},"c_Weichen_Parallel":{"expanded":true},"c_Weichenkoerper":{"expanded":true},"c_Weichenkombinationen":{"expanded":true},"c_TEFElemente":{"expanded":true},"c_OmnifloBogen":{"expanded":true},"c_Boegen_90":{"expanded":false},"c_OmnifloWeiche":{"expanded":true}},"shapes":{}}
{"categories":{"c_ILS":{"expanded":true},"c_Kreiselmodule":{"expanded":true},"c_Zusatzmodul":{"expanded":false},"c_Foerderer":{"expanded":true},"c_Kurven":{"expanded":true},"c10":{"expanded":true},"c_Background":{"expanded":true},"c_Parts":{"expanded":true},"c_Session":{"expanded":false},"c_Omniflo":{"expanded":true},"c_Boegen":{"expanded":true},"c_Gerade":{"expanded":true},"c_Weichen_90":{"expanded":true},"c_Weichen_45":{"expanded":true},"c_Weichen_Parallel":{"expanded":true},"c_Weichenkoerper":{"expanded":true},"c_Weichenkombinationen":{"expanded":true},"c_TEFElemente":{"expanded":true},"c_OmnifloBogen":{"expanded":true},"c_Boegen_90":{"expanded":false},"c_OmnifloWeiche":{"expanded":false}},"shapes":{}}
@@ -2,102 +2,107 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 774.4" preserveAspectRatio="none" position="absolute" overflow="visible">
<defs>
<clipPath>
<path d="m0 768h1024v-768h-1024z" stroke-width="1px" />
</clipPath>
</defs>
<g transform="matrix(.9982 0 0 .9982 1.6633 1.5715)" fill="none" stroke-linecap="square" stroke-linejoin="miter"><g fill-rule="nonzero" stroke-width=".17228"><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<path d="m485.43 412.07a4.1452 4.1452 0 0 0 0.168 8.287" stroke-width="1px" />
<path d="m484.86 412.27a4.0144 4.0144 0 0 0 0.733 7.961" stroke-width="1px" />
<polyline points="491.19 420.36 485.46 420.36" stroke-width="1px" />
<polyline points="497.33 420.23 494.4 420.23" stroke-width="1px" />
<polyline points="503.75 420.16 501.32 420.16" stroke-width="1px" />
<polyline points="497.64 416.13 503.75 416.13" stroke-width="1px" />
<polyline points="497.33 420.36 497.33 420.16" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="497.33 415.49 497.33 412.07" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="498.11 420.16 496.96 420.16" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="497.65 419.24 497.65 416.21" stroke-width="1px" />
<polyline points="496.68 420.2 494.4 420.2" stroke-width="1px" />
<path d="m496.68 420.2a0.96345 0.96345 0 0 0 0.964-0.963" stroke-width="1px" />
<path d="m497.65 416.21a0.96345 0.96345 0 0 0-0.666-0.916" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="503.75 420.16 503.75 418.42" stroke-width="1px" />
<polyline points="503.75 417.86 503.75 416.13" stroke-width="1px" />
<polyline points="502.72 420.16 502.21 420.16" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="486.82 412.04 485.77 412.04" stroke-width="1px" />
<path d="m487.12 412.09a0.96345 0.96345 0 0 0-0.297-0.047" stroke-width="1px" />
<polyline points="483.84 418.27 483.84 413.97" stroke-width="1px" />
<path d="m485.77 412.04a1.9269 1.9269 0 0 0-1.927 1.927" stroke-width="1px" />
<path d="m483.84 418.27a1.9269 1.9269 0 0 0 1.927 1.927" stroke-width="1px" />
<polyline points="491.19 420.2 485.77 420.2" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="487.46 412.2 497.33 412.2" stroke-width="1px" />
<polyline points="487.06 412.07 497.33 412.07" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="487.12 412.09 496.98 415.3" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#0ff">
<path d="m486.73 410.18a6.1505 6.1505 0 0 0 0 12.301" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<circle cx="486.73" cy="416.33" r="2.7684" stroke-width="1px" />
<polyline points="497.64 416.13 503.75 416.13" stroke-width="1px" />
<polyline points="503.75 416.13 503.75 420.16" stroke-width="1px" />
<polyline points="503.75 420.16 501.32 420.16" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="497.33 420.16 497.33 420.36" stroke-width="1px" />
<polyline points="497.33 420.36 494.4 420.36" stroke-width="1px" />
<polyline points="498.11 417.04 501.32 417.04" stroke-width="1px" />
<polyline points="498.76 427.24 500.68 427.24" stroke-width="1px" />
<polyline points="501.32 427.05 501.32 417.04" stroke-width="1px" />
<polyline points="498.11 427.05 498.11 417.04" stroke-width="1px" />
<polyline points="498.31 427.24 499.72 427.24" stroke-width="1px" />
<polyline points="501.13 426.86 501.32 426.86" stroke-width="1px" />
<polyline points="501.13 427.05 501.32 427.05" stroke-width="1px" />
<polyline points="499.72 427.24 501.13 427.24" stroke-width="1px" />
<polyline points="501.13 426.86 501.13 427.24" stroke-width="1px" />
<polyline points="498.31 426.86 498.31 427.24" stroke-width="1px" />
<polyline points="498.11 426.86 498.31 426.86" stroke-width="1px" />
<polyline points="498.31 427.05 498.11 427.05" stroke-width="1px" />
<polyline points="491.19 417.04 494.4 417.04" stroke-width="1px" />
<polyline points="491.84 427.24 493.76 427.24" stroke-width="1px" />
<polyline points="494.4 427.05 494.4 417.04" stroke-width="1px" />
<polyline points="491.19 427.05 491.19 417.04" stroke-width="1px" />
<polyline points="491.39 427.24 492.8 427.24" stroke-width="1px" />
<polyline points="494.21 426.86 494.4 426.86" stroke-width="1px" />
<polyline points="494.21 427.05 494.4 427.05" stroke-width="1px" />
<polyline points="492.8 427.24 494.21 427.24" stroke-width="1px" />
<polyline points="494.21 426.86 494.21 427.24" stroke-width="1px" />
<polyline points="491.39 426.86 491.39 427.24" stroke-width="1px" />
<polyline points="491.19 426.86 491.39 426.86" stroke-width="1px" />
<polyline points="491.39 427.05 491.19 427.05" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="498.11 420.16 496.96 420.16" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="491.19 420.23 485.6 420.23" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="503.75 418.14 501.32 418.14" stroke-width="1px" />
<polyline points="498.11 418.14 497.65 418.14" stroke-width="1px" />
</g><g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#0ff">
<polyline points="502.4 424.57 490 424.57" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g></g><path d="m996.31 360.66h-104.12" stroke="#ec2525" stroke-width="1px" /></g></svg>
<defs>
<clipPath>
<path d="m0 768h1024v-768h-1024z" stroke-width="1px" />
</clipPath>
</defs>
<g transform="matrix(.9982 0 0 .9982 1.6633 1.5715)" fill="none" stroke-linecap="square" stroke-linejoin="miter">
<g fill-rule="nonzero" stroke-width=".17228">
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<path d="m485.43 412.07a4.1452 4.1452 0 0 0 0.168 8.287" stroke-width="1px" />
<path d="m484.86 412.27a4.0144 4.0144 0 0 0 0.733 7.961" stroke-width="1px" />
<polyline points="491.19 420.36 485.46 420.36" stroke-width="1px" />
<polyline points="497.33 420.23 494.4 420.23" stroke-width="1px" />
<polyline points="503.75 420.16 501.32 420.16" stroke-width="1px" />
<polyline points="497.64 416.13 503.75 416.13" stroke-width="1px" />
<polyline points="497.33 420.36 497.33 420.16" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="497.33 415.49 497.33 412.07" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="498.11 420.16 496.96 420.16" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="497.65 419.24 497.65 416.21" stroke-width="1px" />
<polyline points="496.68 420.2 494.4 420.2" stroke-width="1px" />
<path d="m496.68 420.2a0.96345 0.96345 0 0 0 0.964-0.963" stroke-width="1px" />
<path d="m497.65 416.21a0.96345 0.96345 0 0 0-0.666-0.916" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="503.75 420.16 503.75 418.42" stroke-width="1px" />
<polyline points="503.75 417.86 503.75 416.13" stroke-width="1px" />
<polyline points="502.72 420.16 502.21 420.16" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="486.82 412.04 485.77 412.04" stroke-width="1px" />
<path d="m487.12 412.09a0.96345 0.96345 0 0 0-0.297-0.047" stroke-width="1px" />
<polyline points="483.84 418.27 483.84 413.97" stroke-width="1px" />
<path d="m485.77 412.04a1.9269 1.9269 0 0 0-1.927 1.927" stroke-width="1px" />
<path d="m483.84 418.27a1.9269 1.9269 0 0 0 1.927 1.927" stroke-width="1px" />
<polyline points="491.19 420.2 485.77 420.2" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="487.46 412.2 497.33 412.2" stroke-width="1px" />
<polyline points="487.06 412.07 497.33 412.07" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="487.12 412.09 496.98 415.3" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#0ff">
<path d="m486.73 410.18a6.1505 6.1505 0 0 0 0 12.301" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<circle cx="486.73" cy="416.33" r="2.7684" stroke-width="1px" />
<polyline points="497.64 416.13 503.75 416.13" stroke-width="1px" />
<polyline points="503.75 416.13 503.75 420.16" stroke-width="1px" />
<polyline points="503.75 420.16 501.32 420.16" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="497.33 420.16 497.33 420.36" stroke-width="1px" />
<polyline points="497.33 420.36 494.4 420.36" stroke-width="1px" />
<polyline points="498.11 417.04 501.32 417.04" stroke-width="1px" />
<polyline points="498.76 427.24 500.68 427.24" stroke-width="1px" />
<polyline points="501.32 427.05 501.32 417.04" stroke-width="1px" />
<polyline points="498.11 427.05 498.11 417.04" stroke-width="1px" />
<polyline points="498.31 427.24 499.72 427.24" stroke-width="1px" />
<polyline points="501.13 426.86 501.32 426.86" stroke-width="1px" />
<polyline points="501.13 427.05 501.32 427.05" stroke-width="1px" />
<polyline points="499.72 427.24 501.13 427.24" stroke-width="1px" />
<polyline points="501.13 426.86 501.13 427.24" stroke-width="1px" />
<polyline points="498.31 426.86 498.31 427.24" stroke-width="1px" />
<polyline points="498.11 426.86 498.31 426.86" stroke-width="1px" />
<polyline points="498.31 427.05 498.11 427.05" stroke-width="1px" />
<polyline points="491.19 417.04 494.4 417.04" stroke-width="1px" />
<polyline points="491.84 427.24 493.76 427.24" stroke-width="1px" />
<polyline points="494.4 427.05 494.4 417.04" stroke-width="1px" />
<polyline points="491.19 427.05 491.19 417.04" stroke-width="1px" />
<polyline points="491.39 427.24 492.8 427.24" stroke-width="1px" />
<polyline points="494.21 426.86 494.4 426.86" stroke-width="1px" />
<polyline points="494.21 427.05 494.4 427.05" stroke-width="1px" />
<polyline points="492.8 427.24 494.21 427.24" stroke-width="1px" />
<polyline points="494.21 426.86 494.21 427.24" stroke-width="1px" />
<polyline points="491.39 426.86 491.39 427.24" stroke-width="1px" />
<polyline points="491.19 426.86 491.39 426.86" stroke-width="1px" />
<polyline points="491.39 427.05 491.19 427.05" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="498.11 420.16 496.96 420.16" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#000">
<polyline points="491.19 420.23 485.6 420.23" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#f00">
<polyline points="503.75 418.14 501.32 418.14" stroke-width="1px" />
<polyline points="498.11 418.14 497.65 418.14" stroke-width="1px" />
</g>
<g transform="matrix(42.917,0,0,45.02,-20623,-18464)" clip-path="url(#clipId0)" stroke="#0ff">
<polyline points="502.4 424.57 490 424.57" fill-rule="nonzero" stroke-linecap="square" stroke-linejoin="miter" stroke-width="1px" />
</g>
</g>
<path d="m996.31 360.66h-104.12" stroke="#ec2525" stroke-width="1px" />
</g>
</svg>
</g>
</svg>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 264.58 264.58" preserveAspectRatio="none" position="absolute" overflow="visible">
<path d="m132.29-2.5e-6v264.58" fill="none" stroke="#ffe31b" stroke-opacity="1" stroke-width="1px" />
</svg>
</g>
</svg>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 264.58 264.58" preserveAspectRatio="none" position="absolute" overflow="visible">
<path d="m132.29-2.5e-6v264.58" fill="none" stroke="#ffe31b" stroke-opacity="1" stroke-width="1px" />
</svg>
</g>
</svg>
+600 -256
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.