Получить данные из атрибута в мультивыноске

Автор Тема: Получить данные из атрибута в мультивыноске  (Прочитано 8492 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Пытаюсь получить содержимое атрибута блока привязанного в мультивыноску. Код не находит внутри атрибута ничего, хотя там записано значение. Где я ошибаюсь в получении значения? Может вместо BlockTableRecord нужно получать вставку блока привязанную к мультивыноске? Но как их перебирать - часть всавок связаны с мультивыносками, а другие вставлены самостоятельно.
Код - C# [Выбрать]
  1. [CommandMethod("8test")]
  2. public static void CreateTableStart()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Transaction tr = doc.TransactionManager.StartTransaction();
  7.             using (tr)
  8.             {
  9.                 ObjectId contourNumberId = SelectObjectsOnScreen()[0];
  10.                 var contourNumber = GetStringParameter2("SetStrPar", contourNumberId);            
  11.  
  12.                 tr.Commit();
  13.             }
  14.         }
  15. public static string GetStringParameter2(string message, ObjectId objectId)
  16.         {
  17.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  18.             Document doc = Application.DocumentManager.MdiActiveDocument;
  19.             Database db = doc.Database;
  20.             Transaction tr = db.TransactionManager.StartTransaction();
  21.             PromptStringOptions pso = new PromptStringOptions(message);
  22.             string contourNumber = "NotSet";
  23.             using (tr)
  24.             {
  25.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false);
  26.  
  27.                 MLeader ml = tr.GetObject(objectId, OpenMode.ForRead) as MLeader;
  28.  
  29.                 BlockTableRecord content = tr.GetObject(ml.BlockContentId, OpenMode.ForRead) as BlockTableRecord;
  30.  
  31.                 foreach (ObjectId blkEntId in content)
  32.                 {
  33.                     AttributeDefinition AttributeDef = tr.GetObject(blkEntId, OpenMode.ForRead) as AttributeDefinition;
  34.  
  35.                     if (AttributeDef != null)
  36.                     {
  37.                         AttributeReference att = new AttributeReference();
  38.  
  39.                         if (att.Tag == "ContourNumber")
  40.                         {
  41.                             contourNumber = att.TextString;
  42.                             break;
  43.                         }
  44.                     }
  45.                 }
  46.  
  47.                 tr.Commit();
  48.             }
  49.  
  50.             return contourNumber;
  51.         }
  52. public static List<ObjectId> SelectObjectsOnScreen()
  53.         {
  54.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  55.             Document doc = Application.DocumentManager.MdiActiveDocument;
  56.             Database db = doc.Database;
  57.             Transaction tr = db.TransactionManager.StartTransaction();
  58.  
  59.             List<ObjectId> listOfEntities = new List<ObjectId>();
  60.  
  61.             using (tr)
  62.             {
  63.                 // Request for objects to be selected in the drawing area
  64.                 PromptSelectionResult PrSeRes = doc.Editor.GetSelection();
  65.  
  66.                 // If the prompt status is OK, objects were selected
  67.                 if (PrSeRes.Status == PromptStatus.OK)
  68.                 {
  69.                     SelectionSet SelSet = PrSeRes.Value;
  70.  
  71.                     // Step through the objects in the selection set
  72.                     foreach (SelectedObject SelObj in SelSet)
  73.                     {
  74.                         // Check to make sure a valid SelectedObject object was returned
  75.                         if (SelObj != null)
  76.                         {
  77.                             listOfEntities.Add(SelObj.ObjectId);
  78.                         }
  79.                     }
  80.                 }
  81.  
  82.                 tr.Commit();
  83.             }
  84.  
  85.             return listOfEntities;
  86.         }
  87.  
  88.  
  89.  
  90.  

Отмечено как Решение Atomohod 18-10-2021, 23:19:19

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Atomohod,
P.S.: Это твоя же тема: https://adn-cis.org/forum/index.php?topic=10502.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Ты там где-то нашел AttributeReference?
по MGDDBG в существующем блоке есть атрибут. Исходя из этого пытаюсь прочитать его содержимое.


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

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

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
если тебе нужно содержимое AttributeReference принадлежащее BlockReference.
вот и я сомневался тоже
Может вместо BlockTableRecord нужно получать вставку блока привязанную к мультивыноске?
, но свою же, к моему стыду, тему я совершенно упустил из вида, а поиск я смотрел по другим словам в запросе. С Вашей помощью все встало на свои места.
исправил этот кусок кода и все сработало
Код - C# [Выбрать]
  1. if (AttributeDef != null)
  2.                     {
  3.                         AttributeReference att = ml.GetBlockAttribute(blkEntId);                
  4.                  
  5.                         if (att.Tag == "ContourNumber")
  6.                         {
  7.                             contourNumber = att.TextString;
  8.                             break;
  9.                         }
  10.                     }
Спасибо!