[ADD] Testanlage test_system als Nachbau-Vorlage fuer sps_skel

tests/testdata/test_system.json aus sps_skel/data/test_system.dxf
(dxf_anlage_export.py --projekt TestSystem): 9 Kreisel, 10 Separatoren,
BTMT Beladung, SC Entladung. Treiber tests/test_test_system.lsp
(TEST_TEST_SYSTEM, Menue Tests -> Testanlage test_system) nutzt
dematic_arvato:bau-datei, in alltests.json aktiv (save dxf).

[FIX] dxf_anlage_export.py: doppelte Kreisel-IDs (Kreisel einzeln gebaut,
NUMMER beginnt mehrmals bei 1) bekommen die naechste freie Nummer, mit
Hinweis + Test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-14 10:51:52 +02:00
parent ea0e46a441
commit 1a34a12ab4
9 changed files with 344 additions and 17 deletions
+22
View File
@@ -336,6 +336,27 @@ def einzel_eintrag(e):
])
def kreisel_ids_eindeutig(kreisel, projekt, hinweise):
"""Doppelte Kreisel-IDs aufloesen. Die Nummer kommt aus NUMMER bzw. dem
Blocknamen; in einer Zeichnung, in der Kreisel einzeln gebaut wurden,
beginnt sie jedes Mal neu bei 1 (test_system: vier KREISEL_1_*). Der
erste behaelt seine ID, jeder weitere bekommt die naechste freie Nummer
oberhalb der hoechsten vergebenen. Die Reihenfolge ist die der Eingabe
(Blockname, x, y) und damit stabil."""
muster = re.compile(r"^Kreisel_%s_(\d+)$" % re.escape(projekt))
nummern = [int(m.group(1)) for m in (muster.match(k[sch.F_ID]) for k in kreisel) if m]
naechste = max(nummern, default=0) + 1
vergeben = set()
for k in kreisel:
if k[sch.F_ID] in vergeben:
alt = k[sch.F_ID]
k[sch.F_ID] = "Kreisel_%s_%02d" % (projekt, naechste)
naechste += 1
hinweise.append("%s doppelt - Kreisel bei %.2f/%.2f umbenannt in %s"
% (alt, k[sch.F_X], k[sch.F_Y], k[sch.F_ID]))
vergeben.add(k[sch.F_ID])
def baue_eintraege(inserts, block_inhalt, projekt):
"""Reihenfolge wie mubea.json: Kreisel, VF, GF, Einzelbloecke - die VF
vor den GF, weil gf-init-bibliothek globale Elementmasse umsetzt."""
@@ -344,6 +365,7 @@ def baue_eintraege(inserts, block_inhalt, projekt):
name = e["name"] or ""
if name.startswith("KREISEL_"):
kreisel.append(kreisel_eintrag(e, block_inhalt, projekt))
kreisel_ids_eindeutig(kreisel, projekt, hinweise)
geo = [kreisel_geo(k) for k in kreisel]
for e in inserts:
name = e["name"] or ""