Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 21-07-2019, 17:11:34

Название: Доступ к пользовательским свойствам чертежа
Отправлено: Atomohod от 21-07-2019, 17:11:34
Здравствуйте!
Кто-нибудь из форумчан пользуется custom properties документа? См. скриншот. Как к ним получить доступ из кода. В Help'e про них я не нашел - может не там искал?
(https://i.postimg.cc/4KWGMcFc/2019-07-21-165948.jpg) (https://postimg.cc/4KWGMcFc)
Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: pavka_97 от 21-07-2019, 18:14:03
http://help.autodesk.com/view/OARX/2019/ENU/?guid=OREFNET-Autodesk_AutoCAD_DatabaseServices_DatabaseSummaryInfoBuilder

http://adn-cis.org/forum/index.php?topic=8355.msg30943#msg30943

Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Александр Ривилис от 21-07-2019, 18:56:22
Atomohod,
Еще: https://adndevblog.typepad.com/autocad/2012/05/writing-autocad-drawing-summary-information.html
Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Atomohod от 22-07-2019, 23:11:22
На запись все понял. А как их считывать обратно? Вопрос конечно диковатый но написанный мной метод вроде бы верен, но вызывает исключение. В чем причина?
Код - 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.         }
(https://i.postimg.cc/Ln300VbR/2019-07-22-231055.jpg) (https://postimg.cc/Ln300VbR)
Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Владимир Шу от 23-07-2019, 08:17:36
Я могу ошибаться, но может не стоит использовать интерфейс для объявления custProps... приблизительно на это и ругается ошибка, что ссылка не на инстанс...
Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Александр Ривилис от 23-07-2019, 11:13:09
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. }

Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Atomohod от 23-07-2019, 20:54:55
Посмотри этот код. Я его проверил:
Спасибо, это спасло. Но почему? Замена интерфейса на var и if (custProps.Contains(key)) так сильно влияют на код? Похоже я чего-то еще не знаю. Можно как-нибудь разжевать мне в чем тут прикол?
Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Александр Ривилис от 23-07-2019, 22:25:58
Но почему? Замена интерфейса на var и if (custProps.Contains(key)) так сильно влияют на код?
Замена на var позволяет не думать о точном типе значения (IDictionary - это только интерфейс). А проверка if (custProps.Contains(key)) позволяет избежать исключения, если в таблице нет записи с ключом key.
Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Atomohod от 23-07-2019, 23:23:41
если в таблице нет записи с ключом key.
в этом то и непонятка - значение у меня гарантированно было и в отладчике я его видел в DatabaseSummaryInfoBuilder sumInfo = new DatabaseSummaryInfoBuilder(db.SummaryInfo); но потом хватал ошибку.
Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Александр Ривилис от 24-07-2019, 10:57:01
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. }
Название: Re: Доступ к пользовательским свойствам чертежа
Отправлено: Александр Ривилис от 24-07-2019, 11:08:54
но потом хватал ошибку.
А ты уверен, что хватал именно в этом месте? Ты ведь даже не указал строку, на которой возникает исключение. И не дал нормальный листинг исключения (по кнопке Details в окне исключения).