Добавление в ResultBuffer

Автор Тема: Добавление в ResultBuffer  (Прочитано 2594 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Добавление в ResultBuffer
« : 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;

В чём магия?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавление в ResultBuffer
« Ответ #1 : 08-08-2022, 20:19:48 »
В чём магия?
Никакой магии. В первом коде ты не меняешь свойство xRecord.Data - меняется лишь созданная копия ResultBuffer.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Добавление в ResultBuffer
« Ответ #2 : 08-08-2022, 20:33:57 »
В чём магия?
Никакой магии. В первом коде ты не меняешь свойство xRecord.Data - меняется лишь созданная копия ResultBuffer.

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

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

Я просто получаю ссылку на ResultBuffer, который хранится в Data.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавление в ResultBuffer
« Ответ #3 : 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. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Добавление в ResultBuffer
« Ответ #4 : 08-08-2022, 20:44:03 »
А почему значение, потому что ResultBuffer это обёртка resbuf, так же как и XRecord?

Что такое <Module>?

Отмечено как Решение Lemieux 10-08-2022, 11:53:41

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавление в ResultBuffer
« Ответ #5 : 10-08-2022, 00:06:56 »
А почему значение, потому что ResultBuffer это обёртка resbuf, так же как и XRecord?
Потому что так реализовано.
Что такое <Module>?
Это то, что native/mixed. Воспользуйся утилитой ILSpy ( https://github.com/icsharpcode/ILSpy/releases/latest ) для дизассемблирования acdbmgd.dll
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Добавление в ResultBuffer
« Ответ #6 : 10-08-2022, 11:54:38 »
А почему значение, потому что ResultBuffer это обёртка resbuf, так же как и XRecord?
Потому что так реализовано.
Что такое <Module>?
Это то, что native/mixed. Воспользуйся утилитой ILSpy ( https://github.com/icsharpcode/ILSpy/releases/latest ) для дизассемблирования acdbmgd.dll

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