Две связанные темы, обе про то, как превратить уже написанное ядро в продукт: (1) как правильно строить плотный инженерный интерфейс на egui — на примере аналога Modbus Poll, (2) чего не хватает CAD-редактору, чтобы им пользовался электрик, а не только чертёжник. Здесь — практики с источниками, варианты дизайна и честный список того, что делать не надо.
egui — immediate mode: интерфейс строится заново каждый кадр. Из этого следует всё остальное: нельзя строить виджеты, которых не видно, и нельзя делать тяжёлой работы внутри кадра (структура приложения, производительность).
| Практика | Инженерный смысл |
|---|---|
Состояние отдельно от отрисовки (struct App + UI-независимое ядро) | ядро тестируется без окна; интерфейс можно менять свободно |
Таблицы виртуализируются: egui_extras::TableBuilder + body.rows(h, n, …) (док) | окно на 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-узлам, снапшоты (док) | UI ломается чаще логики; тестировать надо его, а не только ядро |
| Тёмная/светлая тема, сохранение геометрии окна | мелочи, по которым судят о «взрослости» инструмента |
Порядок работ важнее красоты. Сначала кэш строк и виртуализация, потом визуал: обратный порядок даёт красивый интерфейс, который умирает на 500 регистрах.
Modbus Poll — не «таблица», а MDI: каждое окно = одно определение опроса (slave ID, функция, диапазон, формат), окон может быть много одновременно, в ячейках можно писать произвольный текст (Alias), F1 даёт справку по любому диалогу (quick start). Именно поэтому её не бросают: пусконаладчик держит рядом два диапазона, трафик и посылку кадра.
| Вариант | Как выглядит | Чем плох |
|---|---|---|
| A. Вкладки | одна сетка + переключатели Grid/Scada/Chart/Traffic | нельзя посмотреть два диапазона или два slave рядом — главный сценарий пусконаладки |
| B. Доки | egui_dock: панель на каждое определение опроса; любую можно оторвать в отдельное окно | нужен крейт и аккуратная модель состояния панелей |
| C. Дашборд-первым | на старте плитки SCADA, таблицы по кнопке | пусконаладка идёт по числам; как единственный режим не годится |
Рекомендация: B, а C — как равноправный режим, а не замена. Стартовая раскладка — доки с одной панелью таблиц; «Дашборд» открывается на весь экран; Traffic и Test Center — док-панели рядом с сеткой.
Чертёжное ядро (геометрия, слои, привязки) — решённая задача, конкурировать там нечем. Незаменимость EPLAN Electric P8 — в данных поверх чертежа: обозначение устройства, кросс-ссылки, нумерация проводов, клеммники, каталог изделий. Список функций, которые и создают эту незаменимость:
-K1, -M1, -X1:3) с правилом автоматической нумерации и привязкой к символу.превышение лимита контактов — отчёт, который блокирует выпуск.
Чего делать не надо: управление проектами предприятия (PLM), встраивание в чужие форматы и любую совместимость с проприетарными форматами EPLAN — только clean-room модель данных и открытые обменные форматы. Enterprise-функции — это не продукт для инженера, а отдельный рынок с отдельными продавцами.
«100 000 строк ⇒ строим меньше 30»; шапка таблицы вынесена из области прокрутки.
include_str! наотсутствующий файл демо-проекта). Демо теперь воспроизводимо генератором, тесты проходят целиком — то есть «зелёные тесты» в README перестали быть обещанием.
частью сборки: валидный JSON и пустая страница — это один и тот же класс отказа, который не ловится ни компилятором, ни линтером.