Последние сообщения

Последние сообщения

Страницы: 1 ... 3 4 [5] 6 7 ... 10
41
Здравствуйте, Александр!
Благодарю за интерес к вопросу.
На самом деле, атрибуты инстансу блока я добавляю тоже программно и там где необходимо (изменение положения атрибутов в зависимости от видимости или выбора) _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. }
42
Я тоже пытался с динамическими блоками программно работать.
При изменении видимости не создаётся анонимный блок, поэтому и не видно ничего.

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

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


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

Можете подсказать куда копать?
44
1. Возможность добавлять свойства группе листов.
2. Возможность присоединять файлы doc и xls с последующим помещением их в формируемый комплект.
45
AutoCAD .NET API / Re: Не меняется ориентация листа
« Последний ответ от brook 23-09-2025, 11:06:55 »
на самом деле я неправильно сформулировала. один лист формируется с  настроенным поворотом. но все последующие листы будто наследуют этот поворот. у меня чаще всего два листа в одной ориентации и два  в другой. но может быть по-разному. и вот какой ему первый задался, так он остальные и поворачивает, невзирая на текущие настройки. Причём это всё внутри отдельной команды. то есть транзакция точно закрывается и никак они не связаны друг с другом. может что-то попытаться сбросить между командами?
46
AutoCAD .NET API / Re: Не меняется ориентация листа
« Последний ответ от Привалов Дмитрий 19-09-2025, 13:31:21 »
пока на одном стенде не поставили с другого дистрибутива acad, и он стал на 90 градусов всё переворачивать. раньше явно не задавали поворот вообще, он как-то сам вставал. сейчас пытаюсь задать явно, и не работает

нужно проверить настройку плоттеров и листов. Возможно на стенде отсутствует выставляемый плоттер, либо формат лист у него задан по другому не 210*297 , а 297*210.
47
AutoCAD .NET API / Re: Не меняется ориентация листа
« Последний ответ от pavka_97 19-09-2025, 12:15:17 »
Свои плагины я использовал в 13,16,21,24 и под них нередко приходилось редактировать что-то (появлялись новые методы, библиотеки, да и глюки). В консоли тоже не все работает. Если напрямую (не из консоли запускать), работает? Лучше конечно задавать все в явном виде и в порядке как в руководстве или в примерах на форуме. Если раньше работало, а теперь нет, проверьте соответствие библиотек, фреймворков, версий автокада друг другу. Может дистрибутив новый, который вы ставили последним, кривой. Попробуйте местами поменять PlotRotation.Degrees000 и PlotRotation.Degrees090 (если глюк), дополнительно "пошевелить"/ регенерировать лист, например отцентровать psv.SetPlotCentered(ps, true).
48
AutoCAD .NET API / Re: Не меняется ориентация листа
« Последний ответ от brook 19-09-2025, 10:07:25 »
Автокад какой версии? В одной из старых версий у меня был глюк, когда 0 и 90град были перепутаны местами.

2021. это уже старая?
49
AutoCAD .NET API / Re: Не меняется ориентация листа
« Последний ответ от pavka_97 18-09-2025, 18:23:52 »
Автокад какой версии? В одной из старых версий у меня был глюк, когда 0 и 90град были перепутаны местами.
50
AutoCAD .NET API / Re: Не меняется ориентация листа
« Последний ответ от brook 18-09-2025, 10:14:07 »
Насчет настроек печати - не скажу, а вот настройки вьюпортов на листах не применяются ни какими методами. Более менее помогает переключение на вкладку Модель и обратно на лист. И то не всегда.
с вьюпортами у нас всё хорошо. мне не надо переключаться, мы через accoreconsole всё обрабатываем. у нас и с листами всё было нормально, пока на одном стенде не поставили с другого дистрибутива acad, и он стал на 90 градусов всё переворачивать. раньше явно не задавали поворот вообще, он как-то сам вставал. сейчас пытаюсь задать явно, и не работает, не могу понять почему
Страницы: 1 ... 3 4 [5] 6 7 ... 10