Как создать стиль метки для трубы?

Автор Тема: Как создать стиль метки для трубы?  (Прочитано 17476 раз)

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

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Подскажите пожалуйста

Как создать стиль метки для трубы (для того чтобы указать стиль метки при создании сети)?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как создать стиль метки для трубы?
« Ответ #1 : 14-05-2014, 15:48:52 »
Вы уверены, что хотите программно это делать? Это даже с помощью интерфейса не очень просто делается.
Для создания сети можно рассмотреть более простые варианты:
1. Брать уже созданный в шаблоне стиль меток трубы. Искать его, например, по названию. А название это хранить в настройках программы.
2. Брать первый стиль из списка - если не принципиально, какие метки должны стоять.
3. Есть подозрение, что можно создавать сеть не указывая никакой стиль меток для труб (надо проверять).

P.S. А как Вы создаете сеть, что Вам нужно стиль меток для труб?
Я вижу только один метод - Network.Create(CivilDocument, ref string). Здесь только ссылка на документ и строка для имени сети.
Добавить в эту сеть трубы - тоже никаких меток не надо. Методы Network.AddLinePipe и Network.AddCurvePipe не требуют стилей меток ни в каком виде. О чем речь тогда?

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Как создать стиль метки для трубы?
« Ответ #2 : 14-05-2014, 16:00:51 »
Эээ

1. Как программно получить список стилей метокпрофиля плана?
2. Нужно задать именно определённые стили меток для конкретных сетей.
3. Названия сетей уже создаются без указания силей меток для труб - не хватает задания стилей меток, которые надо создать.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как создать стиль метки для трубы?
« Ответ #3 : 14-05-2014, 16:09:47 »
CivilDocument.Styles.LabelStyles.PipeLabelStyles.PlanProfileLabelStyles
Только учитывайте, что у стилей из этой коллекции могут быть дочерние стили.

Кстати, если я правильно понимаю, то методом Add этой коллекции можно создать новый стиль.

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Как создать стиль метки для трубы?
« Ответ #4 : 14-05-2014, 16:33:30 »
Add создает стиль с указанным именем.

А вот как получить созданный стиль на редактирование, я что-то пока не понимаю.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как создать стиль метки для трубы?
« Ответ #5 : 14-05-2014, 16:36:42 »
Метод создает стиль и возвращает ObjectId созданного стиля ;)

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Как создать стиль метки для трубы?
« Ответ #6 : 14-05-2014, 16:57:35 »
получилось

что-то я не тот тип задал - видимо не стоит в конце рабочего дня таким заниматься :)

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Как создать стиль метки для трубы?
« Ответ #7 : 16-05-2014, 08:22:11 »
Взял пример из API Developer’s Guide - Using Property Fields in Label Style Text
newTextComponent.Text.Contents.Value = "<[Описание(CP)]>";
newTextComponent.Text.Contents.Value += "<[Inner Pipe Diameter(Umm|P2|RN|AP|GC|UN|Sn|OF)]>";
newTextComponent.Text.Contents.Value += "<[Material(CP)]>";

<[Material(CP)]>" не воспринимается как как свойство, а воспринимается как текст
<[Описание(CP)]> - воспринимается как свойство

Описание и имя отображаются нормально - а вот другие параметры не отображаются, см. скрин.
Есть какой то нюанс или пример из API Developer’s Guide  не работает?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как создать стиль метки для трубы?
« Ответ #8 : 16-05-2014, 08:50:38 »
Думаю, что причина тут в локализации. Да и в Guide может быть ошибка, не исключаю этого.
Я бы попробовал вручную создать стиль со всеми нужными параметрами а потом в отладчике, поставив точку останова в нужном месте, посмотрел бы нужные значения свойств этого стиля.

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Как создать стиль метки для трубы?
« Ответ #9 : 16-05-2014, 09:26:18 »
видео
после добавления текст метки отображается нормально, а вот  после добавления в ручную любого другого параметра появляются символу типа \u+4018

точка остановки - заданное значение - см. скрин
в командной строке автокада - text: <[Имя сети(CP)]>

в какой кодировке должен быть задан  текст метки через API?
« Последнее редактирование: 16-05-2014, 09:49:57 от Doublefish »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как создать стиль метки для трубы?
« Ответ #10 : 16-05-2014, 09:55:49 »
А что за шрифт применяется? У меня нормально отображается (AutoCAD Civil 3D 2014 RUS без SP):
https://chronicle.autodesk.com/main/details/1106181b-51d3-45a7-9644-14bed2c42502

Никакую особую кодировку задавать не надо, собственно это и демонстрирует Ваш скрин с точкой останова.

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Как создать стиль метки для трубы?
« Ответ #11 : 16-05-2014, 10:04:24 »
Повторюсь - такое происходит после newTextComponent.Text.Contents.Value = "<[Inner Pipe Diameter(Umm|P2|RN|AP|GC|UN|Sn|OF)]>";

В ручную мышкой я и сам вижу что метки отображаются. Как добавить текст метки программно чтобы метка воспринималась как метка а не как текст?

newTextComponent.Text.Contents.Value = "<[Описание(CP)]>";  - работает
newTextComponent.Text.Contents.Value = "<[Material(CP)]>";  - не работает
newTextComponent.Text.Contents.Value = "<[Inner Pipe Diameter(Umm|P2|RN|AP|GC|UN|Sn|OF)]>"; - не работает

???

если в ручную в окне редактора добавить <[Inner Pipe Diameter(Umm|P2|RN|AP|GC|UN|Sn|OF)]> - то начинает работать.

так как же добавить метку диаметра и материала программно ? при этом же имя трубы и описание добавляется и отображается - код же один и тот же!
« Последнее редактирование: 16-05-2014, 10:42:37 от Doublefish »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как создать стиль метки для трубы?
« Ответ #12 : 16-05-2014, 10:46:17 »
Странно, конечно. В теории должно работать, на практике я пока это не использовал. Если поделитесь кодом, с помощью которого добираетесь до свойств стиля, могу попробовать покопаться и поискать причину.

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: Как создать стиль метки для трубы?
« Ответ #13 : 16-05-2014, 11:55:33 »
[CommandMethod("LGIPPipeTestlabeppipeV")]
        public static void lgipaddlabelpipeVTest()
        {
            string sStyleName = "testlabel";
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Autodesk.Civil.ApplicationServices.CivilDocument CivilDoc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;

            using (Autodesk.AutoCAD.ApplicationServices.DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
            {
                using (Transaction tr = acDoc.TransactionManager.StartTransaction())
                {
                    ObjectId oPipeStyleId;
                    oPipeStyleId = CivilDoc.Styles.LabelStyles.PipeLabelStyles.PlanProfileLabelStyles.Add(sStyleName);
                    LabelStyle oPipeLabel = oPipeStyleId.GetObject(OpenMode.ForWrite) as LabelStyle;
                    oPipeLabel.Description = "22";
                    foreach (ObjectId id in oPipeLabel.GetComponents(LabelStyleComponentType.Text))
                    {
                        ObjectIdCollection lineCompCol = oPipeLabel.GetComponents(LabelStyleComponentType.Text);
                        var newTextComponent = tr.GetObject(id, OpenMode.ForWrite) as LabelStyleTextComponent;
                        newTextComponent.General.Visible.Value = true;
                        newTextComponent.Text.Height.Value = 0.005;
                        newTextComponent.Text.Color.Value = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 5);
                        newTextComponent.Text.Contents.Value = "<[Material(CP)]>";
                    }
                    ed.WriteMessage("Метка трубы с именем \"" + sStyleName + "\" успешно добавлена.\n");
                    tr.Commit();
                }
            }
        }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как создать стиль метки для трубы?
« Ответ #14 : 16-05-2014, 15:33:56 »
Да, это, похоже, баг. Проверил в русской и английской версиях, а также попробовал с помощью COM - везде вместо подстановки значения пишет имя поля. Тут даже не API кривое, а где-то в ядре программы ошибка.
если в ручную в окне редактора добавить <[Inner Pipe Diameter(Umm|P2|RN|AP|GC|UN|Sn|OF)]> - то начинает работать.
Это если выбрать этот параметр из списка и нажать стрелочку. Если же просто взять и вставить эту формулу в значение - тоже не обработает. Получается, что API отрабатывает как полагается, а вот внутренние механизмы глючат.
https://chronicle.autodesk.com/main/details/c5735c44-e2c6-4928-8427-df43e9613d54