ADN Club > AutoCAD .NET API
Пр-е изменение пар-ра из таблицы свойств блока не меняет значение аттрибута
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:
Добрый день, Александр! Я пробовал вставить блок, в котором не было других динамических свойств, кроме таблицы свойств блока. Проблема сохранялась.
Навигация
Перейти к полной версии