Гайд: Как исправить сбои перевода DWG в APS и потерю выбора у сотен одинаковых блоков - Часть 2
4. Диагностика: что проверить в первую очередь
4.1. Проверьте, какие виды существуют в манифесте
Вам нужно понять, что именно вы грузите: модель, лист, layout.
Пример диагностики:
Autodesk.Viewing.Document.load(urn, (doc) => {
const nodes = doc.getRoot().search({ type: 'geometry', role: '2d' });
console.table(
nodes.map(n => ({
name: n.name(),
viewableID: n.data.viewableID,
sheetType: n.data.sheetType,
role: n.data.role
}))
);
// Далее пробуйте грузить разные узлы:
// viewer.loadDocumentNode(doc, nodes[0]);
});
Если есть узел с названием вроде Model, попробуйте его. Если сейчас грузится Layout, Sheet, Paper, это может быть причиной.
4.2. Сравните 5 выбираемых кранов и 115 невыбираемых
Это очень важно. Найдите в AutoCAD, чем отличаются выбираемые экземпляры.
Проверьте:
| Параметр | Что проверить |
|---|---|
| Тип объекта | INSERT, не MINSERT, не array, не прокси |
| Имя блока | одно ли имя, нет ли анонимных *U... |
| Effective name | особенно для динамических блоков |
| Вложенность | не внутри ли другого блока |
| Пространство | Model Space или Paper Space |
| Слой | один и тот же слой или разные |
| Цвет/тип линий | есть ли переопределения |
| Атрибуты | есть ли атрибуты и разные ли значения |
| Масштаб/поворот | не отличаются ли только 5 штук |
| Состояние видимости | разные ли состояния динамического блока |
| Перекрытие | не лежит ли штриховка сверху |
| Viewport | не находятся ли они в разных видовых экранах |
Если найдете отличие — это ключ к решению. Например, если 5 выбираемых кранов имеют уникальные атрибуты или лежат на отдельных слоях, а остальные нет — значит нужно сделать уникальными все.
4.3. Проверьте выбор и свойства в Viewer
Добавьте диагностику:
viewer.addEventListener(
Autodesk.Viewing.SELECTION_CHANGED_EVENT,
() => {
const ids = viewer.getSelection();
console.log('Selected dbIds:', ids);
if (!ids.length) return;
viewer.getProperties(
ids[0],
(result) => {
console.log('Properties:', result.properties);
},
(err) => {
console.warn('getProperties error:', err);
}
);
}
);
Если клика нет и SELECTION_CHANGED_EVENT не возникает, значит объект не существует как выбираемый.
Если у вас есть подозрительные dbId из дерева объектов, попробуйте программно:
viewer.select([dbId]);
Если программно выбирается, а кликом нет — это может быть вопрос picking/перекрытия. Если и dbId нигде нет — объект отсутствует в маппинге.
4.4. Проверьте metadata/properties
Можно проверить через Model Derivative metadata endpoints:
GET /modelderivative/v2/designdata/{urn}/metadata
И далее для конкретного вида:
GET /modelderivative/v2/designdata/{urn}/metadata/{viewableId}/properties
Если в properties есть только 5 кранов, а 115 отсутствуют, значит проблема точно на этапе трансляции.
5. Подготовка DWG: что сделать перед повторной загрузкой
5.1. Базовая очистка
Вы уже делаете многое, но вот полный практический список:
-PURGE
AUDIT
RECOVER
OVERKILL
PURGE REGAPPS
PURGE ZERO-LENGTH GEOMETRY
PURGE UNUSED LAYERS
PURGE UNUSED BLOCKS
PURGE UNUSED LINE TYPES
PURGE UNUSED DIMENSION STYLES
PURGE UNUSED TEXT STYLES
Особенно важно удалить неиспользуемые определения блоков и анонимные блоки.
5.2. Убрать динамические блоки или перевести их в статические
Для APS лучше:
- один статический блок;
- одно состояние видимости;
- без лишних динамических параметров;
- с обычным именем;
- желательно с атрибутом
ID.
Варианты:
- Вручную заменить динамические блоки на статические.
- Использовать
BURST, если доступно и если это не ломает нужные атрибуты. - Экспортировать/пересохранить чертеж так, чтобы динамические состояния были зафиксированы.
- Если файл генерируется автоматически — генерировать сразу статические блоки.
Важно:
Если вы используете EXPLODE, вы можете потерять сущность «кран» как блок. Иногда это допустимо, но чаще лучше оставить блок, но сделать его статическим и атрибутивным.
5.3. Добавить уникальный атрибут на каждый кран
Это один из лучших вариантов.
Создайте блок крана с атрибутом, например:
Tag: CRANE_ID
Value: CR-001
Каждая вставка должна иметь уникальное значение:
CR-001
CR-002
...
CR-120
Зачем это нужно:
- APS с большей вероятностью создаст отдельный объект для вставки с уникальными свойствами;
- у вас появится стабильный внешний идентификатор;
- можно искать объекты через
viewer.search(); - можно связывать объекты с вашей базой данных.
Пример поиска:
viewer.search('CR-017', (ids) => {
console.log('Found ids:', ids);
viewer.select(ids);
});
Важно:
Не полагайтесь только на dbId. После повторного перевода dbId могут измениться. Лучше использовать внешний идентификатор, например атрибут CRANE_ID.
5.4. Альтернатива: уникальные слои
Если атрибуты не помогают, можно попробовать разнести краны по уникальным слоям:
CRANE_001
CRANE_002
...
Это грубее, но иногда заставляет транслятор не сливать объекты.
Минусы:
- много слоев;
- может ухудшить структуру чертежа;
- может повлиять на производительность при очень большом количестве;
- слой не является бизнес-идентификатором.
Для 120 кранов это может быть приемлемо. Для тысяч — уже нежелательно.
5.5. Альтернатива: уникальные имена блоков
Можно создать:
CRANE_001
CRANE_002
...
и вставлять каждый кран как свой блок. Это может помочь, если транслятор объединяет только вставки одного определения блока.
Минусы:
- файл становится тяжелее;
- перевод может стать дольше;
- сложнее поддерживать исходный DWG;
- при сотнях/тысячах это может быть неэффективно.
Этот вариант стоит использовать, если атрибуты и слои не помогли, а объектов не тысячи.
5.6. Убрать массивы, MINSERT, группы и вложенность
Проверьте:
- нет ли
MINSERT; - нет ли ассоциативных массивов;
- нет ли группы;
- нет ли родительского блока;
- нет ли вложенных ссылок.
Если есть:
EXPLODE / конвертировать в отдельные вставки
Но делать это нужно так, чтобы не потерять идентификацию кранов. Лучше после взрыва создать уникальные атрибуты или заново вставить блоки с атрибутами.
5.7. Упростить штриховку
Рекомендации:
- не взрывайте плотную штриховку в тысячи линий — это может ухудшить проблему;
- уменьшите плотность паттерна;
- увеличьте масштаб штриховки;
- замените сложные паттерны на простые;
- используйте сплошную заливку, если допустимо;
- вынесите штриховку на отдельные слои;
- удалите некритичную штриховку для перевода;
- рассмотрите отдельный файл-подложку для штриховки.
Если штриховка обязательна визуально, часто лучше:
фон: упрощенный вектор или растр
краны: отдельный слой/модель/маркеры
5.8. Проверить пространство и виды
Рекомендую:
- Оставить только Model Space, если вам нужен именно план в модели.
- Удалить лишние layout'ы.
- Удалить ненужные видовые экраны.
- Проверить, что краны находятся прямо в Model Space.
- Если нужен лист, проверить выбор именно в контексте листа отдельно.
Если вы грузите sheet, а краны в model viewport, это может быть причиной отсутствия выбора.
5.9. Проверить аннотативность и прокси-объекты
Если блоки аннотативные:
- попробуйте отключить annotative;
- зафиксируйте масштаб;
- уберите множественные аннотативные представления.
Если объекты прокси:
- используйте
EXPORTTOAUTOCADили аналогичный экспорт в чистый AutoCAD DWG; - запросите исходник без вертикальных объектов.
5.10. Сохранить в более простую/старую версию
Иногда помогает:
- сохранить как DWG 2013;
- сохранить как DXF 2013/2018;
- удалить динамические функции;
- удалить лишние metadata.
Но это именно диагностический и обходной шаг, не гарантия.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.