Сейчас в свободное время потихоньку осваиваю vb.netНе устану говорить - НЕ НУЖНО ОСВАИВАТЬ VB.NET. На нем никто толком не работает, поэтому и помощи особой не ждите!
Александр Ривилис, у меня Ваш код не стартует, валится в методе GetLEPOptions() на строкеВидимо да, но похоже по этой ветке я вообще не шёл, т.к. не вводил ключевых слов. Я не анализировал его код полностью. Частично по причине негативного отношения к VB.NET, частично из-за того, что сразу стало понятно, что основная проблема в работе с транзакциями.
Dim PrKeyRes As PromptEntityResult = AcEd.GetKeywords(PrKeyOpt), что в общем то объяснимо, но мне любопытно, на 2015 акаде такие вольности прокатывают?
И в нем написано, что можно открывать вложенные транзакции и думал, что это как раз нормально. Впредь буду максимально избегать этого.Можно. Но очень осторожно. И по возможности лучше их избегать.
почему нельзя было записывать или считывать данные напрямую через объекты (как это в VBA ;D).Можно. Во многих примерах, которые я выкладывал на сайте и форуме, я использовал открытие без транзакций. И в том и другом способах есть свои плюсы и минусы.
И еще один вопрос. Метод AppendEntity записывает данные (объект) в БД чертежа, т.е. в BlockTableRecord или подобные, а что фактически делает метод транзакции AddNewlyCreatedDBObject. И что будет если не делать один из методов.Метод AppendEntity лишь устанавливает связь примитива с его владельцем-блоком. Если эту связь не установить, то в чертеже этого примитива не будет и при сохранении чертежа в dwg-файл он не попадёт. В отличие от VBA в AutoCAD .NET API возможно создание объектов/примитивов, которые не содержатся в чертеже (Non Database Resident).
2. Переменная с уровнем Friend или Public получает значение когда проект загружается в Autocad или когда запускается какая либо процедура. Например на уровне модуля есть записьВообще-то мог бы проверить и сам - так лучше запоминается. Но вообще-то очевидно, что вычисление происходит один раз при инициализации объекта AcDoc, так что он будет указывать на документ, который был активным в момент загрузки dll-файла. А если закрыть этот документ, то AcDoc будет указывать на (вполне возможно) не распределённую область памяти и обращение к ней вызовет исключение. Кстати, если сборка загружена до открытия документов, AcDoc может равняться нулю.
Код - vb.net: [Выделить]
Friend AcDoc As Document=Application.DocumentManager.MdiActiveDocument
. При открытом чертеже я загружаю код .net. Закрываю чертеж, но есть другой чертеж который становится активным. Запускаю код. На какой чертеж будет ссылаться переменная AcDoc?
Метод AppendEntity лишь устанавливает связь примитива с его владельцем-блоком. Если эту связь не установить, то в чертеже этого примитива не будет и при сохранении чертежа в dwg-файл он не попадёт. В отличие от VBA в AutoCAD .NET API возможно создание объектов/примитивов, которые не содержатся в чертеже (Non Database Resident).Раз десять перечитывал и очень внимательно. Нельзя сказать что теперь все понятно, но многое прояснилось это точно. Спасибо за информацию.
Метод AddNewlyCreatedDBObject транзакции указывает ей, что она должна управлять этим только что созданным объектом, и при вызове Transaction.Commit() закрыть этот объект (вызвать его метод Close()). Если метод AddNewlyCreatedDBObject не вызвать, то транзакция не будет иметь понятия об этом объекте и не закроет его. В результате этот объект будет добавлен к чертежу, но не будет виден и с ним ничего нельзя будет сделать. Скорее всего возникнет еще и проблема с сохранением этого файла.
2) Транзакцию нужно открывать когда собираешься прочесть информацию из объекта AutoCAD или модифицировать его и сразу же закрывать и подтверждать ( Transaction.Commit() ) транзакцию как только объект перестаёт быть нужен.
Просил замечания - получай.