VB.NET Проблемы при вставке блоков

Автор Тема: VB.NET Проблемы при вставке блоков  (Прочитано 10616 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Здравствуйте.
Раньше немного программировал на VBA. Сейчас в свободное время потихоньку осваиваю vb.net. И возникла такая проблема, после выполнения команды в модели нету вставленных блоков. Процедура вызывающая эту процедуру проверяет наличие блока в БД чертежа и получает от пользователя полилинию. Вся работа программы проходит штатно, при окончании отладки в Visual Studio возвращается что, acad.exe завершилась с кодом 0. Уже сутки не могу найти, где тут засада.

Код - vb.net [Выбрать]
  1. Sub AddLEPPolyline(PolyLn As Polyline, BlockName As String)
  2.         Dim i As Integer = 0
  3.         Dim PntColl As New Point3dCollection
  4.         Dim Ang As Double
  5.         Dim FstPnt As Point3d, SndPnt As Point3d
  6.  
  7.         For i = 0 To PolyLn.NumberOfVertices - 1
  8.             PntColl.Add(PolyLn.GetPoint3dAt(i))
  9.         Next
  10.  
  11.         i = 0
  12.         Using AcTrans As Transaction = AcDb.TransactionManager.StartTransaction
  13.  
  14.             Dim AcBlkTbl As BlockTable = AcTrans.GetObject(AcDb.BlockTableId, OpenMode.ForRead)
  15.             Dim AcMS As BlockTableRecord = AcTrans.GetObject(AcBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  16.  
  17.             For Each Pnt As Point3d In PntColl
  18.                 If i = 0 Then
  19.                     SndPnt = Pnt
  20.                     i = i + 1
  21.                     Continue For
  22.                 Else
  23.                     FstPnt = SndPnt
  24.                     SndPnt = Pnt
  25.                 End If
  26.  
  27.                 Ang = FstPnt.GetVectorTo(SndPnt).AngleOnPlane(PolyLn.GetPlane)
  28.  
  29.                 If i = 1 And Start_OverGr_Block = True Then
  30.                     Using FstBlk As BlockReference = New BlockReference(FstPnt, AcBlkTbl(BlockName))
  31.                         If Not AcMS.IsWriteEnabled Then AcMS.UpgradeOpen()
  32.                         FstBlk.Layer = LayerName_OverGround
  33.                         FstBlk.ScaleFactors = New Scale3d(HScale)
  34.                         FstBlk.ColorIndex = 256
  35.                         FstBlk.Rotation = Ang
  36.                         AcMS.AppendEntity(FstBlk)
  37.                         AcTrans.AddNewlyCreatedDBObject(FstBlk, True)
  38.                     End Using
  39.  
  40.                 ElseIf i = PntColl.Count - 1 And End_OverGr_Block = True Then
  41.                     Using SndBlk As BlockReference = New BlockReference(SndPnt, AcBlkTbl(BlockName))
  42.                         SndBlk.Layer = LayerName_OverGround
  43.                         SndBlk.ScaleFactors = New Scale3d(HScale)
  44.                         SndBlk.ColorIndex = 256
  45.                         SndBlk.Rotation = Ang - System.Math.PI
  46.                         AcMS.AppendEntity(SndBlk)
  47.                         AcTrans.AddNewlyCreatedDBObject(SndBlk, True)
  48.                     End Using
  49.  
  50.                 Else
  51.                     Using FstBlk As BlockReference = New BlockReference(FstPnt, AcBlkTbl(BlockName))
  52.                         FstBlk.Layer = LayerName_OverGround
  53.                         FstBlk.ScaleFactors = New Scale3d(HScale)
  54.                         FstBlk.ColorIndex = 256
  55.                         FstBlk.Rotation = Ang
  56.                         AcMS.AppendEntity(FstBlk)
  57.                         AcTrans.AddNewlyCreatedDBObject(FstBlk, True)
  58.                     End Using
  59.  
  60.                     Using EndBlk As BlockReference = New BlockReference(SndPnt, AcBlkTbl(BlockName))
  61.                         EndBlk.Layer = LayerName_OverGround
  62.                         EndBlk.ScaleFactors = New Scale3d(HScale)
  63.                         EndBlk.ColorIndex = 256
  64.                         EndBlk.Rotation = Ang - System.Math.PI
  65.                         AcMS.AppendEntity(EndBlk)
  66.                         AcTrans.AddNewlyCreatedDBObject(EndBlk, True)
  67.                     End Using
  68.                 End If
  69.                 i = i + 1
  70.             Next
  71.  
  72.             AcTrans.Commit()
  73.         End Using
  74.     End Sub
« Последнее редактирование: 18-11-2015, 00:57:15 от Александр Ривилис »

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Еще возможно ошибка сидит в этой процедуре которая проверяет наличие блока и если ее нет, то создает ее. После выполнения процедуры из предыдущего поста, как я говорил, блоки в модели не появляются, но в списке блоков чертежа она появляется и средствами Автокада ее можно добавить в чертеж. Но все таки я не уверен, что сделал в этой процедуре все правильно.

Код - vb.net [Выбрать]
  1. Function CheckHighVoltageBlock() As Boolean
  2.  
  3.         Using AcTrans As Transaction = AcDb.TransactionManager.StartTransaction
  4.  
  5.             If IsNothing(CheckAndAddingLayer(LayerName_OverGround, 5)) Then
  6.                 AcEd.WriteMessage(vbLf & "Не удалось получить или добавить слой " & LayerName_OverGround)
  7.                 Return False
  8.             End If
  9.  
  10.             Dim AcBlkTbl As BlockTable = AcTrans.GetObject(AcDb.BlockTableId, OpenMode.ForRead)
  11.  
  12.             If AcBlkTbl.Has(BlHighName) Then
  13.                 Return True
  14.             Else
  15.                 Dim AcBlkRec As BlockTableRecord = New BlockTableRecord
  16.                 If Not AcBlkTbl.IsWriteEnabled Then AcBlkTbl.UpgradeOpen()
  17.  
  18.                 AcBlkRec.Name = BlHighName
  19.  
  20.                 Dim BlkId As ObjectId = AcBlkTbl.Add(AcBlkRec)
  21.                 AcTrans.AddNewlyCreatedDBObject(AcBlkRec, True)
  22.  
  23.                 Dim AcLine As Line = New Line(New Point3d(0.75, 0, 0),
  24.                                                     New Point3d(8, 0, 0))
  25.                 AcLine.Layer = LayerName_OverGround
  26.                 AcLine.ColorIndex = 256
  27.                 AcBlkRec.AppendEntity(AcLine)
  28.                 AcTrans.AddNewlyCreatedDBObject(AcLine, True)
  29.  
  30.                 AcLine = New Line(New Point3d(8, 0, 0),
  31.                                                     New Point3d(7, 0.75, 0))
  32.                 AcLine.Layer = LayerName_OverGround
  33.                 AcLine.ColorIndex = 256
  34.                 AcBlkRec.AppendEntity(AcLine)
  35.                 AcTrans.AddNewlyCreatedDBObject(AcLine, True)
  36.  
  37.                 AcLine = New Line(New Point3d(8, 0, 0),
  38.                                                     New Point3d(7, -0.75, 0))
  39.                 AcLine.Layer = LayerName_OverGround
  40.                 AcLine.ColorIndex = 256
  41.                 AcBlkRec.AppendEntity(AcLine)
  42.                 AcTrans.AddNewlyCreatedDBObject(AcLine, True)
  43.  
  44.                 AcLine = New Line(New Point3d(7, 0, 0),
  45.                                                     New Point3d(6, 0.75, 0))
  46.                 AcLine.Layer = LayerName_OverGround
  47.                 AcLine.ColorIndex = 256
  48.                 AcBlkRec.AppendEntity(AcLine)
  49.                 AcTrans.AddNewlyCreatedDBObject(AcLine, True)
  50.  
  51.                 AcLine = New Line(New Point3d(7, 0, 0),
  52.                                                     New Point3d(6, -0.75, 0))
  53.                 AcLine.Layer = LayerName_OverGround
  54.                 AcLine.ColorIndex = 256
  55.                 AcBlkRec.AppendEntity(AcLine)
  56.                 AcTrans.AddNewlyCreatedDBObject(AcLine, True)
  57.  
  58.                 AcTrans.Commit()
  59.                 Return True
  60.             End If
  61.         End Using
  62.         Return True
  63.     End Function
« Последнее редактирование: 18-11-2015, 00:57:32 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: VB.NET Проблемы при вставке блоков
« Ответ #2 : 18-11-2015, 01:01:34 »
NurGeo
Приветствую на форуме.
1) Создавай новые темы и в правильном разделе, а не продолжай темы, которые к твоему вопросу отношения не имеют.
2) Не увлекайся тэгом spoiler. В нём есть смысл только если очень длинный код, который можно и не читать. Ты же просишь чтобы твой код посмотрели и подсказали где ошибка, так что скрывать его нечего.
3) Сделай тестовый проект и приложи его к сообщению, чтобы можно было проверить. На первый взгляд я ничего крамольного не нашёл, т.к. на VB.NET не пишу, то мог и пропустить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Re: VB.NET Проблемы при вставке блоков
« Ответ #3 : 18-11-2015, 13:55:21 »
Добрый день, благодарю за наставления. Будем исправляться.
Выкладываю проект, он вообще при создании ссылался на civil, я почистил чтобы ссылки были только на акадовские dll и изменил несколько процедуры и модули убрав ссылки на объекты Civil-а. Надеюсь все правильно сделал. После этого еще раз проверил процедуру, все также. Проект выполнен на VS 2015. Autocad 2015 запускался как вертикальное решение Civil 2015, с предустановками metric. Есть другой проект, где тоже программой вставляется вхождения блоков, там блоки замечательно вставляются (также на VS2015 и Autocad 2015).

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: VB.NET Проблемы при вставке блоков
« Ответ #4 : 18-11-2015, 16:15:38 »
Первая и главная причина нерабочего кода кроется в этой фразе:
Сейчас в свободное время потихоньку осваиваю vb.net
Не устану говорить - НЕ НУЖНО ОСВАИВАТЬ VB.NET. На нем никто толком не работает, поэтому и помощи особой не ждите!

