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

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

Страницы: 1 ... 3 4 [5] 6 7 ... 10
41
AutoCAD .NET API / Re: Копирорование блоков
« Последний ответ от Александр_М 06-07-2025, 22:20:26 »
Спасибо!

Сделал как тут https://adn-cis.org/forum/index.php?topic=9821.msg43667#msg43667
Всё работает.
42
AutoCAD .NET API / Re: Копирорование блоков
« Последний ответ от Александр Ривилис 06-07-2025, 19:03:49 »
Поиграйся с DrawOrderTable для блока. Есть примеры на форуме.
43
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 естественно всё нормально.

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


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


Сработало. Теперь всё корректно.
45
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);



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

47
AutoCAD .NET API / Re: Ошибка вставки блоков
« Последний ответ от Atomohod 27-06-2025, 21:33:52 »
Нужно вызвать Dispose(), после клонирования.
это помогло, спасибо!
48
AutoCAD .NET API / Re: Ошибка вставки блоков
« Последний ответ от Привалов Дмитрий 23-06-2025, 07:25:06 »
Что не так с методом вставки блоков?
1. Нет блокировки текущего документа.
2. IdMapping idMap = new IdMapping(); Нужно вызвать Dispose(), после клонирования.
49
AutoCAD .NET API / Ошибка вставки блоков
« Последний ответ от Atomohod 22-06-2025, 16:41:28 »
Здравствуйте!
Не могу понять причину поведения кода. Если запускаю его отдельно по команде 111ImportAndInsertBlocks, все в порядке метод работает. Если же вызываю его из кода см. метод ниже, то по окончании работы метода кад чуть зависает и аварийно закрывается без всяких сообщений. Если вызов ImportAndInsertBlocksFromDwg закоммитить то второй метод прекрасно работает без проблем. Что не так с методом вставки блоков?

Код - C# [Выбрать]
  1. [CommandMethod("111ImportAndInsertBlocks")]
  2. public static void ImportAndInsertBlocksFromDwg()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database destDb = doc.Database;
  6.     Editor ed = doc.Editor;
  7.     string sourceFilePath = @"G:\Blocks\Iso3DBlocks.dwg";
  8.     if (!File.Exists(sourceFilePath))
  9.     {
  10.         ed.WriteMessage("\nФайл не найден.");
  11.         return;
  12.     }
  13.  
  14.     using (Database sourceDb = new Database(false, true))
  15.     {
  16.         try
  17.         {
  18.             sourceDb.ReadDwgFile(sourceFilePath, FileShare.Read, true, "");
  19.             sourceDb.CloseInput(true);
  20.  
  21.             // Собираем все блоки
  22.             ObjectIdCollection blockIds = new ObjectIdCollection();
  23.             List<string> blockNames = new List<string>();
  24.  
  25.             using (Transaction trSrc = sourceDb.TransactionManager.StartTransaction())
  26.             {
  27.                 BlockTable btSrc = (BlockTable) trSrc.GetObject(sourceDb.BlockTableId, OpenMode.ForRead);
  28.  
  29.                 foreach (ObjectId id in btSrc)
  30.                 {
  31.                     BlockTableRecord btr = (BlockTableRecord) trSrc.GetObject(id, OpenMode.ForRead);
  32.                     if (!btr.IsAnonymous && !btr.IsLayout)
  33.                     {
  34.                         blockIds.Add(id);
  35.                         blockNames.Add(btr.Name);
  36.                     }
  37.                 }
  38.  
  39.                 trSrc.Commit();
  40.             }
  41.  
  42.             if (blockIds.Count == 0)
  43.             {
  44.                 ed.WriteMessage("\nВ исходном файле не найдено подходящих блоков.");
  45.                 return;
  46.             }
  47.  
  48.             // Копируем блоки
  49.             IdMapping idMap = new IdMapping();
  50.             sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, idMap, DuplicateRecordCloning.Replace, false);
  51.  
  52.             // Вставка блоков
  53.             using (Transaction tr = destDb.TransactionManager.StartTransaction())
  54.             {
  55.                 BlockTable bt = (BlockTable) tr.GetObject(destDb.BlockTableId, OpenMode.ForRead);
  56.                 BlockTableRecord ms = (BlockTableRecord) tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  57.  
  58.                 foreach (string name in blockNames)
  59.                 {
  60.                     if (bt.Has(name))
  61.                     {
  62.                         ObjectId btrId = bt[name];
  63.                         BlockReference br = new BlockReference(Point3d.Origin, btrId);
  64.                         ms.AppendEntity(br);
  65.                         tr.AddNewlyCreatedDBObject(br, true);
  66.                     }
  67.                 }
  68.  
  69.                 tr.Commit();
  70.             }
  71.  
  72.             ed.WriteMessage($"\nУспешно импортировано и вставлено блоков: {blockNames.Count}");
  73.         }
  74.         catch (System.Exception ex)
  75.         {
  76.             ed.WriteMessage($"\nОшибка: {ex.Message}");
  77.         }
  78.     }
  79. }

