ADN Club > AutoCAD .NET API

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

(1/2) > >>

Roman:
Всем здравствуйте!
Я создал динамический блок. В котором задал некоторые текстовые поля через аттрибут. Для возможности подменять значение текста на его перевод на другом языке.
Внутри блока создал таблицу свойств, в котором задал соответствие языку:

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


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

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

Александр_М:
Я тоже пытался с динамическими блоками программно работать.
При изменении видимости не создаётся анонимный блок, поэтому и не видно ничего.

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

Roman:
Здравствуйте, Александр!
Благодарю за интерес к вопросу.
На самом деле, атрибуты инстансу блока я добавляю тоже программно и там где необходимо (изменение положения атрибутов в зависимости от видимости или выбора) _attsync для блока применяю. Моя проблема повторится даже если у динамического блока не будет других параметров, только таблица свойств блока.
По всей видимости, зависимости не вычисляются в автокаде при программном изменении значения свойства из таблицы свойств.
Поэтому я загугли как организуется доступ к таблице свойств и пока что через код стал записывать значения в атрибуты в зависимости от того, что выбрано для поля Lang в соответствие с таблицей:

--- Код - C# [Выбрать] ---public static void SetPropertyFromPropertyTable(Transaction tr, BlockReference blockRef, string value, string propertyName = "Lang"){    if (blockRef == null) return;     if (value == null) return;     try    {        var blockDef = tr.GetObject(blockRef.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;        DBDictionary extDic = tr.GetObject(blockDef.ExtensionDictionary, OpenMode.ForRead) as DBDictionary;        // Открываем словарь ENHANCEDBLOCK          Autodesk.AutoCAD.Internal.DatabaseServices.EvalGraph graph = tr.GetObject(extDic.GetAt("ACAD_ENHANCEDBLOCK"), OpenMode.ForRead) as EvalGraph;        var nodeIds = graph.GetAllNodes();        foreach (uint nodeId in nodeIds)        {            DBObject node = graph.GetNode(nodeId, OpenMode.ForRead, tr);            if (!(node is BlockPropertiesTable)) continue;             var table = node as BlockPropertiesTable;             Dictionary<string, string> props = new Dictionary<string, string>();            for (int i = 0; i < table.Rows.Count; i++)            {                var par = table.Columns[0].Parameter;                if (par == null)                    break;                 if (par.Name != propertyName)                    break;                 var tapedValue = (TypedValue)table.Rows[i][0].AsArray().GetValue(0); //RU-EN                if (tapedValue.TypeCode == (int)DxfCode.Text)                {                    if (value != (string)tapedValue.Value)                    {                        continue;                    }                }                 for (int j = 1; j < table.Columns.Count; j++)                {                    var lableAttrName = table.Columns[j].Parameter.Name;                     var lableValTV = (TypedValue)table.Rows[i][j].AsArray().GetValue(0);                    if (lableValTV.TypeCode == (int)DxfCode.Text)                    {                        var lableVal = (string)lableValTV.Value;                        props.Add(lableAttrName, lableVal);                    }                }            }            SetParam(tr, blockRef, props);            break;        }    }    catch(System.Exception ex)     {         //log    }}

Александр_М:
Добрый день.
Пробовали вставить в чертеж все варианты блока вручную. А после этого вставлять дополнительные блоки программно?
Проблема сохраняется?

Roman:
Добрый день, Александр! Я пробовал вставить блок, в котором не было других динамических свойств, кроме таблицы свойств блока. Проблема сохранялась.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии