REMOVEALLPROXY

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

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #60 : 20-11-2014, 17:48:41 »
Допустим использовали только масштаб 1:2, ты все остальные масштабы удалил. Теперь пользователю самому придется создать масштаб 1:1.
Подразумевается, что полная очистка, в т.ч. и масштабов, происходит в самом конце работы, когда документ оформлен и его нужно очистить от лишнего. Кроме того, у меня есть отдельная команда, которая создаёт список аннотативных масштабов по госту, считывая все возможные варианты из внешнего XML файла, так что восстановить гостовские масштабы (при необходимости) не проблема. Да и не только их, т.к. XML можно подредактировать как угодно.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #61 : 20-11-2014, 19:26:13 »
В #56 Обновил исходный код:
1. В файле ExtensionMethods.cs добавил дополнительную проверку в строке 303 (оказалась нужной).
2. Переписал файл Commands.cs, убрав из него тестовую команду Test и добавив несколько новых, которыми пользователи могут пользоваться.

Реализованы следующие команды:
  • Proxy - вывести в консоль CAD информацию о количестве имеющихся в чертеже объектов ProxyObject и ProxyEntity.
  • ClrScales - сокращение от "clear scales". Команда удаляет в чертеже все неиспользованные аннотативные масштабы.
  • rmProxy - сокращение от "remove proxy". Удалить из чертежа все имеющиеся объекты ProxyObject и ProxyEntity.
  • xproxy - сокращение от "explode proxy". Расчленить в чертеже все имеющиеся объекты ProxyEntity.
Всё, финиш.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: REMOVEALLPROXY
« Ответ #62 : 20-11-2014, 22:32:17 »
Подразумевается, что полная очистка, в т.ч. и масштабов, происходит в самом конце работы, когда документ оформлен и его нужно очистить от лишнего.
Я, например, чаще чищу чертежи, полученные от кого-то, до работы с ними (иначе их нередко ни чем не "повернуть").

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #63 : 20-11-2014, 22:33:39 »
Я, например, чаще чищу чертежи до работы с ними (иначе их нередко ни чем не "повернуть").
Цитировать
Кроме того, у меня есть отдельная команда, которая создаёт список аннотативных масштабов по госту, считывая все возможные варианты из внешнего XML файла, так что восстановить гостовские масштабы (при необходимости) не проблема. Да и не только их, т.к. XML можно подредактировать как угодно.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: REMOVEALLPROXY
« Ответ #64 : 20-11-2014, 22:48:12 »
Я не про масштабы, а про чистку в общем.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #65 : 21-11-2014, 03:07:26 »
Вспомнил я еще про такой метод: Database.ReclaimMemoryFromErasedObjects, который позволяет освободить оперативную память, занятую удаленными (методом Erase) объектами. Может быть актуально если с чертежом продолжают работу в том же сеансе без сохранения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн T72Автор темы

  • ADN Club
  • Сообщений: 23
  • Карма: 4
Re: REMOVEALLPROXY
« Ответ #66 : 21-11-2014, 07:44:29 »
Цитировать
T72, я хотел бы уточнить (так как не тестировал твой код). Твой код после всех исправлений на форуме сейчас работает нормально, т.е. можно считать, что это полностью работоспособный вариант или нужно его править?
Добрый день. Извиняюсь за столь долгий ответ, тестировал функции. Пока все работает хорошо, добавил еще один try/catch т.к. в одном из цивиловских фалов возникла ситуация при которой точка COGO не хотела удаляться, код в сообщении подправил.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #67 : 21-11-2014, 10:40:23 »
в одном из цивиловских фалов возникла ситуация при которой точка COGO не хотела удаляться
Можешь выложить этот DWG файл для тестирования?

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #68 : 21-11-2014, 10:41:04 »
Вспомнил я еще про такой метод: Database.ReclaimMemoryFromErasedObjects, который позволяет освободить оперативную память, занятую удаленными (методом Erase) объектами.
Спасибо, полезная информация. Добавлю в код.


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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #69 : 21-11-2014, 11:03:35 »
По поводу метода Database.ReclaimMemoryFromErasedObjects: в конец кода команды ClrScales (исходники см. выше в файле Commands.cs) я попробовал добавить такой код:

Код - C# [Выбрать]
  1. // Remove erased objects from memory
  2. Db.ObjectId[] erasedIds = db.GetDBObjectIds(n => n.IsErased);
  3. using (Db.ObjectIdCollection ids = new Db.ObjectIdCollection(
  4.         erasedIds)) {
  5.         db.ReclaimMemoryFromErasedObjects(ids);
  6. }

Однако если вызвать команду ClrScales два раза подряд, то в строке 5 получаем следующее исключение:

Цитировать
Autodesk.AutoCAD.Runtime.Exception was unhandled by user code
  Message=ePermanentlyErased
  Source=acdbmgd
  StackTrace:
       at Autodesk.AutoCAD.DatabaseServices.Database.ReclaimMemoryFromErasedObjects(ObjectIdCollection ids)
       at Bushman.CAD.Commands.Command_ClearUnusedAnnotativeScales() in c:\Users\developer\Documents\Visual Studio 2013\Projects\DwgResave_solution\Acad2009_Proxy\Commands.cs:line 82
       at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
       at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
  InnerException:

Обратите внимание на подсвеченное красным цветом. В чистку я пытаюсь отправить идентификаторы всех объектов базы данных, которые IsErased == true.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #70 : 21-11-2014, 11:32:42 »
Всё правильно. Так и должно быть. Документация говорит о том, что код ePermanentlyErased возникает при повторном освобождении памяти. Специального признака того, что объект освобожден нет. Чтобы проверить это нужно его попытаться открыть и если получаем исключение ePermanentlyErased, то его память освобождена. Несмотря на то, что у тебя при вызове Database.ReclaimMemoryFromErasedObjects возникает исключение, тем не менее (согласно документации) все объекты обрабатываются, а исключение генерируется если хотя бы один из объектов уже освобожден (см. описание метода AcDbDatabase::reclaimMemoryFromErasedObjects).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #71 : 21-11-2014, 11:41:56 »
Добрый день. Извиняюсь за столь долгий ответ, тестировал функции. Пока все работает хорошо, добавил еще один try/catch т.к. в одном из цивиловских фалов возникла ситуация при которой точка COGO не хотела удаляться, код в сообщении подправил.
Я не зря задал этот вопрос. Судя по коду у тебя не должны удаляться "неудаляемые" прокси-объекты/прокси-примитивы. В твоем коде если не срабатывает метод Erase(), то вызывается:
Код - C# [Выбрать]
  1. Entity entity = dbObj as Entity;
  2. DBObject tmpObj = null;
  3. if (entity != null)
  4. {
  5.     tmpObj = new Line();
  6. }
  7. else
  8. {
  9.     tmpObj = new DBDictionary();
  10. }
  11. dbObj.HandOverTo(tmpObj, false, false);
  12. nProxyDeleted++;
  13. tmpObj.Close();
  14. tmpObj.Dispose();
Но нигде нет tmpObj.Erase(); :(
Так что или код у тебя работает не всегда, или на форуме не окончательный код. Проверь пожалуйста.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #72 : 21-11-2014, 11:57:25 »
Специального признака того, что объект освобожден нет.
Жаль. Этот функционал не помешал бы.
Несмотря на то, что у тебя при вызове Database.ReclaimMemoryFromErasedObjects возникает исключение, тем не менее (согласно документации) все объекты обрабатываются, а исключение генерируется если хотя бы один из объектов уже освобожден (см. описание метода AcDbDatabase::reclaimMemoryFromErasedObjects).
Т.е. вы хотите сказать, что исключение вываливается не на первом же уже удалённом объекте, но "в уме" запоминается, что такой объект присутствует и пробежав по всем элементам, обработав нужные, исключение вываливается после полной обработки? В этом случае просто нет смысла в исключении, поскольку AutoCAD мог просто в итерации пропускать "инвалидов" и обрабатывать только "валидов". Если так, то будет достаточно этот код засунуть в try\catch с пустым catch.

UPD Странно, что после вызова Database.ReclaimMemoryFromErasedObjects повторная итерация по Database снова находит эти ObjectId. Логичней, на мой взгляд, было бы для их Handle в Database.TryGetObjectId возвращать false, чтобы не сбивать с толку.

Оффлайн T72Автор темы

  • ADN Club
  • Сообщений: 23
  • Карма: 4
Re: REMOVEALLPROXY
« Ответ #73 : 21-11-2014, 12:09:06 »
    в одном из цивиловских фалов возникла ситуация при которой точка COGO не хотела удаляться

Можешь выложить этот DWG файл для тестирования?
Огрызок от файла http://file.sngp.ru/fileshare/d0f03cf0-5f57-42bf-a464-310102aba44d в нем эти точки, при эрейзе в эксплоде ругается eNotAllowedForThisProxy, но при повторном вызове их уже нет.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #74 : 21-11-2014, 12:19:21 »
Огрызок от файла
Я не нашёл в этом файле ни одного proxy.
UPD а блин... у меня по умолчанию открылся пустой (я не заметил этого), т.к. AutoCAD 2009 не смог открыть этот файл. Сейчас пересохраню в более старую версию и попытаюсь снова.