Проверка типа объекта DBObject

Автор Тема: Проверка типа объекта DBObject  (Прочитано 15306 раз)

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

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Проверка типа объекта DBObject
« Ответ #15 : 21-03-2016, 15:03:55 »
Только хотел про ObjectId и RXClass написать, да Boxa.Shu опередил ))
Подтверждаю, пользуюсь именно этим способом, прежде чем открывать объекты - фильтрую по ObjectId и RXClass
Алексей

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Проверка типа объекта DBObject
« Ответ #16 : 21-03-2016, 15:15:47 »
Как видно и транзакция то не нужна...
Для 2008 это увы не так. метода ObjectClass у ObjectId нет. Соответственно приходится получить объект, а затем вызывать GetRXClass() объекта.
А я вынужден писать универсальный код. А так вы правы, будет быстрее, за счет уменьшения количества медленных методов tr.GetObject(id...)

Я использую свои доп классы для подключения к БД и управления транзакцией, но надеюсь смысл понятен из кода

Код - C# [Выбрать]
  1. using (DbConnection dwg = new DbConnection(DbFlag.Current))
  2. {
  3.         List<BlockTableRecord> blocks = dwg.GetBlocks(OpenMode.ForRead, false);
  4.  
  5.         RXClass dbText = RXClass.GetClass(typeof(DBText));
  6.         int AttrCount = 0;
  7.         Stopwatch timer1 = new Stopwatch();
  8.         timer1.Start();
  9.                        
  10.         foreach (BlockTableRecord block in blocks)
  11.         {
  12.                 foreach (ObjectId id in block)
  13.                 {
  14.                         DBObject obj = dwg.GetObject(id, OpenMode.ForWrite, false, true);
  15.                                                
  16.                         if (obj.GetRXClass() == dbText) AttrCount++;
  17.                 }
  18.         }
  19.         timer1.Stop();
  20.         long seconds = timer1.ElapsedMilliseconds;
  21.         Logger.WriteMessage("Считано атрибутов-{0}/время-{1}", AttrCount, seconds);
  22. }

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Проверка типа объекта DBObject
« Ответ #17 : 21-03-2016, 15:39:24 »
Для 2008 это увы не так. метода ObjectClass у ObjectId нет. Соответственно приходится получить объект, а затем вызывать GetRXClass() объекта.
Посмотрел, нда... objectId.ObjectClass только в 2009 появился... тогда нет смысл получать тип через этот механизм... если только Александр Ривилис не поможет получить этот метод через PInvoke ...

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Проверка типа объекта DBObject
« Ответ #18 : 21-03-2016, 16:05:54 »
В связи с этим для 95% уверенности получаю имя класса примитива и сравниваю.
..и если хочешь убедиться на 100%
Код - C# [Выбрать]
  1. Entity entity ....
  2. Type type = entity.GetType();
  3. string fullTypeName = type.ToString();
  4. if (fullTypeName == "Autodesk.AutoCAD.DatabaseServices.DBText" )
...надежнее, но читается не очень
Для 2008 это увы не так. метода ObjectClass у ObjectId нет.
Ну тогда уж, наверное, лучше так:
Код - C# [Выбрать]
  1. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  2. ...
  3. Type dbTxtType = typeof(AcDb.DBText);
  4. if (entity.GetType().Equals(dbTxtType))
  5. ...
  6.  
Надежно и "читабельно".

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Проверка типа объекта DBObject
« Ответ #19 : 21-03-2016, 16:13:14 »
Ну тогда уж, наверное, лучше так:
Ага до Equals типов я не додумался. А ответ был так близко....более корректный вариант, чем сравнение через "is"

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Проверка типа объекта DBObject
« Ответ #20 : 21-03-2016, 16:15:19 »
Интересно только, как он по скорости будет. Быстрее, чем сравнение с именем типа или нет?

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Проверка типа объекта DBObject
« Ответ #21 : 21-03-2016, 16:24:26 »
Интересно только, как он по скорости будет. Быстрее, чем сравнение с именем типа или нет?
Под автокадом проверил он самый быстрый и корректный в моем случае(без objectId.ObjectClass разумеется)
Он +- равен Is по скорости. Разница слишком мала, чтоб в автокаде ее выловить.
Если уж хочется проверить более точно, то в чистом C# без автокада нужно мерять.

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Проверка типа объекта DBObject
« Ответ #22 : 21-03-2016, 16:35:45 »
Быстрее, чем сравнение с именем типа или нет?
Протестил, не быстрее.
1877 - is
12812 - GetType().Equals()

Но в реальном приложении эту разницу не выловить, поэтому не стоит париться.
Код - C# [Выбрать]
  1. Stopwatch timer1 = new Stopwatch();
  2. timer1.Start();
  3.  
  4. int k = 10;
  5. for (int i = 0; i < 1000000000; i++)
  6. {
  7.         if (k is int)
  8.         {
  9.         }
  10. }
  11. timer1.Stop();
  12.  
  13. long seconds = timer1.ElapsedMilliseconds;
  14. Console.WriteLine("{0} - is int", seconds);
  15.  
  16. Stopwatch timer2 = new Stopwatch();
  17. timer2.Start();
  18.  
  19.  
  20. Type intt = typeof(int);
  21. for (int i = 0; i < 1000000000; i++)
  22. {
  23.         if (k.GetType().Equals(intt))
  24.         {
  25.         }
  26. }
  27. timer2.Stop();
  28.  
  29. long seconds2 = timer2.ElapsedMilliseconds;
  30. Console.WriteLine("{0} - GetType().Equals()", seconds2);
  31.  
  32. Console.ReadKey();

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проверка типа объекта DBObject
« Ответ #23 : 21-03-2016, 17:26:22 »
Посмотрел, нда... objectId.ObjectClass только в 2009 появился... тогда нет смысл получать тип через этот механизм... если только Александр Ривилис не поможет получить этот метод через PInvoke ...
В ObjectARX этот метод появился синхронно с AutoCAD .NET API в 2009-ой версии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение