Этого достаточно, что Автокад не стер данные других приложений в XData
У меня вроде так и сделано, но исходные данные все равно заменяютсяТолько если имя твоего приложения (appName) совпадает с именем, которое использует AutoCAD.
Только если имя твоего приложения (appName) совпадает с именем, которое использует AutoCAD.Нет, они разные. В чем и проблема. До у меня AcDbBlockRepETag, после - данные моего приложения. Предыдущих нет. Возможно ли что хData обнуляются сами при вставке(программно через sourceDb.WblockCloneObjects(Drawing.GetObjects(sourceDb, layersToSync), idMSpace, idMap, DuplicateRecordCloning.Ignore, false);) в новый чертеж?
Возможно ли что хData обнуляются сами при вставке(программно через sourceDb.WblockCloneObjects(Drawing.GetObjects(sourceDb, layersToSync), idMSpace, idMap, DuplicateRecordCloning.Ignore, false);) в новый чертеж?А ты RegAppTableRecord копируешь в новый чертеж? Если ты сейчас говоришь об алгоритме, который в предыдущей теме, то тогда понятно откуда у тебя ошибка. В новом чертеже нет этой RegAppTableRecord если ты её не скопировал или не создал до копирования.
Алгоритм моего кода такой: в исходном чертеже отобрать объекты, прикрепить к ним xdata и вставить в новый чертеж при помощи sourceDb.WblockCloneObjects.
layersToSyncЭто список слоев (string) объекты с которых нужно скопировать.
В новом чертеже нет этой RegAppTableRecord если ты её не скопировал или не создал до копирования.То есть ее нужно копировать вручную? Я думал что sourceDb.WblockCloneObjects переносит все данные всех объектов без потерь, то есть делает глубокую копию, выходит что я ошибаюсь?
Я думал что sourceDb.WblockCloneObjects переносит все данные всех объектов без потерьЭто не так. Тут есть много нюансов.
что в idMap сохраняются пары исходный ObjectId и скопированный ObjectId.
много нюансов.В моем случае предыдущую xData нужно копировать вручную и ее отсутствие вызывает ошибки? Так?
В моем случае предыдущую xData нужно копировать вручную и ее отсутствие вызывает ошибки? Так?Не XData копировать, а RegAppTableRecord
Не XData копировать, а RegAppTableRecordКак ее правильно скопировать через WblockCloneObjects? Можно пример?
Стоп. Ты меня совсем запутал. В исходной базе тебе нужно добавлять XData к твоим объектам? Если нет, то тогда создаёшь свою RegAppTableRecord в базе, в которую копируешь и добавляешь XData к скопированным объектам. И еще. WblockCloneObjects крайне желательно вызывать вне всяких транзакций. Кстати, как я заметил, у тебя куча вложенных транзакций. Это допустимо, но нежелательно. Если без этого можно обойтись (а у тебя точно можно), то лучше обойтись без вложенных транзакций.В моем случае предыдущую xData нужно копировать вручную и ее отсутствие вызывает ошибки? Так?Не XData копировать, а RegAppTableRecord
Благо, что в idMap сохраняются пары исходный ObjectId и скопированный ObjectId.При замене порядка - то есть не присваивать xData внутри чертежа источника, а сначала скопировать объекты в конечный чертеж и присваивать там, я хватаю ошибку и Автокад падает. В момент работы с IdPair. Такие дела.
По поводу форматирования тебе уже написали.Каюсь, второпях не уследил.
Проект в zip-архиве сюда. Мне надоело смотреть на обрывки кода.Прикладываю проект в архиве. txt файлики для конфига тоже.
Нужен минимальный тестовый пример, созданный с нуля, который воспроизводит ошибку.Александр Ривилис, фишка то в том и есть, что я получаю разные ошибки (перетертые xData, AcDbRegAppTable(9) Invalid Entry, pure virtual function call, исчезновение ранее добавленных объектов) причем хаотично - 20 раз отработает нормально, на 21 выдаст ошибку, на 22 норм, затем совершенно другая ошибка и снова нормально.
Ты или не понимаешь что я прошуНе понимаю, что не так. Чертежи с нуля с объектами приложил, все решение с файлами необходимыми для сборки и для конфига тоже.
Нужен минимальный тестовый пример, созданный с нуля, который воспроизводит ошибкуВ моем случае стабильно воспроизводится одна проблема - исчезновение ранее добавленных объектов после вставки последующих. Другие ошибки я хватаю хаотично на ЭТОМ ЖЕ коде, не меняя его. Воспроизвести их нарочно у меня нет возможности - я не знаю что их вызывает и условия под это мне не создать.
Не понимаю, что не так. Чертежи с нуля с объектами приложил, все решение с файлами необходимыми для сборки и для конфига тоже.Зачем мне тратить моё время на изучение логики твоей программы? В этом главный вопрос.
Зачем мне тратить моё время на изучение логики твоей программыТут я прошу прощения, алгоритм и цель кода я действительно подробно не рассказал.
Ты подумал что будет при наличии одноименных блоков, имеющих разное содержимоеПоследующие переопределятся на основе первого описания блока, которое было добавлено раньше.
Последующие переопределятся на основе первого описания блока, которое было добавлено раньше.Если это динамические блоки, то я очень сомневаюсь, что это будет корректно работать.
что это будет корректно работать.Возможны ошибки во время работы кода или потеря свойств самого блока?
И то и другое. И у тебя еще и просто ошибка в коде при изменении свойства видимости блока.что это будет корректно работать.Возможны ошибки во время работы кода или потеря свойств самого блока?
В методе SetDynamicBlockProperty (файл EntityProcessor.cs) ты открываешь BlockReference для чтения, а затем модифицируешь его динамические свойства. Это как???
2. В методе GetXData2 (файл Synchronizer.cs) ты открываешь транзакцию, но не вызываешь Commit. Соответственно происходит откат. И вообще этот метод бред в чистейшем виде. Ты передаешь в него DBObject, т.е. объект уже открыт.
Причем те что имеют в xdata AcDbBlockRepETag и мной добавленные xdata как раз и исчезают.Ну это как раз очевидно. Ты сначала меняешь для BlockReference его XData, а затем меняешь динамические свойства. Изменение динамического свойства приводит к созданию нового BlockReference и добавленные тобой XData исчезают. Попробуй убрать строку
Но проблема исчезновения ранее добавленных объектов не ушла - они исчезают. Причем те что имеют в xdata AcDbBlockRepETag и мной добавленные xdata как раз и исчезаютИсчезают объекты или исчезает XData?
Попробуй убрать строку
Код - C# [Выбрать]
EntityProcessor.SetDynamicBlockProperty(destDb, blockNames);
Будут ли исчезать твои XData?
Попробуй убрать строкуПопробовал - объекты исчезают. Исчезает ли в них xdata никак не проверить - объект в чертеже отсутствует. Тут нужно наверно уточнить - пропадают не только блоки но и полилинии и другие объекты. Объекты я здесь применяю как широкий термин - все что отображается/нарисовано в чертеже.
AcDbBlockRepETag есть также у меня в свойствах полилинии при открытии MgdDbg.Бред какой-то. Эта RegApp должна быть только у динамических блоков.
Я вижу, что у тебя в чертеже следы NanoSPDSА как Вы это увидели? Где можно посмотреть? У нас есть чертежи контрагентов, он рисуют в Нанокаде. Но чертежи на которых исчезают объекты сделаны в Автокадах 2015 и 2010. В Нанокаде они не разрабатывались.
он рисуют в НанокадеЯ не сказал Нанокад. Я сказал NonoSPDS:
Какой то глюк - сообщение задвоилось.Скриншота не вижу.
Скриншота не вижу.Картинка почему-то не прикрепляется. Попытаюсь еще раз.
всё снеси и проверяй на чистом AutoCAD со всеми установленными обновлениямиНа чистой установке тоже самое.
Значит спишем на баг AutoCAD 2015, который давно не поддерживается и то, что чертежи редактировались не только в AutoCAD.всё снеси и проверяй на чистом AutoCAD со всеми установленными обновлениямиНа чистой установке тоже самое.
Например пройти по всем элементам и те что не блоки очистить от xdata с AcDbBlockRepETag вручную.Попробуй.
В качестве догадки - может ли этот AcDbBlockRepETag унаследовть полилиния которая раньше была внутри блока, затем блок разбили, а AcDbBlockRepETag унаследовался линией?Только если это баг или разбивали блок не стандартной командой _EXPLODE, а какими-то сторонними методами.
Цитата: Atomohod от 14-04-2021, 15:22:23
Например пройти по всем элементам и те что не блоки очистить от xdata с AcDbBlockRepETag вручную.
Попробуй.
Есть ли какая-нибудь особенность обнуления xdata?Есть. Во-первых, полностью обнулять XData нельзя. Ты так совсем испортишь чертеж. Во-вторых, чтобы обнулить XData для конкретного приложения, нужно (appName - это имя конкретного приложения, например "AcDbBlockRepETag", только удалять его нужно у всего кроме BlockReference):