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

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

Страницы: [1] 2 3 ... 10
1
AutoCAD .NET API / Re: Копирорование блоков
« Последний ответ от Привалов Дмитрий 07-07-2025, 09:35:16 »
Всё работает.
Есть еще варианты, может кому-то может пригодятся для борьбы с недоработками определенных версий.
При ручной вставке блока DrawOrderTable обычно копируется и проблем нет.

В AutoCAD 2010  при ручной вставке блока или при вставке блока из палитры, точно не помню, DrawOrderTable не копировался.

В итоге проверил 2 рабочих варианта.
1. В том месте, где штриховка перекрывала объект, подрезал штриховку, избавившись от необходимости в DrawOrderTable.
2. Перестроил блоки программно. Считал порядок следования объектов из DrawOrderTable и пересоздал объекты в блоке. Объекты добавленные последними отображаются сверху.
2
Сработало. Теперь всё корректно.
А что именно, hatch.EvaluateHatch(true);? Возможно кому-то пригодится правильный ответ.
3
AutoCAD .NET API / Re: Копирорование блоков
« Последний ответ от Александр_М 06-07-2025, 22:20:26 »
Спасибо!

Сделал как тут https://adn-cis.org/forum/index.php?topic=9821.msg43667#msg43667
Всё работает.
4
AutoCAD .NET API / Re: Копирорование блоков
« Последний ответ от Александр Ривилис 06-07-2025, 19:03:49 »
Поиграйся с DrawOrderTable для блока. Есть примеры на форуме.
5
AutoCAD .NET API / Копирорование блоков
« Последний ответ от Александр_М 06-07-2025, 15:19:01 »
Добрый день.
Подскажите как решить проблему.

Копирую блок из одного чертежа в другой.
Код - C# [Выбрать]
  1.   public static void CopyBlockDefinition(string sourceDwgPath, string blockName, Database targetDb)
  2.         {
  3.             using (Database sourceDb = new Database(false, true))
  4.             {
  5.                 sourceDb.ReadDwgFile(sourceDwgPath, FileOpenMode.OpenForReadAndAllShare, false, null);
  6.  
  7.                 using (Transaction sourceTrans = sourceDb.TransactionManager.StartTransaction())
  8.                 {
  9.                     BlockTable sourceBt = (BlockTable)sourceTrans.GetObject(sourceDb.BlockTableId, OpenMode.ForRead);
  10.  
  11.                     if (!sourceBt.Has(blockName)) return;
  12.  
  13.                     ObjectId sourceBlockId = sourceBt[blockName];
  14.  
  15.                     using (Transaction targetTrans = targetDb.TransactionManager.StartTransaction())
  16.                     {
  17.                         IdMapping idMap = new IdMapping();
  18.                         sourceDb.WblockCloneObjects(
  19.                             new ObjectIdCollection() { sourceBlockId },
  20.                             targetDb.BlockTableId,
  21.                             idMap,
  22.                             DuplicateRecordCloning.Replace,
  23.                             false);
  24.  
  25.                         targetTrans.Commit();
  26.                     }
  27.  
  28.                     sourceTrans.Commit();
  29.                 }
  30.             }
  31.         }
  32.  

Всё работает, копия создаётся.
Но есть проблема.
В оригинальном блоке назначен порядок прорисовки объектов, а в копии он нарушен.
Порядок прорисовки важен. Получается атрибут закрыт штриховкой и его не видно.

При копировании ctrl+c ctrl+v естественно всё нормально.

Как скопировать блок сохранив порядок прорисовки?
 


6
Спасибо!
попробуй заменить на:
1. hatch.EvaluateHatch(true);
2. hatch.EvaluateHatch(false);
3. hatch.EvaluateHatch(true); hatch.RecordGraphicsModified(true);


Сработало. Теперь всё корректно.
7
hatch.RecordGraphicsModified(true);
hatch.RecordGraphicsModified(true);
попробуй заменить на:
1. hatch.EvaluateHatch(true);
2. hatch.EvaluateHatch(false);
3. hatch.EvaluateHatch(true); hatch.RecordGraphicsModified(true);

еще попробуй добавлять, удалять контур hatch.AppendLoop(...); hatch.EvaluateHatch(false); hatch.RemoveLoopAt(hatch.NumberOfLoops-1);



8
Добрый день.
спасибо за ответ.
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 файл где уже будут все варианты анонимных блоков, но это костыль, хоть и рабочий.
Хочется заставить автокад правильно рисовать.

9
AutoCAD .NET API / Re: Ошибка вставки блоков
« Последний ответ от Atomohod 27-06-2025, 21:33:52 »
Нужно вызвать Dispose(), после клонирования.
это помогло, спасибо!
10
AutoCAD .NET API / Re: Ошибка вставки блоков
« Последний ответ от Привалов Дмитрий 23-06-2025, 07:25:06 »
Что не так с методом вставки блоков?
1. Нет блокировки текущего документа.
2. IdMapping idMap = new IdMapping(); Нужно вызвать Dispose(), после клонирования.
Страницы: [1] 2 3 ... 10