- library/электрика_блоки.dxf — 4 блока (СВ_ВСТР, СВ_БРА, РОЗ_2, ВЫКЛ_3) для вставки - symbols/ + preview/ — по файлу и картинке на символ - docs/примитивы-электрики.md — разбор по примитивам, атрибутам, слоям, порядок сборки через MCP, грабли - docs/условные-обозначения.md, conventions/*.json — легенда из эталона (правило: на лист не ставить) - docs/электрические-планы-ГОСТ.md — накопленные правила оформления - scripts/build_symbols_mcp.py (проверен на живом MCP 1.6.0-ours, 0 анонимных блоков), scripts/inspect_dxf.py - examples/plan_el_final.dxf/.pdf/.png — пример применения (14 вставок)
47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
#!/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)
|