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

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

Страницы: 1 ... 6 7 [8] 9 10
71
AutoCAD .NET API / Ошибка записи содержимого json в xrecord
« Последний ответ от Atomohod 30-05-2025, 00:28:24 »
Здравствуйте. Столкнулся с проблемой что после отработки метода записи содержимого json в xrecord файл при повторном открытии выдает сообщение о необходимости восстановления. Но почему так ума не приложу. Json 813 кб, 23000 строк.
Мой код:
Код - C# [Выбрать]
  1. public class JsonXRecordCommands
  2. {
  3.     [CommandMethod("StoreJsonInXRecord")]
  4.     public void StoreJsonInXRecord()
  5.     {
  6.    
  7.         string jsonFilePath = @"G:\DevProjects\a62488f5-29fe-4525-b6e2-eb8ac404e237.json";
  8.  
  9.         try
  10.         {
  11.             // Чтение JSON-файла и преобразование в байты
  12.             string jsonString = File.ReadAllText(jsonFilePath);
  13.             byte[] fullData = Encoding.UTF8.GetBytes(jsonString);
  14.             int chunkSize = 100 * 1024; // 100 КБ
  15.  
  16.             // Создание списка для хранения частей данных
  17.             List<TypedValue> typedValues = new List<TypedValue>();
  18.             for (int i = 0; i < fullData.Length; i += chunkSize)
  19.             {
  20.                 int length = Math.Min(chunkSize, fullData.Length - i);
  21.                 byte[] chunk = new byte[length];
  22.                 Array.Copy(fullData, i, chunk, 0, length);
  23.                 typedValues.Add(new TypedValue((int) DxfCode.BinaryChunk, chunk));
  24.             }
  25.  
  26.             // Создание ResultBuffer из списка частей
  27.             ResultBuffer rb = new ResultBuffer(typedValues.ToArray());
  28.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  29.  
  30.             // Сохранение в XRecord
  31.             using (Transaction tr = db.TransactionManager.StartTransaction())
  32.             {
  33.                 DBDictionary nod = (DBDictionary) tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);
  34.                 string key = "MyJsonData";
  35.  
  36.                 ObjectId xrecId;
  37.                 if (nod.Contains(key))
  38.                 {
  39.                     xrecId = nod.GetAt(key);
  40.                 }
  41.                 else
  42.                 {
  43.                     Xrecord xrec = new Xrecord();
  44.                     nod.SetAt(key, xrec);
  45.                     tr.AddNewlyCreatedDBObject(xrec, true);
  46.                     xrecId = xrec.ObjectId;
  47.                 }
  48.  
  49.                 Xrecord xrec1 = (Xrecord) tr.GetObject(xrecId, OpenMode.ForWrite);
  50.                 xrec1.Data = rb;
  51.                 tr.Commit();
  52.             }
  53.         }
  54.         catch (Exception ex)
  55.         {
  56.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"Ошибка: {ex.Message}\n");
  57.         }
  58.     }
  59.  
  60.     [CommandMethod("RetrieveJsonFromXRecord")]
  61.     public void RetrieveJsonFromXRecord()
  62.     {
  63.         Database db = Application.DocumentManager.MdiActiveDocument.Database;
  64.         using (Transaction tr = db.TransactionManager.StartTransaction())
  65.         {
  66.             DBDictionary nod = (DBDictionary) tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead);
  67.             string key = "MyJsonData";
  68.  
  69.             if (nod.Contains(key))
  70.             {
  71.                 ObjectId xrecId = nod.GetAt(key);
  72.                 Xrecord xrec = (Xrecord) tr.GetObject(xrecId, OpenMode.ForRead);
  73.                 ResultBuffer rb = xrec.Data;
  74.  
  75.                 // Сбор всех частей данных
  76.                 List<byte> fullData = new List<byte>();
  77.                 foreach (TypedValue tv in rb.AsArray())
  78.                 {
  79.                     if (tv.TypeCode == (int) DxfCode.BinaryChunk)
  80.                     {
  81.                         byte[] chunk = (byte[]) tv.Value;
  82.                         fullData.AddRange(chunk);
  83.                     }
  84.                 }
  85.  
  86.                 // Преобразование в строку JSON
  87.                 string jsonString = Encoding.UTF8.GetString(fullData.ToArray());
  88.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"JSON: {jsonString}\n");
  89.             }
  90.             else
  91.             {
  92.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("XRecord не найден.\n");
  93.             }
  94.         }
  95.     }
  96. }


лог Автокад:
Подстановка [simplex.shx] вместо [CS_Gost2304.shx].
Выполняется регенерация модели.

Идет проверка объектов в таблице меток.
Правильных объектов: 237    Неправильных объектов: 0
Проверка объектов на правильность окончена.

    База данных чертежа спасена.

Проверка заголовка
Проверка таблиц
Проверка объектов, проход 1

Проход 1: проверено объектов: 200    AcDbXrecord(535)                  восстановлен.
Проверка объектов, проход 2
Проход 2: проверено объектов: 200
Проверка блоков
 Проверено блоков: 8

Проверка AcDsRecords


Всего найдено ошибок: 1, исправлено: 1

Стерто 0 объектов
72
AutoCAD .NET API / Re: Transparency
« Последний ответ от avc 29-05-2025, 19:13:52 »
Да в API Автокада каждое первое свойство и метод могут вызвать исключения. А то и фатал Автокада. Надо по аккуратнее. Анализировать наиболее важные свойства прежде чем пытаться извлекать другие. Если IsInvalid, то зачем вы пытаетесь читать другие свойства? Transparency вроде не фаталит, но зачем? Зачем читать Alpha, если и так известно что IsClear, IsSolid, ByLayer или ByBlock ? Отлов исключений программу точно не ускорит.
73
AutoCAD .NET API / Re: Transparency
« Последний ответ от DimVer 29-05-2025, 17:14:03 »
Или что то вроде такого:

Код - C# [Выбрать]
  1. public class TransparencyDtoMapper
  2. {
  3.     private Transparency _transparency;
  4.     public TransparencyDtoMapper(Transparency transparency)
  5.     {
  6.         _transparency = transparency;
  7.     }
  8.     public TransparencyDto Map()
  9.     {
  10.         var transparencyDto = new TransparencyDto();
  11.  
  12.         try { transparencyDto.Alpha = _transparency.Alpha; } catch { };
  13.         try { transparencyDto.IsByAlpha = _transparency.IsByAlpha; } catch { };
  14.         try { transparencyDto.IsByBlock = _transparency.IsByBlock; } catch { };
  15.         try { transparencyDto.IsByLayer = _transparency.IsByLayer; } catch { };
  16.         try { transparencyDto.IsClear = _transparency.IsClear; } catch { };
  17.         try { transparencyDto.IsInvalid = _transparency.IsInvalid;} catch { }
  18.         try { transparencyDto.IsSolid = _transparency.IsSolid; } catch { };
  19.  
  20.         return transparencyDto;
  21.     }
  22. }
74
AutoCAD .NET API / Transparency
« Последний ответ от DimVer 29-05-2025, 17:05:08 »
Добрый день, не знаю вопрос больше про класс Transparency или про C#:

Есть такой вот код, который свойства мапит в DTO.
Код - C# [Выбрать]
  1. namespace CadApp.Mapping.Shared
  2. {
  3.     public class TransparencyDtoMapper
  4.     {
  5.         private Transparency _transparency;
  6.         public TransparencyDtoMapper(Transparency transparency)
  7.         {
  8.             _transparency = transparency;
  9.         }
  10.         public TransparencyDto Map()
  11.         {
  12.             if (_transparency.IsInvalid)
  13.             {
  14.                 return new TransparencyDto
  15.                 {
  16.                     Alpha = 255,
  17.                     IsByAlpha = false,
  18.                     IsByBlock = false,
  19.                     IsByLayer = false,
  20.                     IsClear = false,
  21.                     IsInvalid = true,
  22.                     IsSolid = false
  23.                 };
  24.             };
  25.  
  26.             return new TransparencyDto
  27.                 {
  28.                     Alpha = _transparency.Alpha,
  29.                     IsByAlpha = _transparency.IsByAlpha,
  30.                     IsByBlock = _transparency.IsByBlock,
  31.                     IsByLayer = _transparency.IsByLayer,
  32.                     IsClear = _transparency.IsClear,
  33.                     IsInvalid = _transparency.IsInvalid,
  34.                     IsSolid = _transparency.IsSolid
  35.                 };
  36.         }
  37.     }
  38. }

Подскажите пожалуйста, правильно я понимаю объект класса Transparenсy может быть валидным, но некоторые свойства при попытке получить их значения выкидват исключения.
Единственный вариант вычитать сначала все свойства через try catch и потом только проинициализировать DTO? Нет более правильного способа?
75
Словно не хватает такого же события на начале операции перемещения (Drag)
Посмотри события у DocumentCollection

using Cad = Autodesk.AutoCAD.ApplicationServices.Core.Application;
DocumentCollection docMen = Cad.DocumentManager

DocumentLockModeWillChange, после него наступает событие.
DocumentLockModeChanged

