Доступ к пользовательским свойствам чертежа

Автор Тема: Доступ к пользовательским свойствам чертежа  (Прочитано 8234 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Кто-нибудь из форумчан пользуется custom properties документа? См. скриншот. Как к ним получить доступ из кода. В Help'e про них я не нашел - может не там искал?


Отмечено как Решение Александр Ривилис 22-07-2019, 21:44:34

Оффлайн pavka_97

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
На запись все понял. А как их считывать обратно? Вопрос конечно диковатый но написанный мной метод вроде бы верен, но вызывает исключение. В чем причина?
Код - C# [Выбрать]
  1. public static string GetCustomProperty(this Database db, string key)
  2.         {
  3.             DatabaseSummaryInfoBuilder sumInfo = new DatabaseSummaryInfoBuilder(db.SummaryInfo);
  4.             IDictionary custProps = sumInfo.CustomPropertyTable;
  5.             return (string)custProps[key];
  6.         }


Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Я могу ошибаться, но может не стоит использовать интерфейс для объявления custProps... приблизительно на это и ругается ошибка, что ссылка не на инстанс...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Atomohod,
Посмотри этот код. Я его проверил:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(GetCustProps.MyCommands))]
  10.  
  11. namespace GetCustProps
  12. {
  13.   public static class MyCommands
  14.   {
  15.  
  16.     [CommandMethod("GetCustProp")]
  17.     public static void GetCustProp()
  18.     {
  19.       Document doc = Application.DocumentManager.MdiActiveDocument;
  20.       if (doc == null)
  21.         return;
  22.  
  23.       Editor ed = doc.Editor;
  24.       PromptResult rs = ed.GetString("\nУкажите ключ: ");
  25.       if (rs.Status != PromptStatus.OK)
  26.         return;
  27.       string val = doc.Database.GetCustomProperty(rs.StringResult);
  28.       ed.WriteMessage("\nval = {0}", val);
  29.  
  30.     }
  31.     public static string GetCustomProperty(this Database db, string key)
  32.     {
  33.       DatabaseSummaryInfoBuilder sumInfo = new DatabaseSummaryInfoBuilder(db.SummaryInfo);
  34.       var custProps = sumInfo.CustomPropertyTable;
  35.       if (custProps.Contains(key))
  36.         return (string)custProps[key];
  37.       else
  38.         return null;
  39.     }
  40.   }
  41. }

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Посмотри этот код. Я его проверил:
Спасибо, это спасло. Но почему? Замена интерфейса на var и if (custProps.Contains(key)) так сильно влияют на код? Похоже я чего-то еще не знаю. Можно как-нибудь разжевать мне в чем тут прикол?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но почему? Замена интерфейса на var и if (custProps.Contains(key)) так сильно влияют на код?
Замена на var позволяет не думать о точном типе значения (IDictionary - это только интерфейс). А проверка if (custProps.Contains(key)) позволяет избежать исключения, если в таблице нет записи с ключом key.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
если в таблице нет записи с ключом key.
в этом то и непонятка - значение у меня гарантированно было и в отладчике я его видел в DatabaseSummaryInfoBuilder sumInfo = new DatabaseSummaryInfoBuilder(db.SummaryInfo); но потом хватал ошибку.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Atomohod,
Кстати, можно и так:
Код - C# [Выбрать]
  1. public static string GetCustomProperty(this Database db, string key)
  2. {
  3.   DatabaseSummaryInfoBuilder sumInfo = new DatabaseSummaryInfoBuilder(db.SummaryInfo);
  4.   if (sumInfo.CustomPropertyTable.Contains(key))
  5.     return (string)sumInfo.CustomPropertyTable[key];
  6.   else
  7.     return null;
  8. }

И так у меня тоже работает. И если ключа нет, то возвращает null без никаких ошибок:
Код - C# [Выбрать]
  1. public static string GetCustomProperty(this Database db, string key)
  2. {
  3.   DatabaseSummaryInfoBuilder sumInfo = new DatabaseSummaryInfoBuilder(db.SummaryInfo);
  4.   System.Collections.IDictionary custProps = sumInfo.CustomPropertyTable;
  5.   return (string)custProps[key];
  6. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
но потом хватал ошибку.
А ты уверен, что хватал именно в этом месте? Ты ведь даже не указал строку, на которой возникает исключение. И не дал нормальный листинг исключения (по кнопке Details в окне исключения).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение