Вызов Lisp-функции из Arx-приложения

Автор Тема: Вызов Lisp-функции из Arx-приложения  (Прочитано 8321 раз)

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

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

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Всем привет.
Как вызвать загруженную в сеансе Lisp-функцию из Arx-приложения?
Можно фрагмент кода?

Отмечено как Решение AndrewKuznets 28-01-2020, 15:27:18

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #1 : 27-01-2020, 11:37:34 »
1. Лучше переписать lisp-функцию на c++ - будет меньше проблем.
2. Далеко не каждую lisp-функцию можно вызвать из arx-приложения.
3. Если функция определённым образом подготовлена, то её можно вызвать через acedInvoke
Для этой цели функция должна или иметь префикс C: (как для команды) или зарегистрирована при помощи
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-acad-defun 'имя_функции)
4. Есть еще недокументированная функция:
Код - C# [Выбрать]
  1. int __cdecl acedEvaluateLisp(wchar_t const * lispExpression, struct resbuf * & result);
Ей можно передать на вход lisp-выражение (в виде строки) и получить результат.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #2 : 28-01-2020, 15:27:09 »
Спасибо, Александр.
Учту Ваши советы.

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #3 : 01-12-2020, 16:40:30 »
Александр, а если усложнить ситуацию?

Надо вызвать из arx приложения функцию в .net приложении. Напрямую - не знаю как. Но можно попробовать через Lisp.
Пробую вызывать с помощью acedEvaluateLisp. Если функция объявлена средствами lisp (через defun), то вызов срабатывает. Если функцию объявляю средствами .net (через LispFunction), то пишет ошибку: ; ошибка: неверный тип данных или переполнение данных: H

Я что-то не так делаю или такое в принципе невозможно?

Код - C# [Выбрать]
  1.         [LispFunction("AlxdSelectFileProc", "AlxdSelectFileProc")]
  2.         public ErrorStatus AlxdSelectFileProc(ResultBuffer args)
  3.         {
  4.             Console.Write(args);
  5.  
  6.             return ErrorStatus.OK;
  7.         }
  8.  

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #4 : 01-12-2020, 16:45:54 »
Я что-то не так делаю или такое в принципе невозможно?
Ничего невозможного нет. Какие параметры в функцию передаёшь?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #5 : 01-12-2020, 16:47:44 »
Как-то так

Код - C++ [Выбрать]
  1. Acad::ErrorStatus selectfileproc(  /*[out]*/ short* userCancel,
  2.                                    /*[out]*/ ACHAR*& chosenPath,
  3.                                              void* h, // HWND
  4.                                              const int nFlags,
  5.                                              const ACHAR* prompt,
  6.                                              const ACHAR* dir,
  7.                                              const ACHAR* name,
  8.                                              const ACHAR* type,
  9.                                              int* pnChoice,
  10.                                              bool* pbReadOnly,
  11.                                              const ACHAR* pszWSTags,
  12.                                              void* pReserved)
  13. {
  14.         ACHAR cmdstr[2048];
  15.         cmdstr[0] = '\0';
  16.  
  17.         ACHAR* dir2;
  18.         acutNewString(dir, dir2);
  19.  
  20.         ACHAR* tmp = dir2;
  21.         while (tmp = _tcsstr(tmp, _T("\\")))
  22.         {
  23.                 tmp[0]=_T('/');
  24.         }
  25.  
  26.         ACHAR* pszWSTags2 = NULL;
  27.         if (pszWSTags == NULL)
  28.                 acutNewString(_T(""), pszWSTags2);
  29.  
  30.         _stprintf(cmdstr, _T("(%s (list '(h . %d) '(nFlags . %d) '(PROMPT . \"%s\") '(DIR . \"%s\") '(NAME . \"%s\") '(TYPE . \"%s\") '(pnChoice . %d) '(pbReadOnly . %d) '(pszWSTags . \"%s\")))"), _T("AlxdSelectFileProc"), (int)h, nFlags, prompt, dir2, name, type, (int)pnChoice, (int)pbReadOnly, pszWSTags2);
  31.  
  32.         struct resbuf * value = NULL;
  33.         int ret;
  34.         //ret = acedEvaluateLisp("(AlxdSelectFileProc)", value);
  35.         ret = acedEvaluateLisp(cmdstr, value);
  36.  
  37.         //return:
  38.         //result     = result/fullpath
  39.         if (value == NULL)
  40.                 return Acad::eNotHandled;
  41.  
  42.         if (value->restype == RTSTR)
  43.         {
  44.                 *userCancel = false;
  45.                 if (acutNewString(value->resval.rstring, chosenPath) == Acad::eOk)
  46.                         return Acad::eOk;
  47.                 return Acad::eNotHandled;
  48.         }
  49.  
  50.         if (value->restype == RTSHORT)
  51.         {
  52.                 if (value->resval.rint == Acad::eOpenFileCancelled)
  53.                         *userCancel = true;
  54.  
  55.                 return (Acad::ErrorStatus)value->resval.rint;
  56.         }
  57.  
  58.         return Acad::eNotHandled;
  59. }
  60.  

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #6 : 01-12-2020, 16:51:33 »
А откуда ему знать что такое h, PROMPT и т.д.? Это глобальные переменные? Он их вычислить пытается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #7 : 01-12-2020, 16:56:43 »
Почему хоть?

