Гайд: Как исправить сбои перевода DWG в APS и потерю выбора у сотен одинаковых блоков - Часть 3
6. Что делать с ошибкой перевода
6.1. Не использовать x-ads-force: true без изменения источника
Если файл не изменился, повторная конвертация часто даст тот же результат. x-ads-force полезен, когда:
- вы изменили исходник;
- нужно перебить кэш перевода;
- был временный сбой;
- менялись настройки задания.
Но если источник остается тяжелым или проблемным, ошибка повторится.
6.2. Загрузить файл заново под новым именем/новым URN
Иногда полезно не просто пересоздать manifest, а:
- заново загрузить объект в OSS;
- получить новый
urn; - запустить перевод.
Это помогает, если:
- объект был поврежден при загрузке;
- есть проблема с кэшем/регионом;
- файл был загружен с ошибками;
- нужно исключить влияние старого состояния.
6.3. Проверить messages в манифесте
Смотрите не только status, но и:
"messages": [...]
Там могут быть предупреждения:
- слишком много объектов;
- пропущены элементы;
- проблемы с листами;
- проблемы с памятью;
- ограничения по геометрии.
6.4. Разделить файл
Если файл 50–100 МБ и содержит плотную штриховку + сотни блоков, перевод может не укладываться во внутренние лимиты времени/памяти.
Варианты разделения:
Вариант A: зоны участка
site_zone_01.dwg
site_zone_02.dwg
site_zone_03.dwg
Вариант B: фон и объекты
site_background.dwg
site_cranes.dwg
Вариант C: листы и модель
model_space.dwg
layout_01.dwg
layout_02.dwg
Для отображения в Viewer можно:
- загружать несколько моделей;
- использовать overlay;
- синхронизировать выбор через внешние ID;
- скрывать/показывать слои/модели.
7. Рекомендуемые архитектурные решения
Ниже три основных варианта. Для вашей задачи с кранами я бы рассматривал их именно в таком порядке.
Вариант 1. Сделать каждый кран уникальным в DWG
Подходит, если:
- кранов сотни, не десятки тысяч;
- вам нужен именно DWG как источник;
- вы хотите максимально использовать стандартный выбор Viewer;
- можно модифицировать исходный файл.
Что сделать
- Оставить один блок
CRANE. - Сделать его статическим.
- Добавить атрибут
CRANE_ID. - Для каждой вставки задать уникальное значение.
- Убрать динамические состояния.
- Убедиться, что вставки находятся в Model Space.
- Убедиться, что это не
MINSERT, не массив, не вложенный блок. - Упростить/удалить штриховку.
- Перевести.
- Проверить выбор и свойства.
Ожидаемый результат
Каждый кран имеет:
dbId
properties:
Block: CRANE
CRANE_ID: CR-017
Layer: ...
Тогда можно:
viewer.search('CR-017', (ids) => {
viewer.select(ids);
viewer.isolate(ids);
});
Риски
- не гарантировано, что транслятор создаст объект на каждую вставку;
- при большом числе уникальных атрибутов перевод может стать тяжелее;
- нужно тестировать на реальном файле.
Вариант 2. Разделить файл: фон + краны
Подходит, если:
- фон тяжелый;
- штриховка вызывает сбои;
- краны должны быть выбираемыми;
- нужно улучшить производительность.
Схема
background.dwg → только план, дороги, зоны, штриховка
cranes.dwg → только краны, желательно с атрибутами
В Viewer можно:
- грузить обе модели;
- совмещать их по координатам;
- фон делать полупрозрачным или неактивным;
- краны держать как отдельную выбираемую модель.
Плюсы:
- меньше нагрузка на перевод каждого файла;
- проще изолировать проблему;
- можно отключать фон;
- легче управлять выбором.
Минусы:
- нужно управлять несколькими моделями;
- нужно синхронизировать координаты.
Вариант 3. Подложка + маркеры/оверлеи кранов
Это часто самый надежный производственный подход для больших планов с сотнями/тысячами одинаковых объектов.
Идея
Вы не заставляете Viewer выбирать каждый векторный кран как объект.
Вместо этого:
1. План участка отображается как:
- упрощенный DWG;
- PDF;
- растровая подложка;
- векторная подложка без тяжелых блоков.
2. Краны хранятся в вашей БД:
{
"id": "CR-017",
"x": 12345.67,
"y": 6543.21,
"rotation": 90,
"type": "tower_crane",
"status": "active"
}
- Поверх плана рисуются маркеры/иконки/HTML-оверлеи.
- Клик по маркеру открывает карточку крана.
- Выбор работает не через
dbId, а через вашcraneId.
Плюсы
- полностью контролируемая выбираемость;
- не зависит от внутренней оптимизации транслятора;
- масштабируется на тысячи объектов;
- можно добавлять цвета, статусы, фильтры;
- легко связать с внешней БД;
- хорошая производительность.
Минусы
- нужно хранить координаты кранов;
- нужно синхронизировать систему координат;
- нужно рисовать собственное выделение;
- если нужен выбор именно векторной геометрии крана, это не полная замена.
Как реализовать
Шаг 1. Получить координаты кранов из DWG
Можно через:
- AutoCAD Data Extraction;
- AutoLISP;
- AutoCAD .NET API;
- ObjectARX;
- APS Design Automation for AutoCAD;
- экспорт в CSV/JSON.
Нужны:
CRANE_ID
INSERT_X
INSERT_Y
ROTATION
SCALE_X
SCALE_Y
LAYER
BLOCK_NAME
Шаг 2. Загрузить легкую подложку
В подложке можно оставить:
- границы;
- дороги;
- здания;
- основные слои;
- упрощенную штриховку или без нее.
Шаг 3. Наложить маркеры
Варианты:
- HTML-элементы поверх
viewer.container; - canvas overlay;
- SVG overlay;
- THREE.Sprite / 3D overlay objects;
- Autodesk Data Visualization extension;
- Markups Core для временных выделений.
Шаг 4. Реализовать picking
Алгоритм:
pointerup → получить экранные координаты
→ преобразовать в мировые/модельные координаты
→ найти ближайший кран в радиусе
→ выделить маркер
→ показать свойства из вашей БД
Шаг 5. Синхронизировать координаты
Для 2D-плана часто достаточно аффинного преобразования.
Можно:
- взять 2–3 известные точки на плане;
- получить их экранные координаты в Viewer;
- вычислить преобразование между DWG-координатами и клиентскими координатами;
- применять его для маркеров.
В Viewer есть методы преобразования координат, например clientToWorld, worldToClient, а для 2D-листов также можно использовать getPageToModelTransform, если доступно. Но надежнее всего сначала проверить на конкретных известных точках.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.