;;;============================================================;;; 功能:批量遍历文件夹中的DWG文件,读取多段线总面积;;; 方式:直接打开每个图形(不依赖ObjectDBX,兼容所有版本);;; 命令:GetPolylineArea_Open;;;============================================================(vl-load-com);;; 调用Windows文件夹浏览对话框(defunBrowseForFolder(msg/shellfolderfolderObjpath)(setqshell(vlax-create-object"Shell.Application"))(setqfolder(vlax-invokeshell'BrowseForFolder0msg0))(iffolder(progn(setqfolderObj(vlax-get-propertyfolder'Self))(setqpath(vlax-get-propertyfolderObj'Path))))(vlax-release-objectshell)(ifpath(vl-string-right-trim"\\"path)nil));;; 检查并设置SDI模式(必须为0,允许多文档)(defunCheckSDIMode(/sdiVal)(setqsdiVal(getvar"SDI"))(if(=sdiVal1)(progn(princ"\n【警告】当前SDI系统变量为1(单文档模式),无法批量打开多个图形。")(princ"\n请将SDI设置为0后再运行本程序。")(princ"\n命令:SDI回车 -> 输入 0 回车")nil)t));;; 主函数(defunC:GetPolylineArea_Open(/folderPath outPath dwgList outFile acadObj totalArea doc modelSpace obj fullPath closeErr);; 1. 检查SDI模式(if(not(CheckSDIMode))(exit));; 2. 选择文件夹(setqfolderPath(BrowseForFolder"请选择存放DWG文件的文件夹"))(if(nullfolderPath)(progn(princ"\n未选择文件夹,程序退出。")(exit)))(if(not(vl-file-directory-pfolderPath))(progn(princ(strcat"\n错误:无效的文件夹路径-"folderPath))(exit)));; 3. 获取所有DWG文件列表(setqdwgList(vl-directory-filesfolderPath"*.dwg"1))(if(nulldwgList)(progn(princ"\n该文件夹下没有找到DWG文件!")(exit)))(princ(strcat"\n共发现 "(itoa(lengthdwgList))" 个DWG文件。"));; 4. 指定输出文本文件路径(setqoutPath(getfiled"保存面积统计结果"(getvar"dwgprefix")"txt"1))(if(nulloutPath)(exit));; 5. 打开输出文件(写入模式)(setqoutFile(openoutPath"w"))(if(nulloutFile)(progn(princ"\n错误:无法创建输出文件!")(exit)))(write-line"文件名\t\t总面积"outFile)(write-line"================================"outFile);; 6. 获取AutoCAD应用程序对象(setqacadObj(vlax-get-acad-object));; 7. 遍历每个DWG文件(foreachdwg dwgList(setqfullPath(strcatfolderPath"\\"dwg)totalArea0.0)(princ(strcat"\n正在处理: "dwg));; 尝试打开文档(setqdocnil)(if(not(vl-catch-all-error-p(setqdoc(vl-catch-all-apply'vla-open(list(vla-get-DocumentsacadObj)fullPath)))))(progn;; 获取模型空间(setqmodelSpace(vla-get-ModelSpacedoc))(vlax-forobj modelSpace(if(or(=(vla-get-ObjectNameobj)"AcDbPolyline")(=(vla-get-ObjectNameobj)"AcDb2dPolyline"))(if(and(vlax-property-available-pobj'Area)(not(zerop(vla-get-Areaobj))))(setqtotalArea(+totalArea(vla-get-Areaobj))))));; 关闭文档(不保存更改)(setqcloseErr(vl-catch-all-apply'vla-close(listdoc:vlax-false)))(if(vl-catch-all-error-pcloseErr)(princ(strcat"\n【警告】关闭文档时出错: "dwg)));; 写入结果(write-line(strcatdwg"\t\t"(rtostotalArea22))outFile);; 强制垃圾回收,减少内存占用(gc))(progn(princ(strcat"\n无法打开文件: "dwg" ,已跳过。"))(write-line(strcatdwg"\t\t(打开失败)")outFile))));; 8. 清理(closeoutFile)(princ(strcat"\n\n处理完成!结果已保存至:"outPath))(princ));;; 提供命令别名(princ"\n输入命令 GetPolylineArea_Open 启动批量面积统计(直接打开图形方式)。")(princ)cad 版本为2020,无法使用ObjectDBX方法,测试提示无close 方法,待查原因。