#!/usr/bin/env python3 # -*- coding: utf-8 -*- """Инвентаризация DXF: блоки, атрибуты, слои, вставки. Без AutoCAD (ezdxf). python3 inspect_dxf.py library/электрика_блоки.dxf python3 inspect_dxf.py examples/plan_el_final.dxf """ import sys import ezdxf def inspect(path: str) -> None: doc = ezdxf.readfile(path) print(f"=== {path}") print(f" версия DXF: {doc.dxfversion}") print(f" слои ({len(doc.layers)}): {[l.dxf.name for l in doc.layers]}") blocks = [b for b in doc.blocks if not b.name.startswith(("*Model", "*Paper"))] print(f" блоков: {len(blocks)}") for b in blocks: kinds = {} attdefs = [] for e in b: kinds[e.dxftype()] = kinds.get(e.dxftype(), 0) + 1 if e.dxftype() == "ATTDEF": attdefs.append(e.dxf.tag) marker = " (служебный: стрелка/маркер размера)" if b.name.startswith("_") else "" print(f" {b.name:<12} {kinds}{' атрибуты: ' + str(attdefs) if attdefs else ''}{marker}") ins_model = [e for e in doc.modelspace() if e.dxftype() == "INSERT"] print(f" вставок в модели: {len(ins_model)}") for lay in doc.layouts: if lay.name == "Model": continue n = sum(1 for e in lay if e.dxftype() == "INSERT") if n: print(f" вставок на листе «{lay.name}»: {n}") bad = [b.name for b in blocks if b.name.startswith("*U")] print(f" анонимных блоков *U: {len(bad)} {bad if bad else ''}") if __name__ == "__main__": if len(sys.argv) < 2: print(__doc__) sys.exit(1) for p in sys.argv[1:]: inspect(p)