Files
dxfmakros/lib/dump_vf_wrapper_inhalt.py
T
Michael StanglandClaude Sonnet 5 c95a94c175 Diagnose-Skripte fuer VF/GF-Kettenzusammensetzung ergaenzen
Zeigen die Spec- bzw. Blockdefinitions-Struktur einer VF-/GF-Linienzugkette
in der Konsole, um sichtbar zu machen, dass ein einzelner VF_n-Wrapper
intern zwischen VF- und GF-Abschnitten wechseln kann (Grundlage fuer den
noch ausstehenden Separator-TYP-Fix).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-23 17:14:03 +02:00

85 lines
2.8 KiB
Python

"""
Diagnose: Inhalt jedes VF_n/GF_n-Wrapper-Blocks in Baureihenfolge ausgeben.
Zeigt fuer jeden Wrapper (VF_n/GF_n) alle direkt in seiner Blockdefinition
enthaltenen Sub-INSERTs (rekursiv, wie ssg-collect-nested-inserts es tut) in
der Reihenfolge, in der sie in der Blockdefinition stehen - inkl. Blockname
und lokalem Einfuegepunkt. Damit sichtbar wird, welche Foerderer-/
Gefaellestrecke-Segmente (VF-Baustein-Bloecke vs. GF-Baustein-Bloecke)
tatsaechlich zwischen den verpackten Separator_SP-Symbolen liegen - ein
einzelner VF_n-Wrapper kann intern mehrfach zwischen Foerderer- und
Gefaellestrecke-Abschnitten wechseln, sein Blockname (VF_n) sagt darueber
nichts aus.
Aufruf: python dump_vf_wrapper_inhalt.py <dxf-oder-dwg>
"""
import sys
import ezdxf
# Muster grob nach Herkunft eingeteilt, rein zur Anzeige - keine
# Export-Klassifikation. GF-Baustein-Bloecke tragen "Staustrecke"/"Gefaelle"
# im Namen (siehe Gefaellestrecke.lsp/vf_linienzug.lsp GF-Zweige), reine
# VF-Bausteine div. Praefixe (siehe vf_standard.lsp/vf_etage.lsp/
# vf_linienzug.lsp horizontale/geneigte Foerderer-Bloecke).
def klassifiziere(block_name):
bn = block_name.upper()
if bn.startswith("STAUSTRECKE_SEPARATOR"):
return "SEP (Trennsteg)"
if "SEPARATOR_SP" in bn:
return "SEP (Symbol)"
if bn.startswith(("AS_ELEMENT", "ES_ELEMENT")):
return "AS/ES"
if "GEFAELLE" in bn or bn.startswith("STAUSTRECKE"):
return "GF-Baustein"
if bn.startswith(("VARIO_", "VF_", "UMLENK", "MOTOR", "ANTRIEB")):
return "VF-Baustein"
return ""
def dump_block(doc, block_name, tiefe=0):
block = doc.blocks.get(block_name)
if block is None:
print(" " * tiefe + f"[Blockdefinition {block_name} nicht gefunden]")
return
for e in block:
if e.dxftype() != "INSERT":
continue
name = e.dxf.name
x, y, z = e.dxf.insert
klasse = klassifiziere(name)
klasse_str = f" <- {klasse}" if klasse else ""
print(" " * tiefe + f"{name:40s} x={x:10.2f} y={y:10.2f}{klasse_str}")
# rekursiv absteigen (verschachtelte Wrapper/Zwischenbloecke)
if doc.blocks.get(name) is not None:
dump_block(doc, name, tiefe + 1)
def main():
if len(sys.argv) != 2:
print(f"Aufruf: python {sys.argv[0]} <dxf-oder-dwg>")
sys.exit(1)
pfad = sys.argv[1]
doc = ezdxf.readfile(pfad)
msp = doc.modelspace()
wrapper = [
e for e in msp.query("INSERT")
if e.dxf.name.startswith(("VF_", "GF_"))
]
wrapper.sort(key=lambda e: e.dxf.name)
if not wrapper:
print("Keine VF_n/GF_n-Wrapper-Bloecke im Modellraum gefunden.")
return
for e in wrapper:
print(f"\n=== {e.dxf.name} (handle={e.dxf.handle}) ===")
dump_block(doc, e.dxf.name)
if __name__ == "__main__":
main()