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>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
3f89f36e4a
commit
c95a94c175
@@ -0,0 +1,84 @@
|
||||
"""
|
||||
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()
|
||||
Reference in New Issue
Block a user