Как поймать ошибку?

Автор Тема: Как поймать ошибку?  (Прочитано 8725 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Как поймать ошибку?
« Ответ #15 : 03-02-2020, 13:50:16 »
У тебя в Common.cs  полный бред, который даже сложно комментировать.
обсуждалось здесь
https://adn-cis.org/forum/index.php?topic=9705.0
нужно переделывать всё логику методов.
зачем всю логику переделывать всех методов?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как поймать ошибку?
« Ответ #16 : 03-02-2020, 13:53:13 »
Цитировать
обсуждалось здесь
ага
Цитировать
для получения ObjectId того BlockTableRecord

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #17 : 03-02-2020, 13:55:12 »
зачем всю логику переделывать всех методов?
Я не знаю как мне еще нужно объяснять про открытые примитивы/объекты вне транзакций, а у тебя это на каждом шагу. Не должно быть глобальных List<Polyline>, List<BlockReference> и т.д.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Как поймать ошибку?
« Ответ #18 : 03-02-2020, 13:56:27 »
Никогда не храни открытые объекты/примитивы - храни их ObjectId. И открывай по мере надобности.
не совсем понял о чем речь

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #19 : 03-02-2020, 13:58:29 »
не совсем понял о чем речь
Ты хранишь между запусками команд вот такое: List<BlockReference>, List<Polyline> - этого делать категорически нельзя. Вместо этого храни List<ObjectId> для вставок блоков и полилиний и если нужны их данные - открывай их по мере надобности.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как поймать ошибку?
« Ответ #20 : 03-02-2020, 14:00:28 »
Цитировать
этого делать категорически нельзя
а я делаю  ::)
Код - C# [Выбрать]
  1.         public void DrawLayer(Data.DataLayer wl)
  2.         {
  3.             //List<Entity> wEntlist = new List<Entity>();
  4.             Autodesk.Gis.Map.ObjectData.Table wTbl = null;
  5.             if (wl.HasAttributes()) wTbl = CreateODTable(wl._Rule);
  6.             ObjectId wid;
  7.             Entity wEnt;
  8.             Geometry.TGeometry g;
  9.             foreach (Data.MyRecord wr in wl.Table)
  10.             {
  11.                 g = wr.GetGeometry();
  12.                 if (g != null)
  13.                 {
  14.                     wEnt = MakeGeometry(g);
  15.                     wid = DrawEntity(wEnt);
  16.                     if (wl.HasAttributes()) AddAttr(wid, wr, wTbl);
  17.                 }
  18.                 //wEntlist.Add(wEnt);
  19.             }
  20.             //DrawEntity(wEntlist);
  21.         }
https://github.com/triroakenshield/RosReestrImpLib/blob/master/RosReestrImp/MyCommands.cs

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #21 : 03-02-2020, 14:04:33 »
а я делаю 
wEnt у тебя содержится в Database (т.е. ObjectId у него не null) или только в памяти?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как поймать ошибку?
« Ответ #22 : 03-02-2020, 14:06:34 »
Только в памяти  ;D, а DrawEntity добавляет его в Database и возвращает ObjectId - с которым дальше и работаю!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #23 : 03-02-2020, 14:08:40 »
Только в памяти  ;D, а DrawEntity добавляет его в Database и возвращает ObjectId - с которым дальше и работаю!
Ну так совсем другое дело...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Как поймать ошибку?
« Ответ #24 : 03-02-2020, 14:11:56 »
Вместо этого храни List<ObjectId> для вставок блоков и полилиний и если нужны их данные - открывай их по мере надобности.
c этого момента подробнее, пожалуйста... если можно, конечно
что значит открываешь? просто работа очень много и читать исходники, пока, времени просто нет...
не совсем понимаю пока в каких абстрактных типах данных (АТД) всё это хранится, поэтому так и поступаю.
по-идее, как я это понимаю, BlockReference - ссылка ( разыменованный указатель), те указатель, но при обращении к нему получаем АТД. ObjectID, исходя из названия, это какой-то ключ для получения Object из Dictonary, например или какой-то древовидной структуры.
Можно пример, как имея BlockReference получить ObjectID и обратно. ObjectId это ключ для получения BlockReference из какой-то структуры, АТД - что это за структура?
Честно сказать, у меня мозги "заплелись" немного ))

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как поймать ошибку?
« Ответ #25 : 03-02-2020, 14:14:50 »
Код - vb.net [Выбрать]
  1.     Public Shared Function CrTbl(acDoc As MyAcAs.Document) As MyTable
  2.         'Создаём таблицу
  3.         Dim ed As Editor = acDoc.Editor
  4.         Dim objIdArray() As ObjectId = MyTable.GetSelect(ed) 'Получаем от пользователя набор данных для парсинга
  5.         If objIdArray IsNot Nothing Then
  6.             Dim dbObj As DBObject
  7.             Dim wList As New List(Of Line)
  8.             Dim wTList As New List(Of DBText)
  9.             Dim wMTList As New List(Of MText)
  10.             Using tr As Transaction = acDoc.Database.TransactionManager.StartTransaction
  11.                 Try
  12.                     For Each objId As ObjectId In objIdArray
  13.                         dbObj = tr.GetObject(objId, OpenMode.ForRead)
  14.                         'Сортируем полученные объекты
  15.                         Select Case True
  16.                             Case TypeOf dbObj Is Line
  17.                                 wList.Add(dbObj)
  18.                             Case TypeOf dbObj Is Polyline
  19.                                 wList.AddRange(MyTable.PolyToLine(dbObj))
  20.                             Case TypeOf dbObj Is DBText
  21.                                 wTList.Add(dbObj)
  22.                             Case TypeOf dbObj Is MText
  23.                                 wMTList.Add(dbObj)
  24.                         End Select
  25.                     Next
  26.                     tr.Commit()
  27.                 Catch ex As Exception
  28.                     ed.WriteMessage(ex.ToString())
  29.                     tr.Abort()
  30.                 End Try
  31.             End Using
  32.             '
  33.             Dim wMTbl As MyTable = MyTable.CrTbl(wList)
  34.             'Заполняем текстом
  35.             For Each wt In wTList
  36.                 wMTbl.SetValue(wt)
  37.             Next
  38.             For Each wmt In wMTList
  39.                 wMTbl.SetValue(wmt)
  40.             Next
  41.             Return wMTbl
  42.         Else
  43.             Return Nothing
  44.         End If
  45.     End Function
блин, неправильный пример... но ведь работает
« Последнее редактирование: 03-02-2020, 14:28:15 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #26 : 03-02-2020, 14:24:20 »
Честно сказать, у меня мозги "заплелись" немного ))
Извини, но это единственно что я вынес из твоего сообщения. Не лезь в абстракции. Делай то, что я тебе подсказываю, иначе ты потратишь уйму времени на написание кода, который будет работать через раз и ты будешь создавать постоянно темы, аналогичные этой.
Открытие объекта это или tr.GetObject(id,...) или id.Open(...) - в результате из ObjectId получаем одного из наследников DBObject (например, Entity или BlockTableRecord). Закрытие объекта, открытого через id.Open(...) - это метод Close, а для открытого в транзакции - это или tr.Commit() или tr.Dispose()
Если объект открыт (например, BlockReference) в одной из твоих команд и не закрыт в ней (хранится в static переменной), то это значит, что ни сам AutoCAD, ни другие приложения к нему обратиться уже не смогут.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #27 : 03-02-2020, 14:26:51 »
блин, неправильный пример... но ведь работает
Для объектов, открытых ForRead такое иногда работает. Но зачем наступать на грабли???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Как поймать ошибку?
« Ответ #28 : 09-06-2020, 15:50:05 »
Прошу прощения за некропостинг, но может кто-то объяснит почему автор везде пихает static?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #29 : 09-06-2020, 15:56:36 »
Прошу прощения за некропостинг, но может кто-то объяснит почему автор везде пихает static?
1. Это не некропостинг - этой теме всего-то четыре месяца.
2. static бывает достаточно удобен для утилитных функций, которые можно вызвать без создания самого объекта класса.
Но почему автор решил использовать static наверное у автора и нужно спрашивать. Впрочем подозреваю, что с его стороны это просто "копипастинг" готового метода, найденного на просторах интернет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение