Как получить список замороженных слоев на подшивке?

Автор Тема: Как получить список замороженных слоев на подшивке?  (Прочитано 14487 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Оба класса наследуются от Transaction, который реализует IDisposable. Соответственно использование using для них целесообразно.

Андрей, я имел в виду, что все объекты, получаемые при помощи Transaction.GetObject() у меня заключены в using. Насколько я понял, при создании через StartOpenCloseTransaction, транзакция отслеживает все созданные объекты, и при своем уничтожении уничтожает и их. А тут все объекты уже уничтожены вручную, может в этом дело. Хотя думаю вряд ли. В любом случае дело даже скорее не в моем говнокоде, поскольку код один, чертеж один, разница только в способе создании транзакции.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
я имел в виду, что все объекты, получаемые при помощи Transaction.GetObject() у меня заключены в using.
А вот это совсем лишнее. Ни для StartOpenCloseTransaction, ни для StartTransaction этого делать не следует. Только если не пользуешься транзакциями совсем. Я на форуме уже неоднократно писал что такое Dispose() для наследников DBObject в зависимости от того содержатся ли они в Database или нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Я на форуме уже неоднократно писал что такое Dispose() для наследников DBObject в зависимости от того содержатся ли они в Database или нет.

Александр, я постараюсь поискать тему на форуме. Спасибо за совет. Я обычно стараюсь вызывать Dispose() для всего, где он объявлен )))

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я обычно стараюсь вызывать Dispose() для всего, где он объявлен )))
Попробуй вызвать Dispose для Database, который ты не создавал при помощи new Database. Я буду долго смеяться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Я имел в виду, что вызываю Dispose() для всего, что я сам создавал...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я имел в виду, что вызываю Dispose() для всего, что я сам создавал...
Метод GetObject не создаёт, а открывает существующий объект.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Ну это смотря в какой трактовке. GetObject не создает нового объекта AutoCAD, но создает новый объект в памяти. Другое дело, что транзакция сама его уничтожает по завершении. Или я не прав?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
GetObject не создает нового объекта AutoCAD, но создает новый объект в памяти. Другое дело, что транзакция сама его уничтожает по завершении. Или я не прав?
Не прав. Объект уже находится в памяти и GetObject лишь получает указатель на него. При этом устанавливается режим доступа к объекту (ForRead, ForWrite, ForNotify...). По завершении транзакции, а точнее при вызове Close() объекта объект так же не удаляется из памяти.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Ух ты... Тогда в каком случае нужно использовать Dispose()?
И вообще он что-то делает для объектов, которые получены при помощи GetObject? Или там просто пустой метод?

Объект уже находится в памяти и GetObject лишь получает указатель на него.

В какой момент времени объекты оказываются в памяти?

----

Кстати после того как я убрал using с объектов полученных из StartOpenCloseTransaction-транзакции, проход по чертежу стал намного быстрее работать, но все равно заметно, что со StartTransaction немного быстрее. К тому же столкнулся с проблемой, что при получении StartOpenCloseTransaction я при печати не мог установить текущий лист при помощи ManagerLayout...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
но все равно заметно, что со StartTransaction немного быстрее.
Всё-равно странно. Транзакция одна или ты запускаешь кучу транзакций?
К тому же столкнулся с проблемой, что при получении StartOpenCloseTransaction я при печати не мог установить текущий лист при помощи ManagerLayout...
И это правильно. Внутри работающей OpenCloseTransaction если объект в ней открыт для чтения, то ты не можешь открыть его же для записи, а при установке текущего листа при помощи LayoutManager требуется такая возможность. Так что в этом случае нужно транзакцию завершать, переключать лист и затем запускать новую транзакцию. Ну или найти какой (или какие) из открытых объектов мешает переключению и закрывать его (или их) при помощи метода Close().
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Транзакция одна.

На счет StartOpenCloseTransaction и переключения листов все равно странно. Если просто заменить на StartTransaction, то все работает. К тому же LayoutManager - статический класс и листы меняются присвоением имени, а не объекта Layout.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
К тому же LayoutManager - статический класс и листы меняются присвоением имени, а не объекта Layout.
И что? Это не означает, что "под ковром" не требуется модификация каких-то объектов чертежа.
Если просто заменить на StartTransaction, то все работает.
Так и должно быть, так как при Transaction можно открывать один и тот же объект и для чтения и для записи, а при OpenCloseTransaction - нельзя. На форуме это обсуждалось не раз.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Ааа, так вона оно как. Я тут недавно, еще не успел все прочесть:)

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Не прав. Объект уже находится в памяти и GetObject лишь получает указатель на него.
Скажу честно - меня данное обстоятельство сильно удивило - даже набросал код для проверки (просто по расходу памяти на большое кол-во объектов при GC) - действительно - как минимум на уровне ARX объекты "висят" в памяти (при получении .Net объектов расход идет "побольше" чем на просто указатели - но не зависит от сложности примитива - видимо .Net обертки все-же создаются - это я не проверял - но это и не принципиально). Тогда я вообще не понимаю для чего нужен весь этот "гемор" с транзакциями и приведением объектов (я то думал как-раз для того - чтоб была возможность создавать потенциально неограниченные по размеру чертежи - которые лишь кешируются, для производительности, но не висят в памяти). Зачем это все - доступ-же все равно возможен только из одного потока - вижу только одно "разумное" объяснение когда проектировали систему - хотели как лучше - не манер БД - но видимо "не осилили" - вроде и так сойдет.