Код - C# [Выбрать]
  1.  public static void FindLinePairs()
  2.  {
  3.      Root z = GetIsometryFromJson(@"G:\DevProjects\Iso3DRepo\a62488f5-29fe-4525-b6e2-eb8ac404e237.json");
  4.    
  5.  
  6.      Document doc = Application.DocumentManager.MdiActiveDocument;
  7.      Database db = doc.Database;
  8.      Editor ed = doc.Editor;
  9.    
  10.      PolylineBlockAligner.ImportAndInsertBlocksFromDwg();
  11.      if (z.Pipes.Count > 0)
  12.      {
  13.          List<List<ObjectId>> vpList = new List<List<ObjectId>>();
  14.          using (Transaction trans = db.TransactionManager.StartTransaction())
  15.          {
  16.              BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  17.              BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  18.              int color = 10;
  19.              foreach (Pipe pipe in z.Pipes)
  20.              {
  21.                  foreach (Branch branch in pipe.Branches)
  22.                  {
  23.                      List<ObjectId> ids = new List<ObjectId>();
  24.  
  25.                      Point3dCollection points = new Point3dCollection();
  26.                      foreach (BranchObject item in branch.BranchObjects)
  27.                      {
  28.                          ObjectId layer = Debugger.CreateLayer(branch.Name.Replace('/', '-') + " " + item.ElementType + " --- " + item.Name.Replace('/', '-').Replace('=', ' '));
  29.  
  30.                          Point3d arrive = new Point3d(item.ArriveXPosition, item.ArriveYPosition, item.ArriveZPosition);
  31.                          Point3d leave = new Point3d(item.LeaveXPosition, item.LeaveYPosition, item.LeaveZPosition);
  32.  
  33.                          Point3d pointA = new Point3d(item.ElementXPosition, item.ElementYPosition, item.ElementZPosition);
  34.  
  35.                          points.Add(arrive);
  36.                          points.Add(pointA);
  37.                          points.Add(leave);
  38.                        
  39.                          using (MText mtext = new MText())
  40.                          {
  41.                              mtext.TextHeight = 5;
  42.                              mtext.Attachment = AttachmentPoint.MiddleLeft;
  43.                              mtext.Contents = item.ToString();
  44.                            //  mtext.Contents = item.ElementType;
  45.                              mtext.ColorIndex = color;
  46.                              mtext.Location = pointA;
  47.                              mtext.Normal = new Vector3d(-0.5774, -0.5774, 0.5774);
  48.                              mtext.Direction = new Vector3d(0.7071, -0.7071, 0);
  49.                              btr.AppendEntity(mtext);
  50.                              trans.AddNewlyCreatedDBObject(mtext, true);
  51.                              mtext.LayerId = layer;
  52.                          }
  53.                          
  54.                          Polyline3d polyline3D;
  55.                          if (item.ElementType.Contains("BEND"))
  56.                          {
  57.                              polyline3D = new Polyline3d(Poly3dType.QuadSplinePoly, points, false);
  58.                          }
  59.                          else if (item.ElementType.Contains("ELBOW"))
  60.                          {
  61.                              polyline3D = new Polyline3d(Poly3dType.CubicSplinePoly, points, false);
  62.                          }
  63.                          else
  64.                          {
  65.                              polyline3D = new Polyline3d(Poly3dType.SimplePoly, points, false);
  66.                          }
  67.                          polyline3D.LineWeight = LineWeight.LineWeight080;
  68.                          polyline3D.ColorIndex = color;
  69.  
  70.                          polyline3D.LayerId = layer;
  71.                          btr.AppendEntity(polyline3D);
  72.                          trans.AddNewlyCreatedDBObject(polyline3D, true);
  73.                          XDataUtilities.AddJsonXDataToObject(polyline3D.ObjectId, item);
  74.                          ids.Add(polyline3D.ObjectId);
  75.                          points.Clear();
  76.                          if (item.ElementType.Contains("VALVE"))
  77.                          {
  78.                              BlockUtilities.InsertAndAlignValveBlock(pointA, polyline3D.ObjectId);
  79.                          }
  80.                          if (item.ElementType.Contains("FLANGE"))
  81.                          {
  82.                              BlockUtilities.InsertAndAlignFlangeBlock(pointA, polyline3D.ObjectId);
  83.                          }
  84.                      }
  85.  
  86.                      // Создаем 3D полилинию
  87.                      color += 5;
  88.                      vpList.Add(ids);
  89.                      //ids.Clear();
  90.                  }
  91.              }
  92.              trans.Commit();
  93.          }
  94.        
  95.      }
  96.      else
  97.      {
  98.          ed.WriteMessage("\nПары линий с общей точкой не найдены.");
  99.      }
  100.  
  101.      ViewSetter viewSetter = new ViewSetter();
  102.      viewSetter.SetSouthWestIsometricViewInModelSpace();
  103.      ed.Regen();
  104.  }
50
Подскажите куда копать.

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);
Страницы: 1 ... 3 4 [5] 6 7 ... 10