Не обновляется ассоциативная штриховка в 2023 автокаде при програмном изменении

Автор Тема: Не обновляется ассоциативная штриховка в 2023 автокаде при програмном изменении  (Прочитано 1366 раз)

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

Оффлайн Александр_МАвтор темы

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Добрый день.
Столкнулся с проблемой.
Опишу как можно подробнее.
Имеется динамический блок
контур полилиния, заполнение ассоциативная штриховка.
Есть таблица выбора с размерами.
Если вставить в чертеж блок и вручную менять свойство то всё работает прекрасно, размеры полилинии изменяются, и штриховка под них подстраивается.
Но если тоже самое сделать программно, то полилинии изменяются, а вот штриховка не перерисовывается, остаётся такого размера как была в редакторе блока.

Поведение в разных версиях автокад разное.
В 2024 такой проблемы нет
в 2016  решается таким образом:
Код - C# [Выбрать]
  1.  
  2.    blockRefStart.RecordGraphicsModified(true);    
  3.    blockRefStart.RecordGraphicsModified(true);
  4.  

причём именно дважды RecordGraphicsModified.

В 2023 не получается никак. Хотя если выполнить _ATTSYNC то всё перерисовывается корректно. Но не вызывать же его после каждой вставки блока.

Свойство меняю так:
Код - C# [Выбрать]
  1.  foreach (DynamicBlockReferenceProperty prop in blockRefStart.DynamicBlockReferencePropertyCollection)
  2.         {
  3.                  if (prop.PropertyName == "Выбор1")
  4.                      {
  5.                           prop.Value = "Первый вариант";
  6.                           break;
  7.                       }
  8.          }
  9.  

Подскажите куда копать.
Спасибо!


Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 562
  • Карма: 121
Подскажите куда копать.

1.
blockRefStart.RecordGraphicsModified(true); принудительно помечает, что графический примитив (Entity) нужно перерисовать.
В конце желательно вызвать регенерацию.
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
ed.Regen();

2.
Когда ты меняешь, например размеры, на динамическом блоке, то помимо основного BlockTableRecord появляется анонимный блок BlockTableRecord.
возможно RecordGraphicsModified(true) на BlockReference не влияет на перерисовку анонимного блок BlockTableRecord.
попробуй вызвать метод UpdateAnonymousBlocks() у BlockTableRecord.

3. Если не помогло, можно попробовать получить анонимные блоки и попробовать обновить штриховку в них,
попробуй свойства и методы:
blockIns.BlockTableRecord - id основного блока
blockIns.DynamicBlockTableRecord - id измененного блока.
можешь получить id анонимных блоков GetAnonymousBlockIds(); - id всех анонимных блоков.

далее поискать штриховку и попытаться обновить ее, например hatch.RecordGraphicsModified(true);

Оффлайн Александр_МАвтор темы

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Добрый день.
спасибо за ответ.
1. Я это понимаю. Перерисовывается в 2016 и 2024 и без regen , а в 2023 и regen не помогает.
2. Да, знаю про анонимные блоки. UpdateAnonymousBlocks()  не помогло в 2023 но сломало штриховки в 2024.
3. Попробовал вот так в отдельной транзакции
Код - C# [Выбрать]
  1.  using (Transaction tr = db.TransactionManager.StartTransaction())
  2.                         {
  3.                             BlockTable blockTable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  4.  
  5.                             foreach (ObjectId btrId in blockTable)
  6.                             {                              
  7.                                 BlockTableRecord btr2 = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
  8.  
  9.                                 if ( btr2.Name.ToUpper() == "имя блока".ToUpper())
  10.                                 {                                  
  11.                                     //   получаем все анонимные блоки динамического блока
  12.                                     ObjectIdCollection anonymousIds = btr2.GetAnonymousBlockIds();
  13.  
  14.                                     foreach (ObjectId anonymousBtrId in anonymousIds)
  15.                                     {
  16.                                         // получаем анонимный блок
  17.                                         BlockTableRecord anonymousBtr = (BlockTableRecord)tr.GetObject(anonymousBtrId, OpenMode.ForRead);
  18.  
  19.                                         foreach (ObjectId objId in anonymousBtr)
  20.                                         {
  21.                                             try
  22.                                             {
  23.                                                 Hatch hatch = tr.GetObject(objId, OpenMode.ForWrite) as Hatch;
  24.                                                 if (hatch != null)
  25.                                                     hatch.RecordGraphicsModified(true);
  26.                                             }
  27.                                             catch
  28.                                             { }
  29.                                         }
  30.                                     }
  31.                                 }
  32.                             }
  33.                             tr.Commit();
  34.                         }
  35.  
  36.  
т.е. ищу основной блок по имени, нахожу все его анонимные блоки и принудительно перерисовываю штриховку.
Эффекта нет. в 2016 и 2024 всё корректно, в 2023 штриховки не правильные.

Может ещё есть идеи?


Как вариант думал создать dwg файл где уже будут все варианты анонимных блоков, но это костыль, хоть и рабочий.
Хочется заставить автокад правильно рисовать.