ADN Club > Civil 3D API
Программное назначение названия сети с символом вертикальной черты
Дмитрий Загорулькин:
Всем привет!
Сегодня поймал новую неприятную "особенность" Civil 3D API. Присутствует в Civil 3D 2019, в других пока не проверял. Вкратце, проблема такая: вручную, через пользовательский интерфейс в имени сети можно использовать вертикальную черту (символ |), а программно такое имя сети не задать!
Код тестовой команды:
--- Код - C# [Выбрать] ---using System.Linq;using Autodesk.AutoCAD.ApplicationServices.Core;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Runtime;using Autodesk.Civil.ApplicationServices;using Autodesk.Civil.DatabaseServices; namespace CivilTest{ public class TestNetworkNaming { [CommandMethod(nameof(SetNetworkNameTest))] public void SetNetworkNameTest() { var civilDocument = CivilApplication.ActiveDocument; var networkId = civilDocument.GetPipeNetworkIds().Cast<ObjectId>().FirstOrDefault(); if (networkId.IsValid) { SetNetworkName(networkId, "Test|Network"); } } /// <summary> /// Присвоение названия сети /// </summary> /// <param name="networkId">ObjectId сети</param> /// <param name="name">Название</param> public static void SetNetworkName(ObjectId networkId, string name) { var database = networkId.Database; var document = Application.DocumentManager.GetDocument(database); using (document.LockDocument()) using (var transaction = database.TransactionManager.StartTransaction()) { var network = transaction.GetObject(networkId, OpenMode.ForWrite, false, true) as Network; if (network != null) { try { network.Name = name; } catch (System.Exception e) { document.Editor.WriteMessage("\nException: {0}", e.Message); } } transaction.Commit(); } } }}
Результат её работы:
--- Код: ---Exception: Error: string contents for attribute 'Test|Network' contain invalid characters. The following characters are not valid in object names: <>/\":;=|,*?`
--- Конец кода ---
Видеозапись проверки с голосовыми комментариями (прошу прощения за тихий звук):
Может у кого-то есть идеи, как это попробовать обойти?
Александр Ривилис:
--- Цитата: Дмитрий Загорулькин от 21-08-2020, 14:24:22 ---Вкратце, проблема такая: вручную, через пользовательский интерфейс в имени сети можно использовать вертикальную черту (символ |), а программно такое имя сети не задать!
--- Конец цитаты ---
Честно говоря очень странно, что такое имя можно задать через пользовательский интерфейс, так как в AutoCAD есть особое назначение для этого символа - использование в именах из внешних ссылок. Скорее всего это победить нельзя. Но можно задать этот вопрос в ADN DevHelp.
Александр Ривилис:
Про ограничения метода Name класса Network ничего не сказано в документации, зато есть в описании метода Create:
http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/45fec93e-f4c7-e5fc-6112-0ce7d676cfe2.htm
Интересно, что там перечислены недопустимые символы, но "|" среди них не упоминается.
Дмитрий Загорулькин:
Да, при создании сети проверяются другие символы:
--- Код - C# [Выбрать] ---namespace Autodesk.Civil.DatabaseServices{ [Wrapper("AeccDbNetwork")] public sealed class Network : GeoEntity { public static unsafe ObjectId Create(CivilDocument document, ref string networkName) { string str1 = networkName; if (null == (object) str1) throw new ArgumentNullException(); if (str1.Trim().Length == 0) throw new ArgumentException("Key can't be blank."); string str2 = "\\\",/;?*=:"; if (networkName.IndexOfAny(str2.ToCharArray()) != -1) throw new ArgumentException("The invalid characters in Key are: '\\', '\"', ',', '/', ';', '?', '*', '=', ':'");... Я так подозреваю, что в API не стали переопределять базовый метод задания имени объекту Civil, в котором больше ограничений.
Александр Ривилис:
--- Цитата: Дмитрий Загорулькин от 21-08-2020, 15:17:45 ---Я так подозреваю, что в API не стали переопределять базовый метод задания имени объекту Civil, в котором больше ограничений.
--- Конец цитаты ---
100%
Навигация
Перейти к полной версии