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

ADN Club => AutoCAD .NET API => Тема начата: Александр Ривилис от 02-08-2016, 10:47:38

Название: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Александр Ривилис от 02-08-2016, 10:47:38
Имейте в виду, что ENAME, скорее всего, не получится передать.
Передать получится. Будет небольшая проблема в преобразовании ENAME -> ObjectId (при помощи P/Invoke acdbGetObjectId)
Название: Re: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Дмитрий Загорулькин от 02-08-2016, 11:04:42
Интересно, а есть какие-нибудь устоявшиеся практики? Ведь не первый же случай, когда требуется объект, полученный в LISP, обработать .NET методом. Вы о таких случаях что-нибудь знаете? Я не вижу особого смысла в использовании именно ENAME, ведь идентификаторов объекта и так достаточно - ObjectID, Handle. А у объектов Civil есть еще и названия собственные, по которым можно их найти в чертеже.
Название: Re: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Александр Ривилис от 02-08-2016, 11:41:23
Интересно, а есть какие-нибудь устоявшиеся практики? Ведь не первый же случай, когда требуется объект, полученный в LISP, обработать .NET методом.
Я вижу несколько основных вариантов:
1. P/Invoke acdbGetObjectId - получение ObjectId из ENAME
2. Передавать сразу vla-ObjectId как число и из него получать ObjectId в .NET
3. Можно передать Handle как (шестнадцатиричную) строку и получить ObjectId по Handle в .NET
Название: Re: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Дмитрий Загорулькин от 02-08-2016, 14:42:21
Погуглил маленько. Да, похоже, что 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.
Название: Re: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Александр Ривилис от 02-08-2016, 14:45:52
Надо только разобраться в каком виде в метод .NET из LISP приходит ENAME.
Оп! Помоему оно сразу приходит в ObjectId. :)
Точнее TypeValue с LispDataType.ObjectId
Название: Re: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Александр Ривилис от 02-08-2016, 14:49:40
Цитата: Александр Ривилис от 02-08-2016, 11:41:23

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

По этому способу примеров не нашел, но, думаю, там тоже все не сильно сложно.
Не сложно но громоздко. Примеры есть и у нас на форуме: http://adn-cis.org/forum/index.php?topic=3119.msg12697#msg12697
Название: Re: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Дмитрий Загорулькин от 02-08-2016, 14:56:16
Оп! По моему оно сразу приходит в ObjectId.
ObjectId, которое Autodesk.AutoCAD.DatabaseServices.ObjectId? Нее, вряд ли, слишком шикарно, чтобы быть правдой :). Или Вы имеете в виду ObjectID, которое в виде Int64, которое хранится в Autodesk.AutoCAD.DatabaseServices.ObjectId.OldId?
Не сложно но громоздко. Примеры есть и у нас на форуме: http://adn-cis.org/forum/index.php?topic=3119.msg12697#msg12697
Нда... Сложно получается для универсального способа.
Название: Re: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Александр Ривилис от 02-08-2016, 14:59:46
ObjectId, которое Autodesk.AutoCAD.DatabaseServices.ObjectId? Нее, вряд ли, слишком шикарно, чтобы быть правдой :)
Тем не менее! Доверюсь Gile: https://forums.autodesk.com/t5/net/convert-entity-name-to-objectid/m-p/3674898#M31697
Название: Re: Как лучше передавать идентификатор объекта из VisualLsp в .NET
Отправлено: Дмитрий Загорулькин от 02-08-2016, 15:14:40
Проверил - так и есть :)
Код - 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)))