您当前的位置:主页>>AutoCAD>>AutoCAD二次开发  
           AutoCAD 中工程表格的检索方法

    在工程设计和计算中,数据表格的应用非常多。传统的编程方法是运用条件选择语句去分别检索,但是这种检索方法不仅速度慢,而且没有通用性,即每个数据表格都要编写特定的检索程序,对大型数据表格编写起来更加困难。其实,AutoLisp语言最大的特点是表的存储方式,如果我们将数据表格存储为表的形式并编写成数据文件,然后编写通用的数据检索程序去检索,不仅能提高数据检索的速度,而且能提高程序的通用性。

  工程数据表格虽然多种多样,但一般都可用下列形式概括。

    表头
   数据
变元
h1 h2 h3 h4
a1 b1 c1 d11 d12 d13 d14
b2 c2 d21 d22 d23 d24
c3 d31 d32 d33 d34
a2 b3 c4 d41 d42 d43 d44
b4 c5 d51 d52 d53 d54
c6 d61 d62 d63 d64
b5 c7 d71 d72 d73 d74
c8 d81 d82 d83 d84

  由于工程数据表格大多不大于三个变元,这里仅以三个变元为例。其数据文件(data1.lsp)一般写成如下形式,请注意书写的格式:

   (defun data1(h1 h2 h3 h4) ;定义表头

   ((a1 ((b1 ((c1 (d11 d12 d13 d14))

   )) ;此列双括号表示c变元定义结束

   (b2 ((c2 (d21 d22 d23 d24))

   (c3 (d31 d32 d33 d34))

   ))

   )) ;此列双括号表示b变元定义结束

   (a2 ((b3 ((c4 (d41 d42 d43 d44))

   ))

   (b4 ((c5 (d51 d52 d53 d54))

   (c6 (d61 d62 d63 d64))

   ))

   (b5 ((c7 (d71 d72 d73 d74))

   (c8 (d81 d82 d83 d84))

   ))

   ))

   ) ;这个括号表示a变元定义结束

   ) ;最后一个括号表示整个表格定义结束

  通用检索函数(find.lsp)定义如下:

  (defun find (a b c dataname)

   (load ″fwcx″) ;装入范围查询函数

   (setq head (car(eval(read dataname))));取相应的表头

   (setq data (cadr(eval(read dataname))));取数据表格中的数据

   (setq data ;返回查询a变元后剩余的表

   (if (listp (car(car data))) ;如果变元不是原子,则选用

   (fwcx a data) (cadr(assoc a data)) ;范围查询

   )

   )

   (setq data ;返回查询b变元后剩余的表

  (if (listp (car(car data)))

   (fwcx b data) (cadr(assoc b data))

   )

   )

   (setq data ;返回查询c变元后剩余的表

   (if (listp (car (car data)))

   (fwcx c data) (cadr(assoc c data))

   )

   )

   (setq j 0)

   (repeat (length head) ;将最后返回的表的每个原子赋

   (setq headz (nth j head)) ;给相应的表头变量

   (set headz (nth j data))

   (setq j (1+ j))

   )

   data)

  其中,范围查询函数(fwcx.lsp)定义如下:

  (defun fwcx(m zt)

   (setq j 0)

   (repeat(length zt)

   (setq zt1

   (list

   (apply ′and

   (list

   (apply (car(car(car(nth j zt)))) (list m (cadr(car(car(nth j zt))))))

   (apply (car(cadr(car(nth j zt)))) (list m (cadr(cadr(car(nth j zt))))))

   )

   )

   (cadr (nth j zt)))

   )

   (if (setq ztt (apply ′if zt1)) (setq zt2 (cadr zt1)) )

   (setq j (1+ j))

   )

   zt2

  )

  查询函数find的使用方法是先装入数据文件,然后调用函数进行查询。方法如下:

   (load″data1.lsp″) (load″find.lsp″) (find ′a2 ′b4 ′c6 ″data1″)

  函数调用返回值为(d61 d62 d63 d64),表头变量的值与其一一对应。

  在实际运用中,还应注意以下问题:

  1) 当变元个数不足三个时,应将相应变元数据空出,用其对应的原子代替,变元应用的优先级是c>b>a。

  2) 当变元不是固定的数值,而是相应的数据范围,只需用相应的逻辑表代替其对应的变元位置即可。

       如下表:

基本尺寸m IT5 ITv6 IT7 IT8
≤3 4 6 10 14
>3-6 5 8 12 18
>6-10 6 9 15 22
>10-8 8 11 18 27

  其数据文件(data2.lsp)编写如下:

  (defun data2(IT5 IT6 IT7 IT8)

  ((a((b((((>0)(<=3)) (4 6 10 14)

   (((>3)(<=6) (5 8 12 18))

   (((>6)(<=10))(6 9 15 22))

   (((>10)(<=18)) (8 11 18 27))

  ))

  ))

  )

  )

  使用方法如下:

  (load ″data2″) (load″find″) (find ′a′b 5″data2″)

  3) 如果值不是一个数据值,而是多个值,只需用相应的表代替即可。

  4) 当表头也不是固定的数值,而是相应的数据范围时,需要在检索完表格的数据后,再对表头数据进行相应处理。

  如下所示表格和其对应的数据文件(data3.lsp):

    表头
   数据
变元
h1 h2 h3 h4
a1 b1 c1 d11 d12 d13 d14
b2 c2 d21 d22 d23 d24
c3 d31 d32 d33 d34
a2 b3 c4 d41 d42 d43 d44
b4 c5 d51 d52 d53 d54
c6 d61 d62 d63 d64
b5 c7 d71 d72 d73 d74
c8 d81 d82 d83 d84

  (defun data3(h1 h2 h3 h4)

   ((a((D((7((68 50) (86 65) (105 80)))

   (8 ((77 50) (98 65) ((119 80)))

   (9 ((93 50) (117 65) (142 80)))

   ))

   (E((6 ((43 32)(53 40) (66 50)))

   (7(((50 32)(61 40) (75 50)))

   (8((59 32)(73 40) (89 50)))

   ))

   ))

   ))

  如果要检索公差带为E,等级精度7,基本尺寸为22的孔的极限偏差值,相应的程序段如下:

   (load “data3.lsp”)(find‘a‘E 7“data3”)

   (setq d 22)

   (setq piancha (cond((and(>=d 10)(   ((and(>=d 18)(
   ((and(>=d 30)(
   )

   )

  5) 由于篇幅所限,此通用检索程序没有设出界检查,如果检索表格中并不存在的数据,便会出现错误,在使用时注意。

  注:本文所含程序均在AutoCAD R12 for Windows上调试通过。

民众工作室.制作      版权所有