Как лучше передавать идентификатор объекта из VisualLsp в .NET

Автор Тема: Как лучше передавать идентификатор объекта из VisualLsp в .NET  (Прочитано 9261 раз)

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

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

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Имейте в виду, что ENAME, скорее всего, не получится передать.
Передать получится. Будет небольшая проблема в преобразовании ENAME -> ObjectId (при помощи P/Invoke acdbGetObjectId)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Интересно, а есть какие-нибудь устоявшиеся практики? Ведь не первый же случай, когда требуется объект, полученный в LISP, обработать .NET методом. Вы о таких случаях что-нибудь знаете? Я не вижу особого смысла в использовании именно ENAME, ведь идентификаторов объекта и так достаточно - ObjectID, Handle. А у объектов Civil есть еще и названия собственные, по которым можно их найти в чертеже.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Интересно, а есть какие-нибудь устоявшиеся практики? Ведь не первый же случай, когда требуется объект, полученный в LISP, обработать .NET методом.
Я вижу несколько основных вариантов:
1. P/Invoke acdbGetObjectId - получение ObjectId из ENAME
2. Передавать сразу vla-ObjectId как число и из него получать ObjectId в .NET
3. Можно передать Handle как (шестнадцатиричную) строку и получить ObjectId по Handle в .NET
« Последнее редактирование: 02-08-2016, 13:49:38 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Погуглил маленько. Да, похоже, что Id или Handle - оптимально. Вот тут даже есть пример: http://www.cadtutor.net/forum/showthread.php?60551-Lisp-eName-to-Net-DBObject&s=5c519ba0cfd6551846c22c784c209855
1. P/Invoke acdbGetObjectId - получение ObjectId из ENAME
По этому способу примеров не нашел, но, думаю, там тоже все не сильно сложно. Надо только разобраться в каком виде в метод .NET из LISP приходит ENAME.

Отмечено как Решение Александр Ривилис 02-08-2016, 15:23:29

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Надо только разобраться в каком виде в метод .NET из LISP приходит ENAME.
Оп! Помоему оно сразу приходит в ObjectId. :)
Точнее TypeValue с LispDataType.ObjectId
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитата: Александр Ривилис от 02-08-2016, 11:41:23

    1. P/Invoke acdbGetObjectId - получение ObjectId из ENAME

По этому способу примеров не нашел, но, думаю, там тоже все не сильно сложно.
Не сложно но громоздко. Примеры есть и у нас на форуме: http://adn-cis.org/forum/index.php?topic=3119.msg12697#msg12697
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Оп! По моему оно сразу приходит в ObjectId.
ObjectId, которое Autodesk.AutoCAD.DatabaseServices.ObjectId? Нее, вряд ли, слишком шикарно, чтобы быть правдой :). Или Вы имеете в виду ObjectID, которое в виде Int64, которое хранится в Autodesk.AutoCAD.DatabaseServices.ObjectId.OldId?
Не сложно но громоздко. Примеры есть и у нас на форуме: http://adn-cis.org/forum/index.php?topic=3119.msg12697#msg12697
Нда... Сложно получается для универсального способа.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
ObjectId, которое Autodesk.AutoCAD.DatabaseServices.ObjectId? Нее, вряд ли, слишком шикарно, чтобы быть правдой :)
Тем не менее! Доверюсь Gile: https://forums.autodesk.com/t5/net/convert-entity-name-to-objectid/m-p/3674898#M31697
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Проверил - так и есть :)
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.DatabaseServices;
  2. using Autodesk.AutoCAD.Runtime;
  3. using System;
  4.  
  5. namespace AcadTests
  6. {
  7.     public class LispEnameTest
  8.     {
  9.         [LispFunction("lispenametest")]
  10.         public TypedValue LispEnameTestRun(ResultBuffer args)
  11.         {
  12.             if ((args != null) && (args.AsArray().Length > 0))
  13.             {              
  14.                 Array argArray = args.AsArray();
  15.                 TypedValue tv = (TypedValue)argArray.GetValue(0);
  16.                 if (tv.TypeCode == (short)LispDataType.ObjectId)
  17.                 {
  18.                     ObjectId id = (ObjectId)tv.Value;
  19.                     return new TypedValue((int)LispDataType.T_atom);
  20.                 }
  21.             }
  22.  
  23.             return new TypedValue((int)LispDataType.Nil);
  24.         }
  25.     }
  26. }
  27.  

Код - Auto/Visual Lisp [Выбрать]
  1. (lispenametest (car (entsel)))