ADN Club > ObjectARX
Проблема с осмыслением AcDbIdMapping при копировании-вставке
Mihanpan:
Добрый день.
Помогите, пожалуйста, разобраться.
Есть чертеж, на нем блоки, связи между которыми заданы через их хэндлы. При копировании/вставке эти связи, понятное дело, надо установить для новых объектов (где возможно). Хотел сделать через AcEditorReactor.
Столкнулся со следующей проблемой:
при просмотре idMapping в функции реактора endDeepClone некоторые блоки удается проследить от оригинала до копии по цепочке идентификаторов в базах чертежа и временной, некоторые - нет. (знаю, что по handle следить не имеет смысла, потому опираюсь на AcDbObjectId)
Пример: выделяю три блока (handle 341, 242, 2b4), копирую, вставляю, получаю новые три блока (4c0, 4b5, 4ac)
При этом в отладчике веду протокол - пишу содержимое idMapping в endDeepClone.
В протоколе указываются AcDbObjectId [handle] ключа --> AcDbObjectId [handle] значения (дальше я привожу только для трех копируемых блоков):
на Wblock
ff604ba0 [242] --> ff613db0 [5b]
ff604ec0 [2b4] --> ff613f60 [76]
ff607890 [341] --> ff60b1d0 [95]
на Insert
ff613db0 [47a] --> ff60dca0 [47a]
ff613f60 [483] --> ff60dd30 [483]
(здесь ключ ff60b1d0 не встречается)
на Explode
ff60dca0 [47a] --> ff622040 [4ac]
ff60dd30 [483] --> ff6220d0 [4b5]
ff60dde0 [48e] --> ff622180 [4c0]
Интересно, что если копирую только один блок (тот же с handle 341), то цепочка идентификаторов прослеживается без проблем.
В архиве - исходники, файл чертежа для примера и полный протокол (logs.txt), который получился у меня.
Александр Ривилис:
Попробуй всё тоже самое, но во вставкой в другой чертеж. У меня есть идея, но её нужно проверить.
Mihanpan:
Проверил
В многодокументном режиме (SDI==0) картина идентичная - два блока можно определить, третий (h==341) "оторвался" между Wblock и Insert. (Были открыты оба документа, я выделил, скопировал, переключился через "Окно" в Чертеж2, вставил)
В однодокументном (SDI==1) все цепочки разорвались, на Insert нет подходящих Id, которые были получены после Wblock. (Был открыт Чертеж1, выделил, скопировал, открыл Чертеж2, вставил)
Александр Ривилис:
--- Цитата: Mihanpan от 02-09-2014, 08:31:34 ---В однодокументном (SDI==1) все цепочки разорвались, на Insert нет подходящих Id, которые были получены после Wblock. (Был открыт Чертеж1, выделил, скопировал, открыл Чертеж2, вставил)
--- Конец цитаты ---
Вот у меня именно эта картина и наблюдается при SDI == 0. Причем если проследить, то видно что pDbDest, которая в Wblock больше ни разу не встречается:
--- Код: ---20:55:27------endDeepClone--------
map->DeepCloneContext = 7,
map->pDbOrig=2a930560 (E:\RAN\VCSDK_2008\TestTrack\Чертеж1.dwg),
map->pDbDest=2ac6d470 (),
pWorkingDb=2a930560 (E:\RAN\VCSDK_2008\TestTrack\Чертеж1.dwg)
20:55:27pair Id's: class AcDbBlockReference 8796082576288 [242] --> 8796082552240 [5B]
20:55:27pair Id's: class AcDbBlockReference 8796082576960 [2B4] --> 8796082552672 [76]
20:55:27pair Id's: class AcDbBlockReference 8796082578320 [341] --> 8796082614736 [95]
20:55:31------endDeepClone--------
map->DeepCloneContext = 6,
map->pDbOrig=2a98bf00 (C:\Temp\A$C78427FC6.DWG),
map->pDbDest=2a930560 (E:\RAN\VCSDK_2008\TestTrack\Чертеж1.dwg),
pWorkingDb=2a930560 (E:\RAN\VCSDK_2008\TestTrack\Чертеж1.dwg)
20:55:31pair Id's: class AcDbBlockReference 8796082598352 [50C] --> 8796082579776 [50C]
20:55:31pair Id's: class AcDbBlockReference 8796082609584 [4F8] --> 8796082579456 [4F8]
20:55:31pair Id's: class AcDbBlockReference 8796082610016 [501] --> 8796082579600 [501]
20:55:32------endDeepClone--------
map->DeepCloneContext = 1,
map->pDbOrig=2a930560 (E:\RAN\VCSDK_2008\TestTrack\Чертеж1.dwg),
map->pDbDest=2a930560 (E:\RAN\VCSDK_2008\TestTrack\Чертеж1.dwg),
pWorkingDb=2a930560 (E:\RAN\VCSDK_2008\TestTrack\Чертеж1.dwg)
20:55:32pair Id's: class AcDbBlockReference 8796082579456 [4F8] --> 8796082580256 [52A]
20:55:32pair Id's: class AcDbBlockReference 8796082579600 [501] --> 8796082580400 [533]
20:55:32pair Id's: class AcDbBlockReference 8796082579776 [50C] --> 8796082580576 [53E]
--- Конец кода ---
(я немного исправил твой код)
Я еще немного поиграюсь с этим кодом, и если ничего не получится - отправлю вопрос в ADN DevHelp.
Александр Ривилис:
P.S.: Кстати, у тебя в коде есть существенная ошибка:
Ты передаешь в функцию OutputDebugFormatedString значения idPair.key() и idPair.value(), т.е. адреса AcDbObjectId для ключа и значения. А нужно тебе передать сами ключ и значение, т.е. idPair.key().asOldId() и idPair.value().asOldId().
Навигация
Перейти к полной версии