Скопировать метки из профиля

Автор Тема: Скопировать метки из профиля  (Прочитано 7001 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
В предыдущей теме http://adn-cis.org/forum/index.php?topic=9203.0
Обсуждали подмену профиля на видах профиля.
Все хорошо получилось, но без меток.
Меток на поверхности две
1) Отметка поверхности
2) глубина заложения до лотка трубы

Как же мне получить набор меток из старой поверхности
профиля и добавить этот набор меток в новый профиль?

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #1 : 05-04-2019, 12:06:36 »
Или, если не получится получить из объекта Profile,
то может создать новые метки и назначить их.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Скопировать метки из профиля
« Ответ #2 : 05-04-2019, 12:14:50 »
Имеющиеся метки относятся к "старому" профилю и какого-то простого способа их перенести на другой профиль нет. Можно пройтись по имеющимся меткам, собрать о них данные и по этим данным создать новые метки на "новом" профиле.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Скопировать метки из профиля
« Ответ #3 : 05-04-2019, 12:17:17 »
Меток на поверхности две
1) Отметка поверхности
2) глубина заложения до лотка трубы
Какие это объекты Civil 3D? Нужно полное название на английском. Посмотреть можно с помощью ARXDBG/MGDDBG

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #4 : 05-04-2019, 12:23:54 »
Классы объектов меток такие:
1) AeccDbPipeNetworkBandLabeling
2) AeccDbProfileDataBandLabeling

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Скопировать метки из профиля
« Ответ #5 : 05-04-2019, 12:51:03 »
ProfileView -> Bands -> GetBottomBandItems и/или GetTopBandItems -> пройтись по коллекции и заменить ссылки Profile1Id и/или Profile2Id со старого профиля на новый

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #6 : 05-04-2019, 14:17:10 »
GetBottomBandItems

Не могу понять к какому типу преобразовать элемент коллекции Bands.GetBottomBandItems?
Ругается на неявное преобразование типа.

Код - C# [Выбрать]
  1. //Получаю из трассы trs нужный мне вид профиля
  2. Alignment trs = ...
  3. ObjectId idView = trs.GetProfileViewIds[0]; // Ну пусть первый элемент коллекции
  4. ProfileView pv = (ProfileView)tr.GetObject(idView, CAD_DBS.OpenMode.ForWrite);
  5. // Вот тут к какому типу преобразовать
  6. pv.Bands.GetBottomBandItems;




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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Скопировать метки из профиля
« Ответ #7 : 05-04-2019, 14:24:56 »
Я не просто так вставлял ссылки на справку - там всё есть.

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #8 : 05-04-2019, 14:37:37 »
Так вроде не ругается

Код - C# [Выбрать]
  1. ProfileViewBandSet bs = pv.Bands;
  2. ProfileViewBandItemCollection Coll = bs.GetBottomBandItems();

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #9 : 05-04-2019, 16:36:50 »
Не совсем до конца разобрался.
В задаче 1 я создаю новый профиль
В задачах с 2 по 5 получаю доступ к нужному мне виду профиля
через объект трассы trs (Alignment) GetViewID - моя внутренняя функция
и сканируем строки данных вида профиля
Получаю эти два поля Profile1Id и Profile2Id;

А что дальше с этими Profile1Id и Profile2Id, они же к виду профиля относятся.
Как мне их связать с новым профилем который я создал в задаче 1?

Когда я удаляю старый профиль, то вместе с ним и удаляются его метки,
которые прописываются в профильной таблице.
 

Код - C# [Выбрать]
  1.  
  2.                                 // 1. Создаю новый профиль
  3.                                 CAD_DBS.ObjectId NewID = Profile.CreateFromSurface(...)
  4.                                 // 2. Получаем вид профиля
  5.                                 CAD_DBS.ObjectId idView = GetViewID(trs);
  6.                                 CIV_DBS.ProfileView pv = (CIV_DBS.ProfileView)tr.GetObject(idView, CAD_DBS.OpenMode.ForWrite);
  7.                                 // 3. У вида профиля получаем набор установок полос данных
  8.                                 CIV_DBS.ProfileViewBandSet bs = pv.Bands;
  9.                                 // 4. Получаем коллекцию нижних строк (профильная таблица)
  10.                                 CIV_DBS.ProfileViewBandItemCollection RecordsTabl = bs.GetBottomBandItems();
  11.                                 // 5. Цикл по записям профильной таблицы
  12.                                 foreach (CIV_DBS.ProfileViewBandItem itm in RecordsTabl) {
  13.                                     // Тут я так понял нужно поставить некое условие какую строку выбрать?
  14.                                     CAD_DBS.ObjectId id1 = itm.Profile1Id;
  15.                                     CAD_DBS.ObjectId id2 = itm.Profile2Id;
  16.                                 }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Скопировать метки из профиля
« Ответ #10 : 05-04-2019, 19:14:04 »
А что дальше с этими Profile1Id и Profile2Id, они же к виду профиля относятся.
Как мне их связать с новым профилем который я создал в задаче 1?
Надо проверять эти значения - не ссылаются ли они на Id старого профиля. Если ссылаются - то заменять на Id нового профиля. Наверное, лучше это делать до того, как старый профиль будет удалён.
они же к виду профиля относятся.
В этих свойствах записан Id профиля, с которого берутся значения.

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #11 : 08-04-2019, 09:25:39 »
А вроде теперь понятно ProfileID1 и ProfileID2 это соответствуют 
тем двум полям таблицы "Профиль 1" и "Профиль 2",
 которые  "свойствах вида профиля" во вкладке "области данных"
Мне нужно пробежаться по строками найти нужную строку и назначить эти ID

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #12 : 08-04-2019, 09:49:27 »

На картинке выделил столбец "Стиль"
Только не понятно какое поле элемента itm задействовать чтобы найти нужную мне строку?

Код - C# [Выбрать]
  1.                                 // 1. Получаем вид профиля
  2.                                 ObjectId idView = GetViewID(trs);
  3.                                 ProfileView pv = (ProfileView)tr.GetObject(idView, OpenMode.ForWrite);
  4.                                 // 2. У вида профиля получаем набор установок полос данных
  5.                                 ProfileViewBandSet bs = pv.Bands;
  6.                                 // 3. Получаем коллекцию нижних строк (профильная таблица)
  7.                                 ProfileViewBandItemCollection RecordsTabl = bs.GetBottomBandItems();
  8.                                 // 4. Цикл по записям профильной таблицы
  9.                                 foreach (ProfileViewBandItem itm in RecordsTabl)
  10.                                 {
  11.                                     if (itm.[???].ToUpper() == "ТРУБЫ_ПРОЕКТНАЯ ОТМЕТКА ЗЕМЛИ")
  12.                                    {
  13.                                     itm.Profile1Id = ...
  14.                                     itm.Profile2Id = ...
  15.                                     }
  16.                                 }
 

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Скопировать метки из профиля
« Ответ #13 : 08-04-2019, 10:25:04 »
Тебе не всё ли равно как называется тип данных? Пользователи изменят название - и придётся переписывать программу? Ещё раз повторюсь: пройдись по всем данным. Если в Profile1Id содержится ObjectId удаляемого профиля - записывай вместо него ObjectId нового профиля. То же самое и с Profile2Id. И только потом удаляй старый профиль.

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #14 : 08-04-2019, 10:50:18 »
Тебе не всё ли равно как называется тип данных? Пользователи изменят название - и придётся переписывать программу? Ещё раз повторюсь: пройдись по всем данным. Если в Profile1Id содержится ObjectId удаляемого профиля - записывай вместо него ObjectId нового профиля. То же самое и с Profile2Id. И только потом удаляй старый профиль.
А! Ну тогда все понятно. просто проверить на совпадение id если сходятся, то подменить.

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #15 : 08-04-2019, 15:44:47 »
Сделал так
idREDold - ИД старого профиля


Код - C# [Выбрать]
  1.                                 foreach (CIV_DBS.ProfileViewBandItem itm in RecordsTabl)
  2.                                 {
  3.                                     if (RecordsTabl[i].Profile1Id == idREDold)
  4.                                         RecordsTabl[i].Profile1Id = NewID_RED;
  5.  
  6.                                     if (RecordsTabl[i].Profile2Id == idREDold)
  7.                                         RecordsTabl[i].Profile2Id = NewID_RED;
  8.                                 }

Но подмены iD Профиль1 и Профиль2 не происходит.
Вместо старого профиля в таблице значение "профиль не найден"
Что не так Транзакцию commit делаю.
может полностью код команды положить?

Отмечено как Решение Алексей (IdeaSoft) 08-04-2019, 17:17:45

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #16 : 08-04-2019, 16:04:21 »
Вот код команды

Код - C# [Выбрать]
  1.        
  2. using System.Windows.Forms;
  3.  
  4. using CAD_DBS = Autodesk.AutoCAD.DatabaseServices;
  5. using CAD_GEO = Autodesk.AutoCAD.Geometry;
  6. using CAD_APS = Autodesk.AutoCAD.ApplicationServices;
  7. using CAD_RTM = Autodesk.AutoCAD.Runtime;
  8. using CAD_EDI = Autodesk.AutoCAD.EditorInput;
  9. using CAD_PLS = Autodesk.AutoCAD.PlottingServices;
  10.  
  11. using CIV_APS = Autodesk.Civil.ApplicationServices;
  12. using CIV_DBS = Autodesk.Civil.DatabaseServices;
  13.  
  14. [assembly: CAD_RTM.CommandClass(typeof(ideasoft_civ.acad_commands))]
  15.  
  16. class acad_commands
  17. {
  18.  
  19. // Команда подмены профилей земли в проекте Цивил
  20.         [CAD_RTM.CommandMethod("PSM_CIVIL_PROF_REPLACE")]
  21.         public static void PSM_COMM_CIVIL_TRASSA_REPLACE()
  22.         {
  23.             // Выбираем нужную поверхность, по которой будем обновлять профили
  24.             CAD_DBS.Entity pov;
  25.             bool ret = false;
  26.             CAD_DBS.ObjectId idpov = acad_Func.get_ent("Укажите поверхность-tin", out ret, out pov);
  27.             if (pov == null) return;
  28.             if (!(pov is CIV_DBS.Surface))
  29.                 return;
  30.             CIV_DBS.Surface sur = (CIV_DBS.Surface)pov;
  31.            
  32.             bool delProf = DialogResult.Yes == MessageBox.Show("Удалять старую версию линии земли на профиле?", "Цивил",
  33.                      MessageBoxButtons.YesNo);
  34.  
  35.             CAD_DBS.Entity ent;
  36.             bool ret1 = false;
  37.             CAD_DBS.ObjectId idprof = acad_Func.get_ent("Укажите профиль для подмены", out ret1, out ent);
  38.             if (ent == null) return;
  39.             if (!(ent is CIV_DBS.Profile))
  40.                 return;
  41.             CIV_DBS.Profile prof = (CIV_DBS.Profile)ent;
  42.            
  43.             string ProfName = prof.Name;
  44.             DialogResult res = InputBox("Идея-Софт ПС Профиль", "Имя профиля проекта Civil", ref ProfName);
  45.             if (res != DialogResult.OK) return;
  46.             if (ProfName.Trim() == "") return;
  47.            
  48.             CAD_APS.Document doc = CAD_APS.Application.DocumentManager.MdiActiveDocument;
  49.             CAD_DBS.Database db = doc.Database;
  50.  
  51.             CIV_APS.CivilDocument civ_doc = CIV_APS.CivilDocument.GetCivilDocument(db);
  52.  
  53.             List<CAD_DBS.Entity> Ents = new List<CAD_DBS.Entity>();
  54.            
  55.             string StartRep = "Были заменены профили:" + '\n';
  56.             if (!delProf)
  57.                 StartRep = "Были добавлены профили:" + '\n';
  58.            
  59.             int k = 0; // Счетчик для отчета работы команды
  60.  
  61.             // Список имен замененных профилей
  62.             string ListRep = "";
  63.  
  64.             using (doc.LockDocument())
  65.             {
  66.                 using (CAD_DBS.Transaction tr = db.TransactionManager.StartTransaction())
  67.                 {
  68.                     // Цикл по трассам
  69.                     foreach (CAD_DBS.ObjectId id in civ_doc.GetAlignmentIds())
  70.                     {
  71.                         // Получаем объект трассы
  72.                         CIV_DBS.Alignment trs = ( CIV_DBS.Alignment)tr.GetObject(id, CAD_DBS.OpenMode.ForRead);
  73.                         // Получаем нужные профили (Профиль проектируемой земли и профиль лотка трубы)
  74.                         CAD_DBS.ObjectId idREDold = new CAD_DBS.ObjectId();
  75.                         CAD_DBS.ObjectId idLOTold = new CAD_DBS.ObjectId();
  76.                         CIV_DBS.Profile profLOTold = null;
  77.                         CIV_DBS.Profile profREDold = null;
  78.                         if (getProfil_fragment_Name("лоток", trs, tr, ref idLOTold, ref profLOTold) &&
  79.                             getProfil_fragment_Name(ProfName, trs, tr, ref idREDold, ref profREDold))
  80.                         {
  81.                             // Создаем объект нового профиля
  82.                             CIV_DBS.Styles.ProfileLabelSetStyleCollection coll = civ_doc.Styles.LabelSetStyles.ProfileLabelSetStyles;
  83.                             CAD_DBS.ObjectId idSetLS = coll[1];
  84.                             // Придумаем имя новому профилю
  85.                             DateTime dt = DateTime.Now;
  86.                             string SDate = dt.Year + "_" + String.Format("{0:00}", dt.Month) + "_" +
  87.                                                            String.Format("{0:00}", dt.Day) + "_" +
  88.                                                            String.Format("{0:00}", dt.Hour) + "_" +
  89.                                                            String.Format("{0:00}", dt.Minute) + "_" +
  90.                                                            String.Format("{0:00}", dt.Second) + "_" +
  91.                                                            String.Format("{0:000}", dt.Millisecond);
  92.                             string NewNameProf = "_PSM_" + trs.Name + "_SPOZU_" + SDate;
  93.                             CAD_DBS.ObjectId NewID_RED = Profile.CreateFromSurface(
  94.                                                          NewNameProf, trs.ObjectId,
  95.                                                          sur.ObjectId, profREDold.LayerId,
  96.                                                          profREDold.StyleId, idSetLS);
  97.                             // Получаем вид профиля
  98.                             CAD_DBS.ObjectId idView = GetViewID(trs);
  99.                             CIV_DBS.ProfileView pv = (CIV_DBS.ProfileView)tr.GetObject(idView, CAD_DBS.OpenMode.ForWrite);
  100.                             // У вида профиля получаем набор установок полос данных
  101.                             CIV_DBS.ProfileViewBandSet bs = pv.Bands;
  102.                             // Получаем коллекцию нижних строк (профильная таблица)
  103.                             CIV_DBS.ProfileViewBandItemCollection RecordsTabl = bs.GetBottomBandItems();
  104.                             // Цикл по записям профильной таблицы
  105.                             for (int i = 0; i < RecordsTabl.Count; i++)
  106.                                 // Подмена id профилей в таблице
  107.                                 foreach (CIV_DBS.ProfileViewBandItem itm in RecordsTabl)
  108.                                 {
  109.                                     if (RecordsTabl[i].Profile1Id == idREDold)
  110.                                         RecordsTabl[i].Profile1Id = NewID_RED;
  111.                                     if (RecordsTabl[i].Profile2Id == idREDold)
  112.                                         RecordsTabl[i].Profile2Id = NewID_RED;
  113.                                 }
  114.                            
  115.                             bs.SetBottomBandItems(RecordsTabl);
  116.  
  117.                             k++;
  118.                             if (delProf)
  119.                             {
  120.                                 // Удаление старого профиля
  121.                                 acad_Func.ent_delete(idREDold);
  122.                                 ListRep += k.ToString() + ") " + profREDold.Name + " на " + NewNameProf + '\n';
  123.                             }
  124.                             else
  125.                             {
  126.                                 ListRep += k.ToString() + ") " + NewNameProf + '\n';
  127.                             }
  128.                         }
  129.                     } // Конец цикла по трассам
  130.                     tr.Commit();
  131.                 }
  132.             }
  133.             // Выводим краткий отчет по работе команды (не обязательно)
  134.             if (ListRep != "")
  135.                MessageBox.Show(StartRep + ListRep);  
  136.         }
  137.        
  138.  
  139.  
  140.         // ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ РАБОТЫ КОМАНДЫ
  141.         // Функция вывода диалога ввода строки
  142.         public static DialogResult InputBox(string title,
  143.                                             string promptText,
  144.                                             ref string value)
  145.         {
  146.             Form form = new Form();
  147.             System.Windows.Forms.Label label = new System.Windows.Forms.Label();
  148.             TextBox textBox = new TextBox();
  149.             Button buttonOk = new Button();
  150.             Button buttonCancel = new Button();
  151.             form.Text = title;
  152.             label.Text = promptText;
  153.             textBox.Text = value;
  154.             buttonOk.Text = "OK";
  155.             buttonCancel.Text = "Отмена";
  156.             buttonOk.DialogResult = DialogResult.OK;
  157.             buttonCancel.DialogResult = DialogResult.Cancel;
  158.             label.SetBounds(9, 18, 372, 13);
  159.             textBox.SetBounds(12, 36, 372, 20);
  160.             buttonOk.SetBounds(228, 72, 75, 23);
  161.             buttonCancel.SetBounds(309, 72, 75, 23);
  162.             label.AutoSize = true;
  163.             textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
  164.             buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
  165.             buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
  166.             form.ClientSize = new System.Drawing.Size(396, 107);
  167.             form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
  168.             form.ClientSize = new System.Drawing.Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
  169.             form.FormBorderStyle = FormBorderStyle.FixedDialog;
  170.             form.StartPosition = FormStartPosition.CenterScreen;
  171.             form.MinimizeBox = false;
  172.             form.MaximizeBox = false;
  173.             form.AcceptButton = buttonOk;
  174.             form.CancelButton = buttonCancel;
  175.             DialogResult dialogResult = form.ShowDialog();
  176.             value = textBox.Text;
  177.             return dialogResult;
  178.         }
  179.         // Получаем id для первого вида профиля трассы trs
  180.         public static CAD_DBS.ObjectId GetViewID(CIV_DBS.Alignment trs) {
  181.             foreach (CAD_DBS.ObjectId id in trs.GetProfileViewIds())
  182.                 return id;
  183.             CAD_DBS.ObjectId retid = new CAD_DBS.ObjectId();  
  184.             return retid;
  185.         }
  186.        // Получаем нужный профиль трассы про ключевому фрагменту имени профиля
  187.        public static bool getProfil_fragment_Name(string fragment_Name,
  188.                                                    CIV_DBS.Alignment trs,
  189.                                                    CAD_DBS.Transaction tr,
  190.                                                ref CAD_DBS.ObjectId retID,
  191.                                                ref CIV_DBS.Profile ProfObj)
  192.         {
  193.             foreach (CAD_DBS.ObjectId curr in trs.GetProfileIds())
  194.             {
  195.                 CIV_DBS.Profile CurrPr = (CIV_DBS.Profile)tr.GetObject(curr, CAD_DBS.OpenMode.ForRead);
  196.                 if (CurrPr != null)
  197.                     if (CurrPr.Name.IndexOf(fragment_Name) != -1)
  198.                     {
  199.                         ProfObj = CurrPr;
  200.                         retID = curr;
  201.                         return true;
  202.                     }
  203.             }
  204.             return false;
  205.         }
  206.     public static class acad_Func
  207.     {
  208.         public static CAD_DBS.ObjectId get_ent(string msg, out bool ret, out CAD_DBS.Entity ent)
  209.         {
  210.             ret = false;
  211.             CAD_DBS.ObjectId id = new CAD_DBS.ObjectId();
  212.             CAD_DBS.Database db = CAD_APS.Application.DocumentManager.MdiActiveDocument.Database;
  213.             ent = null;
  214.             using (CAD_DBS.Transaction trans = db.TransactionManager.StartTransaction())
  215.             {
  216.                 try
  217.                 {
  218.                     CAD_EDI.PromptEntityOptions entityOpts = new CAD_EDI.PromptEntityOptions("\n" + msg);
  219.                     CAD_EDI.PromptEntityResult entityRes = CAD_APS.Application.DocumentManager.MdiActiveDocument.Editor.GetEntity(entityOpts);
  220.                     CAD_DBS.Entity entObject = (trans.GetObject(entityRes.ObjectId, CAD_DBS.OpenMode.ForRead) as CAD_DBS.Entity);
  221.                     id = entObject.ObjectId;
  222.                     ent = entObject;
  223.                     trans.Commit();
  224.                     ret = true;
  225.                 }
  226.                 catch
  227.                 {
  228.                             trans.Commit();
  229.                 }
  230.             }
  231.             return id;
  232.         }
  233.     }
  234. }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Скопировать метки из профиля
