Point3dCollection возвращает точку после последней. Баг?

Автор Тема: Point3dCollection возвращает точку после последней. Баг?  (Прочитано 9667 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Вот такой код:
Код - C# [Выбрать]
  1. [CommandMethod("TestPoint3dCollection")]
  2. public void TestPoint3dCollectionCmd()
  3. {
  4.     Point3dCollection col = new Point3dCollection();
  5.     col.Add(new Point3d(1.0, 2.0, 3.0));
  6.     string msg
  7.         = $"Всего точек в коллекции: {col.Count} шт.";
  8.  
  9.     for (int i = 0; i <= col.Count + 1; i++)
  10.     {
  11.         msg += $"\n\nТочка № {i + 1}: ";
  12.         try
  13.         {
  14.             Point3d pt = col[i];
  15.             msg += $"X={pt.X:0.####}, Y={pt.Y:0.####}, Z={pt.Z:0.####}";
  16.         }
  17.         catch (System.Exception ex)
  18.         {
  19.             msg += ex.Message;
  20.         }
  21.         msg += "\nЕё индекс в коллекции: ";
  22.         try
  23.         {
  24.             msg += col.IndexOf(col[i]);
  25.         }
  26.         catch (System.Exception ex)
  27.         {
  28.             msg += ex.Message;
  29.         }
  30.     }            
  31.  
  32.     Application.ShowAlertDialog(msg);
  33. }        
  34.  
Результат - на скриншоте. Как думаете, это баг?

Отмечено как Решение Дмитрий Загорулькин 02-04-2019, 17:53:11

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Как думаете, это баг?
Да. Кстати, можно дисассемблемом этот класс посмотреть. Там хорошо видно, что если "индекс <= количество элементов" вместо "индекс < количество элементов", то исключения нет. Но подозреваю, что это никто исправлять не будет. Может возникнуть побочный эффект.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Попробовал тот же фокус с ObjectIdCollection - ей вообще всё равно какой индекс! Если он выходит за диапазон - просто возвращается ObjectId.Null. В общем, я понял - надеяться на исключение IndexOutOfRangeException при работе со встроенными коллекциями AutoCAD не стоит...
Код - C# [Выбрать]
  1. [CommandMethod("TestObjectIdCollection")]
  2. public void TestObjectIdCollectionCmd()
  3. {
  4.     Database db = Application.DocumentManager.MdiActiveDocument.Database;
  5.     ObjectIdCollection col = new ObjectIdCollection();
  6.     col.Add(db.CurrentSpaceId);            
  7.  
  8.     int i = -10000;
  9.  
  10.     bool isOk;
  11.  
  12.     do
  13.     {
  14.         try
  15.         {
  16.             ObjectId id = col[i++];
  17.             isOk = true;
  18.         }
  19.         catch
  20.         {
  21.             isOk = false;
  22.         }                
  23.     } while (isOk && i < 10000);
  24.  
  25.     Application.ShowAlertDialog($"Index: {i}, status: {isOk}");          
  26. }        
  27.  

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
надеяться на исключение
надеяться на исключение - это уже какая-то неправильная логика. ИМХО

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробовал тот же фокус с ObjectIdCollection - ей вообще всё равно какой индекс! Если он выходит за диапазон - просто возвращается ObjectId.Null.
Угу:
Код - C# [Выбрать]
  1.         public unsafe ObjectId this[int index]
  2.         {
  3.                 get
  4.                 {
  5.                         AcArray<AcDbObjectId,AcArrayMemCopyReallocator<AcDbObjectId> >* impObj = GetImpObj();
  6.                         ObjectId result;
  7.                         result.m_id = *(long*)((long)index * 8L + *(long*)impObj);
  8.                         return result;
  9.                 }
  10.                 set
  11.                 {
  12.                         AcArray<AcDbObjectId,AcArrayMemCopyReallocator<AcDbObjectId> >* impObj = GetImpObj();
  13.                         *(long*)((long)index * 8L + *(long*)impObj) = *(long*)(&value);
  14.                 }
  15.         }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
надеяться на исключение - это уже какая-то неправильная логика. ИМХО
Я имел в виду, что раньше была надежда, что если вдруг где-то ошибся с индексами - словишь исключение. И по этому поводу голова не болела. Сейчас ещё и это надо держать в уме.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Сейчас ещё и это надо держать в уме.
Скорее всего это еще одна причина, почему AutoCAD фаталит на ровном месте.....в уме разработчиков уже не укладываются многочисленные исключения из правил.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
:)
Это же внешний API. Не думаю, что его используют для внутреннего функционала.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
:)
Это же внешний API. Не думаю, что его используют для внутреннего функционала.
Почему нет? Часть managed модулей в AutoCAD использует AutoCAD .NET API так же как native-модули используют ObjectARX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Стало интересно сколько людей трудится над созданием и тестированием AutoCAD, сотни(тысячи), но не нашел. (((

Кому интересно, наткнулся на небольшую статью про тестирование AutoCAD
http://isicad.ru/ru/articles.php?article_num=14676


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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Стало интересно сколько людей трудится над созданием и тестированием AutoCAD, сотни(тысячи), но не нашел. (((

Кому интересно, наткнулся на небольшую статью про тестирование AutoCAD
http://isicad.ru/ru/articles.php?article_num=14676


Этой статье уже восемь лет. А вот и живое выступление Михаила Белиловского:

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

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 554
  • Карма: 119
Вот посвежее
http://isicad.ru/ru/articles.php?article_num=19038

из статьи....AutoCAD R13 был настолько плох, его очень плохо покупали, компания была в критическом состоянии и могла развалиться. Но ничего, выжила и смогла улучшить продукт.
хм, никогда бы не подумал что одна неудачная версия могла потопить Autodesk.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
хм, никогда бы не подумал что одна неудачная версия могла потопить Autodesk.
Тогда (в 1994-ом) в портфеле Autodesk был только AutoCAD. И тогда версии AutoCAD не "клепали" каждый год.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение