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>
85 lines
2.8 KiB
Python
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()
|