# Инженерный инструмент на egui и электротехнический слой в CAD

Две связанные темы, обе про то, как превратить уже написанное ядро в продукт: (1) как правильно строить
плотный инженерный интерфейс на egui — на примере аналога Modbus Poll, (2) чего не хватает CAD-редактору,
чтобы им пользовался электрик, а не только чертёжник. Здесь — практики с источниками, варианты дизайна и
честный список того, что делать не надо.

---

## 1. egui: правила, которые определяют, будет ли инструмент тормозить

egui — immediate mode: интерфейс строится заново каждый кадр. Из этого следует всё остальное: **нельзя
строить виджеты, которых не видно, и нельзя делать тяжёлой работы внутри кадра**
([структура приложения](https://app.studyraid.com/en/read/105424/4737052/structuring-a-complex-egui-application),
[производительность](https://app.studyraid.com/en/read/105424/4737053/performance-considerations-and-optimization)).

| Практика | Инженерный смысл |
|---|---|
| Состояние отдельно от отрисовки (`struct App` + UI-независимое ядро) | ядро тестируется без окна; интерфейс можно менять свободно |
| Таблицы виртуализируются: `egui_extras::TableBuilder` + `body.rows(h, n, …)` ([док](https://docs.rs/egui_extras/latest/egui_extras/struct.TableBuilder.html)) | окно на 10 000 регистров стоит столько же, сколько на 30 |
| Никаких `format!` и поисков по хэш-таблицам в горячем цикле | форматирование значения — самое частое действие в Modbus-инструменте |
| Стабильные `Id` у строк (`ui.push_id(addr, …)`) | иначе выделение мыши «переезжает» на чужую строку после прокрутки |
| Панели, а не одно полотно: `egui_dock` (вкладки-доки, отрыв в отдельное окно), `egui_tiles` | замена MDI-окон, но без оконной системы MFC |
| Графики отдельным крейтом (`egui_plot`), а не своим циклом рисования | курсор, комбинированные кривые, экспорт — из коробки |
| UI-тесты: `egui_kittest` — `Harness::new_ui`, клики по AccessKit-узлам, снапшоты ([док](https://docs.rs/egui_kittest/latest/egui_kittest/)) | UI ломается чаще логики; тестировать надо его, а не только ядро |
| Тёмная/светлая тема, сохранение геометрии окна | мелочи, по которым судят о «взрослости» инструмента |

**Порядок работ важнее красоты.** Сначала кэш строк и виртуализация, потом визуал: обратный порядок даёт
красивый интерфейс, который умирает на 500 регистрах.

## 2. Три варианта дизайна инженерного инструмента

Modbus Poll — не «таблица», а **MDI**: каждое окно = одно определение опроса (slave ID, функция, диапазон,
формат), окон может быть много одновременно, в ячейках можно писать произвольный текст (Alias), F1 даёт
справку по любому диалогу ([quick start](http://modbustools.com/quickstart.html)). Именно поэтому её не
бросают: пусконаладчик держит рядом два диапазона, трафик и посылку кадра.

| Вариант | Как выглядит | Чем плох |
|---|---|---|
| **A. Вкладки** | одна сетка + переключатели Grid/Scada/Chart/Traffic | нельзя посмотреть два диапазона или два slave рядом — главный сценарий пусконаладки |
| **B. Доки** | `egui_dock`: панель на каждое определение опроса; любую можно оторвать в отдельное окно | нужен крейт и аккуратная модель состояния панелей |
| **C. Дашборд-первым** | на старте плитки SCADA, таблицы по кнопке | пусконаладка идёт по числам; как единственный режим не годится |

**Рекомендация: B, а C — как равноправный режим, а не замена.** Стартовая раскладка — доки с одной панелью
таблиц; «Дашборд» открывается на весь экран; Traffic и Test Center — док-панели рядом с сеткой.

## 3. Электротехнический слой в CAD: что делает EPLAN незаменимым

Чертёжное ядро (геометрия, слои, привязки) — решённая задача, конкурировать там нечем. Незаменимость EPLAN
Electric P8 — в **данных поверх чертежа**: обозначение устройства, кросс-ссылки, нумерация проводов, клеммники,
каталог изделий. Список функций, которые и создают эту незаменимость:

1. **Проект = набор страниц с нумерацией**, а не один файл. Геометрия — следствие, модель данных — ссылки.
2. **Device tag** (`-K1`, `-M1`, `-X1:3`) с правилом автоматической нумерации и привязкой к символу.
3. **Кросс-ссылки катушка ↔ контакты**, пересчитываемые при любом переносе, с переходом в один клик.
4. **Автонумерация проводов и адресация цепей** с пересчётом при вставке элемента.
5. **Клеммники и кабели**: таблица клемм и кабельный журнал генерируются из схемы, а не ведутся отдельно.
6. **Каталог изделий и спецификация (BOM)**: символ → артикул/производитель, выгрузка в CSV/XLSX.
7. **Экспорт по страницам**: PDF/DXF, маркировка клемм под печать.
8. **Проверки проекта (ERC)**: неподключённые контакты, дубли обозначений, отсутствующие артикулы,
   превышение лимита контактов — отчёт, который блокирует выпуск.

**Чего делать не надо:** управление проектами предприятия (PLM), встраивание в чужие форматы и любую
совместимость с проприетарными форматами EPLAN — только clean-room модель данных и открытые обменные форматы.
Enterprise-функции — это не продукт для инженера, а отдельный рынок с отдельными продавцами.

## 4. Что уже проверено на практике

- **Виртуализация сетки** аналога Modbus Poll: чистая функция видимого диапазона + 5 тестов, включая
  «100 000 строк ⇒ строим меньше 30»; шапка таблицы вынесена из области прокрутки.
- **Найден настоящий дефект сборки:** тестовый набор не компилировался на свежем клоне (`include_str!` на
  отсутствующий файл демо-проекта). Демо теперь воспроизводимо генератором, тесты проходят целиком — то есть
  «зелёные тесты» в README перестали быть обещанием.
- **Урок инструментария:** проверка формы данных на страницах (сгенерированных, а не написанных) обязана быть
  частью сборки: валидный JSON и пустая страница — это один и тот же класс отказа, который не ловится ни
  компилятором, ни линтером.
