Тема: Как передать список из LISP в ObjectARX?
Как создать функцию для LISP-а, аргументом которой является список? Например (sp (list 1 2 3)).
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Как передать список из LISP в ObjectARX?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как создать функцию для LISP-а, аргументом которой является список? Например (sp (list 1 2 3)).
Элементарно! :)
Расписываю по шагам. Для простоты описания используем ObjectARX Wizard.
1) Создаем при помощи ObjectARX Wizard новый проект (назовем его, например, LispFunction).
2) На панели ObjectARX Wizard выбираем ObjectARX Commands (крайняя левая иконка).
3) В появившемся диалоговом окне находим строку ADS symbols & commands
4) В первой пустой строке под ней нажимаем правую кнопку мыши и из меню выбираем New
5) В поле Symbol Name вводим имя функции (например, как ты просишь sp и указываем (это не обязательно, но желательно) Invok'able - True.
6) Нажимаем Ok - и на этом фактически все - ObjectARX Wizard создал нам заготовку функции:
// ----- ads_sp symbol (do not rename) static int ads_sp(void) { //----- Remove the following line if you do not expect any argument for this ADS function struct resbuf *pArgs =acedGetArgs () ; // TODO: add your code here // TODO: Replace the following line by your returned value if any acedRetVoid () ; return (RSRSLT) ; }
В переменной pArgs - указатель на связанный список переданных параметров.
Одно небольшое замечание. Список (list 1 2 3) будет передан в эту функцию не как список, а как 3d-точка, т.е. pArgs->restype == RT3DPOINT
Список (list 1 2) будет передан как 2d-точка, т.е. pArgs->restype == RTPOINT,
а вот список (list 1 2 3 4) уже будет передаваться как список, т.е.:
pArgs->restype == RTLB pArgs->rbnext->restype == RTSHORT и pArgs->rbnext->resval.rint == 1 pArgs->rbnext->rbnext->restype == RTSHORT и pArgs->rbnext->rbnext->resval.rint == 2 pArgs->rbnext->rbnext->rbnext->restype == RTSHORT и pArgs->rbnext->rbnext->rbnext->resval.rint == 3 pArgs->rbnext->rbnext->rbnext->rbnext->restype == RTSHORT и pArgs->rbnext->rbnext->rbnext->rbnext->resval.rint == 4 pArgs->rbnext->rbnext->rbnext->rbnext->rbnext->restype == RTLE
Вот пожалуй и все. Для возврата значения в lisp необходимо использовать одну из acedRetXXX-функций в зависимости от того, какой тип значения ты хочешь вернуть. acedRetVoid(), которую вписал ObjectARX Wizard ничего не возвращает.
P.S.: А вообще это все есть в ObjectARX Developer Guide. Только нужно внимательно посмотреть.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Как передать список из LISP в ObjectARX?
Форум работает на PunBB, при поддержке Informer Technologies, Inc