Получение LabelGroups из ProfileView

Автор Тема: Получение LabelGroups из ProfileView  (Прочитано 7971 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Добрый день.
Возник вопрос как получить LabelGroups из ProfileView?
ProfileViewBandItem которые интересуют, получил.

Код - C# [Выбрать]
  1.             CivilDocument doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
  2.             ObjectIdCollection alignments = doc.GetAlignmentIds();
  3.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(docInfo);
  4.  
  5.             foreach (ObjectId oId in alignments)
  6.             {
  7.                 using (Transaction tr = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  8.                 {
  9.                     try
  10.                     {
  11.                         Alignment al = (Alignment)oId.GetObject(OpenMode.ForRead);
  12.                        
  13.                         String txt = String.Format("\nAlignName:!{0}\n", al.Name);
  14.                         Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(txt);
  15.  
  16.                         ObjectIdCollection profIds = al.GetProfileViewIds();
  17.  
  18.                         foreach (ObjectId pId in profIds)
  19.                         {
  20.                            
  21.                             try
  22.                             {
  23.                                 ProfileView pv = (ProfileView)pId.GetObject(OpenMode.ForRead);
  24.                                 ProfileViewBandSet bs = pv.Bands;
  25.                                 ProfileViewBandItemCollection bsc = bs.GetBottomBandItems();
  26.  
  27.                                 foreach (ProfileViewBandItem bi in bsc)
  28.                                 {
  29.                                     //ProfileViewBandItem bii = bi;
  30.                                 }
  31.  
  32.                             }
  33.                             catch (Autodesk.Civil.CivilException ex)
  34.                             {
  35.                                 string msg = ex.Message;
  36.                             }
  37.  
  38.                         }
  39.                     }
  40.                     catch (Autodesk.Civil.CivilException ex)
  41.                     {
  42.                         string msg = ex.Message;
  43.                     }
  44.  
  45.                     tr.Commit();
  46.                 }
  47.             }
  48.  

Отмечено как Решение begiz 12-01-2015, 13:09:11

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Получение LabelGroups из ProfileView
« Ответ #1 : 12-01-2015, 13:03:08 »
Вот как я получал метки из области данных:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.DatabaseServices;
  2. using Autodesk.Civil.DatabaseServices;
  3.  
  4. namespace ProfileViews
  5. {
  6.     /// <summary>
  7.     /// Данные по меткам области данных вида профиля
  8.     /// </summary>
  9.     public struct BandLabelGroups
  10.     {
  11.         public ObjectIdCollection PipeNetworkBLGIds { get; set; }
  12.         public ObjectIdCollection HorizontalGeometryBLGIds { get; set; }
  13.         public ObjectIdCollection ProfileDataBLGIds { get; set; }
  14.         public ObjectIdCollection SectionalDataBLGIds { get; set; }
  15.  
  16.         public BandLabelGroups(ObjectId pViewId) : this()
  17.         {
  18.             PipeNetworkBLGIds = PipeNetworkBandLabelGroup.GetAvailableLabelGroupIds(pViewId);
  19.             HorizontalGeometryBLGIds = HorizontalGeometryBandLabelGroup.GetAvailableLabelGroupIds(pViewId);
  20.             ProfileDataBLGIds = ProfileDataBandLabelGroup.GetAvailableLabelGroupIds(pViewId);
  21.             SectionalDataBLGIds = SectionalDataBandLabelGroup.GetAvailableLabelGroupIds(pViewId);
  22.         }
  23.     }
  24. }
Этот код позволяет получить коллекции ObjectId именно групп меток.
А объект ProfileViewBandItem - это, грубо говоря, настройки для групп меток.
« Последнее редактирование: 13-01-2015, 17:26:30 от Загорулькин Дмитрий »

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: Получение LabelGroups из ProfileView
« Ответ #2 : 12-01-2015, 13:09:07 »
Супер, ето то что нужно.
Не сразу понял кто такой pViewId.
Спасибо.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Получение LabelGroups из ProfileView
« Ответ #3 : 12-01-2015, 13:19:09 »
Только как их переопределить - это непростой вопрос. Как один из вариантов - использовать Drawable Overrule. Но тогда нужно будет писать код, который будет полностью заново отрисовывать эти объекты. А по другому, наверное, никак не сделать...

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: Получение LabelGroups из ProfileView
« Ответ #4 : 12-01-2015, 13:21:57 »
Ну я если честно думал вот так сделать, ето безобразие в реактор закинуть.
Может по другому как то?

Код - C# [Выбрать]
  1.                     LabelGroup group = (LabelGroup)baseLabel;
  2.                     foreach (LabelGroupSubEntity subEntity in group.SubEntities)
  3.                     {
  4.                         ObjectIdCollection textComponentIds = subEntity.GetTextComponentIds();
  5.                         textComponentIds = subEntity.GetTextComponentIds();
  6.                         if (textComponentIds.Count > 0)
  7.                         {
  8.                             foreach(ObjectId id in textComponentIds)
  9.                             {
  10.                                 LabelStyleTextComponent lsc = (LabelStyleTextComponent)id.GetObject(OpenMode.ForWrite);
  11.                                 if (lsc.Name == "добавкаНАЧАЛОкривой" || lsc.Name == "ДобавкаНачалаКонца")
  12.                                 {
  13.                                     double st = 0;
  14.                                     double off = 0;
  15.                                     al.StationOffset(subEntity.LabelLocation.X,subEntity.LabelLocation.Y,0.01,ref st,ref off);
  16.                                     Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st+" "+al.GetStationStringWithEquations(st)+"\n");
  17.                                     subEntity.SetTextComponentOverride(id, _getNearestPoint(Double.Parse(al.GetStationStringWithEquations(st).Replace("+", "")), station_map));
  18.                                 }
  19.                             }
  20.                         }
  21.                         else
  22.                         {
  23.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Label: "
  24.                                 + subEntity.Parent.GetRXClass().DxfName + " doesn't have any text component to override! "
  25.                                 + "This label will be ignored for the current action.\n");
  26.                             break;
  27.                         }
  28.                     }
  29.  

Т.е. так же как и с обычными LabelGroup, которыe к Alighment прицеплены. Или тут такой вариант не проидет?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Получение LabelGroups из ProfileView
« Ответ #5 : 12-01-2015, 13:26:04 »
Попробуйте, может быть получится :)