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

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

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

Оффлайн Алексей (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.                             }