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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 18-10-2021, 22:36:58

Название: Получить данные из атрибута в мультивыноске
Отправлено: Atomohod от 18-10-2021, 22:36:58
Здравствуйте!
Пытаюсь получить содержимое атрибута блока привязанного в мультивыноску. Код не находит внутри атрибута ничего, хотя там записано значение. Где я ошибаюсь в получении значения? Может вместо 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.  
Название: Re: Получить данные из атрибута в мультивыноске
Отправлено: Александр Ривилис от 18-10-2021, 22:53:01
Пытаюсь получить содержимое атрибута блока привязанного в мультивыноску.
MLeader.GetBlockAttribute - вот куда нужно копать.
А всё что в твоём коде - полная ерунда. Ты там где-то нашел AttributeReference? Нет. Ты зачем-то его создаёшь из AttributeDefinition. И что это может дать? Какое отношение этот  AttributeReference имеет к AttributeReference для вставки блока в MLeader?
Название: Re: Получить данные из атрибута в мультивыноске
Отправлено: Александр Ривилис от 18-10-2021, 22:55:24
Atomohod,
P.S.: Это твоя же тема: https://adn-cis.org/forum/index.php?topic=10502.0
Название: Re: Получить данные из атрибута в мультивыноске
Отправлено: Atomohod от 18-10-2021, 22:58:00
Ты там где-то нашел AttributeReference?
по MGDDBG в существующем блоке есть атрибут. Исходя из этого пытаюсь прочитать его содержимое.
(https://i.postimg.cc/H8d0vP7t/2021-10-18-225519.jpg) (https://postimg.cc/H8d0vP7t)
Название: Re: Получить данные из атрибута в мультивыноске
Отправлено: Александр Ривилис от 18-10-2021, 22:59:55
Исходя из этого пытаюсь прочитать его содержимое.
Только делаешь совершенно другое.
Название: Re: Получить данные из атрибута в мультивыноске
Отправлено: Александр Ривилис от 18-10-2021, 23:05:34
по MGDDBG в существующем блоке есть атрибут. Исходя из этого пытаюсь прочитать его содержимое.
Зачем тебе содержимое AttributeDefinition из  BlockTableRecord, если тебе нужно содержимое AttributeReference принадлежащее BlockReference.
Название: Re: Получить данные из атрибута в мультивыноске
Отправлено: Atomohod от 18-10-2021, 23:18:18
если тебе нужно содержимое 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.                     }
Спасибо!