1. Всё вышенаписанное не имеет ничего общего с передачей аргументов из lisp в arx.
2. Прочитай у меня в подписи как следует форматировать код на форуме.
3. Вот пример кода:
//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CTestLispApp : public AcRxArxApp {
public:
CTestLispApp () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
return (retCode) ;
}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
return (retCode) ;
}
virtual void RegisterServerComponents () { }
//////////////////////////////////////////////////////////////////////////
// (SummArgs a1 a2 ... an)
// Суммируем все переданные аргументы. Возвращаем сумму
//////////////////////////////////////////////////////////////////////////
static int ads_SummArgs () {
double summ = 0.0;
resbuf *args = acedGetArgs();
resbuf *rb = args;
for (; rb; rb = rb->rbnext) {
if (rb->restype == RTREAL || rb->restype == RTANG) {
summ += rb->resval.rreal;
} else if (rb->restype == RTSHORT) {
summ += rb->resval.rint;
}
}
acedRetReal(summ);
acutRelRb (args) ;
return (RTNORM) ;
}
} ;
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CTestLispApp)
ACED_ADSSYMBOL_ENTRY_AUTO(CTestLispApp, SummArgs, false)
Command: (summargs 1 2 3 4)
10.0
4. Чтобы узнать количество аргументов нужно пройтись до конца списка args и подсчитать все элементы. При этом следует учесть, что могут быть вложенные списки. В принципе из lisp в arx всё передаётся в виде одного списка, в котором содержатся последовательно все аргументы. У последнего resbuf в списке rbnext == NULL.
Пару функций из моих загашников 20-летней давности:
/*-----------------28/11/95 13:42-------------------
LENGTH_LIST
----------------
Функция подсчитывает количество элементов списка
Если есть вложенные списки, то они также подсчитываются
c длиной 1.
Внимание:
Список указывается resbuf'ом следующим после RTLB
для этого списка
--------------------------------------------------*/
int length_list(resbuf *start)
{
int i=0, count_par=0;
do {
if (start->restype == RTLB) count_par++;
if (start->restype == RTLE || start->restype == RTDOTE) count_par--;
if (count_par < 0) break; // Завершающая скобка списка
if (count_par > 0) continue; // Внутри вложенного списка
i++; // Увеличиваем счетчик числа элементов
} while ((start = start->rbnext) != NULL);
return i;
}
/*--------------------------------01/12/95 22:37----------------------------------
NEXT_PARAM
--------------
Функция пропускает текущий параметр в списке аргументов и возвращает
следующий параметр из списка параметров (первый resbuf данного элемента).
--------------------------------------------------------------------------------*/
resbuf *next_param (resbuf *prev)
{
int count_par = 0;
resbuf *next = NULL;
if (prev->restype == RTLB) {
do {
if (prev->restype == RTLB) count_par++;
if (prev->restype == RTLE || prev->restype == RTDOTE) count_par--;
if (count_par) prev = prev->rbnext;
else break;
} while (prev);
if (prev && prev->rbnext) next = prev->rbnext;
}
else next = prev->rbnext;
return next;
}