расстояния между рубленными (Equation) и геометрическими(Geometry) пикетами

Автор Тема: расстояния между рубленными (Equation) и геометрическими(Geometry) пикетами  (Прочитано 9785 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Доброго времени суток.
Появилась необходимость написать програмульку для Civil (1 раз пишу, до этого только для Acad на ObjectARX C++ писал).
Суть задания: Расчитать рассояние мезду большими пикетами (Major) и рубленными(неправельными (Equation)) и это значение записать в AligmentLabel.
Если я вся правельно понял, то это сделать стандартными средствами Civil нельзя, даже с исползованием формул.

Вобшем, с грехом пополам накарябал такое решение.
Код - C# [Выбрать]
  1. public void MyCommand() // This method can have any name
  2.         {
  3.             // Put your command code here
  4.             CivilDocument doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
  5.             ObjectIdCollection alignments = doc.GetAlignmentIds();
  6.             ObjectIdCollection sites = doc.GetSiteIds();
  7.             String docInfo = String.Format("This document has {0} alignments and {1} sites.\n", alignments.Count, sites.Count);
  8.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(docInfo);
  9.  
  10. //berem vse alignment
  11.             foreach (ObjectId oId in alignments)
  12.             {
  13.                 using (Transaction tr = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  14.                 {
  15.                     try
  16.                     {
  17.                         Alignment al = (Alignment)oId.GetObject(OpenMode.ForRead);
  18.                        
  19.                         String txt = String.Format("\nAlignName:!{0}\n", al.Name);
  20.                         Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(txt);
  21.  
  22. //dostaem vse tikety
  23.                         Station[] statGeom = al.GetStationSet(StationTypes.GeometryPoint);
  24.                         Station[] statMajo = al.GetStationSet(StationTypes.Major);
  25.                         Station[] statEqua = al.GetStationSet(StationTypes.Equation);
  26.  
  27.                         foreach (Station st in statGeom)
  28.                         {
  29.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  30.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  31.                         }
  32.                        
  33.                         foreach (Station st in statMajo)
  34.                         {
  35.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  36.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  37.                         }
  38.                         foreach (Station st in statEqua)
  39.                         {
  40.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  41.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  42.                         }
  43.  
  44.                         ObjectIdCollection alLabGr = al.GetAlignmentLabelGroupIds();
  45.                         int i = 1;
  46.                         foreach (ObjectId alLabGroId in alLabGr)
  47.                         {
  48.                             LabelBase label = alLabGroId.GetObject(OpenMode.ForWrite) as LabelBase;
  49.                             _SetLabelTextOverride(label, al, statMajo, statEqua, statGeom);
  50.                         }
  51.                     }
  52.                     catch (Autodesk.Civil.CivilException ex)
  53.                     {
  54.                         string msg = ex.Message;
  55.                     }
  56.  
  57.                     tr.Commit();
  58.  
  59.                 }
  60.             }
  61.  
  62.         }
  63.  
  64.         private string _getNearestPoint(double pt, Dictionary<double, double> station_map)
  65.         {
  66.             double dist = pt;
  67.             foreach (KeyValuePair<double, double> entry in station_map)
  68.             {
  69.                 if (entry.Value - pt < dist && entry.Value > pt) dist = Math.Abs(pt - entry.Value);
  70.             }
  71.             return String.Format("{0:0.00}", dist);
  72.         }
  73.  
  74.         private void _SetLabelTextOverride(LabelBase baseLabel, Alignment al, Station[] statMajo, Station[] statEqua, Station[] statGeom)
  75.         {
  76.             StationEquationCollection stc = al.StationEquations;
  77.  
  78.             Dictionary<double, double> station_map = new Dictionary<double, double>();
  79.  
  80. //dostaem zna4enije rublennogo piketa dlia
  81.             foreach (Station st in statMajo)
  82.             {
  83.                 station_map[st.RawStation] = st.RawStation;
  84.             }
  85.  
  86.             foreach (Station st in statEqua)
  87.             {
  88.                 StationEquation se = stc.GetStationEquation(st.RawStation);
  89.                 station_map[se.StationAhead] = se.StationBack;
  90.             }
  91. //
  92.             switch (baseLabel.GetRXClass().DxfName)
  93.             {
  94.        
  95.                 case "AECC_ALIGNMENT_GEOMPOINT_LABEL_GROUP":
  96.                     LabelGroup group = (LabelGroup)baseLabel;
  97.                     int i = 1;
  98.                     foreach (LabelGroupSubEntity subEntity in group.SubEntities)
  99.                     {
  100.                         ObjectIdCollection textComponentIds = subEntity.GetTextComponentIds();
  101.                         textComponentIds = subEntity.GetTextComponentIds();
  102.                         if (textComponentIds.Count > 0)
  103.                         {
  104.                             foreach(ObjectId id in textComponentIds)
  105.                             {
  106.                                 LabelStyleTextComponent lsc = (LabelStyleTextComponent)id.GetObject(OpenMode.ForWrite);
  107.                                 if (lsc.Name == "добавкаНАЧАЛОкривой" || lsc.Name == "ДобавкаНачалаКонца")
  108.                                 {
  109. //meniajem zna4enije "dobavki"
  110.                                     double st = 0;
  111.                                     double off = 0;
  112.                                     al.StationOffset(subEntity.LabelLocation.X,subEntity.LabelLocation.Y,0.01,ref st,ref off);
  113.                                     Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st+" "+al.GetStationStringWithEquations(st)+"\n");
  114.                                     subEntity.SetTextComponentOverride(id, _getNearestPoint(Double.Parse(al.GetStationStringWithEquations(st).Replace("+", "")), station_map));
  115.                                 }
  116.                             }
  117.                         }
  118.                         else
  119.                         {
  120.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Label: "
  121.                                 + subEntity.Parent.GetRXClass().DxfName + " doesn't have any text component to override! "
  122.                                 + "This label will be ignored for the current action.\n");
  123.                             break;
  124.                         }
  125.                     }
  126.                     break;
  127.  
  128.                 default:
  129.                     break;
  130.             }
  131.         }
  132.  

Вроде считает правельно и даже записывает значение. Но может есть более коректный/правельный подход?

Но основной вопрос заклиучется в том, что мне эти же значения нужно прописать и в ProfileView.
Вот к этому даже не знаю с какой стороны подступится + это всио поидее должно крутиться, как я понимаю, на реакторе.

П.С. за ранее простите за терминологию, я 1 раз с таким проэктом работаю и не особо вник пока в пикеты,выноски и профили :)

« Последнее редактирование: 15-12-2014, 22:51:47 от begiz »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Приветствую!
Цитировать
Вроде считает правельно и даже записывает значение. Но может есть более коректный/правельный подход?
На первый взгляд, все в порядке. Если поделитесь своим DWG-файлом, можно попробовать погонять код и поискать возможные проблемы.
Цитировать
Но основной вопрос заклиучется в том, что мне эти же значения нужно прописать и в ProfileView.
Вид профиля - объект довольно сложный. Так что, сперва надо понять, в какую его часть Вы хотите поместить данные. Опять же, лучше будет, если Вы покажете это на чертеже.
Цитировать
это всио поидее должно крутиться, как я понимаю, на реакторе.
В теории, это тоже возможно - достаточно подписаться на события модификации объектов и проверять их на принадлежность к Alignment.

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Дмитрий, спасибо за ответ.
Прицепил фаил, там много всяких заданий отмечено,
но на данном этапе меня только обозначенный вопрос интересует.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Просмотрел внимательно код, отметил в комментариях несколько смущающих моментов
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.Civil.DatabaseServices;
  7. using Autodesk.Civil.ApplicationServices;
  8. using Autodesk.Civil.DatabaseServices.Styles;
  9. using Autodesk.AutoCAD.EditorInput;
  10.  
  11. namespace ForCivilTest
  12. {
  13.     public class Class1
  14.     {
  15.         public void MyCommand() // This method can have any name
  16.         {
  17.             // Put your command code here
  18.             CivilDocument doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
  19.             ObjectIdCollection alignments = doc.GetAlignmentIds();
  20.             ObjectIdCollection sites = doc.GetSiteIds();
  21.             String docInfo = String.Format("This document has {0} alignments and {1} sites.\n", alignments.Count, sites.Count);
  22.  
  23.             // Можно где-то тут объявить:
  24.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  25.             Database db = adoc.Database;
  26.             Editor ed = adoc.Editor;
  27.  
  28.             // И подставлять переменные, чтобы не было таких громоздких конструкций
  29.             //Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(docInfo);
  30.             ed.WriteMessage(docInfo);
  31.  
  32.             //berem vse alignment
  33.             foreach (ObjectId oId in alignments)
  34.             {  
  35.                 //using (Transaction tr = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  36.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  37.                 {
  38.                     try
  39.                     {
  40.                         // Получаем текущую трассу
  41.                         Alignment al = (Alignment)oId.GetObject(OpenMode.ForRead);
  42.  
  43.                         // Выводим о ней информацию
  44.                         String txt = String.Format("\nAlignName:!{0}\n", al.Name);
  45.                         //Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(txt);
  46.                         ed.WriteMessage(txt); // Ну и так далее
  47.  
  48.                         //dostaem vse tikety
  49.                         // Точки геометрии
  50.                         Station[] statGeom = al.GetStationSet(StationTypes.GeometryPoint);
  51.                         // Точки основных пикетов
  52.                         Station[] statMajo = al.GetStationSet(StationTypes.Major);
  53.                         // Точки чего?
  54.                         Station[] statEqua = al.GetStationSet(StationTypes.Equation);
  55.  
  56.                         // Вывод данных о точках геометрии
  57.                         foreach (Station st in statGeom)
  58.                         {
  59.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  60.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  61.                         }
  62.  
  63.                         // Вывод данных о точках основных пикетов
  64.                         foreach (Station st in statMajo)
  65.                         {
  66.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  67.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  68.                         }
  69.  
  70.                         // Вывод данных о точках чего?
  71.                         foreach (Station st in statEqua)
  72.                         {
  73.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  74.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  75.                         }
  76.  
  77.                         // Получение данных о группах меток для трассы
  78.                         ObjectIdCollection alLabGr = al.GetAlignmentLabelGroupIds();
  79.  
  80.                         // Лишнее?
  81.                         int i = 1;
  82.  
  83.                         // Проходим по группам меток
  84.                         foreach (ObjectId alLabGroId in alLabGr)
  85.                         {
  86.                             // Хм, подозреваю, что тут лучше использовать не LabelBase, а LabelGroup
  87.                             // чтобы понимать, что мы имеем дело не с отдельной меткой а с группой меток
  88.                             LabelBase label = alLabGroId.GetObject(OpenMode.ForWrite) as LabelBase;
  89.                            
  90.                             // Проходим по каждой группе меток, задаем текст                            
  91.                             _SetLabelTextOverride(label, al, statMajo, statEqua, statGeom);
  92.                         }
  93.                     }
  94.                     catch (Autodesk.Civil.CivilException ex)
  95.                     {
  96.                         // А куда потом эту строку?
  97.                         string msg = ex.Message;
  98.                     }
  99.  
  100.                     tr.Commit();
  101.  
  102.                 }
  103.             }
  104.  
  105.         }
  106.  
  107.         // Очень сложный для моего понимания метод...
  108.         private string _getNearestPoint(double pt, Dictionary<double, double> station_map)
  109.         {
  110.             double dist = pt;
  111.             foreach (KeyValuePair<double, double> entry in station_map)
  112.             {
  113.                 if
  114.                     (entry.Value - pt < dist
  115.                     && entry.Value > pt)
  116.                     dist = Math.Abs(pt - entry.Value);
  117.             }            
  118.             return String.Format("{0:0.00}", dist);
  119.         }
  120.  
  121.         private void _SetLabelTextOverride(LabelBase baseLabel, Alignment al, Station[] statMajo, Station[] statEqua, Station[] statGeom)
  122.         {
  123.             StationEquationCollection stc = al.StationEquations;
  124.  
  125.             Dictionary<double, double> station_map = new Dictionary<double, double>();
  126.  
  127.             //dostaem zna4enije rublennogo piketa dlia ... чего? :)
  128.             foreach (Station st in statMajo)
  129.             {
  130.                 // Что-то очень хитрое. Словарь из ключа и равного ключу значения. Зачем?
  131.                 station_map[st.RawStation] = st.RawStation;
  132.             }
  133.  
  134.             // К сожалению, не понимаю, что это за Equation. Поэтому, не понимаю этого цикла
  135.             foreach (Station st in statEqua)
  136.             {
  137.                 StationEquation se = stc.GetStationEquation(st.RawStation);
  138.                 station_map[se.StationAhead] = se.StationBack;
  139.             }
  140.  
  141.             // Если в метод передавать сразу LabelGroup, то вот этого не нужно будет
  142.             switch (baseLabel.GetRXClass().DxfName)
  143.             {
  144.  
  145.                 case "AECC_ALIGNMENT_GEOMPOINT_LABEL_GROUP":
  146.                     LabelGroup group = (LabelGroup)baseLabel;
  147.  
  148.                     // Где-то я это уже встречал... :)
  149.                     int i = 1;
  150.  
  151.                     // Проходим по всем примитивам внутри LabelGroup
  152.                     foreach (LabelGroupSubEntity subEntity in group.SubEntities)
  153.                     {
  154.                         // Получаем их коллекцию текстовых компонентов
  155.                         ObjectIdCollection textComponentIds = subEntity.GetTextComponentIds();
  156.                         // ... дважды
  157.                         textComponentIds = subEntity.GetTextComponentIds();
  158.  
  159.                         // Если компоненты есть
  160.                         if (textComponentIds.Count > 0)
  161.                         {
  162.                             double st = 0;
  163.                             double off = 0;
  164.  
  165.                             al.StationOffset(subEntity.LabelLocation.X, subEntity.LabelLocation.Y, 0.01, ref st, ref off);
  166.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st + " " + al.GetStationStringWithEquations(st) + "\n");
  167.  
  168.                             // Проходим по ним
  169.                             foreach (ObjectId id in textComponentIds)
  170.                             {
  171.                                 // Получаем объект текстового компонента метки
  172.                                 LabelStyleTextComponent lsc = (LabelStyleTextComponent)id.GetObject(OpenMode.ForWrite);
  173.  
  174.                                 // Если его имя нам подходит
  175.                                 if (lsc.Name == "добавкаНАЧАЛОкривой" || lsc.Name == "ДобавкаНачалаКонца")
  176.                                 {
  177.  
  178.                                     // следующие строки можно вынести за цикл 'foreach (ObjectId id in textComponentIds)'
  179.                                    
  180.                                     //meniajem zna4enije "dobavki"
  181.                                     //double st = 0;
  182.                                     //double off = 0;
  183.  
  184.                                    
  185.                                     //al.StationOffset(subEntity.LabelLocation.X, subEntity.LabelLocation.Y, 0.01, ref st, ref off);
  186.                                     //Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st + " " + al.GetStationStringWithEquations(st) + "\n");
  187.  
  188.                                     // Вычисляем и задаем ему значение. Это я проверить не могу, т.к. не понимаю какие данные обрабатываются
  189.                                     subEntity.SetTextComponentOverride(id, _getNearestPoint(Double.Parse(al.GetStationStringWithEquations(st).Replace("+", "")), station_map));
  190.                                 }
  191.                             }
  192.                         }
  193.                         else
  194.                         {
  195.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Label: "
  196.                                 + subEntity.Parent.GetRXClass().DxfName + " doesn't have any text component to override! "
  197.                                 + "This label will be ignored for the current action.\n");
  198.                            
  199.                             // А это вроде как серьезная ошибка. Если нам попадается какая-то метка без текстовых компонентов,
  200.                             // цикл 'foreach (LabelGroupSubEntity subEntity in group.SubEntities)' прерывается.
  201.                             // Хотя, может в этом есть какая-то логика?
  202.                             break;
  203.                         }
  204.                     }
  205.                     // Это мы из case выходим
  206.                     break;
  207.  
  208.                 default:
  209.                     break;
  210.             }
  211.         }
  212.  
  213.     }
  214. }
  215.  

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
За ранее извиниус' за транслит, просто долго полу4иаециа без клавиатуры с кирилиcоj набират' :)  Код из разриада : 3 дниа не спал' и ресил резко изу4ит' неизвестноjе АПИ методом cопы/пасте и сеарcк по документаcии, так 4то не обессут'те за кореиавыjе конструкcии и всиакиjе непониатныjе переменныjе :)  Попробуjу в коде разjаснит' ети xитрыjе конструкcии и функcии которыjе с4итаjу.  Во 1, jа поxоду запуталсиа в пикетаx и не правел'но написал заданиjе. У нас ест' геометри4ескиjе то4ки - повороты, вершины арок и тд. Далсе у нас ест' основныjе пикеты, которыjе идут каздыjе 100м (как в примере) и Есе у нас ест' рубленныjе пикеты, ето как бы основныjе пикеты, толко сдвинутыjе относително своjеj оригиналноj позиcии (например на 101м вместо 100м). Задаcиа пос4итат' расстоjаниjе мезду геометри4ескоj то4коj основноj то4коj. в слуcиаjе еси основнаjа то4ка нормалнаjа, то Cивил вроде ето с4итат' умеет сам. А вот если основноj пикет рубленыj/сдвинутыj узе приxодициа програмит'.

Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.Civil.DatabaseServices;
  7. using Autodesk.Civil.ApplicationServices;
  8. using Autodesk.Civil.DatabaseServices.Styles;
  9. using Autodesk.AutoCAD.EditorInput;
  10.  
  11. namespace ForCivilTest
  12. {
  13.     public class Class1
  14.     {
  15.         public void MyCommand() // This method can have any name
  16.         {
  17.             // Put your command code here
  18.             CivilDocument doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
  19.             ObjectIdCollection alignments = doc.GetAlignmentIds();
  20.             ObjectIdCollection sites = doc.GetSiteIds();
  21.             String docInfo = String.Format("This document has {0} alignments and {1} sites.\n", alignments.Count, sites.Count);
  22.  
  23.             // Можно где-то тут объявить:
  24.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  25.             Database db = adoc.Database;
  26.             Editor ed = adoc.Editor;
  27.  
  28.             // И подставлять переменные, чтобы не было таких громоздких конструкций
  29.             //Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(docInfo);
  30.             ed.WriteMessage(docInfo);
  31.  
  32.             //berem vse alignment
  33.             foreach (ObjectId oId in alignments)
  34.             {  
  35.                 //using (Transaction tr = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  36.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  37.                 {
  38.                     try
  39.                     {
  40.                         // Получаем текущую трассу
  41.                         Alignment al = (Alignment)oId.GetObject(OpenMode.ForRead);
  42.  
  43.                         // Выводим о ней информацию
  44.                         String txt = String.Format("\nAlignName:!{0}\n", al.Name);
  45.                         //Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(txt);
  46.                         ed.WriteMessage(txt); // Ну и так далее
  47.  
  48.                         //dostaem vse tikety
  49.                         // Точки геометрии
  50.                         Station[] statGeom = al.GetStationSet(StationTypes.GeometryPoint);
  51.                         // Точки основных пикетов - da tex 4to idut u menia kazdyje 100m dopustim
  52.                         Station[] statMajo = al.GetStationSet(StationTypes.Major);
  53.                         // Точки чего? eto Station Equation, nepravelnyje pikety, t.e. pikety sdvinutyje ot pravlenyx (kotoryje kazdyje 100m). iz Civil dostupny po Alignment Priperties->station control.
  54.                         Station[] statEqua = al.GetStationSet(StationTypes.Equation);
  55.  
  56.                         // Вывод данных о точках геометрии
  57.                         foreach (Station st in statGeom)
  58.                         {
  59.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  60.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  61.                         }
  62.  
  63.                         // Вывод данных о точках основных пикетов
  64.                         foreach (Station st in statMajo)
  65.                         {
  66.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  67.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  68.                         }
  69.  
  70.                         // Вывод данных о точках чего? nepravel'nyje/rublenyje pikety
  71.                         foreach (Station st in statEqua)
  72.                         {
  73.                             String st_coord = String.Format("Station: {0}, {1}\n", st.StationType, st.RawStation);
  74.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st_coord);
  75.                         }
  76.  
  77.                         // Получение данных о группах меток для трассы
  78.                         ObjectIdCollection alLabGr = al.GetAlignmentLabelGroupIds();
  79.  
  80.                         // Лишнее? lishnee :)
  81.                         int i = 1;
  82.  
  83.                         // Проходим по группам меток
  84.                         foreach (ObjectId alLabGroId in alLabGr)
  85.                         {
  86.                             // Хм, подозреваю, что тут лучше использовать не LabelBase, а LabelGroup, vozmozno, no poka nzn kak ispolzovat', po4itaju dokumentaciju
  87.                             // чтобы понимать, что мы имеем дело не с отдельной меткой а с группой меток
  88.                             LabelBase label = alLabGroId.GetObject(OpenMode.ForWrite) as LabelBase;
  89.                            
  90.                             // Проходим по каждой группе меток, задаем текст                            
  91.                             _SetLabelTextOverride(label, al, statMajo, statEqua, statGeom);
  92.                         }
  93.                     }
  94.                     catch (Autodesk.Civil.CivilException ex)
  95.                     {
  96.                         // А куда потом эту строку? et dlia debbugera poka 4to tol'ko
  97.                         string msg = ex.Message;
  98.                     }
  99.  
  100.                     tr.Commit();
  101.  
  102.                 }
  103.             }
  104.  
  105.         }
  106.  
  107.         // Очень сложный для моего понимания метод...
  108.         private string _getNearestPoint(double pt, Dictionary<double, double> station_map)
  109.         {
  110.             double dist = pt; // rasstojanije piketa ot naciala
  111.             foreach (KeyValuePair<double, double> entry in station_map)
  112.             {
  113.                 if
  114.                     (entry.Value - pt < dist
  115.                     && entry.Value > pt)
  116.                     dist = Math.Abs(pt - entry.Value); // popytka najti blizajshuju to4ku kotoraja nam podxodit. tak kak osnovnyj(Major) to4ek bolse 4em nepravelnyx(equation) ni4ego umnee ne pridumal,
  117.                                                                            // no javno ne pravel'mo, potomu 4to rabotaet tolko dlia sdvinutyx pikov kotoryje mense 100, 4to ne vsegda pravda.
  118.             }            
  119.             return String.Format("{0:0.00}", dist);
  120.         }
  121.  
  122.         private void _SetLabelTextOverride(LabelBase baseLabel, Alignment al, Station[] statMajo, Station[] statEqua, Station[] statGeom)
  123.         {
  124.             StationEquationCollection stc = al.StationEquations;
  125.  
  126.             Dictionary<double, double> station_map = new Dictionary<double, double>();
  127.  
  128.             //dostaem zna4enije rublennogo piketa dlia ... чего? :) zapolniaetsia map po kliu4iam osnovnyx piketov
  129.             foreach (Station st in statMajo)
  130.             {
  131.                 // Что-то очень хитрое. Словарь из ключа и равного ключу значения. Зачем?
  132.                 station_map[st.RawStation] = st.RawStation;
  133.             }
  134.  
  135.             // К сожалению, не понимаю, что это за Equation. Поэтому, не понимаю этого цикла - a vot zdes meniaem zna4enije osnovnogo pikata na rublenyj,
  136.            // po kliu4iu osnovnogo, potomu 4to rublenyj beretsia kak otstup ot osnovnogo
  137.             foreach (Station st in statEqua)
  138.             {
  139.                 StationEquation se = stc.GetStationEquation(st.RawStation);
  140.                 station_map[se.StationAhead] = se.StationBack;
  141.             }
  142.  
  143.             // Если в метод передавать сразу LabelGroup, то вот этого не нужно будет - bylo by zame4iatel'no, po4itaju API kak sdelat', eto variant skopirovanyj o kuda to.
  144.             switch (baseLabel.GetRXClass().DxfName)
  145.             {
  146.  
  147.                 case "AECC_ALIGNMENT_GEOMPOINT_LABEL_GROUP":
  148.                     LabelGroup group = (LabelGroup)baseLabel;
  149.  
  150.                     // Где-то я это уже встречал... :)
  151.                     int i = 1;
  152.  
  153.                     // Проходим по всем примитивам внутри LabelGroup
  154.                     foreach (LabelGroupSubEntity subEntity in group.SubEntities)
  155.                     {
  156.                         // Получаем их коллекцию текстовых компонентов
  157.                         ObjectIdCollection textComponentIds = subEntity.GetTextComponentIds();
  158.                         // ... дважды
  159.                         textComponentIds = subEntity.GetTextComponentIds();
  160.  
  161.                         // Если компоненты есть
  162.                         if (textComponentIds.Count > 0)
  163.                         {
  164.                             double st = 0;
  165.                             double off = 0;
  166.  
  167.                             al.StationOffset(subEntity.LabelLocation.X, subEntity.LabelLocation.Y, 0.01, ref st, ref off);
  168.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st + " " + al.GetStationStringWithEquations(st) + "\n");
  169.  
  170.                             // Проходим по ним
  171.                             foreach (ObjectId id in textComponentIds)
  172.                             {
  173.                                 // Получаем объект текстового компонента метки
  174.                                 LabelStyleTextComponent lsc = (LabelStyleTextComponent)id.GetObject(OpenMode.ForWrite);
  175.  
  176.                                 // Если его имя нам подходит
  177.                                 if (lsc.Name == "добавкаНАЧАЛОкривой" || lsc.Name == "ДобавкаНачалаКонца")
  178.                                 {
  179.  
  180.                                     // следующие строки можно вынести за цикл 'foreach (ObjectId id in textComponentIds)'
  181.                                    
  182.                                     //meniajem zna4enije "dobavki"
  183.                                     //double st = 0;
  184.                                     //double off = 0;
  185.  
  186.                                    
  187.                                     //al.StationOffset(subEntity.LabelLocation.X, subEntity.LabelLocation.Y, 0.01, ref st, ref off);
  188.                                     //Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(st + " " + al.GetStationStringWithEquations(st) + "\n");
  189.  
  190.                                     // Вычисляем и задаем ему значение. Это я проверить не могу, т.к. не понимаю какие данные обрабатываются
  191.                                     // Double.Parse(al.GetStationStringWithEquations(st).Replace("+", "")) - eto preobrazovanije pikate iz vida 196+00, v normalnyj double dlia vyshislenij.
  192.                                     // vozmozno eto vsio ne pravel'no i nuzno po drugomu, na kak i napisal ja ne znaju poka drugogo varianta kak pos4itat rasstojanije mezdu geometri4eskoj to4noj i rublenym piketom :)
  193.                                     subEntity.SetTextComponentOverride(id, _getNearestPoint(Double.Parse(al.GetStationStringWithEquations(st).Replace("+", "")), station_map));
  194.                                 }
  195.                             }
  196.                         }
  197.                         else
  198.                         {
  199.                             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Label: "
  200.                                 + subEntity.Parent.GetRXClass().DxfName + " doesn't have any text component to override! "
  201.                                 + "This label will be ignored for the current action.\n");
  202.                            
  203.                             // А это вроде как серьезная ошибка. Если нам попадается какая-то метка без текстовых компонентов,
  204.                             // цикл 'foreach (LabelGroupSubEntity subEntity in group.SubEntities)' прерывается.
  205.                             // Хотя, может в этом есть какая-то логика?
  206.                             // poka ne znaju ese kak budet ralizovana logika, poka ostavil tak
  207.                             break;
  208.                         }
  209.                     }
  210.                     // Это мы из case выходим
  211.                     break;
  212.  
  213.                 default:
  214.                     break;
  215.             }
  216.         }
  217.  
  218.     }
  219. }
  220.  
  221.  

