明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1779|回复: 5

[求助]帮忙看一下程序,不理解

[复制链接]
发表于 2008-3-14 21:28:00 | 显示全部楼层 |阅读模式

这是我前一段在网上见到的,下来学习学习可有些地方没看懂,望大侠指点。它最终完成的是什么

(defun c:pl_pur  ()
 ;;按选择目录对文件批量提纯纠错
 ;;(c:pl_pur)
 (VL-LOAD-COM)
 (setq AcadObject   (vlax-get-acad-object)
       AcadDocument (vla-get-ActiveDocument Acadobject)
       mSpace     (vla-get-ModelSpace Acaddocument))
 (setvar "CMDECHO" 0)
 (setq pff (dos_getfilem
     "请选择处理的文件,如果只选择其中一幅,则将目录下图形全部选择"
     (if (= filepath nil)
      (getvar "TEMPPREFIX")
      filepath)
     "Drawing files (*.dwg)|*.dwg||"))
 (setq delete_list (list (list "INSERT" "CASS40")
    (list "INSERT" "njcknfy")
    (list "INSERT" "njck1")))
 (if (/= nil pff)
  (progn
   (cond ((= (length pff) 2)
   (progn (setq filepath (car pff))
   (setq pff_aa (vl-directory-files filepath "*.dwg" 1))))
  ((> (length pff) 2)
   (progn (setq filepath (car pff)) (setq pff_aa (cdr pff))))
  (t nil))
   (setq pff_i 0)
   (repeat (length pff_aa)
    (setq Docsets (vla-get-Documents (vla-get-application AcadDocument)))
    (setq
     NewDrawing1 (vla-open Docsets (strcat filepath (nth pff_i pff_aa))))
    (vla-purgeall NewDrawing1)

以下部分看也看不懂,指点一下
    (vla-auditinfo NewDrawing1 :vlax-true)
    (setq groupssel (vla-get-groups NewDrawing1))
    (vlax-for obj groupssel (vla-delete obj))
    (setq delete_i 0
   mode    acselectionsetall)
    (setq old_EXTMIN (vla-getvariable NewDrawing1 "EXTMIN")
   old_EXTMAX (vla-getvariable NewDrawing1 "EXTMAX")
   ssetobj    nil)
    (while (nth delete_i delete_list)
     (if (= ssetobj nil)
      (setq ssetobj (vla-add (vla-get-selectionsets NewDrawing1) "SSET"))
      (vla-clear ssetobj))
     (setq filter_code (vlax-make-safearray vlax-vbinteger '(0 . 1)))
     (setq filter_value (vlax-make-safearray vlax-vbvariant '(0 . 1)))
     (vlax-safearray-fill filter_code '(0 2))
     (vlax-safearray-fill filter_value (nth delete_i delete_list))
     (vla-select ssetobj mode old_EXTMIN old_EXTMAX filter_code filter_value)
     (vlax-for blkobj ssetobj (vla-delete blkobj))
     (setq delete_i (1+ delete_i)))
    (vla-save NewDrawing1)
    (vla-close NewDrawing1)
    (setq pff_i (1+ pff_i)))))
 (alert (strcat "\n批量提纯纠错完成,共处理了" (itoa (length pff_aa)) "幅图!")))

发表于 2008-3-14 23:16:00 | 显示全部楼层
defun c:pl_pur  ()
 ;;按选择目录对文件批量提纯纠错
 ;;(c:pl_pur)
 (VL-LOAD-COM);;加载公用库函数以支持VL
 (setq AcadObject   (vlax-get-acad-object);;AutoCAD应用程序对象
       AcadDocument (vla-get-ActiveDocument Acadobject);;AutoCAD文档对象
       mSpace     (vla-get-ModelSpace Acaddocument));;AutoCAD模型空间对象
 (setvar "CMDECHO" 0);;设置系统变量,在LISP程序运行时不显示命令语句(在程序中使用"COMMAND"时才有需要用到)
 (setq pff (dos_getfilem ;;应该是调用了DOSLIB中的函数,这个我没有使用经验,不是很了解估计是打开文件的对话框
     "请选择处理的文件,如果只选择其中一幅,则将目录下图形全部选择"
     (if (= filepath nil)
      (getvar "TEMPPREFIX");;如果FILEPATH值为空,将系统临时文件目录路径赋值给DOS_GETFILEM 的参数
      filepath)
     "Drawing files (*.dwg)|*.dwg||"))
 (setq delete_list (list (list "INSERT" "CASS40");;定义变量DELETE_LIST
    (list "INSERT" "njcknfy")
    (list "INSERT" "njck1")))
 (if (/= nil pff)
  (progn;;如果上面文件对话框返回值不为空,即用户选择了文件或目录时进入下面的LISP命令组
   (cond ((= (length pff) 2);;如果PFF值为LISP类型,且长度为2
   (progn (setq filepath (car pff));;获取文件路径,为PFF表的第一个值
   (setq pff_aa (vl-directory-files filepath "*.dwg" 1))));;并获取文件路径下所有*.DWG文件名表存入变量PFF_AA中
  ((> (length pff) 2);;如果PFF值为LISP类型,且长度>2
   (progn (setq filepath (car pff)) (setq pff_aa (cdr pff))));;;;获取文件路径,为PFF表的第一个值,将PFF_AA赋值为PFF的CDR值,获取文件名称表
  (t nil));;遇到除以上两种情况以外的情况时,返回空
   (setq pff_i 0);;赋值PFF_I为0
   (repeat (length pff_aa);;进入循环,次数为PFF_AA的表长度值
    (setq Docsets (vla-get-Documents (vla-get-application AcadDocument)));;获取CAD应用程序文档集合对象,多文档版本才支持
    (setq
     NewDrawing1 (vla-open Docsets (strcat filepath (nth pff_i pff_aa))));;打开PFF_AA列表中的第PFF_I个DWG文件
    (vla-purgeall NewDrawing1);;清理图形中未使用对象

以下部分看也看不懂,指点一下
    (vla-auditinfo NewDrawing1 :vlax-true);;对于发现的每个出错,AutoCAD 提供出错的描述并推荐修正动作
    (setq groupssel (vla-get-groups NewDrawing1));;获取文档的groups集合
    (vlax-for obj groupssel (vla-delete obj))删除GROUPS中的所有对象
    (setq delete_i 0
   mode    acselectionsetall);;设置常量acselectionsetall,这个常量是选择命令VLA-SELECT的选择方式值,为全部选择
    (setq old_EXTMIN (vla-getvariable NewDrawing1 "EXTMIN");;获取系统变量存储窗口左下角坐标
   old_EXTMAX (vla-getvariable NewDrawing1 "EXTMAX");;获取系统变量存储右上角坐标
   ssetobj    nil)
    (while (nth delete_i delete_list);;********此处出错,未定义表DELETE_LIST*********

;;;;假定 定义DELETE_LIST部分语句没有贴上来,继续
     (if (= ssetobj nil)
      (setq ssetobj (vla-add (vla-get-selectionsets NewDrawing1) "SSET"));;如果SSETOBJ值为空,获取选择集
      (vla-clear ssetobj));;否则清空SSETOBJ
     (setq filter_code (vlax-make-safearray vlax-vbinteger '(0 . 1)));;创建数组
     (setq filter_value (vlax-make-safearray vlax-vbvariant '(0 . 1)));;创建数组
     (vlax-safearray-fill filter_code '(0 2));;设置数组FILTER_CODE的值为(LIST 0 2)
     (vlax-safearray-fill filter_value (nth delete_i delete_list));;设置FILTER_VALUE为DELETE_LIST中第DELETE_I个值
     (vla-select ssetobj mode old_EXTMIN old_EXTMAX filter_code filter_value);;选中CAD窗口中刷选DELETE_LIST中第DELETE_I个值
     (vlax-for blkobj ssetobj (vla-delete blkobj));;删除选到的对象
     (setq delete_i (1+ delete_i)));;循环指针
    (vla-save NewDrawing1);;保存文档
    (vla-close NewDrawing1);;关闭文档
    (setq pff_i (1+ pff_i)))));;文件循环指针
 (alert (strcat "\n批量提纯纠错完成,共处理了" (itoa (length pff_aa)) "幅图!")))

发表于 2008-3-14 23:24:00 | 显示全部楼层

以上程序的基本思路:

循环

         打开文档

         清理未使用对象

         调用vla-auditinfo 判断图形时候需要修复

           如果需要修复

           找出出错的图元对象并删除

          保存文档

结束循环

程序结束

发表于 2008-3-15 13:45:00 | 显示全部楼层

楼上的厉害  呵呵  太详细了  学习一下

 楼主| 发表于 2008-3-17 08:21:00 | 显示全部楼层
太谢谢了,我想提取一批图档里的某个图层、指定大小的文字,求高手给个函数和思路。
发表于 2012-12-3 02:10:36 | 显示全部楼层
xiaojinwen 发表于 2008-3-14 23:16
defun c:pl_pur  () ;;按选择目录对文件批量提纯纠错 ;;(c:pl_pur) (VL-LOAD-COM);;加 ...

非常感谢你认真的回答,有这些注释看起来快多了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-4 04:13 , Processed in 0.200144 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表