Устаревший метод GetLabelIds

Автор Тема: Устаревший метод GetLabelIds  (Прочитано 3502 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Устаревший метод GetLabelIds
« : 22-04-2019, 10:38:03 »
Среда VS подчеркивает то,
что метод Autodesk.Civil.DatabaseServices.Structure.GetLabelIds()
является устаревшим при подключении сборок API Civil 2018

Есть более свежие альтернативные методы?


Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Устаревший метод GetLabelIds
« Ответ #1 : 22-04-2019, 11:38:53 »
Делаю так (в проекте сборки API Civil 2018):
Код - C# [Выбрать]
  1.                 using CIV_DBS = Autodesk.Civil.DatabaseServices;
  2.                 string metka = "";
  3.                 var coll = c.GetLabelIds();
  4.                 if (coll != null)
  5.                 {
  6.                     foreach (CAD_DBS.ObjectId id in coll)
  7.                     {
  8.                         CAD_DBS.Entity obj = acad_Func.get_entByID(id);
  9.                         if (obj != null)
  10.                             if (obj is CIV_DBS.StructureLabel)
  11.                                 metka = (obj as CIV_DBS.StructureLabel).Name;
  12.                     }
  13.                 }

Ругается в строке 11.
Ошибка: Retrive attribute failed

Через какое поле мне получить содержимое метки колодца в плане?



Код - C# [Выбрать]
  1.  
  2. public static class acad_func {
  3.        public static CAD_DBS.Entity get_entByID(CAD_DBS.ObjectId id)
  4.         {
  5.  
  6.             CAD_DBS.Entity ret = null;
  7.             CAD_DBS.Database db = CAD_APS.Application.DocumentManager.MdiActiveDocument.Database;
  8.             using (CAD_DBS.Transaction trans = db.TransactionManager.StartTransaction())
  9.             {
  10.                 try
  11.                 {
  12.                     ret = (trans.GetObject(id, CAD_DBS.OpenMode.ForRead) as CAD_DBS.Entity);
  13.                 }
  14.                 catch { }
  15.                 trans.Commit();
  16.             }
  17.             return ret;
  18.         }
  19. }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Устаревший метод GetLabelIds
« Ответ #2 : 22-04-2019, 12:57:34 »
Алексей, какая IDE используется при написании кода? В VS, например, можно посмотреть сообщение атрибута Obsolete. Но даже если в IDE не посмотреть, то в справке можно глянуть: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/ccd780ab-04cb-c49f-2620-53a5393ad05b.htm
Цитировать
[ObsoleteAttribute("Use Autodesk.Civil.DatabaseServices.Structure.GetAvailableStructureLabelIds instead.", false)]
public ObjectIdCollection GetLabelIds()
С переводом, надеюсь, проблем не будет? :)
Вдобавок, "обрадую": в API нет цивилизованного способа получить текст из метки. Если в двух словах - надо взрывать. Если подробнее, то, например, вот это обсуждение: https://forums.autodesk.com/t5/civil-3d-customization/civil3d-api-c-extract-label-text/td-p/6988920. А если ещё подробнее - то тут можно глянуть: https://www.google.ru/search?&rls=ru&q=civil+3d+net+label+text

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Устаревший метод GetLabelIds
« Ответ #3 : 22-04-2019, 15:32:01 »
Если в двух словах - надо взрывать
Ну вообщем я так и сделал explode и работал с текстами напрямую.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Устаревший метод GetLabelIds
« Ответ #4 : 22-04-2019, 17:14:33 »

Код - C# [Выбрать]
  1. public static class acad_func {
  2.        public static CAD_DBS.Entity get_entByID(CAD_DBS.ObjectId id)
  3.         {
  4.  
  5.             CAD_DBS.Entity ret = null;
  6.             CAD_DBS.Database db = CAD_APS.Application.DocumentManager.MdiActiveDocument.Database;
  7.             using (CAD_DBS.Transaction trans = db.TransactionManager.StartTransaction())
  8.             {
  9.                 try
  10.                 {
  11.                     ret = (trans.GetObject(id, CAD_DBS.OpenMode.ForRead) as CAD_DBS.Entity);
  12.                 }
  13.                 catch { }
  14.                 trans.Commit();
  15.             }
  16.             return ret;
  17.         }
  18. }
Алексей, использовать объекты, открытые в транзакции после закрытия этой самой транзакции - это незаконно!

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Устаревший метод GetLabelIds
« Ответ #5 : 22-04-2019, 17:31:46 »
Алексей, использовать объекты, открытые в транзакции после закрытия этой самой транзакции - это незаконно!
В некоторых случаях прокатывает, если к примеру использовать только для чтения.
А если к примеру сделать Entity.clone()
Хотя нужно проверить это еще раз. Скорее вы правы - незаконно...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Устаревший метод GetLabelIds
« Ответ #6 : 22-04-2019, 19:32:37 »
Хотя нужно проверить это еще раз. Скорее вы правы - незаконно...
Тут и проверять нечего. Это как рубить сук, на котором сидишь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение