Сообщество программистов Autodesk в СНГ
ADN Club => Civil 3D API => Тема начата: Doublefish от 14-05-2014, 15:35:17
-
Подскажите пожалуйста
Как создать стиль метки для трубы (для того чтобы указать стиль метки при создании сети)?
-
Вы уверены, что хотите программно это делать? Это даже с помощью интерфейса не очень просто делается.
Для создания сети можно рассмотреть более простые варианты:
1. Брать уже созданный в шаблоне стиль меток трубы. Искать его, например, по названию. А название это хранить в настройках программы.
2. Брать первый стиль из списка - если не принципиально, какие метки должны стоять.
3. Есть подозрение, что можно создавать сеть не указывая никакой стиль меток для труб (надо проверять).
P.S. А как Вы создаете сеть, что Вам нужно стиль меток для труб?
Я вижу только один метод - Network.Create(CivilDocument, ref string). Здесь только ссылка на документ и строка для имени сети.
Добавить в эту сеть трубы - тоже никаких меток не надо. Методы Network.AddLinePipe и Network.AddCurvePipe не требуют стилей меток ни в каком виде. О чем речь тогда?
-
Эээ
1. Как программно получить список стилей метокпрофиля плана?
2. Нужно задать именно определённые стили меток для конкретных сетей.
3. Названия сетей уже создаются без указания силей меток для труб - не хватает задания стилей меток, которые надо создать.
-
CivilDocument.Styles.LabelStyles.PipeLabelStyles.PlanProfileLabelStyles
Только учитывайте, что у стилей из этой коллекции могут быть дочерние стили.
Кстати, если я правильно понимаю, то методом Add этой коллекции можно создать новый стиль.
-
Add создает стиль с указанным именем.
А вот как получить созданный стиль на редактирование, я что-то пока не понимаю.
-
Метод создает стиль и возвращает ObjectId созданного стиля ;)
-
получилось
что-то я не тот тип задал - видимо не стоит в конце рабочего дня таким заниматься :)
-
Взял пример из 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 не работает?
-
Думаю, что причина тут в локализации. Да и в Guide может быть ошибка, не исключаю этого.
Я бы попробовал вручную создать стиль со всеми нужными параметрами а потом в отладчике, поставив точку останова в нужном месте, посмотрел бы нужные значения свойств этого стиля.
-
видео (http://screencast.com/t/tqvsjxiMXmB)
после добавления текст метки отображается нормально, а вот после добавления в ручную любого другого параметра появляются символу типа \u+4018
точка остановки - заданное значение - см. скрин
в командной строке автокада - text: <[Имя сети(CP)]>
в какой кодировке должен быть задан текст метки через API?
-
А что за шрифт применяется? У меня нормально отображается (AutoCAD Civil 3D 2014 RUS без SP):
https://chronicle.autodesk.com/main/details/1106181b-51d3-45a7-9644-14bed2c42502
Никакую особую кодировку задавать не надо, собственно это и демонстрирует Ваш скрин с точкой останова.
-
Повторюсь - такое происходит после 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)]> - то начинает работать.
так как же добавить метку диаметра и материала программно ? при этом же имя трубы и описание добавляется и отображается - код же один и тот же!
-
Странно, конечно. В теории должно работать, на практике я пока это не использовал. Если поделитесь кодом, с помощью которого добираетесь до свойств стиля, могу попробовать покопаться и поискать причину.
-
[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();
}
}
}
-
Да, это, похоже, баг. Проверил в русской и английской версиях, а также попробовал с помощью 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
-
Как обойти данную проблему?
Может быть можно как то скопировать из другого чертежа стили меток?
-
Если сильно нужно - можно попробовать в ADN задать вопрос по поводу этой проблемы. С Вас тогда полный текст кода, позволяющий воспроизвести проблему (включая все using и один командный метод для запуска кода).
Вообще, работа в Civil 3D подразумевает использование готового шаблона для создания чертежа, в котором уже настроены вручную все нужные стили. Если в уже существующем чертеже не хватает каких-то стилей - есть довольно удобный инструмент, позволяющий пользователю самостоятельно перенести нужные стили из другого чертежа. Не знаю, зачем Вам понадобилось создавать стили программно...
Для программного копирования стилей между чертежами можно воспользоваться методом ExportTo объекта StyleBase (родительского объекта любого стиля).
-
Отправил запрос через подписку - Technical Support.
-
Тоже вариант, может подскажут чего дельного.
-
В результате следующий ответ:
Not supported. The comp.Text.Contents.Value does not support the format like "<[Material(CP)]>", you should set a fixed string to it.
-
Одной фразой убили всю идею программного создания стиля метки.
-
А есть примерчик копирования стиля в текущий чертеж из другого dwg с помощью ExportTo ?
-
У меня нет - никогда этим не занимался. Как я уже говорил, стандартные инструменты с этим сами прекрасно справляются. :)
-
Как обойти данную проблему?
Сегодня тоже напоролся на эту проблему. Весьма досадный момент, конечно. Но обнаружился частичный обходной маневр: если создать выражение из нужного параметра, то его стиль метки нормально воспринимает. Конечно, не для всего это подойдет - материал в выражение никак не засунуть...