Где можно задать дополнительный параметр для сети?

Автор Тема: Где можно задать дополнительный параметр для сети?  (Прочитано 8865 раз)

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

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Добрый день

Подскажите пожалуйста - где можно задать дополнительный параметр для сети?

например есть имя сети и описание - возник вопрос где в чертеже задать тип для этой сети (водопровод или канализация) кроме как в имени и описании?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Возникает вопрос: зачем? Есть же стили, настроить их нужным образом и все.
А так, каких-то дополнительных свойств для этого нет. Разве что в чертеже информацию можно сохранить в расширенных данных или в словарях, но это и в голом автокаде можно сделать.

Оффлайн Vladimir811

  • ADN OPEN
  • Сообщений: 3
  • Карма: 1
Если еще актуально. Тоже появилась такая необходимость, информация со справки, которая помогла решить вопрос:

Назначение дополнительных свойств для размера элемента

Один из способов настройки элемента заключается в добавление в размер элемента свойства. В следующем примере свойство создается путем редактирования файла конфигурации параметров элемента.

Назначение дополнительных свойств для размера элемента

1. Перейдите в папку с файлом XML конфигурации параметров элемента (AeccPartParamCfg.xml). По умолчанию файл находится в папке: C:\Documents and Settings\All Users\Application Data\Autodesk\AutoCAD Civil 3D <версия>\rus\Pipes Catalog\Aecc Shared Content.
2. Откройте файл и щелкните правой кнопкой мыши  "Просмотр HTML-кода".
3. Перейдите к разделу <AeccParamDeclaration>. В качестве образца дополнительного свойства рассматривается "Коэффициент Хазен-Вильямса", используемый при анализе расходов. Текст соответствующей записи: <AeccDfParameter name="ACHW" desc="Hazen Williams Coefficient" context="FlowAnalysis_HazenWilliams" index="0" datatype="Float" usage="Double_General" unit="" visible="True" internal="True"/>.
4. Скопируйте существующее дополнительное свойство и внесите необходимые изменения для создания нового свойства.
5. В разделе <AeccParamUsage> соответствующая запись для образца, упоминаемого в шаге 3, — <AeccOptParam context="FlowAnalysis_HazenWilliams"/>. Скопируйте запись и внесите в нее необходимые изменения для создания новой записи для пользовательского свойства.
6. Сохраните и закройте файл xml.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, я уже об этом писал: http://adn-cis.org/forum/index.php?topic=811.0
Только в этой теме речь о дополнительном свойстве не отдельного элемента, а сети.

Оффлайн Vladimir811

  • ADN OPEN
  • Сообщений: 3
  • Карма: 1
Да, действительно, невнимательно прочитал.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
В дополнение к своему второму сообщению в этой теме:
Если сеть передается в другой чертеж с помощью быстрых ссылок (Shortcuts), то дополнительные данные для сети, сохраненные в XData или ExtensionDictionary, передаются в другой чертеж вместе с сетью. Меня лично это очень порадовало :)
P.S. В случае с ExtensionDictionary передаются только Xrecord верхнего уровня, вложенные словари не передаются независимо от состояния свойства DBDictionary.TreatElementsAsHard

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Обнаружился очень неприятный момент при использовании ExtensionDictionary сети-ссылки в версиях 2017 и 2018. Как это проявляется:
В версии 2017:
При вставке сети-быстрой ссылки в чертёж всё в порядке - данные, которые содержатся в ExtensionDictionary переносятся корректно. Но, после выполнения операции синхронизации, записи словаря из сети-источника не заменяют уже имеющиеся записи, а записываются в словарь рядышком, но уже с названиями "*A<номер>". Соответственно, после каждой синхронизации, записи словаря плодятся. Под "нормальными" именами в словаре содержатся только те записи, которые были на момент вставки сети в чертёж. Получается, что обновлённые данные обрабатывающая программа уже не получит.
В версии 2018:
Тут всё гораздо печальнее. При вставке, опять же, проблем никаких. Но после первой же синхронизации ExtensionDictionary просто удаляется! Запись о том, что у объекта-сети есть ExtensionDictionary сохраняется, но сам словарь из базы чертежа удаляется.