По поводу кода - он у вас не работает т.к. вы понаоткрывали кучу транзакций, а завершить их поленились! Конкретно: в методе UserPolylineLEP() и LEPandLES(). Причем в первом методе AcTr.Commit() еще и не в том месте стояло. Если в эти методы добавить AcTr.Commit(), то ПО ЗАВЕРШЕНИИ функции все ваши блоки появятся. Больше чем уверен, что задумка не такая (блоки должны появляться в процессе работы функции, т.к. она циклическая), поэтому советую оптимизировать свой код и убрать лишние транзакции (а там почти все лишние)

Отмечено как Решение NurGeo 19-11-2015, 20:46:10

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: VB.NET Проблемы при вставке блоков
« Ответ #5 : 18-11-2015, 17:12:02 »
NurGeo
К тому что написал Александр Пекшев aka Modis, могу добавить следующее:
1) Ты правильно начинал с темы:  Две типичных ошибки работы с транзакциями
Именно на первую из них ты и "наступил". В результате все твои вставленные блоки удалились, так как транзакция осталась неподтвержденной.
2) Транзакцию нужно открывать когда собираешься прочесть информацию из объекта AutoCAD или модифицировать его и сразу же закрывать и подтверждать ( Transaction.Commit() ) транзакцию как только объект перестаёт быть нужен.
3) Следует по возможности избегать вложенных транзакций (т.е. не запускать новую транзакцию, когда уже другая транзакция активна).

