Скриншоты и визуальная проверка
Сочетайте чтение данных, реальные изображения и проверки макета слайдов.
Визуальная проверка превращает модели в изображения и доказательства раскладки. Agent проверяет данные и формулы, затем реально отрисованные текст, фигуры и страницы, исправляет их через Facade и проверяет новое состояние.
Три вида доказательств
| Доказательство | Что проверяет |
|---|---|
| Структурированное чтение | Исходные значения, формулы и результаты, абзацы и свойства. |
| PNG | Видимое содержимое, обрезку, диаграммы, цвета и композицию. |
| Диагностика раскладки | Правила, ID, границы и позиции из отрисованной геометрии для точных исправлений. |
Подготовка состояния и зависимостей
Screenshot и Layout Lint получают материализованные UnitData, не подключают удалённые цели и не интерпретируют changesets. Для совместного содержимого выполните pull(), дождитесь расчётов после изменения формул и вызовите exportUnitData(). В Worktree экспортируйте нужный черновик; приложение может записать target, revision и область рядом с отчётом.
Родительский Snapshot не содержит всех зависимостей. Передайте Sheet/Relational Table-источники в formulaReferenceUnits, дочерние Unit — в embeddedUnits. Render Page материализует их до родителя. UUID-изображения подготавливают через resolveUnitScreenshotImageAssets() и resolver приложения. Это best-effort-разрешение: проверяйте отсутствующие ресурсы.
От содержимого к стабильному изображению
univer-render-runtime размещает собранную приложением Render Page и запускает браузер из Node.js. Плагины восстанавливают содержимое, обе стороны проверяют версию протокола. Операции идут в последовательную очередь Runtime, который можно использовать повторно; владелец в итоге вызывает close().
Условия зависят от продукта. Фигуры с формулами ожидают выхода из pending и при необходимости стабильных пикселей нескольких кадров. Relational Table ожидает шрифты, расчёты, активные table/view и стабильную DOM/Canvas-раскладку. Выход из pending может означать ошибку: проверяйте значение и статус.
Текущая реализация хеширует сериализованные UnitData, источники формул и дочернее содержимое. При изменении данных меняется key сеанса даже с прежним Unit ID, исключая повторное использование старого изображения только по идентификатору.
Выбор области по продукту
| Продукт | Область и результат |
|---|---|
| Sheet | Лист и явный диапазон A1 для PNG области; важные результаты выбирайте явно. |
| Doc | Выбор или перечисление страниц с отдельными PNG. |
| Slide | Номер от 1 либо page ID, дополнительный contact sheet. |
| Relational Table | Рабочая область активной таблицы/представления после открытия, DOM + Canvas. |
| Canvases | Полные границы либо взаимоисключающие region / elementIds, padding и геометрические доказательства. |
unit-screenshot возвращает bytes, размеры, идентификатор страницы/области и рекомендуемые имена; сохраняет приложение. Scale допускает 0.1–4, настраиваются maxPages и maxPixels на изображение. Двойной масштаб даёт примерно вчетверо больше пикселей, поэтому большие данные проверяют по областям. PDF не входит в этот интерфейс пяти продуктов.
Общие данные для снимка и lint
Пример снимает и проверяет одни данные Slide и источники формул. renderRuntime уже создан, slideData — подготовленный снимок. Возможности сами не пишут файлы. Сборка страницы и закрытие ресурсов описаны в визуальной проверке AI SDK.
import { createUnitScreenshot } from '@univer-cli/unit-screenshot'import { createUnitLayoutLint } from '@univer-cli/unit-layout-lint'const source = { unitType: 'slide' as const, unitData: slideData, formulaReferenceUnits,}const screenshot = createUnitScreenshot({ runtime: renderRuntime })const lint = createUnitLayoutLint({ runtime: renderRuntime })const capture = await screenshot.capture({ ...source, target: { kind: 'slide-pages', pages: [1], scale: 2 },})const report = await lint.lint({ ...source, pages: [1] })Slide: поиск проблем по границам глифов
Layout Lint использует факты браузера. declared — рамка модели, ink — реальные границы нарисованных глифов в координатах страницы с учётом раскладки, выравнивания и поворота. Рамка внутри страницы не гарантирует, что текст также помещается.
| Текущее правило | Основание |
|---|---|
text-off-page | Реальная область текста выходит за страницу. |
text-escapes-container | Текст явно выходит из найденного небольшого непрозрачного контейнера. |
text-overlaps-text | Две реальные области текста существенно перекрываются. |
coverage.pages и coverage.rules описывают охват. Finding содержит pageId, id, text.ink и соответствующие overflow, container, other; стабильный fingerprint помогает сравнивать исправления. Сейчас все findings — warnings для проверки вместе со снимками. Пустой список означает лишь отсутствие срабатываний выбранных правил в выбранной области.
Canvases: проверка отрисованных соединителей
Снимки Canvases дополнительно возвращают layoutAnalysis: routes, issues и summary, разрешённые браузером. Это отдельный интерфейс от unit-layout-lint, поддерживающего только Slide. Автоматические пути могут быть не разрешены в модели; проверяйте итог с source: 'rendered'.
Диагностика находит пересечения элементов, линий, стрелок и подписей с connectorIds, elementIds, focusBounds. Исправьте нужные объекты, снимите region или elementIds, затем проверьте весь холст. Так визуальная проблема связывается с конкретной правкой Facade.
Передача доказательств
Храните результаты, область, страницы, снимки и диагностику вместе. Снимок не доказывает верность формул, а lint не заменяет визуальную оценку. Панели, фокус и всплывающие меню проверяйте в Web-редакторе; убедитесь, что зависимости между Unit загружены.
Завершите проверку до Ready в Worktree. См. исполнение без интерфейса и серверные вычисления и Agent и автоматизация.
Насколько полезно это руководство?