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

ADN Club => AutoCAD .NET API => Тема начата: Балиев от 23-06-2022, 15:45:42

Название: Идентифицировать примитив по записи в Xrecord
Отправлено: Балиев от 23-06-2022, 15:45:42
День добрый,
Есть геометрический примитив - полилиния. Какие данные о ней нужно записать в Xrecord, чтобы потом можно было по этим данным идентифицировать эту полилинию. Возможно это - ObjectId, но тогда, как записать его  в Xrecord, чтобы потом его можно было считать как ObjectId?

Заранее благодарен!
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Владимир Шу от 23-06-2022, 16:37:39
не ObjectId, скорее нужно писать хендл, он не меняется.
У объекта базы данных есть метод acCurDb.GetObjectId() который принимает хендл и возвращает ObjectId.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Балиев от 23-06-2022, 17:07:27

не ObjectId, скорее нужно писать хендл, он не меняется.
У объекта базы данных есть метод acCurDb.GetObjectId() который принимает хендл и возвращает ObjectId.
А как хендл из Xrecord достать?
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Lemieux от 23-06-2022, 17:58:41
А как хендл из 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 сущности.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Александр Ривилис от 23-06-2022, 19:58:18
Балиев,
Это точно нужно или достаточно прописать XRecord в ExtensionDictionary полилинии и тогда искать не придется?
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Балиев от 23-06-2022, 20:08:46
Балиев,
Это точно нужно или достаточно прописать XRecord в ExtensionDictionary полилинии и тогда искать не придется?
Нужно. Задача состоит в том, чтобы создав полилинию, затем, не "тыкая в нее", иметь возможность выбрать ее среди других примитивов.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Александр Ривилис от 23-06-2022, 20:12:11
Задача состоит в том, чтобы создав полилинию, затем, не "тыкая в нее", иметь возможность выбрать ее среди других примитивов.
Т.е. писать Xrecord ты будешь в NamedObjectsDictionary? И как идентифицировать, что это именно та полилиния?
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Балиев от 23-06-2022, 20:27:31
Т.е. писать Xrecord ты будешь в NamedObjectsDictionary? И как идентифицировать, что это именно та полилиния?
Да, писать я буду в NamedObjectsDictionary. В запись с определенным searchKey заносится Xrecord с идентификатором полилинии. Вопрос что это за идетификатор? Может быть и handle, но как записать его в Xrecord я знаю, а вот достать его оттуда у меня не получается.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Алексей Кулик от 23-06-2022, 20:31:43
Задача состоит в том, чтобы создав полилинию, затем, не "тыкая в нее", иметь возможность выбрать ее среди других примитивов.
Т.е. писать Xrecord ты будешь в NamedObjectsDictionary? И как идентифицировать, что это именно та полилиния?
Почему в NamedObjectsDictionary? Насколько я понял, Xrecord засовывается в словарь на примитиве как раз. Или я в очередной раз заблуждаюсь?
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Александр Ривилис от 23-06-2022, 20:32:53
Может быть и handle, но как записать его в Xrecord я знаю, а вот достать его оттуда у меня не получается.
Записываешь как строку и точно также считываешь как строку. Строку преобразуешь в long и используешь конструктор Handle с аргументом long.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Алексей Кулик от 23-06-2022, 20:33:13
Балиев, ИМХО проще всего записывать необходимые данные как раз как показал Lemieux. А вот что и в каком виде будет записываться / считываться - песня отдельная.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Александр Ривилис от 23-06-2022, 20:33:45
Почему в NamedObjectsDictionary? Насколько я понял, Xrecord засовывается в словарь на примитиве как раз. Или я в очередной раз заблуждаюсь?
Можно и туда и туда.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Алексей Кулик от 23-06-2022, 20:34:03
Off-Topic: показать
Может быть и handle, но как записать его в Xrecord я знаю, а вот достать его оттуда у меня не получается.
Записываешь как строку и точно также считываешь как строку. Строку преобразуешь в long и используешь конструктор Handle с аргументом long.
Как раз недавно столкнулся с аналогичной задачей ;)
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Алексей Кулик от 23-06-2022, 20:34:49
откровенно говоря, я бы засовывал в примитив. NOD не сильно для таких телодвижений предназначен, как мне кажется.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Балиев от 23-06-2022, 21:36:12
Почему в NamedObjectsDictionary? Насколько я понял, Xrecord засовывается в словарь на примитиве как раз.
В принципе можно и так, но в этом случае для отыскания нужного примитива необходимо перебирать все примитивы. В случае же записи в NOD нужный примитив отыскивается напрямую по индентификатору. Мне кажется это более логично.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Lemieux от 23-06-2022, 21:36:14
Балиев, ИМХО проще всего записывать необходимые данные как раз как показал Lemieux. А вот что и в каком виде будет записываться / считываться - песня отдельная.
Я и в NamedObjectDictionary писал, всё зависит от задачи. В NOD я пишу об общем состоянии чертежа, в сущности я пишу информацию, чтобы сущности знали друг о друге.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Балиев от 23-06-2022, 21:38:36
Записываешь как строку и точно также считываешь как строку. Строку преобразуешь в long и используешь конструктор Handle с аргументом long.
Спасибо! Собственно, ради этой подсказки я и отрывал тему.
Название: Re: Идентифицировать примитив по записи в Xrecord
Отправлено: Алексей Кулик от 24-06-2022, 09:29:37
А что будет, если хендл сменится? Например, после вставки чертежа в другой как внешней ссылки или блока? Или после _.wblock? А что будет происходить после удаления объекта? Или его копирования с удалением исходного? Проход по всем примитивам, как мне кажется, займет не так уж много времени, а результат будет гарантирован.
Но дело хозяйское.