P.S.: Я по минимуму исправил код. Если ты сравнишь его со своим, то поймёшь в какую сторону следует его править.
P.S.S.: Но лучше переходи на C#.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: VB.NET Проблемы при вставке блоков
« Ответ #6 : 18-11-2015, 18:22:01 »
Пока разбирался в коде автора, много чего написали..
от себя своё ИМХО:
- в предварительном выборе могут быть любые объекты
- используйте транзакцию только тогда, когда она нужна, вставлять ее в каждый метод, это гарантированно словить баг.
- следите за типами данных
- одинаковый код выносите в отдельный метод, не плоди простыню.
- передавайте не объекты, а ссылки на них
- Учите не язык, а платформу.


Код во вложении. Рабочий.
Так получилось, что я несколько увлекся рефакторингом, там много поменял.

Александр Ривилис, у меня Ваш вариант кода,  валится в методе GetLEPOptions() на строке
Dim PrKeyRes As PromptEntityResult = AcEd.GetKeywords(PrKeyOpt), что в общем то объяснимо, но мне любопытно, у автора топика это вопросов не вызвало и у Вас тоже,  на 2015 акаде такие вольности прокатывают?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: VB.NET Проблемы при вставке блоков
« Ответ #7 : 18-11-2015, 18:41:42 »
Александр Ривилис, у меня Ваш код не стартует,  валится в методе GetLEPOptions() на строке
Dim PrKeyRes As PromptEntityResult = AcEd.GetKeywords(PrKeyOpt), что в общем то объяснимо, но мне любопытно, на 2015 акаде такие вольности прокатывают?
Видимо да, но похоже по этой ветке я вообще не шёл, т.к. не вводил ключевых слов. Я не анализировал его код полностью. Частично по причине негативного отношения к VB.NET, частично из-за того, что сразу стало понятно, что основная проблема в работе с транзакциями.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Re: VB.NET Проблемы при вставке блоков
« Ответ #8 : 18-11-2015, 20:22:57 »
Ооо, сколько информации сразу. Похоже я тоже увидел свою ошибку, еще не проверял но думаю понял, но по порядку.
1. Учусь в основном по AutoCAD .NET Developer's Guide. И в нем написано, что можно открывать вложенные транзакции и думал, что это как раз нормально. Впредь буду максимально избегать этого.
2. Основная моя ошибка. Сейчас перечитал пункт по транзакциям и понял, что если не сохранять главную (первую) транзакцию, то он отменяет все предыдущие. Я предполагал  что каждая транзакция при вызове метода commit записывает изменения текущей транзакции в базу данных чертежа и вышестоящие транзакции не будут касаться его.
3. Все таки трудно после VBA понять систему транзакции, я все еще не до конца понимаю его смысл, почему нельзя было записывать или считывать данные напрямую через объекты (как это в VBA  ;D).  Знаю что есть вариант модифицировать объекты напрямую, но советуют через транзакции, поэтому и иду по этому пути.
4. В приложенном проекте еще много логических ошибок, и фильтр не настроен на предварительном выборе и блоки он ставит логически неправильно и в опции я сам еще не заходил, так как застрял с этими блоками. Но это дело наживное.
5. И еще один вопрос. Метод AppendEntity записывает данные (объект) в БД чертежа, т.е. в BlockTableRecord или подобные, а что фактически делает метод транзакции  AddNewlyCreatedDBObject. И что будет если не делать один из методов. В общем как вы поняли я плаваю в мат.части, можно просто "тыкнуть" если это где то уже описано. Спасибо всем.

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Re: VB.NET Проблемы при вставке блоков
« Ответ #9 : 18-11-2015, 20:41:45 »
Еще два вопроса по мат.части.
1. Как вы видели в коде я открываю транзакции в каждом методе для получения ссылок на таблицу блоков и записи таблицы блоков. Если я их объявлю на уровне модуля, в первой процедуре открою транзакцию получу ссылки на них и закрою. Будет ли это правильно?
2. Переменная с уровнем Friend или Public получает значение когда проект загружается в Autocad или когда запускается какая либо процедура. Например на уровне модуля есть запись
Код - vb.net [Выбрать]
  1. Friend AcDoc As Document=Application.DocumentManager.MdiActiveDocument
