Получить несколько аргументов при вызове arx функции из LISP

Автор Тема: Получить несколько аргументов при вызове arx функции из LISP  (Прочитано 6332 раз)

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

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

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: drunkwolfs
Как получить несколько аргументов при вызове arx функции из arx файла написанного на си++?
VS2010 Autocad2014 x64 ObjectARX2014 Win7

Вызываю из автокада функцию вот так
Код - Auto/Visual Lisp [Выбрать]
  1. (test 10 20)
Первый аргумент "10" принимается вот так:
Код - C++ [Выбрать]
  1. test_func(struct resbuf *first)
А как принять второй "20"?
« Последнее редактирование: 05-03-2016, 17:19:15 от Александр Ривилис »

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

  • ADN OPEN
  • Сообщений: 21
  • Карма: 1
  • Skype: drunkwolfs
Получилось. Сделал вот так
Код - C++ [Выбрать]
  1. testf(struct resbuf *rb)
  2. {
  3.     ads_real  x = (ads_real) rb->rbnext->resval.rint
  4. }

А как узнать сколько аргументов пришло?
« Последнее редактирование: 05-03-2016, 17:19:30 от Александр Ривилис »

Отмечено как Решение drunkwolfs 06-03-2016, 05:44:16

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Всё вышенаписанное не имеет ничего общего с передачей аргументов из lisp в arx.
2. Прочитай у меня в подписи как следует форматировать код на форуме.
3. Вот пример кода:
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6. //-----------------------------------------------------------------------------
  7. //----- ObjectARX EntryPoint
  8. class CTestLispApp : public AcRxArxApp {
  9. public:
  10.   CTestLispApp () : AcRxArxApp () {}
  11.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  12.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  13.     return (retCode) ;
  14.   }
  15.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  16.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  17.     return (retCode) ;
  18.   }
  19.  
  20.   virtual void RegisterServerComponents () {    }
  21.   //////////////////////////////////////////////////////////////////////////
  22.   //                 (SummArgs a1 a2 ... an)
  23.   // Суммируем все переданные аргументы. Возвращаем сумму
  24.   //////////////////////////////////////////////////////////////////////////
  25.   static int ads_SummArgs () {
  26.     double summ = 0.0;
  27.     resbuf *args = acedGetArgs();
  28.     resbuf *rb = args;
  29.     for (; rb; rb = rb->rbnext) {
  30.       if (rb->restype == RTREAL || rb->restype == RTANG)   {
  31.         summ += rb->resval.rreal;
  32.       } else if (rb->restype == RTSHORT) {
  33.         summ += rb->resval.rint;
  34.       }
  35.     }
  36.     acedRetReal(summ);
  37.     acutRelRb (args) ;
  38.     return (RTNORM) ;
  39.   }
  40. } ;
  41. //-----------------------------------------------------------------------------
  42. IMPLEMENT_ARX_ENTRYPOINT(CTestLispApp)
  43. ACED_ADSSYMBOL_ENTRY_AUTO(CTestLispApp, SummArgs, false)

Command: (summargs 1 2 3 4)
10.0

4. Чтобы узнать количество аргументов нужно пройтись до конца списка args и подсчитать все элементы. При этом следует учесть, что могут быть вложенные списки. В принципе из lisp в arx всё передаётся в виде одного списка, в котором содержатся последовательно все аргументы. У последнего resbuf в списке rbnext  == NULL.

Пару функций из моих загашников 20-летней давности:
Код - C++ [Выбрать]
  1. /*-----------------28/11/95 13:42-------------------
  2.                     LENGTH_LIST
  3.                   ----------------
  4.   Функция подсчитывает количество элементов списка
  5.  Если есть вложенные списки, то они также подсчитываются
  6.  c длиной 1.
  7.  Внимание:
  8.  Список указывается resbuf'ом следующим после RTLB
  9.  для этого списка
  10.  --------------------------------------------------*/
  11. int length_list(resbuf *start)
  12. {
  13.  
  14.  int i=0, count_par=0;
  15.  
  16.  do {
  17.  
  18.   if (start->restype == RTLB) count_par++;
  19.   if (start->restype == RTLE || start->restype == RTDOTE) count_par--;
  20.   if (count_par < 0) break;     // Завершающая скобка списка
  21.   if (count_par > 0) continue;  // Внутри вложенного списка
  22.   i++; // Увеличиваем счетчик числа элементов
  23.  
  24.  } while ((start = start->rbnext) != NULL);
  25.  
  26.  return i;
  27. }
  28. /*--------------------------------01/12/95 22:37----------------------------------
  29.                                     NEXT_PARAM
  30.                                   --------------
  31.     Функция пропускает текущий параметр в списке аргументов и возвращает
  32.     следующий параметр из списка параметров (первый resbuf данного элемента).
  33. --------------------------------------------------------------------------------*/
  34. resbuf *next_param (resbuf *prev)
  35. {
  36.   int count_par = 0;
  37.   resbuf  *next = NULL;
  38.  
  39.   if (prev->restype == RTLB) {
  40.     do {
  41.       if (prev->restype == RTLB) count_par++;
  42.       if (prev->restype == RTLE || prev->restype == RTDOTE) count_par--;
  43.       if (count_par) prev = prev->rbnext;
  44.             else     break;
  45.     } while (prev);
  46.  
  47.     if (prev && prev->rbnext) next = prev->rbnext;
  48.   }
  49.   else next = prev->rbnext;
  50.  
  51.   return next;
  52. }
« Последнее редактирование: 05-03-2016, 23:07:19 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение