ADN Club > ObjectARX

Проблема с осмыслением AcDbIdMapping при копировании-вставке

(1/2) > >>

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().

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии