Идентифицировать примитив по записи в Xrecord

Автор Тема: Идентифицировать примитив по записи в Xrecord  (Прочитано 3658 раз)

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

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

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
День добрый,
Есть геометрический примитив - полилиния. Какие данные о ней нужно записать в Xrecord, чтобы потом можно было по этим данным идентифицировать эту полилинию. Возможно это - ObjectId, но тогда, как записать его  в Xrecord, чтобы потом его можно было считать как ObjectId?

Заранее благодарен!

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
не ObjectId, скорее нужно писать хендл, он не меняется.
У объекта базы данных есть метод acCurDb.GetObjectId() который принимает хендл и возвращает ObjectId.

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2

не ObjectId, скорее нужно писать хендл, он не меняется.
У объекта базы данных есть метод acCurDb.GetObjectId() который принимает хендл и возвращает ObjectId.
А как хендл из Xrecord достать?

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
А как хендл из Xrecord достать?

Вот примерно так XRecord добавляется к Entity

Код - C# [Выбрать]
  1.         public static void AddExtentionRecord(this Entity entity, string record, Handle handle)
  2.         {
  3.             Document doc = Application.DocumentManager.MdiActiveDocument;
  4.             using (DocumentLock docLoc = doc.LockDocument())
  5.             {
  6.                 Database db = doc.Database;
  7.  
  8.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  9.                 {
  10.                     ObjectId extId = entity.ExtensionDictionary;
  11.                     if (extId == ObjectId.Null)
  12.                     {
  13.                         entity.CreateExtensionDictionary();
  14.                         extId = entity.ExtensionDictionary;
  15.                     }
  16.                     DBDictionary dbExt = tr.GetObject(extId, OpenMode.ForWrite) as DBDictionary;
  17.  
  18.                     if (!dbExt.Contains(record))
  19.                     {
  20.                         Xrecord xRec = new Xrecord();
  21.                         ResultBuffer rb = new ResultBuffer{ new TypedValue((int)DxfCode.Handle, handle) };
  22.                         xRec.Data = rb;
  23.                         dbExt.SetAt(record, xRec);
  24.                         tr.AddNewlyCreatedDBObject(xRec, true);
  25.                     }
  26.                     tr.Commit();
  27.                 }
  28.             }
  29.         }

Получение XRecord в обратном порядке, просто сперва получаешь ExtensionDictionary сущности.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Балиев,
Это точно нужно или достаточно прописать XRecord в ExtensionDictionary полилинии и тогда искать не придется?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Балиев,
Это точно нужно или достаточно прописать XRecord в ExtensionDictionary полилинии и тогда искать не придется?
Нужно. Задача состоит в том, чтобы создав полилинию, затем, не "тыкая в нее", иметь возможность выбрать ее среди других примитивов.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Задача состоит в том, чтобы создав полилинию, затем, не "тыкая в нее", иметь возможность выбрать ее среди других примитивов.
Т.е. писать Xrecord ты будешь в NamedObjectsDictionary? И как идентифицировать, что это именно та полилиния?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Т.е. писать Xrecord ты будешь в NamedObjectsDictionary? И как идентифицировать, что это именно та полилиния?
Да, писать я буду в NamedObjectsDictionary. В запись с определенным searchKey заносится Xrecord с идентификатором полилинии. Вопрос что это за идетификатор? Может быть и handle, но как записать его в Xrecord я знаю, а вот достать его оттуда у меня не получается.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Задача состоит в том, чтобы создав полилинию, затем, не "тыкая в нее", иметь возможность выбрать ее среди других примитивов.
Т.е. писать Xrecord ты будешь в NamedObjectsDictionary? И как идентифицировать, что это именно та полилиния?
Почему в NamedObjectsDictionary? Насколько я понял, Xrecord засовывается в словарь на примитиве как раз. Или я в очередной раз заблуждаюсь?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Отмечено как Решение Балиев 23-06-2022, 21:37:32

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Может быть и handle, но как записать его в Xrecord я знаю, а вот достать его оттуда у меня не получается.
Записываешь как строку и точно также считываешь как строку. Строку преобразуешь в long и используешь конструктор Handle с аргументом long.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Балиев, ИМХО проще всего записывать необходимые данные как раз как показал Lemieux. А вот что и в каком виде будет записываться / считываться - песня отдельная.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Почему в NamedObjectsDictionary? Насколько я понял, Xrecord засовывается в словарь на примитиве как раз. Или я в очередной раз заблуждаюсь?
Можно и туда и туда.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Off-Topic: показать
Может быть и handle, но как записать его в Xrecord я знаю, а вот достать его оттуда у меня не получается.
Записываешь как строку и точно также считываешь как строку. Строку преобразуешь в long и используешь конструктор Handle с аргументом long.
Как раз недавно столкнулся с аналогичной задачей ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
откровенно говоря, я бы засовывал в примитив. NOD не сильно для таких телодвижений предназначен, как мне кажется.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Почему в NamedObjectsDictionary? Насколько я понял, Xrecord засовывается в словарь на примитиве как раз.
В принципе можно и так, но в этом случае для отыскания нужного примитива необходимо перебирать все примитивы. В случае же записи в NOD нужный примитив отыскивается напрямую по индентификатору. Мне кажется это более логично.