1. После того, как для транзакции был вызван Commit(), она не может больше использоваться и нужно создавать новую? Или же можно использовать ее дальше?Не может использоваться, нужно создавать новую.
2. Транзакция не уничтожается при уничтожении Database?Возможно будет интересно почитать это (http://bushman-andrey.blogspot.ru/search/label/Transaction).
Жаль на основной вопрос (про замороженные слои на подшивке) ответа я так и не получил.Подшивка (DST-файл) не имеет слоёв. Слои определены в составе документов, на листы которых ссылается подшивка.
Прошу прощения, я наверное что-то с терминологией напутал - я пока только учусь. Для меня листы всегда были Sheet, а в AutoCAD они вроде как Layout...Первая же ссылка в Google (http://adndevblog.typepad.com/autocad/2012/06/list-of-frozen-layers-in-a-paperspace-viewport.html).
Я так понимаю (могу ошибаться, так как знаком с AutoCAD не так давно), что видовых экранов на листе может быть несколько.Это возможно. Но есть основной, который создаётся при инициализации листа. Впрочем это не важно. Имеется метод Layout.GetViewports, который возвращает коллекцию ObjectId видовых экранов листа, которые и следует проанализировать.
Но есть основной, который создаётся при инициализации листа. Впрочем это не важно. Имеется метод Layout.GetViewports, который возвращает коллекцию ObjectId видовых экранов листа, которые и следует проанализировать.
У него есть какие-то особенности или он просто будет первым в списке?Он будет первым в списке.
Возможно будет интересно почитать это.
Только что попробовал обход довольно большого чертежа по листам->блокам->объектам + фильтры + проверкиРезультат достаточно странный. Особенно если ты открывал все примитивы в режиме "ForRead".
Используя StartOpenCloseTransaction получилось около 14 секунд.
Используя StartTransaction вышло около 3 секунд.
Т.е разница в производительности довольно ощутимая даже для клиентского приложения.
у меня в коде везде using, что для StartTransaction - нормально, а для StartOpenCloseTransaction - не знаю какОба класса наследуются от Transaction, который реализует IDisposable. Соответственно использование using для них целесообразно.
Да, открывал в режиме ForRead.Тогда совсем странно. Боюсь, что ты что-то перемудрил в коде.
Оба класса наследуются от Transaction, который реализует IDisposable. Соответственно использование using для них целесообразно.
я имел в виду, что все объекты, получаемые при помощи Transaction.GetObject() у меня заключены в using.А вот это совсем лишнее. Ни для StartOpenCloseTransaction, ни для StartTransaction этого делать не следует. Только если не пользуешься транзакциями совсем. Я на форуме уже неоднократно писал что такое Dispose() для наследников DBObject в зависимости от того содержатся ли они в Database или нет.
Я на форуме уже неоднократно писал что такое Dispose() для наследников DBObject в зависимости от того содержатся ли они в Database или нет.
Я обычно стараюсь вызывать Dispose() для всего, где он объявлен )))Попробуй вызвать Dispose для Database, который ты не создавал при помощи new Database. Я буду долго смеяться.
Я имел в виду, что вызываю Dispose() для всего, что я сам создавал...Метод GetObject не создаёт, а открывает существующий объект.
GetObject не создает нового объекта AutoCAD, но создает новый объект в памяти. Другое дело, что транзакция сама его уничтожает по завершении. Или я не прав?Не прав. Объект уже находится в памяти и GetObject лишь получает указатель на него. При этом устанавливается режим доступа к объекту (ForRead, ForWrite, ForNotify...). По завершении транзакции, а точнее при вызове Close() объекта объект так же не удаляется из памяти.
Объект уже находится в памяти и GetObject лишь получает указатель на него.
но все равно заметно, что со StartTransaction немного быстрее.Всё-равно странно. Транзакция одна или ты запускаешь кучу транзакций?
К тому же столкнулся с проблемой, что при получении StartOpenCloseTransaction я при печати не мог установить текущий лист при помощи ManagerLayout...И это правильно. Внутри работающей OpenCloseTransaction если объект в ней открыт для чтения, то ты не можешь открыть его же для записи, а при установке текущего листа при помощи LayoutManager требуется такая возможность. Так что в этом случае нужно транзакцию завершать, переключать лист и затем запускать новую транзакцию. Ну или найти какой (или какие) из открытых объектов мешает переключению и закрывать его (или их) при помощи метода Close().
К тому же LayoutManager - статический класс и листы меняются присвоением имени, а не объекта Layout.И что? Это не означает, что "под ковром" не требуется модификация каких-то объектов чертежа.
Если просто заменить на StartTransaction, то все работает.Так и должно быть, так как при Transaction можно открывать один и тот же объект и для чтения и для записи, а при OpenCloseTransaction - нельзя. На форуме это обсуждалось не раз.
Не прав. Объект уже находится в памяти и GetObject лишь получает указатель на него.Скажу честно - меня данное обстоятельство сильно удивило - даже набросал код для проверки (просто по расходу памяти на большое кол-во объектов при GC) - действительно - как минимум на уровне ARX объекты "висят" в памяти (при получении .Net объектов расход идет "побольше" чем на просто указатели - но не зависит от сложности примитива - видимо .Net обертки все-же создаются - это я не проверял - но это и не принципиально). Тогда я вообще не понимаю для чего нужен весь этот "гемор" с транзакциями и приведением объектов (я то думал как-раз для того - чтоб была возможность создавать потенциально неограниченные по размеру чертежи - которые лишь кешируются, для производительности, но не висят в памяти). Зачем это все - доступ-же все равно возможен только из одного потока - вижу только одно "разумное" объяснение когда проектировали систему - хотели как лучше - не манер БД - но видимо "не осилили" - вроде и так сойдет.