ADN Club > Civil 3D API

Программное назначение названия сети с символом вертикальной черты

(1/2) > >>

Дмитрий Загорулькин:
Всем привет!
Сегодня поймал новую неприятную "особенность" 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%

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии