validate_anlage, stabiler TRO-Schluessel, Verbindungen aus BricsCAD, Zeichnung aus der Anlagen-JSON

- validate_anlage.py (+ bin-Wrapper): Pruefung vor der SCL fuer beide Wege
  (Struktur, Zuordnungen, Aktualitaet der JSON, Korrekturen ohne Ziel);
  scl_skeleton ruft sie auf (Warnung, --strict bricht ab)
- DerivedTro.key: stabiler Schluessel (ID der ID-Datei); hw_overrides.ini,
  <csv>_jam_names.ini und tro_overrides.ini greifen ueber ID oder Schluessel,
  eine Umbenennung in TRO_EDIT laesst sie bestehen; JAM_AREA traegt KEY
- --read-tros liest die CONNECTION_ARROW-Bloecke mit -> [<csv>.edit_connections];
  tro_flow.apply_connection_edits wendet sie nach link_tros an
- tro_annotate --anlage zeichnet Marker/Verbindungen aus der Anlagen-JSON
- INI-Korrekturen auch mit BOM lesbar (utf-8-sig)
- Ablauf CSV/DXF+TIA -> Anlagen-JSON -> (BricsCAD) -> SCL in doc/Python_Scripts.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-27 14:32:10 +01:00
parent 6c8c235287
commit 1ac17b95e2
13 changed files with 1100 additions and 48 deletions
+25 -3
View File
@@ -68,6 +68,8 @@ __all__ = [
"flow_order",
"JAM_NAMES_SUFFIX",
"jam_key",
"jam_override",
"jam_stable_key",
"jam_label",
"jam_names",
"jam_numbers",
@@ -653,6 +655,25 @@ def jam_key(area: JamArea) -> str:
return f"{area.tro}.{area.entry}"
def jam_stable_key(area: JamArea, document: TroDocument) -> str:
"""Wie jam_key, aber mit dem stabilen Schluessel des TRO (DerivedTro.key):
bleibt gleich, wenn der TRO in BricsCAD umbenannt wird."""
tro = document.by_id(area.tro)
return f"{tro.stable_key}.{area.entry}" if tro is not None else jam_key(area)
def jam_override(area: JamArea, document: TroDocument,
overrides: dict[str, tuple[str, int]] | None) -> tuple[str, int] | None:
"""Korrektur eines Staubereichs: ueber den stabilen Schluessel, sonst ueber
die aktuelle TRO-ID (Dateien vor 2026-10-27 bzw. ohne Umbenennung)."""
if not overrides:
return None
for key in (jam_stable_key(area, document), jam_key(area)):
if key in overrides:
return overrides[key]
return None
def jam_label(nr: str, k: int) -> str:
"""Kurzname fuer Zeichnung und Dialog: Jam0054_3."""
return f"Jam{nr}_{k}"
@@ -671,7 +692,8 @@ def load_jam_overrides(path: Path) -> dict[str, tuple[str, int]]:
parser = configparser.ConfigParser(inline_comment_prefixes=(";", "#"),
interpolation=None)
parser.optionxform = str
with path.open(encoding="utf-8") as fh:
# utf-8-sig: von Hand (Editor, PowerShell) gespeichert oft mit BOM
with path.open(encoding="utf-8-sig") as fh:
parser.read_file(fh)
result: dict[str, tuple[str, int]] = {}
if parser.has_section("jam"):
@@ -711,8 +733,8 @@ def jam_names(document: TroDocument, geordnet: list[TroBase], hw: HwSource,
"""
nummern = jam_numbers(document, geordnet, hw)
for area in document.jam_areas_or_derived():
if overrides and jam_key(area) in overrides:
nummern[area.jam_id] = overrides[jam_key(area)]
if (wert := jam_override(area, document, overrides)) is not None:
nummern[area.jam_id] = wert
return {jam_id: f'"DB_JamArea{nr}".stJam{nr}_{k}'
for jam_id, (nr, k) in nummern.items()}