Скопировать стиль "пересечки"

Автор Тема: Скопировать стиль "пересечки"  (Прочитано 11468 раз)

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

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Стандартная функция копирования свойств и передача их целевому объекту
для специальных объектов, таких как метка "пересечки" не работает.

Есть ли какая другая команда копирования стиля отображения "пересечки"?
Или нужно прибегнуть к программированию на AutoCAD API Civil

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #1 : 16-04-2019, 10:29:40 »
Классы объектов места пересечения в профиле

У сечения сети в виде эллипса:
AeccDbGraphProfileNetworkPart

У метки с текстом:
AeccDbCrossingPipeProfileLabel

 

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Скопировать стиль "пересечки"
« Ответ #2 : 16-04-2019, 12:30:14 »
Или нужно прибегнуть к программированию на AutoCAD API Civil
Скорее всего, да. С меткой должно получится. Берётся Id стиля метки из образца и назначается выбранной метке. Код будет довольно простым.
А вот с самой трубой могут быть проблемы. Зависит от того, что требуется сделать. Если просто изменить стиль на новый - никаких проблем и сложностей, делается аналогично метке. А вот если надо переопределить стиль трубы на отдельном виде профиля - то программно это сделать не получится.
Впрочем, можно попробовать рекомендацию отсюда: http://adn-cis.org/forum/index.php?topic=8702.0

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #3 : 16-04-2019, 14:54:43 »
А какой класс у элемента AeccDbGraphProfileNetworkPart?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Скопировать стиль "пересечки"
« Ответ #4 : 16-04-2019, 16:05:50 »
Алексей, я конечно же, мог бы ответить. Но это будет очень недальновидно с моей стороны. Я рекомендую воспользоваться утилитой MGDDBG, либо открыть этот объект и посмотреть что в нём в отладчике.

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #5 : 16-04-2019, 16:22:06 »
Алексей, я конечно же, мог бы ответить. Но это будет очень недальновидно с моей стороны. Я рекомендую воспользоваться утилитой MGDDBG, либо открыть этот объект и посмотреть что в нём в отладчике.
А все выяснил это класса Autodesk.Civil.DatabaseServices.Label
           

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #6 : 16-04-2019, 16:26:32 »
Мне хотелось бы сделать так
1) Пользователь выбирает метку "пересечки" в профиле как источник копирования ее стиля
2) Далее указывает на объект Autodesk.Civil.DatabaseServices.ProfileViewPart
    (это эллипс, как правило показывающий сечение трубы)
    И для этого эллипса создается новая метка с исходным стилем, который был выбран в п. 1)
Возможно ли такое сделать с помощью API?

Т.е. подобно тому как это делает команда ADDNETWORKPARTPROFILELABEL
Только эта команда заставляет указать нужные параметры в диалоговом окне
А мне нужно чтобы стиль метки был взят из источника метки, которую укажет пользователь.

 

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Скопировать стиль "пересечки"
« Ответ #7 : 16-04-2019, 17:22:39 »
А какой класс у элемента AeccDbGraphProfileNetworkPart?
А все выяснил это класса Autodesk.Civil.DatabaseServices.Label
Ничего подобного! Это другой объект. Видимо, промахнулся при выборе.
Мне хотелось бы сделать так
1) Пользователь выбирает метку "пересечки" в профиле как источник копирования ее стиля
2) Далее указывает на объект Autodesk.Civil.DatabaseServices.ProfileViewPart
    (это эллипс, как правило показывающий сечение трубы)
    И для этого эллипса создается новая метка с исходным стилем, который был выбран в п. 1)
Возможно ли такое сделать с помощью API?

Т.е. подобно тому как это делает команда ADDNETWORKPARTPROFILELABEL
Только эта команда заставляет указать нужные параметры в диалоговом окне
А мне нужно чтобы стиль метки был взят из источника метки, которую укажет пользователь.
Когда я последний раз изучал такую возможность, оказалось, что в API нет никаких инструментов для работы с типом метки "метка пересекающей трубы на виде профиля". Но это было пару версий назад, сейчас, возможно, что-то изменилось. Как минимум, была добавлена отдельная коллекция для стилей этих меток: http://adn-cis.org/forum/index.php?topic=8887.0. Но какого-то отдельного класса для самого типа метки я при беглом просмотре документации 2019 версии не нашёл. Так что, есть шанс, что пока что такую метку программно не создать.

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #8 : 16-04-2019, 17:26:36 »
Я сделал так.
Стиль метки копируется
Мне бы конечно еще бы сделать копирования PrfileID
(чтобы отметка профиля лотка трубы выводилась в профильной таблице)

Код - C# [Выбрать]
  1.         using CIV_APS = Autodesk.Civil.ApplicationServices;
  2.         using CIV_DBS = Autodesk.Civil.DatabaseServices;
  3.         using CIV_RTM = Autodesk.Civil.Runtime;
  4.        // Команда копирования стиля метки
  5.         [CAD_RTM.CommandMethod("PSM_CIVIL_COPY_STYLE")]
  6.         public void COMM_SET_STYLE()
  7.         {
  8.             CAD_DBS.Entity ent = null;
  9.             bool ret = false;
  10.             acad_Func.get_ent("Укажите элемент, метку-источник", out ret, out ent);
  11.             if (!ret) return;
  12.             if (ent == null) return;
  13.             if (!(ent is CIV_DBS.Label))
  14.                 return;
  15.             CAD_APS.Document doc = CAD_APS.Application.DocumentManager.MdiActiveDocument;
  16.             CAD_DBS.Database db = doc.Database;
  17.             // В бесконечном цикле присваиваем стили меткам, пока не надоест
  18.             while (true)
  19.             {
  20.                 CAD_DBS.Entity ent1 = null;
  21.                 bool ret1 = false;
  22.                 acad_Func.get_ent("Укажите элемент метку-приемник", out ret1, out ent1);
  23.                 if (!ret1) return;
  24.                 if (ent1 == null) return;
  25.                 if (ent1 is CIV_DBS.Label)
  26.                 {
  27.                     using (doc.LockDocument())
  28.                     {
  29.                         using (CAD_DBS.Transaction tr = db.TransactionManager.StartTransaction())
  30.                         {
  31.                             var obj = tr.GetObject(ent1.ObjectId, CAD_DBS.OpenMode.ForWrite);
  32.                             if (obj != null)
  33.                             {
  34.                                 (obj as CIV_DBS.Label).StyleId = (ent as CIV_DBS.Label).StyleId;
  35.                             }
  36.                             tr.Commit();
  37.                         }
  38.                     }
  39.                 }
  40.             }
  41.         }
  42.  
  43.         public static CAD_DBS.ObjectId get_ent(string msg,
  44.                                                out bool ret,
  45.                                                out CAD_DBS.Entity ent)
  46.         {
  47.             ret = false;
  48.             CAD_DBS.ObjectId id = new CAD_DBS.ObjectId();
  49.             CAD_DBS.Database db = CAD_APS.Application.DocumentManager.MdiActiveDocument.Database;
  50.             ent = null;
  51.             using (CAD_DBS.Transaction trans = db.TransactionManager.StartTransaction())
  52.             {
  53.                 try
  54.                 {
  55.                     CAD_EDI.PromptEntityOptions entityOpts = new CAD_EDI.PromptEntityOptions("\n" + msg);
  56.                     CAD_EDI.PromptEntityResult entityRes = CAD_APS.Application.DocumentManager.MdiActiveDocument.Editor.GetEntity(entityOpts);
  57.                     CAD_DBS.Entity entObject = (trans.GetObject(entityRes.ObjectId, CAD_DBS.OpenMode.ForRead) as CAD_DBS.Entity);
  58.                     id = entObject.ObjectId;
  59.                     ent = entObject;
  60.                     trans.Commit();
  61.                     ret = true;
  62.                 }
  63.                 catch
  64.                 {
  65.                 }
  66.             }
  67.             return id;
  68.         }

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #9 : 16-04-2019, 17:44:08 »
Ничего подобного! Это другой объект. Видимо, промахнулся при выборе.

Но может Label родительский класс,
Но метод ToString() показал мне что это Civil.DataBAseServices.Label

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #10 : 16-04-2019, 17:52:54 »
Прикрепляю картинку того что хочу в итоге


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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Скопировать стиль "пересечки"
« Ответ #11 : 16-04-2019, 18:19:09 »
Интересное применение метки пересекающей трубы! Такого я ещё не встречал.
А какие настройки у верхней строки данных? Не понимаю как туда попало значение "124.11" на предыдущей пересечке. Или оно не относится к строке данных? Поди это всё та же метка пересекающей трубы?

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #12 : 16-04-2019, 18:51:45 »
Не понимаю как туда попало значение "124.11" на предыдущей пересечке. Или оно не относится к строке данных? Поди это всё та же метка пересекающей трубы?
Да, это отметка лотка проектируемой трубы.
 

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Скопировать стиль "пересечки"
« Ответ #13 : 17-04-2019, 09:50:38 »
Нашел в диалоге свойств метки
Городская канализация пересечение::...
Когда назначаешь нужный профиль лотка, то текст " ? ? ? " заменяется на нормальное число.
Значение этого свойства "K2-OC2_ветка_84_лоток" - это имя объекта Autodesk.Civil.DatabaseService.Profile
Есть ли в AutoCAD Civil API метод, который назначит эту поверхность?



Пробовал так:
Код - C# [Выбрать]
  1.  
  2. using CIV_DBS = Autodesk.Civil.DatabaseServices;
  3. (obj as CIV_DBS.Label).SetBaseProfile(...)
это что-то друге не помогло.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Re: Скопировать стиль "пересечки"
« Ответ #14 : 17-04-2019, 10:51:33 »
Похоже, что там текст-ссылка в метке.
это имя объекта Autodesk.Civil.DatabaseService.Profile
Есть ли в AutoCAD Civil API метод, который назначит эту поверхность?
Это не поверхность.
Возможно и есть, но тут какая-то хитрая метка, с ходу и не понять как она сделана. Пример с такой меткой выложить можете?