DocMen_DocumentLockModeChanged (DocumentCollection, DocumentLockModeChangedEventArgs)  Чертеж1.dwg Write, Write => NotLocked GlobalCommandName:GETCLIPDATA
DocMen_DocumentLockModeChanged (DocumentCollection, DocumentLockModeChangedEventArgs)  Чертеж1.dwg NotLocked, NotLocked => Write GlobalCommandName:#GETCLIPDATA
DocMen_DocumentLockModeChanged (DocumentCollection, DocumentLockModeChangedEventArgs)  Чертеж1.dwg Write, Write => NotLocked GlobalCommandName:DRAGENTER
DocMen_DocumentLockModeChanged (DocumentCollection, DocumentLockModeChangedEventArgs)  Чертеж1.dwg NotLocked, NotLocked => Write GlobalCommandName:#DRAGENTER
DocMen_DocumentLockModeChanged (DocumentCollection, DocumentLockModeChangedEventArgs)  Чертеж1.dwg Write, Write => NotLocked GlobalCommandName:DROPGEOM
DocMen_DocumentLockModeChanged (DocumentCollection, DocumentLockModeChangedEventArgs)  Чертеж1.dwg NotLocked, NotLocked => Write GlobalCommandName:#DROPGEOM
76
Тут не системная переменная, а реактор (событие). Воспользуйся MGDDBG или ARXDBG для отслеживания.
Здравствуйте! Добрался я до MGDDBG. И действительно, определил, что перетаскивание работает с рейзом событий документа doc.CommandWillStart и doc.CommandEnded с именем команды "DROPGEOM". Однако, не словить момента, когда я начал перемещать объекты. Словно не хватает такого же события на начале операции перемещения (Drag). Оба события с "DROPGEOM" рейзятся только когда отпускаю уже мышь.

В итоге, исходную задачу: определить какие именно объекты были перемещены драгом, я не смогу через это событие.
К моменту, когда оно отработает, у меня уже успеет отработать событие Document.ImpliedSelectionChanged и снимется выделение со всех ранее выделенных объектов. Потому что выделение снимается в момент старта самого перемещения.

77
Map 3D Object Data
78
AutoCAD .NET API / Re: BRep не работает с Surface
« Последний ответ от avc 30-04-2025, 17:20:02 »
Неожиданно, но это работает для всех подопытных поверхностей! Благодарю за помощь.
Код - C# [Выбрать]
  1.     public static SubentityId[]
  2.     GetAllEdges(this Entity entity)
  3.     {
  4.       if (entity is Db.Surface)
  5.       {
  6.         IntPtr pSubentityIdPE = entity.QueryX(Rt.RXObject.GetClass(typeof(AssocPersSubentityIdPE)));
  7.         if (pSubentityIdPE == IntPtr.Zero) return Array.Empty<SubentityId>();
  8.         using AssocPersSubentityIdPE subentityIdPE = Rt.RXObject.Create(pSubentityIdPE, false) as AssocPersSubentityIdPE;
  9.         if (subentityIdPE is null) return Array.Empty<SubentityId>();
  10.         return subentityIdPE.GetAllSubentities(entity, SubentityType.Edge);
  11.       }
  12.       else....
  13.     }
  14.  
  15. .....
  16.             SubentityId[] all = surface.GetAllEdges();
  17.             ObjectId gapSurfId = Db.Surface.CreateExtendSurface(surface.Id, all, gap, Db.Surface.EdgeExtensionType.StretchEdge, false);
  18.  
79
AutoCAD .NET API / Re: BRep не работает с Surface
« Последний ответ от Привалов Дмитрий 30-04-2025, 15:04:30 »
но он возвращает не объект, а int
https://stackoverflow.com/questions/53438729/autocad-associative-framework-getedgevertexsubentities-fatal-error

Код - C# [Выбрать]
  1. IntPtr pSubentityIdPE = entity.QueryX(protocolClass);
  2. if (pSubentityIdPE == IntPtr.Zero)
  3. {
  4.     return;
  5. }
  6. subentityIdPE = AssocPersSubentityIdPE.Create(pSubentityIdPE, false) as AssocPersSubentityIdPE;
  7. if (subentityIdPE == null)
  8. {
  9.   return;
  10. }
80
AutoCAD .NET API / Re: BRep не работает с Surface
« Последний ответ от avc 30-04-2025, 13:21:52 »
Да вот похоже, что вообще никто с ними не работал :) Примеров гуглится ноль. Я собственно с солидами работаю и чисто до кучи решил, что раз моя команда работает с солидами, то и с поверхностями обязана работать. А не тут-то было...

Как я понимаю объектов типа Surface не существует - это абстрактный класс-предок. В чертеже я тестировал плоские и nurbs-поверхности. Они-то и не работают с bRep.

Наличие метода GetAllSubentities у какого-то супер-экзотического AssocPersSubentityIdPE я нагуглил в примере на C++ под ARX. Там этом AssocPersSubentityIdPE получается из поверхности методом QueryX. В .Net тоже есть такой шаманский метод, но он возвращает не объект, а int. Так что никак не получить AssocPersSubentityIdPE. Да и, судя по названию, этот метод выдаст подобъекты ассоциативной поверхности; ассоциации, а не все ребра. А мне нужно работать с любыми поверхностями, включая не ассоциативные.
Страницы: 1 ... 6 7 [8] 9 10