. При открытом чертеже я загружаю код .net. Закрываю чертеж, но есть другой чертеж который становится активным. Запускаю код. На какой чертеж будет ссылаться переменная AcDoc?
По этим вопросам видно, насколько я чайник. Не судите строго, т.к. программирование у меня скорее увлечение, которая позволяет автоматизировать свою работу и работу коллег из нашей организации.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: VB.NET Проблемы при вставке блоков
« Ответ #10 : 18-11-2015, 21:21:11 »
И в нем написано, что можно открывать вложенные транзакции и думал, что это как раз нормально. Впредь буду максимально избегать этого.
Можно. Но очень осторожно. И по возможности лучше их избегать.
почему нельзя было записывать или считывать данные напрямую через объекты (как это в VBA  ;D).
Можно. Во многих примерах, которые я выкладывал на сайте и форуме, я использовал открытие без транзакций. И в том и другом способах есть свои плюсы и минусы.
И еще один вопрос. Метод AppendEntity записывает данные (объект) в БД чертежа, т.е. в BlockTableRecord или подобные, а что фактически делает метод транзакции  AddNewlyCreatedDBObject. И что будет если не делать один из методов.
Метод AppendEntity лишь устанавливает связь примитива с его владельцем-блоком. Если эту связь не установить, то в чертеже этого примитива не будет и при сохранении чертежа в dwg-файл он не попадёт. В отличие от VBA в AutoCAD .NET API возможно создание объектов/примитивов, которые не содержатся в чертеже (Non Database Resident).
Метод AddNewlyCreatedDBObject транзакции указывает ей, что она должна управлять этим только что созданным объектом, и при вызове Transaction.Commit() закрыть этот объект (вызвать его метод Close()). Если метод AddNewlyCreatedDBObject не вызвать, то транзакция не будет иметь понятия об этом объекте и не закроет его. В результате этот объект будет добавлен к чертежу, но не будет виден и с ним ничего нельзя будет сделать. Скорее всего возникнет еще и проблема с сохранением этого файла.
2. Переменная с уровнем Friend или Public получает значение когда проект загружается в Autocad или когда запускается какая либо процедура. Например на уровне модуля есть запись
Код - vb.net: [Выделить]

    Friend AcDoc As Document=Application.DocumentManager.MdiActiveDocument

