Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Doublefish от 14-05-2014, 15:35:17

Название: Как создать стиль метки для трубы?
Отправлено: Doublefish от 14-05-2014, 15:35:17
Подскажите пожалуйста

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

P.S. А как Вы создаете сеть, что Вам нужно стиль меток для труб?
Я вижу только один метод - Network.Create(CivilDocument, ref string). Здесь только ссылка на документ и строка для имени сети.
Добавить в эту сеть трубы - тоже никаких меток не надо. Методы Network.AddLinePipe и Network.AddCurvePipe не требуют стилей меток ни в каком виде. О чем речь тогда?
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 14-05-2014, 16:00:51
Эээ

1. Как программно получить список стилей метокпрофиля плана?
2. Нужно задать именно определённые стили меток для конкретных сетей.
3. Названия сетей уже создаются без указания силей меток для труб - не хватает задания стилей меток, которые надо создать.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 14-05-2014, 16:09:47
CivilDocument.Styles.LabelStyles.PipeLabelStyles.PlanProfileLabelStyles
Только учитывайте, что у стилей из этой коллекции могут быть дочерние стили.

Кстати, если я правильно понимаю, то методом Add этой коллекции можно создать новый стиль.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 14-05-2014, 16:33:30
Add создает стиль с указанным именем.

А вот как получить созданный стиль на редактирование, я что-то пока не понимаю.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 14-05-2014, 16:36:42
Метод создает стиль и возвращает ObjectId созданного стиля ;)
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 14-05-2014, 16:57:35
получилось

что-то я не тот тип задал - видимо не стоит в конце рабочего дня таким заниматься :)
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 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  не работает?
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 16-05-2014, 08:50:38
Думаю, что причина тут в локализации. Да и в Guide может быть ошибка, не исключаю этого.
Я бы попробовал вручную создать стиль со всеми нужными параметрами а потом в отладчике, поставив точку останова в нужном месте, посмотрел бы нужные значения свойств этого стиля.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 16-05-2014, 09:26:18
видео (http://screencast.com/t/tqvsjxiMXmB)
после добавления текст метки отображается нормально, а вот  после добавления в ручную любого другого параметра появляются символу типа \u+4018

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

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

Никакую особую кодировку задавать не надо, собственно это и демонстрирует Ваш скрин с точкой останова.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 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)]> - то начинает работать.

так как же добавить метку диаметра и материала программно ? при этом же имя трубы и описание добавляется и отображается - код же один и тот же!
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 16-05-2014, 10:46:17
Странно, конечно. В теории должно работать, на практике я пока это не использовал. Если поделитесь кодом, с помощью которого добираетесь до свойств стиля, могу попробовать покопаться и поискать причину.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 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();
                }
            }
        }
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 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
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 23-05-2014, 10:36:54
Как обойти данную проблему?

Может быть можно как то скопировать из другого чертежа стили меток?
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 23-05-2014, 11:18:45
Если сильно нужно - можно попробовать в ADN задать вопрос по поводу этой проблемы. С Вас тогда полный текст кода, позволяющий воспроизвести проблему (включая все using и один командный метод для запуска кода).

Вообще, работа в Civil 3D подразумевает использование готового шаблона для создания чертежа, в котором уже настроены вручную все нужные стили. Если в уже существующем чертеже не хватает каких-то стилей - есть довольно удобный инструмент, позволяющий пользователю самостоятельно перенести нужные стили из другого чертежа. Не знаю, зачем Вам понадобилось создавать стили программно...

Для программного копирования стилей между чертежами можно воспользоваться методом ExportTo объекта StyleBase (родительского объекта любого стиля).
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 28-05-2014, 13:27:59
Отправил запрос через подписку - Technical Support.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 28-05-2014, 13:35:14
Тоже вариант, может подскажут чего дельного.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 02-07-2014, 10:06:40
В результате следующий ответ:
Not supported. The comp.Text.Contents.Value does not support the format like "<[Material(CP)]>", you should set a fixed string to it.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 02-07-2014, 11:31:53
Одной фразой убили всю идею программного создания стиля метки.
Название: Re: Как создать стиль метки для трубы?
Отправлено: Doublefish от 02-07-2014, 12:02:38
А есть примерчик копирования стиля в текущий чертеж из другого dwg с помощью ExportTo ?
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 02-07-2014, 12:08:27
У меня нет - никогда этим не занимался. Как я уже говорил, стандартные инструменты с этим сами прекрасно справляются. :)
Название: Re: Как создать стиль метки для трубы?
Отправлено: Дмитрий Загорулькин от 22-10-2014, 17:57:44
Как обойти данную проблему?
Сегодня тоже напоролся на эту проблему. Весьма досадный момент, конечно. Но обнаружился частичный обходной маневр: если создать выражение из нужного параметра, то его стиль метки нормально воспринимает. Конечно, не для всего это подойдет - материал в выражение никак не засунуть...