Тема: Копирование (Copy,Paste)

Обнаружил такое поведение при копировании объектов.
1) Выполняем команду Copy
2) Выполняем команду Paste
3) Приходит сообщение AcDbDatabaseReactor::obectAppended
4) Попадаем в режим Drag и размещаем копию объекта на плане.
5) Приходит сообщение AcDbDatabaseReactor::obectAppended
6) Копирование завершается.
Т.е. на плане дабавился в орезультате копирования ОДИН объект, а сообщение о том, что в базу добавлен объект приходит !два раза! причем с разными id-ми. Реально скопированным объектом является второе сообщение, а объект созданный в первом сообщение не удаляется в дальнейшем и где он остается вообще не понятно.
Как отлечить по объекту - то ли это промежуточный объект для копирования, то ли это действительно скопированный объект??? Главное, что сообщение об удалении из базы этого промежуточного объекта потом не приходит.

Re: Копирование (Copy,Paste)

Согласен. Интересное поведение.
А теперь попробуй копировать объект с помощью "грызуна" удерживая клавишу Ctrl.

Re: Копирование (Copy,Paste)

> KonstantinM
Интересно, ответ нашел? Если нет, то небольшая подсказочка. Copy (в смысле в буфер обмена) создает временную базу (AcDbDatabase) и добавляет в нее выбранные примитивы - это твой первый AcDbDatabaseReactor::obectAppended. А Paste добавляет из временной базы в основную - второй AcDbDatabaseReactor::obectAppended. Тебе достаточно сравнить
objectId1.database(), objectId2.database() и рабочую базу, чтобы понять какой объект промежуточной, а какой окончательный.

Re: Копирование (Copy,Paste)

> Александр Ривилис
Дополнение к вышесказанному.
Промежуточный объект отслеживать и пытаться искать и удалять не нужно, так как временная база автоматически удаляется, и промежуточные объекты вместе с ней.

Re: Копирование (Copy,Paste)

Ну я так и подумал, что создается база данных временная (буферная), которая потом убивается оператором delete без всяких событий реакторов т.к. у объектов objectId-ы не нулевые и у них есть база.
Да догодался, что можно сравнивать текущую базу с запрошенной базой у объекта.
Но решил я эту проблему как то по другому - вроде что-то типа того, что между событиями о первом добавлении объектов и окончательном добавлением объектов происходит еще какое-то событие... - соотвественно когда оно происходит, то я из пула объектов для кторых пришел аппенд - все выкидываю. Т.е. у меня есть пул объектов, когда для объекта приходит аппенд, то он просто заносится в пул. По завершению команды (beginQuiescentState) - я начинаю обработку того, что же там за только что завершившуюся команду произошло... откопировалось, сдвинулось, удалилось и т.п.

Re: Копирование (Copy,Paste)

> KonstantinM
Тоже решение smile Но очень зависящее от версии AutoCAD, т.к. Autodesk достаточно часто тасует порядок событий, возникающих в реакторах, так что в следующей версиии могут быть проблемы. Я, при наличии другого способа, не стал бы так рисковать.
IMHO smile

Re: Копирование (Copy,Paste)

> Александр Ривилис
В чем то ты прав. Щас глянул - это событие beginDragSequence - т.е. при выполнение Paste, сначала копируются объекты в темпоральную базу, потом приходит beginDragSequence (удаляю из пула то что накопировалось), таскаю копию по экрану, отпускаю, приходят правильные сообщения об аппенде... Думаю, что beginDragSequence не пустят раньше того, как копирование объектов, которые будут таскаться в DragSequence... хотя я уже ни в чем со следующими версиями акада не уверен...

Re: Копирование (Copy,Paste)

KonstantinM пишет:

..хотя я уже ни в чем со следующими версиями акада не уверен...

"Толи еще будет, ой-ой-ой" (c) biggrin
Кажется, я уже смог тебя убедить в своем скептическом (реалистическом)отношении. smile
Тем более, что ошибки, связанные с предположением о порядке выполнения событий в AutoCAD не слишком просто находить...