« Ответ #17 : 08-04-2019, 16:11:41 »
Ах да, совсем забыл! После изменения, изменённые строки нужно обратно записать методом SetBottomBandItems.

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #18 : 08-04-2019, 16:15:13 »
В моем случае после цикла где меняю id (между строками 114 и 116)
вставить вызов
Код - C# [Выбрать]
  1. bs.SetBottomBandItems(RecordsTabl);

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #19 : 08-04-2019, 16:27:38 »
Все хорошо все получилось.
Всем большое спасибо!
Вставлю тогда строку
Код - C# [Выбрать]
  1. bs.SetBottomBandItems(RecordsTabl);
и код выше и помечу как решение
« Последнее редактирование: 08-04-2019, 17:40:04 от Алексей (IdeaSoft) »

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

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать метки из профиля
« Ответ #20 : 08-04-2019, 17:43:23 »
Все же есть случай, когда мне нужно обратится именно по имени стиля и поменять только в нужных стилях
Конечно это не универсальных подход все индивидуально ориентированно жестка на имена стилей.
Так сказать одноразовая задача для решения проблемы.

Можно сделать так:

Код - C# [Выбрать]
  1.                             for (int i = 0; i < RecordsTabl.Count; i++)
  2.                             {
  3.                                 // Подмена стиле по конкретным именам
  4.                                 CAD_DBS.ObjectId stID = RecordsTabl[i].BandStyleId;
  5.                                 var obj = tr.GetObject(stID, CAD_DBS.OpenMode.ForRead);
  6.                                 if (obj is CIV_DBS.Styles.StyleBase)
  7.                                 {
  8.                                     string NSt = (obj as CIV_DBS.Styles.StyleBase).Name.ToUpper();
  9.                                     if (NSt.IndexOf("ТРУБЫ_ПРОЕКТНАЯ ОТМЕТКА ЗЕМЛИ") != -1)
  10.                                     {
  11.                                         RecordsTabl[i].Profile1Id = NewID_RED;
  12.                                         RecordsTabl[i].Profile2Id = NewID_RED;
  13.                                     }
  14.                                     if (NSt.IndexOf("ПРОФИЛЬ_ГЛУБИНА ЗАЛОЖЕНИЯ_КЗ") != -1)
  15.                                     {
  16.                                         RecordsTabl[i].Profile1Id = NewID_RED;
  17.                                         RecordsTabl[i].Profile2Id = idLOTold;
  18.                                     }
  19.                                 }
  20.                             }