您當(dāng)前的位置:主頁>>AutoCAD>>AutoCAD二次開發(fā)  
           AutoCAD 中工程表格的檢索方法

    在工程設(shè)計(jì)和計(jì)算中,數(shù)據(jù)表格的應(yīng)用非常多。傳統(tǒng)的編程方法是運(yùn)用條件選擇語句去分別檢索,但是這種檢索方法不僅速度慢,而且沒有通用性,即每個(gè)數(shù)據(jù)表格都要編寫特定的檢索程序,對大型數(shù)據(jù)表格編寫起來更加困難。其實(shí),AutoLisp語言最大的特點(diǎn)是表的存儲(chǔ)方式,如果我們將數(shù)據(jù)表格存儲(chǔ)為表的形式并編寫成數(shù)據(jù)文件,然后編寫通用的數(shù)據(jù)檢索程序去檢索,不僅能提高數(shù)據(jù)檢索的速度,而且能提高程序的通用性。

  工程數(shù)據(jù)表格雖然多種多樣,但一般都可用下列形式概括。

    表頭
   數(shù)據(jù)
變元
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

  由于工程數(shù)據(jù)表格大多不大于三個(gè)變元,這里僅以三個(gè)變元為例。其數(shù)據(jù)文件(data1.lsp)一般寫成如下形式,請注意書寫的格式:

   (defun data1(h1 h2 h3 h4) ;定義表頭

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

   )) ;此列雙括號(hào)表示c變元定義結(jié)束

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

   (c3 (d31 d32 d33 d34))

   ))

   )) ;此列雙括號(hào)表示b變元定義結(jié)束

   (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))

   ))

   ))

   ) ;這個(gè)括號(hào)表示a變元定義結(jié)束

   ) ;最后一個(gè)括號(hào)表示整個(gè)表格定義結(jié)束

  通用檢索函數(shù)(find.lsp)定義如下:

  (defun find (a b c dataname)

   (load ″fwcx″) ;裝入范圍查詢函數(shù)

   (setq head (car(eval(read dataname))));取相應(yīng)的表頭

   (setq data (cadr(eval(read dataname))));取數(shù)據(jù)表格中的數(shù)據(jù)

   (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) ;將最后返回的表的每個(gè)原子賦

   (setq headz (nth j head)) ;給相應(yīng)的表頭變量

   (set headz (nth j data))

   (setq j (1+ j))

   )

   data)

  其中,范圍查詢函數(shù)(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

  )

  查詢函數(shù)find的使用方法是先裝入數(shù)據(jù)文件,然后調(diào)用函數(shù)進(jìn)行查詢。方法如下:

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

  函數(shù)調(diào)用返回值為(d61 d62 d63 d64),表頭變量的值與其一一對應(yīng)。

  在實(shí)際運(yùn)用中,還應(yīng)注意以下問題:

  1) 當(dāng)變元個(gè)數(shù)不足三個(gè)時(shí),應(yīng)將相應(yīng)變元數(shù)據(jù)空出,用其對應(yīng)的原子代替,變元應(yīng)用的優(yōu)先級(jí)是c>b>a。

  2) 當(dāng)變元不是固定的數(shù)值,而是相應(yīng)的數(shù)據(jù)范圍,只需用相應(yīng)的邏輯表代替其對應(yīng)的變元位置即可。

       如下表:

基本尺寸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

  其數(shù)據(jù)文件(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) 如果值不是一個(gè)數(shù)據(jù)值,而是多個(gè)值,只需用相應(yīng)的表代替即可。

  4) 當(dāng)表頭也不是固定的數(shù)值,而是相應(yīng)的數(shù)據(jù)范圍時(shí),需要在檢索完表格的數(shù)據(jù)后,再對表頭數(shù)據(jù)進(jìn)行相應(yīng)處理。

  如下所示表格和其對應(yīng)的數(shù)據(jù)文件(data3.lsp):

    表頭
   數(shù)據(jù)
變元
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,等級(jí)精度7,基本尺寸為22的孔的極限偏差值,相應(yīng)的程序段如下:

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

   (setq d 22)

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

   )

  5) 由于篇幅所限,此通用檢索程序沒有設(shè)出界檢查,如果檢索表格中并不存在的數(shù)據(jù),便會(huì)出現(xiàn)錯(cuò)誤,在使用時(shí)注意。

  注:本文所含程序均在AutoCAD R12 for Windows上調(diào)試通過。

民眾工作室.制作      版權(quán)所有