resbuf 结构包含一个指针字段,用于将结果缓冲区链接到列表中。可以通过在应用程序中声明结果缓冲区来静态分配结果缓冲区。当仅使用单个结果缓冲区(例如 byand)或只需要一个短列表时,可以执行此操作。但是,通过动态分配较长的列表更容易处理,并且 ObjectARX 函数返回的列表始终是动态分配的。返回链表的最常用函数之一是。rbnextacedGetVar()acedSetVar()acedGetArgs() 评估外部函数显示了外部子例程的 AutoLISP 调用格式,该子例程采用三种不同类型的参数:字符串、整数和实值: (doit pstr iarg rarg) 以下代码段演示如何使用此类调用序列实现函数。示例函数检查参数列表是否正确,并在对值进行操作之前在本地保存这些值(未显示操作)。该示例假定先前的调用已为外部子例程分配了函数代码 0,并且此应用程序定义的所有函数都至少采用一个参数:acedDefun() // Execute a defined function. int dofun() { struct resbuf *rb; char str[64]; int ival, val; ads_real rval; ads_point pt; // Get the function code. if ((val = acedGetFuncode()) == RTERROR) return BAD; // Indicate failure. // Get the arguments passed in with the function. if ((rb = acedGetArgs()) == NULL) return BAD; switch (val) { // Which function is called? case 0: // (doit) if (rb->restype != RTSTR) { acutPrintf("\nDOIT called with %d type.", rb->restype); acutPrintf("\nExpected a string."); return BAD; } // Save the value in local string. strcpy(str, rb->resval.rstring); // Advance to the next result buffer. rb = rb->rbnext; if (rb == NULL) { acutPrintf("\nDOIT: Insufficient number of arguments."); return BAD; } if (rb->restype != RTSHORT) { acutPrintf("\nDOIT called with %d type.", rb->restype); acutPrintf("\nExpected a short integer."); return BAD; } // Save the value in local variable. ival = rb->resval.rint; // Advance to the last argument. rb = rb->rbnext; if (rb == NULL) { acutPrintf("\nDOIT: Insufficient number of arguments."); return BAD; } if (rb->restype != RTREAL) { acutPrintf("\nDOIT called with %d type.", rb->restype); acutPrintf("\nExpected a real."); return BAD; } // Save the value in local variable. rval = rb->resval.rreal; // Check that it was the last argument. if (rb->rbnext != NULL) { acutPrintf("\nDOIT: Too many arguments."); return BAD; } // Operate on the three arguments. . . . return GOOD; // Indicate success break; case 1: // Execute other functions. . . . } } 注意:此示例在一个方面非常出色:是唯一返回应用程序不必显式释放的链表的 ObjectARX 全局函数。以下部分介绍管理列表所需内存的常用方法。acedGetArgs()
|
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-1-8 19:36
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.