REMOVEALLPROXY

Автор Тема: REMOVEALLPROXY  (Прочитано 66967 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 948
  • Карма: 155
Re: REMOVEALLPROXY
« Ответ #105 : 05-05-2016, 21:38:21 »
Ситуацию "словил" на чистом dwt.
Объекты "вертикалок" не будут распознаваться как прокси, если demandload=3 и подгружен / науден соответствующий ObjectEnabler - это очевидно. Но, может, у Александра такой объект действительно не распознается как прокси при таких условиях, а у тебя - распознается? Это все в качестве предположения...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13074
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #106 : 05-05-2016, 21:44:52 »
Конечно же второй вариант...
Может. В отличие от RemoveAllProxy, который сканирует всю базу, ExplodeAllProxy работает только с теми контейнерами, которые могут содержать примитивы, а именно с (AcDb)BlockTableRecord'ами содержащимися в (AcDb)BlockTable. Т.е. если гипотетически предположить, что владельцем прокси-примитива будет не блок (том числе *ModelSpace, *PaperSpace, *PaperSpaceX), то ExplodeAllProxy его пропустит и обрабатывать не будет. Теоретически владельцами (AcDb)Entity могут быть только (AcDb)BlockTableRecord, но чем черт не шутит...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #107 : 05-05-2016, 21:47:02 »
Но, может, у Александра такой объект действительно не распознается как прокси при таких условиях, а у тебя - распознается? Это все в качестве предположения...
Насколько я помню, то фильтрацию проксей я делал по аналогии с кодом А.Н. так что ожидались и одинаковые результаты. Нужно будет глянуть и сравнить...

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: REMOVEALLPROXY
« Ответ #108 : 05-05-2016, 22:02:56 »
Еще в качестве предположения проанализируй приведение к другому типу и удаление
Код - C# [Выбрать]
  1. using (Db.Line tmp = new Db.Line())
  2. {
  3.    proxyEntity.HandOverTo(tmp, false, false);
  4.    tmp.Erase();
  5.    proxyEntity.Dispose();
  6.    handOverTo_called = true;
  7. }

На одном чертеже словил, что создаются примитивы от разбивки, но сами  прокси не удаляются.
Т.к. почистить чертеж нужно было срочно, разбил оригинальной программой Александра Ривилиса, проанализировать причину не успел.
В других чертежах все работало норм.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #109 : 05-05-2016, 22:20:21 »
На одном чертеже словил, что создаются примитивы от разбивки, но сами  прокси не удаляются.
Как ты открывал свой proxyEntity (через транзакцию или без)?
Цитата: Андрей Бушман
Внимание! Если в коде не используется OpenCloseTransaction (ниже в коде я покажу оба варианта), то после того, как замещяемый объект (Circle в примере выше) открыт с опцией OpenMode.ForWrite - для него позднее должен быть обязательно вызван метод Dispose(), а для замещающего - метод Close() для того, чтобы зафиксировать изменение и закрыть запись в файле "UNDO.ac$". Обратите внимание на то, что удалять старый объект (Circle в примере выше), вызывая экземплярный метод Erase(), в данном случае не нужно, так как эта операция удаления выполняется в коде метода DBObject.HandOverTo(). Однако очистка памяти от замещаемого объекта (Circle в примере выше) путём вызова его метода Dispose() нужна, т. к. в коде метода HandOverTo() эта очистка не выполняется.

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: REMOVEALLPROXY
« Ответ #110 : 05-05-2016, 22:24:55 »
Теоретически владельцами (AcDb)Entity могут быть только (AcDb)BlockTableRecord, но чем черт не шутит...
Подтверждаю. На практике попадалась пара чертежей, в которых примитивы лежали не там, где надо, т.е. не в BlockTable. Предполагаю, что это результат  вылетов во время сохранения, или неудачного копирования и последующего сохранения.

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: REMOVEALLPROXY
« Ответ #111 : 05-05-2016, 22:26:29 »
Как ты открывал свой proxyEntity (через транзакцию или без)?
Без. насколько помню HandOverTo не работает с объектами транзакций вызывая исключение.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #112 : 05-05-2016, 22:29:08 »
насколько помню HandOverTo не работает с объектами транзакций вызывая исключение.
угу
Цитировать
Метод DBObject.HandOverTo()не разрешён к использованию на объектах, которые являются резидентными объектами транзакции.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #113 : 05-05-2016, 22:46:59 »
В #109 исправил текст цитаты, предварительно внеся соответствующие изменения в оригинал.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13074
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #114 : 05-05-2016, 23:32:16 »
Предполагаю, что это результат  вылетов во время сохранения, или неудачного копирования и последующего сохранения.
Только не это. Теоретически владельцем (AcDb)Entity может оказаться (AcDb)DBDictionary, но он для этого не предназначен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: REMOVEALLPROXY
« Ответ #115 : 06-05-2016, 06:59:15 »
Только не это. Теоретически владельцем (AcDb)Entity может оказаться (AcDb)DBDictionary, но он для этого не предназначен.
В теории да, но на практике попадаются объекты, в том числе примитивы с OwnerId которого не существует в БД. Т.е. вне иерархии, либо объекты/примитивы у которых ownerId==ObjectId.Null;

Чтоб не быть голословным:
https://yadi.sk/i/qvB-W41XrWy3s
https://yadi.sk/i/TUUbhOyDrWy54

Справедливости ради, отмечу - такое очень, очень редко встречается)))))))
Audit удаляет такие объекты.
« Последнее редактирование: 06-05-2016, 07:52:55 от Привалов Дмитрий »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13074
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #116 : 07-05-2016, 01:31:50 »
Audit удаляет такие объекты.
Скажем так. Я считаю, что перед расчленением/удалением прокси следует выполнить как минимум _AUDIT, а еще лучше _RECOVER. В этом случае все не имеющие владельцев объекты будут удалены. А после этого с чертежом уже можно работать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #117 : 10-05-2016, 14:44:38 »
Если надо - могу завтра на работе еще раз смоделировать ситуацию и выдать любую нужную информацию.
Напоминаю.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13074
  • Карма: 1687
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #118 : 10-05-2016, 15:01:35 »
Андрей Бушман
Подозреваю, что у тебя "шалит" Database.ReclaimMemoryFromErasedObjects. В моём коде он не используется.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #119 : 10-05-2016, 15:08:07 »
Подозреваю, что у тебя "шалит" Database.ReclaimMemoryFromErasedObjects. В моём коде он не используется.
"Будем посмотреть".