selectfileproc принимает параметры от AutoCAD'а и тупо передает их в вызываемую функцию.
Я же написал, что если AlxdSelectFileProc объявить в Lisp'е, все работает. Но вот в .net вызов не приходит. Ругаецо, гад.

Код - C++ [Выбрать]
  1. acdbHostApplicationServices()->registerSelectFileCallback(_T("ALXDINTERCEPT"), (SELECTFILEPROC)selectfileproc);
  2.  

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #8 : 01-12-2020, 17:01:01 »
Почему хоть?

selectfileproc принимает параметры от AutoCAD'а и тупо передает их в вызываемую функцию.
Я же написал, что если AlxdSelectFileProc объявить в Lisp'е, все работает. Но вот в .net вызов не приходит. Ругаецо, гад.

Код - C++ [Выбрать]
  1. acdbHostApplicationServices()->registerSelectFileCallback(_T("ALXDINTERCEPT"), (SELECTFILEPROC)selectfileproc);
  2.  
В этом контексте лиспа может не быть вообще, т.е. его интерпретатор вообще может не работать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #9 : 01-12-2020, 17:06:08 »
Да он работает нормально уже лет 15, но если функция объявлена как:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun AlxdSelectFileProc( params / fullname pathlist tdms dlg obj tmp ret)
  2.    ...
  3. )
  4.  

Именно с .net  не проходит фокус.

Если объявить функцию вот так:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun AlxdSelectFileProc(params) (print params))
  2.  

Она вызывается и показывает входные параметры в виде списка. Но не в .net.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #10 : 01-12-2020, 17:10:44 »
Alxd,
Lisp и ObjectARX/.NET по разному передают параметры. Есть различные ограничения. Например, нельзя передать списки, похожие на dxf-коды, но не соответствующие этим стандартам. Т.е. список вида '((210 . "A")) недопустим.
В твоём случае замени '(h . %d) на '(\"h\" . %d) - возможно в таком виде и пройдёт.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #11 : 01-12-2020, 17:12:32 »
Именно с .net  не проходит фокус.
До .NET твои параметры не доходят вообще, потому что они не корректны с точки зрения передачи параметров в ObjectARX/.NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #12 : 01-12-2020, 17:21:25 »
Да, похоже ты прав. Надо их переименовать.

Но может имеется более элегантный способ? Минуя Lisp?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #13 : 01-12-2020, 17:22:56 »
Но может имеется более элегантный способ? Минуя Lisp?
Конечно есть. Только мороки с ним будет еще больше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alxd

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: Вызов Lisp-функции из Arx-приложения
« Ответ #14 : 01-12-2020, 17:26:25 »
Иииии? Скрытный ты наш! :)