Пр-е изменение пар-ра из таблицы свойств блока не меняет значение аттрибута

Автор Тема: Пр-е изменение пар-ра из таблицы свойств блока не меняет значение аттрибута  (Прочитано 112 раз)

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

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Всем здравствуйте!
Я создал динамический блок. В котором задал некоторые текстовые поля через аттрибут. Для возможности подменять значение текста на его перевод на другом языке.
Внутри блока создал таблицу свойств, в котором задал соответствие языку:

Если такой блок вставляю руками и ручкой меняю значения этого свойства, то всё ок работает:


Однако, когда я вставляю этот же блок кодом, блок вставляется с пустым текстовым полем. Аттрибут не отображает какой-либо текст.
Когда я взгляну на ручку - оно отображает корректное выставленное кодом значение.
Но текст на блоке появляется только после повторного выбора значения через ручку.

Можете подсказать куда копать?

Оффлайн Александр_М

  • ADN OPEN
  • Сообщений: 12
  • Карма: 0
Я тоже пытался с динамическими блоками программно работать.
При изменении видимости не создаётся анонимный блок, поэтому и не видно ничего.

Как я сделал.
При первой вставке блока вставляю все варианты видимостей (у Вас 2 получается)
и выполняю _attsync для блока, при этом создаются анонимные блоки для всех видимостей блока на чертеже.
Потом удаляю вставки, а анонимные блоки остаются.
При новой вставке и выборе видимости будет использован готовый анонимный блок.

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Здравствуйте, Александр!
Благодарю за интерес к вопросу.
На самом деле, атрибуты инстансу блока я добавляю тоже программно и там где необходимо (изменение положения атрибутов в зависимости от видимости или выбора) _attsync для блока применяю. Моя проблема повторится даже если у динамического блока не будет других параметров, только таблица свойств блока.
По всей видимости, зависимости не вычисляются в автокаде при программном изменении значения свойства из таблицы свойств.
Поэтому я загугли как организуется доступ к таблице свойств и пока что через код стал записывать значения в атрибуты в зависимости от того, что выбрано для поля Lang в соответствие с таблицей:
Код - C# [Выбрать]
  1. public static void SetPropertyFromPropertyTable(Transaction tr, BlockReference blockRef, string value, string propertyName = "Lang")
  2. {
  3.     if (blockRef == null) return;
  4.  
  5.     if (value == null) return;
  6.  
  7.     try
  8.     {
  9.         var blockDef = tr.GetObject(blockRef.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  10.         DBDictionary extDic = tr.GetObject(blockDef.ExtensionDictionary, OpenMode.ForRead) as DBDictionary;
  11.         // Открываем словарь ENHANCEDBLOCK  
  12.         Autodesk.AutoCAD.Internal.DatabaseServices.EvalGraph graph = tr.GetObject(extDic.GetAt("ACAD_ENHANCEDBLOCK"), OpenMode.ForRead) as EvalGraph;
  13.         var nodeIds = graph.GetAllNodes();
  14.         foreach (uint nodeId in nodeIds)
  15.         {
  16.             DBObject node = graph.GetNode(nodeId, OpenMode.ForRead, tr);
  17.             if (!(node is BlockPropertiesTable)) continue;
  18.  
  19.             var table = node as BlockPropertiesTable;
  20.  
  21.             Dictionary<string, string> props = new Dictionary<string, string>();
  22.             for (int i = 0; i < table.Rows.Count; i++)
  23.             {
  24.                 var par = table.Columns[0].Parameter;
  25.                 if (par == null)
  26.                     break;
  27.  
  28.                 if (par.Name != propertyName)
  29.                     break;
  30.  
  31.                 var tapedValue = (TypedValue)table.Rows[i][0].AsArray().GetValue(0); //RU-EN
  32.                 if (tapedValue.TypeCode == (int)DxfCode.Text)
  33.                 {
  34.                     if (value != (string)tapedValue.Value)
  35.                     {
  36.                         continue;
  37.                     }
  38.                 }
  39.  
  40.                 for (int j = 1; j < table.Columns.Count; j++)
  41.                 {
  42.                     var lableAttrName = table.Columns[j].Parameter.Name;
  43.  
  44.                     var lableValTV = (TypedValue)table.Rows[i][j].AsArray().GetValue(0);
  45.                     if (lableValTV.TypeCode == (int)DxfCode.Text)
  46.                     {
  47.                         var lableVal = (string)lableValTV.Value;
  48.                         props.Add(lableAttrName, lableVal);
  49.                     }
  50.                 }
  51.             }
  52.             SetParam(tr, blockRef, props);
  53.             break;
  54.         }
  55.     }
  56.     catch(System.Exception ex)
  57.     {
  58.         //log
  59.     }
  60. }