Гайд: Как исправить сбои перевода DWG в APS и потерю выбора у сотен одинаковых блоков - Часть 1
Короткий вывод
- Официально задокументированного порога «не больше N одинаковых блоков» для DWG в APS Model Derivative нет. Но на практике транслятор 2D-DWG может объединять/инстансить/упрощать повторяющиеся идентичные символы, особенно если они анонимные, динамические, вложены в другие блоки, находятся в листах/вьюпортах или файл перегружен штриховкой.
- Если у экземпляра в Viewer нет
dbId, значит для этого экземпляра транслятор не создал отдельный выбираемый объект/маппинг. Viewer не может «починить» это на клиенте черезswitchLoaderили настройки рендера. - Для сотен/тысяч одинаковых блоков, где каждый должен быть индивидуально выбираемым, надежнее всего либо сделать каждый экземпляр уникальным для транслятора через атрибуты/имена/слои и статические блоки, либо использовать гибридную схему: легкая подложка + маркеры/оверлеи кранов с внешними ID.
1. Проблема с переводом: почему failed и Tr worker fail to download
Что означает ваш манифест
Пример:
{
"status": "failed",
"progress": "complete",
"children": [
{ "type": "geometry", "status": "success" },
{ "type": "geometry", "status": "success" }
]
}
Это означает, что какие-то дочерние производные были созданы, но корневой процесс перевода завершился с ошибкой.
Так бывает, когда:
- геометрия частично упакована, но упал этап консолидации манифеста;
- упал worker упаковки/загрузки результата;
- произошел таймаут из-за слишком сложного файла;
- не удалось обработать metadata/thumbnail/object mapping;
- внутренняя ошибка загрузки артефактов между сервисами/хранилищем.
Фраза Tr worker fail to download обычно указывает на сбой внутреннего процесса перевода/загрузки результатов, а не на ошибку вашего клика в Viewer. Если это повторяется на одном и том же файле после x-ads-force: true, значит проблема, скорее всего, не временная сетевая, а связана с содержимым/размером/структурой файла либо с внутренним состоянием перевода.
Что важно понимать
Если корневой status: failed, такой перевод нельзя считать надежным, даже если какие-то children имеют success.
Viewer может частично что-то открыть, но могут отсутствовать:
- нормальная иерархия объектов;
- свойства;
- стабильные
dbId; - корректная выбираемость;
- корректная обработка листов/видовых экранов;
- миниатюры;
- полная индексация объектов.
Для продакшена такой URN лучше пересоздать после подготовки файла.
2. Почему одинаковые блоки могут быть видны, но не выбираются
В APS Viewer выбор работает не просто по пикселю «попал в геометрию».
Нужен маппинг:
фрагмент/инстанс/2D-примитив → объект → dbId → свойства
Если транслятор записал геометрию, но не записал отдельный объект на каждое вхождение блока, пользователь увидит картинку, но кликнуть по ней как по отдельному объекту не сможет.
Возможные причины
2.1. Повторяющиеся идентичные блоки оптимизируются
Если у вас 120 вставок одного и того же блока, транслятор может:
- использовать одну геометрию многократно;
- объединить повторяющиеся элементы в пакеты;
- создать один условный объект/узел на группу;
- не создавать индивидуальный
dbIdна каждый инстанс; - записать маппинг только для части инстансов из-за внутренней эвристики.
То, что у вас выбираются примерно 5 из 120, очень похоже на то, что эти 5 чем-то отличаются от остальных:
- находятся в другом пространстве: model space, не в листе/вьюпорте;
- не являются частью массива/группы/вложенного блока;
- имеют другой слой;
- имеют другой атрибут;
- имеют другое состояние динамического блока;
- имеют другую видимость/параметр;
- не перекрыты штриховкой;
- не были созданы через
MINSERT/ассоциативный массив; - имеют явную именную ссылку, а не анонимный блок
*U....
Это важно проверить.
2.2. Блоки могут быть не прямыми вставками, а вложенными объектами
Проверьте в AutoCAD:
- Выберите кран и выполните
LIST. - Убедитесь, что это именно
INSERTнужного блока, а не:MINSERT;- массив;
- анонимный блок;
- прокси-объект;
- объект вертикального продукта;
- вложенный элемент внутри другого блока;
- элемент внутри видового экрана.
Если краны лежат внутри другого блока, например «План участка» или «Генплан», то они могут быть частью одного родительского объекта. Тогда индивидуальная выбираемость может быть ограничена или отсутствовать.
2.3. Динамические блоки — отдельный источник проблем
Динамические блоки могут приводить к:
- созданию анонимных определений блоков;
- разным внутренним состояниям видимости;
- увеличению числа объектов;
- нестабильному маппингу свойств;
- более долгой конвертации;
- частичной потере выбора у отдельных состояний.
Для APS лучше использовать статический блок с обычным именем и, при необходимости, атрибутами.
2.4. Лист / Model Space / Viewport может ломать пообъектный выбор
Для DWG транслятор может создавать несколько 2D-видов:
- Model;
- Layout1;
- Layout2;
- Sheet;
- именованные виды.
Если вы загружаете лист с видовым экраном, вы можете видеть геометрию из model space, но она может не иметь полноценного пообъектного выбора в контексте листа. Проверьте, какой именно узел манифеста вы загружаете. Если есть отдельный Model view, попробуйте загрузить его.
2.5. Штриховка может мешать не только переводу, но и выбору
Плотная штриховка:
- резко увеличивает время перевода;
- повышает потребление памяти;
- может вызывать таймауты;
- может перекрывать блоки по draw order;
- может приводить к объединению/упрощению геометрии;
- может вызывать растеризацию/тайлизацию областей, где выбор становится хуже.
Если после отключения слоя со штриховкой выбираемость улучшается — причина частично в ней.
2.6. Рендеринг через общие буферы геометрии
Да, это связано. Но важно различать:
- сам факт использования общей геометрии для инстансов не обязан убивать выбор;
- выбор ломается, если не записан маппинг «инстанс → объект/
dbId».
То есть проблема не в том, что GPU использует общие буферы, а в том, что в производной модели отсутствует нужный объект или связь между инстансом и dbId.
3. Прямые ответы на ваши вопросы
Вопрос 1. Есть ли известное ограничение на количество экземпляров одного блока?
Официально задокументированного значения вида «не более 20/50/100 одинаковых блоков» я не знаю. В документации такого порога нет.
Но практически наблюдается поведение, при котором транслятор может:
- группировать повторяющиеся 2D-символы;
- инстансить их;
- не создавать индивидуальный объект на каждое вхождение;
- ограничивать детализацию маппинга для больших/плотных чертежей.
Порог может быть не фиксированным числом, а зависеть от:
- общего числа объектов;
- сложности геометрии;
- числа вершин;
- штриховок;
- динамических состояний;
- размера файла;
- типа вида: model или sheet;
- наличия атрибутов;
- внутренней версии транслятора.
Поэтому ваш порог между 20 и 120 не выглядит как жесткое документированное ограничение. Больше похоже на внутреннюю эвристику или комбинацию факторов.
Вопрос 2. Связано ли это с общими буферами геометрии и потерей dbId?
Да, связано, но точнее так:
общие буферы геометрии — не первопричина; первопричина — отсутствие маппинга на объект.
Если транслятор создал:
много инстансов + таблица инстансов + объект/свойства на инстанс
то выбор может работать.
Если транслятор создал:
один пакет геометрии / объединенный фрагмент / инстансы без объекта
то dbId для большинства экземпляров не появится.
В 2D-производных это особенно вероятно, потому что конечное представление ближе к листу/векторной сцене, чем к полноценной 3D-модели с развитым InstanceTree.
Вопрос 3. Есть ли параметр перевода или опция вывода: SVF2, SVF1, switchLoader?
Публично известного параметра уровня:
"disableBlockInstancing": true
или аналогичного «заставить каждый 2D-блок быть выбираемым» для DWG в Model Derivative я не знаю.
switchLoader
switchLoader — это, по сути, опция загрузчика/поведения Viewer, а не параметр серверной трансляции. Она не создает отсутствующие dbId. Если в производном файле нет объекта на каждый кран, switchLoader это не исправит.
SVF2 против SVF1
Можно поэкспериментировать с форматами:
- svf2;
- legacy svf, если он еще доступен для вашего типа файла и региона.
Это может дать разное поведение, но я бы не рассматривал это как надежное решение. Это скорее диагностический шаг.
Пример запроса для svf2:
{
"input": {
"urn": "BASE64_URN"
},
"output": {
"formats": [
{
"type": "svf2",
"views": ["2d"]
}
]
}
}
Если нужно проверить старый путь, можно попробовать:
{
"input": {
"urn": "BASE64_URN"
},
"output": {
"formats": [
{
"type": "svf",
"views": ["2d"]
}
]
}
}
Но:
svfможет быть недоступен/ограничен для некоторых случаев;- legacy-форматы не всегда получают исправления;
- если сам транслятор не создал объекты на инстансы, смена загрузчика не поможет.
Вопрос 4. Рекомендуемый подход для сотен одинаковых блоков с индивидуальной выбираемостью?
Надежный подход — не рассчитывать, что анонимные повторяющиеся вставки блока автоматически станут сотнями независимых объектов. Нужно либо сделать их уникальными для транслятора, либо вынести идентификацию в вашу систему.
Рекомендация по приоритету:
- Убрать проблемы источника: динамические блоки, штриховку, вложенность, листы/массивы.
- Сделать каждый кран уникальным через атрибут, имя блока или слой.
- Убедиться, что загружается Model view, а не sheet/viewport.
- Если не помогает — разделить модель или использовать подложку + маркеры.
- Для сотен/тысяч объектов чаще всего правильнее делать внешнюю систему идентификации и собственный picking/оверлей.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.