Добавление диаметров труб

Автор Тема: Добавление диаметров труб  (Прочитано 6449 раз)

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

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
1. Подскажите пожалуйста, как программно добавить диаметры труб в существующий список элементов?
2. Если нет нужных диаметров труб в семействе, то как программно добавить диаметры в семейство?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавление диаметров труб
« Ответ #1 : 21-04-2014, 15:48:05 »
Могу ошибаться, так как не специалист в Civil 3D, но думаю что ни то, ни другое невозможно с использованием Civil 3D API
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление диаметров труб
« Ответ #2 : 21-04-2014, 17:00:17 »
Попробуйте посмотреть метод PartFamily.AddPartSize.
Как добраться:
- получаем объект Network, например, через документ: CivilDocument.GetPipeNetworkIds и извлекаем из этой коллекции нужную.
- у объекта Network через свойство PartsListId добираемся до ее списка элементов.
- у списка элементов - объекта типа PartsList есть метод GetPartFamilyIdsByDomain. Через него добираемся до семейств нужного типа. Также этот объект имеет методы AddPartFamilyByGuid и AddPartFamilyByDescription для добавления семейств элементов в список.
- у каждого семейства из полученной коллекции есть метод AddPartSize.

Как он работает - ни разу не пробовал. Так что, изучайте. Если получится - отпишитесь, пожалуйста ;)

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление диаметров труб
« Ответ #3 : 24-04-2014, 10:01:21 »
В существующий список элементов названия семейств добавляются нормально.

Проблема с добавление диаметров.

 Autodesk.Civil.DatabaseServices.Styles.SizeFilterRecord oSizeFilterRecord = oPartFamily.PartSizeFilter;
oSizeFilterRecord.GetParamByContextAndIndex(PartContextType.PipeInnerDiameter, 0);
oPartFamily.AddPartSize(oSizeFilterRecord);

добавляется первый диаметр в список.

1. Как добавить второй диаметр в список ?
2. Пишет что метод PartSizeFilter является устаревшим - как правильно добавить в список ?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление диаметров труб
« Ответ #4 : 25-04-2014, 11:35:28 »
1. Дык, наверное так: oSizeFilterRecord.GetParamByContextAndIndex(PartContextType.PipeInnerDiameter, 1); Был неправ.
2.  Autodesk.Civil.DatabaseServices.Styles.SizeFilterRecord oSizeFilterRecord = new PartSizeFilter(oPartFamily);
Upd: По поводу первого пункта см. код (строчки 45 и 47), из него все понятно должно быть (проверок там по минимуму, для реального использования нужно дорабатывать):
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. using Autodesk.Civil.ApplicationServices;
  7. using Autodesk.Civil.DatabaseServices;
  8. using Autodesk.Civil.DatabaseServices.Styles;
  9.  
  10. namespace CivilTest
  11. {
  12.     public class PartListEditTest
  13.     {
  14.         [CommandMethod("AddPartSizeToPartList")]
  15.         public void AddPartSizeToPartList()
  16.         {
  17.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  18.             Database db = adoc.Database;
  19.             Editor ed = adoc.Editor;
  20.             CivilDocument cdoc = CivilDocument.GetCivilDocument(db);
  21.  
  22.             ObjectIdCollection netIds = cdoc.GetPipeNetworkIds();
  23.  
  24.             object sizeVal = null;
  25.  
  26.             if (netIds.Count > 0)
  27.             {
  28.                 ObjectId netId = netIds[0];
  29.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  30.                 {
  31.                     Network net = tr.GetObject(netId, OpenMode.ForRead) as Network;
  32.  
  33.                     PartsList partsList = tr.GetObject(net.PartsListId, OpenMode.ForRead) as PartsList;
  34.  
  35.                     ObjectIdCollection pipeFamIds = partsList.GetPartFamilyIdsByDomain(DomainType.Pipe);
  36.  
  37.                     if (pipeFamIds.Count > 0)
  38.                     {
  39.                         PartFamily family = tr.GetObject(pipeFamIds[0], OpenMode.ForWrite) as PartFamily;
  40.  
  41.                         SizeFilterRecord sizeFlRec = new SizeFilterRecord(family);
  42.  
  43.                         SizeFilterField sizeFlField = sizeFlRec.GetParamByContextAndIndex(PartContextType.PipeInnerDiameter, 0);
  44.  
  45.                         sizeFlField.Value = sizeFlField.ValueList[1];
  46.  
  47.                         sizeVal = sizeFlField.Value;
  48.  
  49.                         family.AddPartSize(sizeFlRec);
  50.                     }
  51.  
  52.                     tr.Commit();
  53.                 }
  54.             }
  55.  
  56.             if (sizeVal != null) ed.WriteMessage("\nДобавлен размер: {0}", sizeVal);
  57.         }
  58.     }
  59. }
« Последнее редактирование: 25-04-2014, 15:42:17 от Загорулькин Дмитрий »

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление диаметров труб
« Ответ #5 : 27-04-2014, 14:36:25 »
Спасибо, получилось добавить в список диаметры.

Подскажите пожалуйста, а как установить добавленным  трубам стиль, правила в существующем списке элементов?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление диаметров труб
« Ответ #6 : 28-04-2014, 09:35:57 »
Вполне закономерный вопрос, вытекающий из предыдущего :)
Я сам пока таким не занимался, но программная настройка списка элементов - весьма интересная и полезная вещь.
Навскидку - как-то так это должно делаться (код не запускал):
Код - C# [Выбрать]
  1.         [CommandMethod("SetStyleAndRulesForPartSize")]
  2.         public void SetStyleAndRulesForPartSize()
  3.         {
  4.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = adoc.Database;
  6.             Editor ed = adoc.Editor;
  7.             CivilDocument cdoc = CivilDocument.GetCivilDocument(db);
  8.  
  9.             // Коллекция ID труб в документе
  10.             ObjectIdCollection netIds = cdoc.GetPipeNetworkIds();  
  11.          
  12.             // Коллекция ID стилей труб в документе
  13.             PipeStyleCollection pipeStyleIds = cdoc.Styles.PipeStyles;
  14.  
  15.             // Коллекция ID наборов правил для труб
  16.             PipeRuleSetStyleCollection pipeRuleSetIds = cdoc.Styles.PipeRuleSetStyles;
  17.  
  18.             if (netIds.Count > 0)
  19.             {
  20.                 // Берем первую сеть
  21.                 ObjectId netId = netIds[0];
  22.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  23.                 {
  24.                     Network net = tr.GetObject(netId, OpenMode.ForRead) as Network;
  25.  
  26.                     // Получаем связанный с сетью список элементов
  27.                     PartsList partsList = tr.GetObject(net.PartsListId, OpenMode.ForRead) as PartsList;
  28.  
  29.                     // Получаем коллекцию ID семейств труб в этом списке
  30.                     ObjectIdCollection pipeFamIds = partsList.GetPartFamilyIdsByDomain(DomainType.Pipe);
  31.  
  32.                     // Если семейства есть
  33.                     if (pipeFamIds.Count > 0)
  34.                     {
  35.                         // Получаем первое
  36.                         PartFamily family = tr.GetObject(pipeFamIds[0], OpenMode.ForWrite) as PartFamily;
  37.  
  38.                         // Проходим по типоразмерам в семействе
  39.                         for (int i = 0; i < family.PartSizeCount; i++)
  40.                         {
  41.                             // Текущий размер части
  42.                             PartSize partSize = tr.GetObject(family[i], OpenMode.ForWrite) as PartSize;
  43.  
  44.                             // Задаем стиль по порядковому номеру
  45.                             partSize.PartStyleId = pipeStyleIds[0];
  46.                             // Или задаем стиль по имени
  47.                             partSize.PartStyleId = pipeStyleIds["Мой стиль трубы"];
  48.  
  49.  
  50.                             // Задаем набор правил по порядковому номеру
  51.                             partSize.RulesStyleId = pipeRuleSetIds[0];
  52.                             // Или задаем набор правил по имени
  53.                             partSize.RulesStyleId = pipeRuleSetIds["Мои правила для трубы"];
  54.                         }
  55.                     }
  56.  
  57.                     tr.Commit();
  58.                 }
  59.             }            
  60.         }
« Последнее редактирование: 28-04-2014, 09:57:39 от Загорулькин Дмитрий »

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление диаметров труб
« Ответ #7 : 28-04-2014, 11:56:25 »
Спасибо большое, получилось добавить нужные диаметры с нужными стилями.

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление диаметров труб
« Ответ #8 : 10-06-2014, 11:05:12 »
Подскажите пожалуйста

Если у трубы или колодца есть дополнительное свойство - то как добраться в формируемом списке до определённого поля (дополнительного свойства, например test) чтобы задать значение?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Добавление диаметров труб
« Ответ #9 : 10-06-2014, 11:08:13 »
Не понял вопроса, уточните, пожалуйста: что такое "дополнительное свойство"?

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Добавление диаметров труб
« Ответ #10 : 10-06-2014, 11:23:54 »
http://docs.autodesk.com/CIV3D/2013/ENU/API_Reference_Guide/html/8bac057e-1d39-b8df-ca9a-11f82cf12e7e.htm

разобрался - просто можно по имени обращаться PartDataField fld = rec.GetDataFieldBy("test");