Списки AutoLISP
AcutBuildList() функция вызвана в сочетании и с acedRetList(), который возвращает структуру списка AutoLISP.
Следующий типовой кодовый фрагмент передает список четырех точек:
struct resbuf *res_list;
ads_point ptarray[4];
// Initialize the point values here.
.
.
.
res_list = acutBuildList(
RT3DPOINT, ptarray[0],
RT3DPOINT, ptarray[1],
RT3DPOINT, ptarray[2],
RT3DPOINT, ptarray[3], 0);
if (res_list == NULL) {
acdbFail("Couldn’t create list\n");
return BAD;
}
acedRetList(res_list);
acutRelRb(res_list);
Точечные пары и вложенные списки могут быть возвращены AutoLISP, вызывая acutBuildList () чтобы формировать список, созданный со специальными кодами типа строительства списка. Эти коды необходимы только для сложных списков. Для обычного (то есть одномерный) списки, acedRetList () можно пропускать простой список буферов результатов, как показано в предыдущем примере.
ОБРАТИТЕ ВНИМАНИЕ список, возвращенный AutoLISP acedRetList () может включать только следующие коды типа результата: RTREAL, RTPOINT, RTSHORT, RTANG, RTSTR, RTENAME, RTPICKS, RTORINT, RT3DPOINT, RTLB, RTLE, RTDOTE, RTNIL, и RTT. (Хотя имеется RTNIL код возврата, если Вы возвращаете только список ноля, Вы можете вызывать acedRetNil ()). Это может содержать типы результата RTLONG, если список возвращается другому ObjectARX-приложению.
Использование кодов типа строительства списка просто. В acutBuildList () запросу, вложенный список предшествует тип результата, закодируют RTLB (для Списка, начинают) и сопровождается типом результата, закодируют RTLE (для Списка Конец). Точечная пара может также быть создана. Точечные пары также начинаются с RTLB и конца с RTLE; точка обозначена типом результата, закодируют RTDOTE, и появляется между двумя членами пары.
ПРИМЕЧАНИЕ Это – изменение от более ранних версий. Приложения, которые не получают точечную пару от AutoLISP больше, должны изменить формат точечной пары перед возвращением этого с acedRetList () (. Более ранний порядок, с RTDOTE в конец, все еще поддерживается.)
ПРЕДУПРЕЖДЕНИЕ! AcutBuildList () функция не проверяет правильно построенный список AutoLISP. Например, если RTLB и коды RTLE не сбалансированы, эта ошибка не обнаружена. Если список хорошо не сформирован, AutoLISP может терпеть неудачу. Исключение кода RTLE, как гарантируют, будет фатальной ошибкой.
Следующий типовой кодовый фрагмент создает вложенный список, чтобы возвратиться AutoLISP:
res_list = acutBuildList(
RTLB, // Begin sublist.
RTSHORT, 1,
RTSHORT, 2,
RTSHORT, 3,
RTLE, // End sublist.
RTSHORT, 4,
RTSHORT, 5,
0);
if (res_list == NULL) {
acdbFail("Couldn’t create list\n");
return BAD;
}
acedRetList(res_list);
acutRelRb(res_list);
The list that this example returns to AutoLISP has the following form:
((1 2 3) 4 5)
The following code fragment constructs a dotted pair to return to AutoLISP:
res_list = acutBuildList(
RTLB, // Begin dotted pair.
RTSTR, "Sample",
RTDOTE,
RTSTR, "Strings",
RTLE, // End dotted pair.
0);
if (res_list == NULL) {
acdbFail("Couldn’t create list\n");
return BAD;
}
acedRetList(res_list);
acutRelRb(res_list);
Список, который этот пример возвращается AutoLISP, имеет следующую форму:
((“Sample” . “Strings”))
ОБРАТИТЕ ВНИМАНИЕ В AutoLISP, кодах группы DXF связери точечных пар и значениях. В ObjectARX-приложении это ненужно, потому что единственный{*отдельный*} буфер результатов содержит, и код группы (в его restype поле) и значении (в его resval поле). В то время как ObjectARX обеспечивает коды типа строительства списка как удобство, большинство ObjectARX-приложений не требует их.