Сохранение пользовательских свойств в объект

Автор Тема: Сохранение пользовательских свойств в объект  (Прочитано 7353 раз)

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

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Здравствуйте.
Я средствами Net добавляю внешние ссылки на DWG файлы, и мне хотелось бы в их BlockReference сохранить несколько параметров типами double, int, string.
Подскажите пожалуйста как это лучше всего можно реализовать.

Вот пример того как я добавил ссылку на файл:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.Geometry;
  5.  
  6. [CommandMethod("AddBR")]
  7. public void AttachingExternalReference()
  8. {
  9.     Database acCurDb;
  10.     acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
  11.     OpenFileDialog OFD = new OpenFileDialog();
  12.     if (OFD.ShowDialog() != DialogResult.OK)
  13.         return;
  14.     using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  15.     {
  16.         ObjectId acXrefId = acCurDb.AttachXref(OFD.FileName, Path.GetFileNameWithoutExtension(OFD.FileName));
  17.         if (!acXrefId.IsNull)
  18.         {
  19.             Point3d insPt = new Point3d(0, 0, 0);
  20.             using (BlockReference acBlkRef = new BlockReference(insPt, acXrefId))
  21.             {
  22.                 BlockTableRecord acBlkTblRec;
  23.                 acBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  24.                 acBlkTblRec.AppendEntity(acBlkRef);
  25.                 acTrans.AddNewlyCreatedDBObject(acBlkRef, true);
  26.             }
  27.         }
  28.         acTrans.Commit();
  29.     }
  30. }

Вот здесь для acBlkRef я и хочу добавить свои свойства

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик

Отмечено как Решение Леонид Семенов 06-06-2016, 09:52:44

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

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

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Использование .NET API для добавления и удаления расширенных данных

Спасибо за источник. Я решил немного изменить в нем код для своих целей: нужно в элементе сохранить несколько строковых значений;
но он почему-то не работает, наверное что-то делаю не так:
Код - C# [Выбрать]
  1. [CommandMethod("ADDXDATA")]
  2.         static public void AddXdata()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             using (doc.LockDocument())
  7.             {
  8.                 Transaction tr = db.TransactionManager.StartTransaction();
  9.                 using (tr)
  10.                 {
  11.                     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  12.                     // Запрос выбора примитива
  13.                     PromptEntityResult ers = ed.GetEntity("Выберите примитив ");
  14.                     // Открываем примитив
  15.                     Entity ent = (Entity)tr.GetObject(ers.ObjectId, OpenMode.ForWrite);
  16.                     // Получаем таблицу зарегистрированных приложений
  17.                     RegAppTable regTable = (RegAppTable)tr.GetObject(db.RegAppTableId, OpenMode.ForRead);
  18.  
  19.                     if (!regTable.Has("MYAPP"))
  20.                     {
  21.                         regTable.UpgradeOpen();
  22.                         // Добавляем имя приложения, которое мы будем
  23.                         // использовать в расширенных данных
  24.                         RegAppTableRecord app = new RegAppTableRecord();
  25.                         app.Name = "MYAPP";
  26.                         regTable.Add(app);
  27.                         tr.AddNewlyCreatedDBObject(app, true);
  28.                     }
  29.                     // Добавляем расширенные данные к примитиву
  30.                     ent.XData = new ResultBuffer(new TypedValue(1001, "MYAPP"),
  31.                                                  new TypedValue(1002, "Текст 1"),
  32.                                                  new TypedValue(1003, "Текст 2"),
  33.                                                  new TypedValue(1004, "Текст 3"));
  34.                     tr.Commit();
  35.                 }
  36.             }
  37.         }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Группы 1002, 1003,  1004, 1005 имеют своё назначение: http://www.autodesk.com/techpubs/autocad/acad2000/dxf/group_codes_in_numerical_order_dxf_01.htm
Так что если тебе нужны строки, то используй код 1000. Он может повторяться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Леонид СеменовАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 2
  • Леонид Семенов. Ведущий инженер-программист
Группы 1002, 1003,  1004, 1005 имеют своё назначение: http://www.autodesk.com/techpubs/autocad/acad2000/dxf/group_codes_in_numerical_order_dxf_01.htm
Так что если тебе нужны строки, то используй код 1000. Он может повторяться.

Спасибо. Думаю теперь я разобрался.
Выкладываю немного измененный http://adn-cis.org/ispolzovanie-.netapidlya-dobavleniya-i-udaleniya-rasshirennyix-dannyix.html.
Может быть кому-то понадобиться в качестве обучающего примера
Код - C# [Выбрать]
  1.         [CommandMethod("ADDXDATA")]
  2.         static public void AddXdata()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             using (doc.LockDocument())
  7.             {
  8.                 Transaction tr = db.TransactionManager.StartTransaction();
  9.                 using (tr)
  10.                 {
  11.                     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  12.                     PromptEntityResult ers = ed.GetEntity("Выберите примитив ");
  13.                     Entity ent = (Entity)tr.GetObject(ers.ObjectId, OpenMode.ForWrite);
  14.                     RegAppTable regTable = (RegAppTable)tr.GetObject(db.RegAppTableId, OpenMode.ForRead);
  15. // - - - - - - - - - - MYAPP - - - - - - - - - -
  16.                     if (!regTable.Has("APP_1"))
  17.                     {
  18.                         regTable.UpgradeOpen();
  19.                         RegAppTableRecord app = new RegAppTableRecord();
  20.                         app.Name = "APP_1";
  21.                         regTable.Add(app);
  22.                         tr.AddNewlyCreatedDBObject(app, true);
  23.                     }
  24.                     ResultBuffer RB = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, "APP_1"));
  25.                     RB.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "APP_1 Текст 1"));
  26.                     RB.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "APP_1 Текст 2"));
  27.                     RB.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "APP_1 Текст 3"));
  28.                     RB.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "APP_1 Текст 4"));
  29.                     ent.XData = RB;
  30. // - - - - - - - - - -  APP_2  - - - - - - - - - -
  31.                     if (!regTable.Has("APP_2"))
  32.                     {
  33.                         regTable.UpgradeOpen();
  34.                         RegAppTableRecord app = new RegAppTableRecord();
  35.                         app.Name = "APP_2";
  36.                         regTable.Add(app);
  37.                         tr.AddNewlyCreatedDBObject(app, true);
  38.                     }
  39.                     RB = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, "APP_2"));
  40.                     RB.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "APP_2 Текст 1"));
  41.                     RB.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "APP_2 Текст 2"));
  42.                     RB.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "APP_2 Текст 3"));
  43.                     RB.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "APP_2 Текст 4"));
  44.                     ent.XData = RB;
  45.                     tr.Commit();
  46.                 }
  47.             }
  48.         }
  49.  
  50.         [CommandMethod("REMXDATA")]
  51.         static public void RemoveXdata()
  52.         {
  53.             Document doc = Application.DocumentManager.MdiActiveDocument;
  54.             Database db = doc.Database;
  55.             Transaction tr = db.TransactionManager.StartTransaction();
  56.             using (doc.LockDocument())
  57.             {
  58.                 using (tr)
  59.                 {
  60.                     Editor ed =
  61.                         Application.DocumentManager.MdiActiveDocument.Editor;
  62.                     try
  63.                     {
  64.                         // Просим пользователя выбрать примитив
  65.                         PromptEntityResult ers = ed.GetEntity("Укажите примитив ");
  66.                         // Открываем выбранный примитив
  67.                         Entity ent = (Entity)tr.GetObject(ers.ObjectId, OpenMode.ForRead);
  68.  
  69.                         ResultBuffer buffer = ent.GetXDataForApplication("APP_1");
  70.                         // Если есть расширенные данные – удалим их.
  71.                         // Для этого в качестве расширенных данных
  72.                         // передаём только имя приложения.
  73.                         // Только связанные с ним данные будут удалены.
  74.                         if (buffer != null)
  75.                         {
  76.                             ent.UpgradeOpen();
  77.                             ent.XData = new ResultBuffer(new TypedValue(1001, "APP_1"));
  78.                             buffer.Dispose();
  79.                         }
  80.                         tr.Commit();
  81.                     }
  82.                     catch
  83.                     {
  84.                         tr.Abort();
  85.                     }
  86.                 }
  87.             }
  88.         }
  89.  
  90.         [CommandMethod("GETXDATA")]
  91.         static public void GetXdata()
  92.         {
  93.             Document doc = Application.DocumentManager.MdiActiveDocument;
  94.             Database db = doc.Database;
  95.             Transaction tr = db.TransactionManager.StartTransaction();
  96.             using (doc.LockDocument())
  97.             {
  98.                 using (tr)
  99.                 {
  100.                     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  101.                     PromptEntityResult ers = ed.GetEntity("Выберите примитив ");
  102.                     Entity ent = (Entity)tr.GetObject(ers.ObjectId, OpenMode.ForWrite);
  103. // - - - - - - - - - - APP_1 - - - - - - - - - -
  104.                     ResultBuffer RB = ent.GetXDataForApplication("APP_1");
  105.                     if (RB!=null)
  106.                         foreach (var rb in RB)
  107.                             System.Windows.Forms.MessageBox.Show(rb.TypeCode.ToString() + " -> " + rb.Value.ToString());
  108.                     else
  109.                         System.Windows.Forms.MessageBox.Show("APP_1 -");
  110. // - - - - - - - - - -  APP_2  - - - - - - - - - -
  111.                     RB = ent.GetXDataForApplication("APP_2");
  112.                     if (RB != null)
  113.                         foreach (var rb in RB)
  114.                             System.Windows.Forms.MessageBox.Show(rb.TypeCode.ToString() + " -> " + rb.Value.ToString());
  115.                     else
  116.                         System.Windows.Forms.MessageBox.Show("APP_2 -");
  117.                 }
  118.             }
  119.         }