По 4ертежу если посмотрет' обведенныj пикет слева, со зна4ениjем добавки 9.15, а реалноjе зна4ениjе долзно быт' 6.11. Так вот оно перес4итываециа правелно. 4тобы полу4ит' 6.11 мозно просто померит' ето расстоjаниjе на 4ертезе.Вот.  надеjус' доxодего расписал, еси гдето неjасно добавлиу картинки с поjаснениjами, мозет будет наглиаднеj :)

/** Пожалуйста пользуйся русской виртуальной клавиатурой или переводчиком с транслита на русский /* Александр Ривилис */ **/
« Последнее редактирование: 16-12-2014, 00:51:27 от Александр Ривилис »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Ага. Вроде разобрался что к чему. Только теперь перестал понимать, в чем у Вас проблема? Код вроде работает, Вас все устраивает :)

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
меня смушият момент с поиском правельной точки(хитрая фунция со сравнениями расстояний), не уверен что во всех случаях будет правельно :)

Но интересует меня вот 4то.
Как ети значения которые я посчитал (допустим правельно) прописать в ProfileView.
На чертеже есть ProfileView, в котором тоже указаны неправелные значения, которые нужно поменять на мои.
Суть вопроса в том, как докопатся до етих Band в них найти то что нужно поменять :)
« Последнее редактирование: 16-12-2014, 11:02:03 от begiz »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Цитировать
menia smushiaet moment s poiskom pravelnoj to4ki(xitraja funcija so sravnenijami rasstojanij), ne uveren 4to vo vsex sluciajax budet pravelno :)
Боюсь, это Вам самому нужно будет разбираться. Если только не подключится кто-то, кто похожую проблему решал.
Цитировать
Sut' voprosa v tom, kak dokopatsia do etix Band'ov i v nix najti to 4to nuzno pomeniat'
Alignment.GetProfileViewIds -> Открываем каждый ProfileView с помощью транзакции и получаем ProfileView.Bands -> ProfileViewBandSet.GetBottomBandItems и в этой коллекции ищем/изменяем нужные данные.

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Все понял, буду ковырять ProfileView.Bands
Спасибо :)

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Всех с наступившим и наступаюшим!
Хотел бы продолжить тему.
До нужных ProfileViewBandItem докопался.
Далее вопрос как из них выташить Labels и их override своими значениями?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
И Вам того же! :)
Уходим, конечно, сильно от темы, указанной в заголовке. Лучше бы в отдельной теме виды профилей обсудить.
« Последнее редактирование: 12-01-2015, 13:01:24 от Загорулькин Дмитрий »

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Понял,
сделал новую тему, но вопрос остался.

http://adn-cis.org/forum/index.php?topic=1768.0