Эта проблема - только с ExtensionDictionary, XData передаётся корректно и при синхронизации корректно обновляется.
Для тестов использовался вот такой код:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.Civil.DatabaseServices;
  6. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  7.  
  8. namespace C3dTest
  9. {
  10.     public class TestNetSCatsExtData
  11.     {
  12.         [CommandMethod("AddNetExtData")]
  13.         public void AddData()
  14.         {
  15.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  16.  
  17.             PromptEntityOptions entOpts = new PromptEntityOptions("\nSelect part: ");
  18.             entOpts.SetRejectMessage("\nThis is not part!");
  19.             entOpts.AddAllowedClass(typeof(Part), false);
  20.             PromptEntityResult entRes = ed.GetEntity(entOpts);            
  21.             if (entRes.Status != PromptStatus.OK) return;
  22.  
  23.             PromptResult stringRes = ed.GetString("\nString value: ");
  24.             if (stringRes.Status != PromptStatus.OK) return;
  25.  
  26.             PromptDoubleResult doubleRes = ed.GetDouble("\nDouble value: ");
  27.             if (doubleRes.Status != PromptStatus.OK) return;
  28.  
  29.             ObjectId netId;
  30.             using (Part part = entRes.ObjectId.Open(OpenMode.ForRead) as Part)
  31.             {
  32.                 netId = part.NetworkId;
  33.             }
  34.  
  35.             AddCustomData
  36.                 (netId,
  37.                 "CustomData",
  38.                 new TypedValue((int)DxfCode.Text, stringRes.StringResult),
  39.                 new TypedValue((int)DxfCode.Real, doubleRes.Value));
  40.  
  41.             AddXData
  42.                 (netId, "CustomData",
  43.                 new TypedValue((int)DxfCode.ExtendedDataAsciiString, stringRes.StringResult),
  44.                 new TypedValue((int)DxfCode.ExtendedDataReal, doubleRes.Value));
  45.         }
  46.  
  47.         static void AddCustomData(ObjectId id, string key, params TypedValue[] values)
  48.         {
  49.             Database db = id.Database;
  50.             using (Transaction tr = db.TransactionManager.StartTransaction())
  51.             {
  52.                 AcDb.DBObject obj = tr.GetObject(id, OpenMode.ForRead);
  53.                 ObjectId dictId = obj.ExtensionDictionary;
  54.                 if (dictId == ObjectId.Null)
  55.                 {
  56.                     obj.UpgradeOpen();
  57.                     obj.CreateExtensionDictionary();
  58.                     dictId = obj.ExtensionDictionary;
  59.                 }
  60.                 DBDictionary xdict = (DBDictionary)tr.GetObject(dictId, OpenMode.ForRead);
  61.                 Xrecord xrec;
  62.                 if (xdict.Contains(key))
  63.                 {
  64.                     xrec = (Xrecord)tr.GetObject((ObjectId)xdict[key], OpenMode.ForWrite);
  65.                 }
  66.                 else
  67.                 {
  68.                     xdict.UpgradeOpen();
  69.                     xrec = new Xrecord();
  70.                     xdict.SetAt(key, xrec);
  71.                     tr.AddNewlyCreatedDBObject(xrec, true);
  72.                 }
  73.                 xrec.Data = new ResultBuffer(values);
  74.                 tr.Commit();
  75.             }
  76.         }
  77.  
  78.         static void AddXData(ObjectId id, string appName, params TypedValue[] values)
  79.         {
  80.             Database db = id.Database;          
  81.             using (Transaction tr = db.TransactionManager.StartTransaction())
  82.             {
  83.                 AcDb.DBObject obj = tr.GetObject(id, OpenMode.ForWrite);
  84.                 AddRegAppTableRecord(db, appName);
  85.                 using (ResultBuffer rb = new ResultBuffer(new TypedValue(1001, appName)))
  86.                 {
  87.                     foreach (TypedValue tVal in values)
  88.                     {
  89.                         rb.Add(tVal);
  90.                     }
  91.                     obj.XData = rb;
  92.                 }
  93.                 tr.Commit();
  94.             }
  95.         }
  96.  
  97.         static void AddRegAppTableRecord(Database db, string regAppName)
  98.         {            
  99.             using (Transaction tr = db.TransactionManager.StartTransaction())
  100.             {
  101.                 RegAppTable table = tr.GetObject
  102.                     (db.RegAppTableId, OpenMode.ForRead) as RegAppTable;
  103.                 if (!table.Has(regAppName))
  104.                 {
  105.                     table.UpgradeOpen();
  106.                     RegAppTableRecord record = new RegAppTableRecord();
  107.                     record.Name = regAppName;
  108.                     table.Add(record);
  109.                     tr.AddNewlyCreatedDBObject(record, true);
  110.                 }
  111.                 tr.Commit();
  112.             }
  113.         }
  114.     }
  115. }
  116.  
Видеозапись этого безобразия:

Если кто желает перепроверить - чертежи для тестов приложил.
« Последнее редактирование: 01-12-2017, 12:23:42 от Дмитрий Загорулькин »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Обнаружился очень неприятный момент при использовании ExtensionDictionary сети-ссылки в версиях 2017 и 2018. Как это проявляется:
В версии 2017:
При вставке сети-быстрой ссылки в чертёж всё в порядке - данные, которые содержатся в ExtensionDictionary переносятся корректно. Но, после выполнения операции синхронизации, записи словаря из сети-источника не заменяют уже имеющиеся записи, а записываются в словарь рядышком, но уже с названиями "*A<номер>". Соответственно, после каждой синхронизации, записи словаря плодятся. Под "нормальными" именами в словаре содержатся только те записи, которые были на момент вставки сети в чертёж. Получается, что обновлённые данные обрабатывающая программа уже не получит.
В версии 2018:
Тут всё гораздо печальнее. При вставке, опять же, проблем никаких. Но после первой же синхронизации ExtensionDictionary просто удаляется! Запись о том, что у объекта-сети есть ExtensionDictionary сохраняется, но сам словарь из базы чертежа удаляется.

Эта проблема - только с ExtensionDictionary, XData передаётся корректно и при синхронизации корректно обновляется.
Сегодня изучал список изменений в обновлениях для Civil 3D 2018 и увидел там такой пункт:
Цитировать
The following issues have been resolved in the Autodesk AutoCAD Civil 3D 2018.3 Update:

API

   <...>
    Fixed an issue that prevented getting the XRecord data of a data referenced object in the host drawing after synchronizing data references.
Так что, похоже, что проблему исправили!