. При открытом чертеже я загружаю код .net. Закрываю чертеж, но есть другой чертеж который становится активным. Запускаю код. На какой чертеж будет ссылаться переменная AcDoc?
Вообще-то мог бы проверить и сам - так лучше запоминается. Но вообще-то очевидно, что вычисление происходит один раз при инициализации объекта AcDoc, так что он будет указывать на документ, который был активным в момент загрузки dll-файла. А если закрыть этот документ, то AcDoc будет указывать на (вполне возможно) не распределённую область памяти и обращение к ней вызовет исключение. Кстати, если сборка загружена до открытия документов, AcDoc может равняться нулю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Re: VB.NET Проблемы при вставке блоков
« Ответ #11 : 19-11-2015, 20:44:57 »
Метод AppendEntity лишь устанавливает связь примитива с его владельцем-блоком. Если эту связь не установить, то в чертеже этого примитива не будет и при сохранении чертежа в dwg-файл он не попадёт. В отличие от VBA в AutoCAD .NET API возможно создание объектов/примитивов, которые не содержатся в чертеже (Non Database Resident).
Метод AddNewlyCreatedDBObject транзакции указывает ей, что она должна управлять этим только что созданным объектом, и при вызове Transaction.Commit() закрыть этот объект (вызвать его метод Close()). Если метод AddNewlyCreatedDBObject не вызвать, то транзакция не будет иметь понятия об этом объекте и не закроет его. В результате этот объект будет добавлен к чертежу, но не будет виден и с ним ничего нельзя будет сделать. Скорее всего возникнет еще и проблема с сохранением этого файла.
Раз десять перечитывал и очень внимательно. Нельзя сказать что теперь все понятно, но многое прояснилось это точно. Спасибо за информацию.
Из-за перехода с VBA, получилось так, что сразу пытался получить доступ к объектам и передавать их, некоторые даже мне не нужные (так мне было привычнее). Начав передавать не сам объект, а ObjectID поразился как сразу упростился код и сами собой отпали две транзакции.
Так получилось, что вначале сам исправил код по рекомендациям выше, а потом заметил код высланный Boxa.Shu. Был приятно удивлен тем, что у меня получилось почти как у него.
Спасибо всем, очень многое почерпнул.
PS. Прикладываю код который у меня получился, так, вдруг вам будет интересен результат ваших советов.))
PPS. Код в принципе работает, но если будут замечания к коду буду рад их услышать.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: VB.NET Проблемы при вставке блоков
« Ответ #12 : 20-11-2015, 02:22:35 »
В InsertOverGroundBlock ты открываешь BlockTableRecord.ModelSpace для записи, а затем проверяешь AcMS.IsWriteEnabled. У тебя или не откроется BlockTableRecord.ModelSpace для записи (и тогда я тебе сочувствую) и возникнет исключение, или проверка AcMS.IsWriteEnabled лишняя.

В CheckBlock очень плохо. Ты работаешь с объектом, открытым в транзакции вне этой транзакции, когда фактически состояние объекта неопределено:
Код - vb.net [Выбрать]
  1. Dim AcBlkTbl As BlockTable
  2. Using AcTrans As Transaction = AcDb.TransactionManager.StartTransaction
  3.       AcBlkTbl = AcTrans.GetObject(AcDb.BlockTableId, OpenMode.ForRead)
  4. End Using
Нарваться на исключение раз плюнуть. Так делать не следует. И в идеале в каждой транзакции нужен вызов Transaction.Commit(), так как его отсутствие означает откат всех изменений, что может быть достаточно долгой процедурой (что-то типа команды _UNDO).

Аналогичная ошибка в AddLEPPolyline (работа с Polyln вне транзакции):
Код - vb.net [Выбрать]
  1. Dim Polyln As Polyline
  2. Using AcTr As Transaction = AcDb.TransactionManager.StartTransaction
  3.      Polyln = AcTr.GetObject(PolyLnId, OpenMode.ForRead)
  4. End Using
  5. For i = 0 To PolyLn.NumberOfVertices - 1
  6.      PntColl.Add(PolyLn.GetPoint3dAt(i))
  7. Next
Похоже ты слишком буквально воспринял мою рекомендацию:
2) Транзакцию нужно открывать когда собираешься прочесть информацию из объекта AutoCAD или модифицировать его и сразу же закрывать и подтверждать ( Transaction.Commit() ) транзакцию как только объект перестаёт быть нужен.

P.S.: Просил замечания - получай.  :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Re: VB.NET Проблемы при вставке блоков
« Ответ #13 : 21-11-2015, 11:02:28 »
Просил замечания - получай.

Вашими замечаниями, повышаются знания и опыт общества, еще раз спасибо за ваш труд, теперь от сообщества новичков.
PS. Код обязательно исправлю.