Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 08-08-2022, 14:38:28

Название: Добавление в ResultBuffer
Отправлено: Lemieux от 08-08-2022, 14:38:28
Всех приветствую.

Вот такой код не работает, не добавляет запись

Код - C# [Выбрать]
  1. ObjectId xRecordId = dbExt.GetAt("DUAL");
  2. Xrecord xRecord = tr.GetObject(xRecordId, OpenMode.ForWrite) as Xrecord;
  3. xRecord.Data.Add(new TypedValue((int)DxfCode.Text, xp));

А такой работает

Код - C# [Выбрать]
  1. ObjectId xRecordId = dbExt.GetAt("DUAL");
  2. Xrecord xRecord = tr.GetObject(xRecordId, OpenMode.ForWrite) as Xrecord;
  3. ResultBuffer resultBuffer = xRecord.Data;
  4. resultBuffer.Add(new TypedValue((int)DxfCode.Text, xp));
  5. xRecord.Data = resultBuffer;

В чём магия?
Название: Re: Добавление в ResultBuffer
Отправлено: Александр Ривилис от 08-08-2022, 20:19:48
В чём магия?
Никакой магии. В первом коде ты не меняешь свойство xRecord.Data - меняется лишь созданная копия ResultBuffer.
Название: Re: Добавление в ResultBuffer
Отправлено: Lemieux от 08-08-2022, 20:33:57
В чём магия?
Никакой магии. В первом коде ты не меняешь свойство xRecord.Data - меняется лишь созданная копия ResultBuffer.

А какая разница? Ведь по идее в этой строке

Код - C# [Выбрать]
  1. ResultBuffer resultBuffer = xRecord.Data;

Я просто получаю ссылку на ResultBuffer, который хранится в Data.
Название: Re: Добавление в ResultBuffer
Отправлено: Александр Ривилис от 08-08-2022, 20:38:45
Я просто получаю ссылку на ResultBuffer, который хранится в Data.
Передаётся не ссылка, а значение (т.е. копия) ResultBuffer. Так сделано и в ObjectARX - есть пара методов (AcDbXrecord::rbChain и AcDbXrecord::setFromRbChain) - первый возвращает, а второй устанавливает значение. Ну а свойство Xrecord.Data - это лишь обертка над этими двумя методами:
Код - C# [Выбрать]
  1. // Autodesk.AutoCAD.DatabaseServices.Xrecord
  2. using System;
  3. using Autodesk.AutoCAD.Runtime;
  4.  
  5. public unsafe ResultBuffer Data
  6. {
  7.         get
  8.         {
  9.                 //IL_0003: Expected I, but got I8
  10.                 resbuf* ptr = null;
  11.                 int num = (int)<Module>.AcDbXrecord.rbChain(GetImpObj(), &ptr, <Module>.AcDbObject.database((AcDbObject*)GetImpObj()));
  12.                 if (num != 0)
  13.                 {
  14.                         throw new Autodesk.AutoCAD.Runtime.Exception((ErrorStatus)num);
  15.                 }
  16.                 object result;
  17.                 if (0L == (nint)ptr)
  18.                 {
  19.                         result = null;
  20.                 }
  21.                 else
  22.                 {
  23.                         IntPtr buffer = new IntPtr(ptr);
  24.                         result = new ResultBuffer(buffer, autoDelete: true);
  25.                 }
  26.                 return (ResultBuffer)result;
  27.         }
  28.         set
  29.         {
  30.                 int num = (int)<Module>.AcDbXrecord.setFromRbChain(GetImpObj(), value.GetImpObj(), <Module>.AcDbObject.database((AcDbObject*)GetImpObj()));
  31.                 if (num != 0)
  32.                 {
  33.                         throw new Autodesk.AutoCAD.Runtime.Exception((ErrorStatus)num);
  34.                 }
  35.         }
  36. }
Название: Re: Добавление в ResultBuffer
Отправлено: Lemieux от 08-08-2022, 20:44:03
А почему значение, потому что ResultBuffer это обёртка resbuf, так же как и XRecord?

Что такое <Module>?
Название: Re: Добавление в ResultBuffer
Отправлено: Александр Ривилис от 10-08-2022, 00:06:56
А почему значение, потому что ResultBuffer это обёртка resbuf, так же как и XRecord?
Потому что так реализовано.
Что такое <Module>?
Это то, что native/mixed. Воспользуйся утилитой ILSpy ( https://github.com/icsharpcode/ILSpy/releases/latest ) для дизассемблирования acdbmgd.dll
Название: Re: Добавление в ResultBuffer
Отправлено: Lemieux от 10-08-2022, 11:54:38
А почему значение, потому что ResultBuffer это обёртка resbuf, так же как и XRecord?
Потому что так реализовано.
Что такое <Module>?
Это то, что native/mixed. Воспользуйся утилитой ILSpy ( https://github.com/icsharpcode/ILSpy/releases/latest ) для дизассемблирования acdbmgd.dll

Спасибо, я пытаюсь разобраться в native/mixed, но пока я ещё слаб.