# Что сделано с примитивами по электрике Документ описывает, **из чего и как собраны** наши условные обозначения по электрике в AutoCAD: каждый символ разобран по примитивам, указаны атрибуты, слои, последовательность вызовов MCP-сервера и проверки. Дата работы: **01.10.2026**, оформлено 05.10.2026. ## 1. Общая схема Символ = **блок AutoCAD**, собранный из простых примитивов (`CIRCLE`, `ARC`, `LINE`), с **атрибутами (ATTDEF)**, которые несут маркировку. Такой блок: - вставляется как единый объект (одна вставка `INSERT`, а не набор линий); - несёт данные (марка, тип, высота, группа включения) — из них собирается ведомость; - переиспользуется на всех планах, поэтому правка символа меняет все вставки. Слои (по назначению): | Слой | Что на нём | |---|---| | `СО_СВЕТИЛЬНИКИ` | символы освещения | | `СО_ВЫКЛЮЧАТЕЛИ` | символы выключателей | | `ЭО_РОЗЕТКИ` | символы розеток | | `СО_ГРУППЫ` | подписи групп включения | | `АР_ПОДЛОЖКА` | архитектурная подложка (стены, перегородки) | | `ВЕДОМОСТЬ`, `РАЗМЕРЫ` | таблица и размеры | | `00 БЛОКИ АННОТАЦИЙ` | подписи/выноски (стиль ОСНОВНОЙ, isocpeur) | | `RAMKA`, `STAMPS` | рамка и основная надпись (форма 3) | ## 2. Разбор символов по примитивам Все блоки имеют базовую точку `(0,0)`. Размеры — в единицах чертежа (мм плана). ### `СВ_ВСТР` — светильник встраиваемый (слой `СО_СВЕТИЛЬНИКИ`) | Примитив | Параметры | |---|---| | `CIRCLE` | центр `(0,0)`, R = 150 | | `LINE` | `(−106,−106) → (106,106)` | | `LINE` | `(−106,106) → (106,−106)` | Атрибуты (ATTDEF): | Тег | Подсказка | Позиция | Высота | Значение по умолчанию | |---|---|---|---|---| | `МАРКА` | Марка светильника | (−60, 200) | 120 | `Т1` | | `ТИП` | Тип по спецификации | (−300, −320) | 90 | `встраиваемый` | | `ВЫСОТА` | Высота от пола, мм | (−120, −450) | 90 | `0` | | `ГРУППА` | Группа включения | (−60, 350) | 90 | `1.1` | ### `СВ_БРА` — бра (настенный светильник, слой `СО_СВЕТИЛЬНИКИ`) | Примитив | Параметры | |---|---| | `ARC` | центр `(0,0)`, R = 150, углы 0°…180° | | `LINE` | `(−150,0) → (150,0)` | | `LINE` | `(0,0) → (0,−120)` | Атрибуты: `МАРКА` (−60, 220) h120 = `Т10`; `ТИП` (−300, −350) h90 = `бра`; `ВЫСОТА` (−120, −480) h90 = `1800`; `ГРУППА` (−60, 360) h90 = `1.1`. ### `РОЗ_2` — розетка двойная с заземляющим контактом (слой `ЭО_РОЗЕТКИ`) | Примитив | Параметры | |---|---| | `ARC` | центр `(0,0)`, R = 150, углы 0°…180° | | `LINE` | `(−150,0) → (150,0)` | | `LINE` | `(0,0) → (0,200)` | | `LINE` | `(−60,200) → (60,200)` | Атрибуты (пять): `МАРКА` (−60, −250) h120 = `S1`; `ТИП` (−300, −380) h90 = `розетка двойная с з/к`; `ВЫСОТА` (−120, −510) h90 = `300`; `НАЗНАЧ` (−150, −640) h90 = `общее`; `ГРУППА` (−60, 260) h90 = `1.1`. ### `ВЫКЛ_3` — выключатель трёхклавишный (слой `СО_ВЫКЛЮЧАТЕЛИ`) | Примитив | Параметры | |---|---| | `CIRCLE` | центр `(0,0)`, R = 150 | | `LINE` | `(0,0) → (0,300)` | | `LINE` | `(−100,300) → (100,300)` | Атрибуты: `МАРКА` (−60, −250) h120 = `V1`; `ТИП` (−300, −380) h90 = `выключатель 3-клавишный`; `ВЫСОТА` (−120, −510) h90 = `900`; `ГРУППЫ` (−200, −640) h90 = `1.1;1.2;1.3`. > Замечание по подписям: атрибуты заданы **столбцом под знаком** (и группа — над знаком). > Это осознанная схема «замаркировки» для плана 1:100: марка читается рядом со знаком, > тип/высота/назначение — строкой ниже. Если для конкретного проекта нужна подпись в строчку > или со стрелкой-выноской, координаты ATTDEF подстраиваются в блоке (правка блока меняет все вставки). ## 3. Порядок сборки через MCP-сервер (как это делалось) Символы собраны не руками в AutoCAD, а командами MCP-сервера `autocad-mcp-pro` (у нас: `10.26.5.108:30015` — рабочая сборка; `:30041` — сборка 1.6.0 с нашим патчем). Последовательность для каждого символа: ``` 1. drawing_new — новый чертёж 2. layer_create name=<слой> — слой символа (CO_СВЕТИЛЬНИКИ / ЭО_РОЗЕТКИ / ...) 3. entity_create_circle / entity_create_arc / entity_create_line — примитивы будущего знака (параметры из раздела 2) 4. block_create_from_entities name=<БЛОК> handles=[...] base_x=0 base_y=0 — из примитивов делается ИМЕНОВАННЫЙ блок 5. entity_create_attdef block_name=<БЛОК> tag=МАРКА x=.. y=.. height=.. default=.. (по разу на каждый тег: МАРКА, ТИП, ВЫСОТА, [НАЗНАЧ], ГРУППА/ГРУППЫ) 6. block_insert name=<БЛОК> x=.. y=.. layer=<слой> attributes={"МАРКА":"Т1", "ТИП":"...", ...} — вставки на плане, значения атрибутов подставляются 7. drawing_save_as / drawing_export_pdf — сохранение DXF/PDF ``` Готовый скрипт, повторяющий сборку: `scripts/build_symbols_mcp.py` (можно запускать на другом чертеже/сервере, параметры символов вынесены в начало файла). ## 4. Проверки, которые выполнялись (и как повторить) | Что проверяем | Команда MCP | Ожидаемый результат | |---|---|---| | Блоки именованные, а не анонимные | `block_list {"compact": true}` | в списке `СВ_ВСТР`, `СВ_БРА`, `РОЗ_2`, `ВЫКЛ_3`, нет `*U…` | | Атрибуты у блока есть | `block_get_attdefs {"name": "<БЛОК>"}` | по 4–5 тегов на символ | | Значения читаются обратно | `block_get_attributes {"handle": <вставка>}` | `{"МАРКА": "Т15", "ТИП": "светильник", …}` | | Вставки на плане | `block_find_references {"name": "<БЛОК>"}` | 14 вставок на плане-примере | | Файл валиден в AutoCAD | открытие в `accoreconsole` (офисный ПК) | `rc=0`, стиль `ГОСТ A` = `isocpeur.ttf` | Локальная инвентаризация без AutoCAD: `scripts/inspect_dxf.py` (ezdxf). ## 5. Грабли (собраны на живых прогонах) 1. **Анонимные блоки `*U`. **Если собрать примитивы и не создать именованный блок, `block_insert` вставляет `*U`-блок: он не переиспользуется, не имеет атрибутов и не попадает в ведомость. Лечение: сначала `block_create_from_entities` с именем, только потом вставки. Проверять `block_list` на отсутствие `*U`. 2. **ATTDEF до вставок.** Если объявить атрибуты после вставок, старые вставки остаются без атрибутов (`block_get_attributes` вернёт `{}`). 3. **Отдельный файл — только удалением.** Когда нужно выделить из большого DXF один символ/зону, нельзя собирать новый документ копированием: `MTEXT` ссылается на текстовый стиль, которого в новом файле нет, и AutoCAD отвечает `rc=53 «неправильный или неполный DXF»`. Правильно — открыть исходный файл и удалить лишнее (`e.destroy()`): таблицы стилей, слоёв и блоков остаются. Тот же приём спас при сборке этого репозитория: при удалении блока-стрелки `_ARCHTICK` размерные стили ссылаются на несуществующий блок и файл не сохраняется — блоки с именами на `_` (стрелки и маркеры размеров) удалять нельзя. 4. **PDF: формат листа.** Раньше PDF «подгонялся» по содержимому и A3 превращался в 167×122 мм. В нашей сборке лист задаётся явно и проверяется медиабокс: A3 = **420×297 мм** (допуск ±2). 5. **Текст в PDF.** Для читаемого PDF нужен настоящий текстовый слой (инлайн-кодировка шрифта) — иначе в PDF остаются кривые и текст не ищется/не копируется. 6. **Легенду на лист не ставить.** Прямое правило Павла: «условные обозначения» выносить отдельным файлом (`docs/условные-обозначения.md`), на листе не держать. 7. **Штриховка/подложка.** Архитектурная подложка — отдельный слой (`АР_ПОДЛОЖКА`), её видимость регулируется, чтобы знаки читались. ## 6. Что можно улучшить (следующие шаги) - Привести подписи к варианту «в строчку» со выноской, если так принято в проекте заказчика. - Добавить растровые превью в сами DXF (эскиз блока) для палитры AutoCAD. - Расширить набор: светильники (подвесной, бра, точечный), розетки (1/2/3-местные, IP), выключатели (1/2/3-клавишные, проходные), щиты, датчики — та же схема (примитивы + ATTDEF + слои). - Собрать из этих блоков ведомость автоматически (по атрибутам `МАРКА`/`ТИП`/`ГРУППА`).