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

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

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

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);
15
Добрый день.
Столкнулся с проблемой.
Опишу как можно подробнее.
Имеется динамический блок
контур полилиния, заполнение ассоциативная штриховка.
Есть таблица выбора с размерами.
Если вставить в чертеж блок и вручную менять свойство то всё работает прекрасно, размеры полилинии изменяются, и штриховка под них подстраивается.
Но если тоже самое сделать программно, то полилинии изменяются, а вот штриховка не перерисовывается, остаётся такого размера как была в редакторе блока.

Поведение в разных версиях автокад разное.
В 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.  

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

16
DIMTIH в 0
DIMTOH в 0

Благодарю, Александр!
18
Добрый всем день!
Пытаюсь нанести размеры на чертеж.
При установке линейных размеров, текст на них у меня всегда располагается горизонтально, даже для вертикальных размеров:



Вручную я могу зайти в диспетчер размерных стилей и изменить размерный стиль, во вкладке Текст есть настройка "ориентация текста" с возможностью установить "Вдоль размерной линии":



Я попытался создать новый размерный стиль путём копирования существующего, но всё-равно не пойму, где такие настройки стиля найти, чтобы удалось установить текст вдоль размерной линии:
Извините, вам запрещён просмотр содержимого спойлеров.
19
Есть ли возможность реализовать в Autolispe  вызов типа данных ref ? Как обойти эту проблему?
Нет. Не пытайся передавать C#<->VisualLisp COM/ActiveX объекты.
20
AutoCAD .NET API / Как реализовать тип данных ref Object[] в AutoLispe?
« Последний ответ от alex-63 03-06-2025, 13:47:20 »
Какой тип данных соответствует  ссылке (exampe  C#   ref par
Код - C# [Выбрать]
  1.         object par = new Object[] { "" };
  2.         Obj.GetMnParam(ref par, OBP_VALUES);
  3.  
)
На JavaScript
Код - Javascript [Выбрать]
  1. var arrParam = new Array();
  2.       Obj.GetMnParam(arrParam, OBP_VALUES); // Получаем значения параметров
  3.  


в AutoLispe?

Реализация на AutoLIspe:
Импортирую typelibrary
Код - Auto/Visual Lisp [Выбрать]
  1.   (vlax-Import-Type-Library :tlb-filename file :methods-prefix    "sm-" :properties-prefix "sp-" :constants-prefix   "sc-")
  2.  (setq  refpar (vlax-make-variant (vlax-make-safearray  vlax-vbObject (cons 0 0))))
  3. (defun ak_list->variantArray0 (ptsList)    
  4. (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray  vlax-vbvariant; element type
  5.                                           (cons 0 ;from
  6.                                                 (- (length ptsList) 1) ;to
  7.                                                 ) ; array dimension
  8.                                         )                      
  9.                         (mapcar 'vlax-make-variant ptsList)
  10.                      );fill
  11.     )                                  
  12. )
  13.  
(setq  refpar   (ak_list->variantArray0 '("")))
Ни этот (sm-GetMnParam obj refpar OBP_VALUES);
Ни этот вызов не работает (sm-GetMnParam  obj  'refpar OBP_VALUES);
Зато передача по значению срабатывает :
(setq  lPtsArray (ak_list->variantArray0 lPts)) ;     // получить массив координат
(if PL (sm-AddPoints PL  lPtsArray))
Есть ли возможность реализовать в Autolispe  вызов типа данных ref ? Как обойти эту проблему?

Страницы: 1 [2] 3 4 ... 10