明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3720|回复: 6

[求助]如何用lisp如何建立数据库

[复制链接]
发表于 2003-7-27 11:35:00 | 显示全部楼层 |阅读模式
如何用lisp  建立数据库,将零件的尺寸定义到数据库中,并方便lisp 调用
发表于 2003-7-28 10:51:00 | 显示全部楼层
我看,用记事本做txt数据库就可以,我成功将公差带中的数据引入到我的公差标注程序中。一般只是个读文件问题,有一个关键字做行标识就可以了。
发表于 2003-7-28 11:32:00 | 显示全部楼层
5.7  使用外部参数文件
依照外部参数文件提供的参数生成图线,是AutoLISP的一种典型实用模式。比如实现对某些过程连续测试结果数据的图形化转换功能,必然要使用到外挂绘图参数文件。由于AutoLISP文件处理功能的限制,这类文件的基本格式必须要满足用AutoLISP 程序读取的要求,就是下列条件:
•  必须是 ASCII码型的文本文件。
•  整个文件应是结构型的,结构的格式可自定义。
5.7.1  其它应用程序生成的参数文件
例如:某过程按相等的时间间隔测试温度和压力,将测试值画在图中,
       外挂数据文件为:00.T&,格式如下:
        1989.5.12.15:25  -------------------          测试开始的时间
        180  -----------------------------------          温度 1
        23.2  ----------------------------------          压力 1
        180.8 -----------------------------------          温度 2
        24 ---------------------------------------          压力 2
        180.2               
......

  这个文件由其它应用程序生成,长度仅受存储介质容量的限制,满足外挂数据文件基本格式的要求,绘图程序如下(T503.LSP):
  
   (Defun C:T& (/ f fn p v x0 y0)
        (SetQ f (StrCat (GetString"T& 文件名:") ".t&p")
              fn (Open f "r")
                p (GetPoint "\n绘图原点:") x0 (Car p) y0 (Cadr p)
           )
           (Read-Line fn)
           (SetQ v (AToF (Read-Line fn)))
           (Read-Line fn)
           (Command "color" 1 "pline" (List x0 (+ y0 (- v 150))))
           (While (SetQ v (Read-Line fn))
                   (SetQ v (AToF v) x0 (+ 5 x0))
                   (Read-Line fn)
                   (Command (List x0 (+ y0 (- v 150))))
           )
           (Close fn) (Command "")

           (SetQ fn (Open f "r") x0 (Car p) y0 (Cadr p))
           (Read-Line fn) (Read-Line fn)     
           (SetQ v (AToF (Read-Line fn)))
           (Read-Line fn)
           (Command "color" 3 "pline" (List x0 (+ y0 (- v 20))))
           (While (SetQ v (Read-Line fn))
                   (SetQ v (AToF v) x0 (+ 5 x0))
                   (Read-Line fn)
                   (Command (List x0 (+ y0 (- v 20))))
           )
           (Close fn) (Command "")
   )

这是使用“一行一个数据”的最基本的格式。可以有选择地把相关数据文件中的有关数据取出,画线。读取数据时,应当跳过测试时间等用作标记的文件行。用PLine画线,是为了将来容易做各种编辑处理。
5.7.2  AutoLISP 程序专用的外部数据文件
这样的数据文件是为 AutoLISP 应用程序定制的,文件记录的结构最好是能够转换成“表”类型的数据:(12 33.5 "A1"....)。由于AutoLISP文件函数的功能局限,读入后当然是带括号的字符串,用 (Read) 函数处理读入的字符串,就能转换成标准的“表”。就可以接着用 AutoLISP 最善长的表处理功能函数来使用这些数据了。这是一种较好的数据文件结构,有利于程序优化和提高效率。
有些这样的数据文件是用别的程序生成的,虽然可以在一个记录行的头尾加上圆括号,但字符串类型的内容用双引号作界限比较麻烦(在程序中另加入双引号是较麻烦的)。如:
    ......
      (A10 2.4 GB276_205 100 20 3.7)
      ......
这样的描述在 (Read) 之后,表中其它项的内容并没有变化,但所有原来按字符串写的的数据类型都成了 SYM(符号),也就不能按字符串使用。符号转换成对应内容的字符串,可以使用 (VL-Prin1-To-String 表达式) 函数。
模拟程序如下(T504.LSP)
(Defun C:TSToC ()
      (SetQ f (Open (GetString "\n文件名: ") "r")
              n 1 ll '()
         )
        (While (SetQ rl (Read-Line f))  
                (SetQ rl (Read rl) rn 0 l '())
                (While (SetQ rr (Nth rn rl))  
                        (SetQ rn (1+ rn))                       
                        (If (= 'SYM (Type rr))     
                             (SetQ l (Cons
                                           (VL-Prin1-To-String  rr)
                                           l
                                        )
                              )       
                             (SetQ l (Cons rr l))
                         )
                 )
                 (SetQ ll (Cons (Reverse l) ll))
         )
         (Close f)
         (SetQ ll (Reverse ll))  
         (PrinC)
  )

5.7.3  读入外挂数据文件的结束处理
•  整个文件全部读完的识别和处理
如果文件是确定的记录行数,最多行数也不大于2147483647(这样长的文件极少用到),可用下边的模式:
          (打开文件)
          (Repeat 文件行数
                 (读入一行的过程描述)
                 (读入字符串理和使用描述)))
          )
          (关闭文件)
   
如果文件的格式是确定的,但记录行数不确定,为控制整个文件的读完,可使用函数(While (SetQ rl (Read-Line fc)) ……) 组成一个读入控制和处理过程。本书中有很多这样的实例,这里不再赘述。
•  文件中确定片段读完的识别和处理
这类数据文件的结构必须是事先设计好的,但不同文件的同一个结构片段的长度有可能不同,甚至某个片段可能没有记录。这就必然有一个“片段尾”的识别问题。
结构片段的尾标可自己设置,这个标记不应与正常记录中可能出现的内容重复,比如可以用:"----"、"*END*"、"|"之类的字符串,甚至仅是一个空的记录行。
每读入一行,都判断一下是否是相关的结构片断的尾标,是:转向下一个结构片段的读入。否:继续读本结构中的下一个记录行。
为了今后系统维护,应保留一个有详细说明的数据文件结构样板文件,说明这类数据文件的各个结构的先后顺序,格式及对应的尾符。
数据文件结构应当根据设计数据的需要组建,什么样的结构最方便、最完整,就设计成什么样的结构。这与使用通常的数据库软件不同,我们不受任何限制。
5.7.4  外挂数据文件与VLX程序包编译
        专业设计程序中,用户当然需要建立自己的工程数据库。其主要技术模式本书有大量的讨论,其中一种就是“外挂数据文件”,这种文件常常是文本文件,以“表”的数据结构填写(参见上边的讨论)、表达工程设计数据。当数据纪录数量巨大,为了便于维护,不便将数据直接写到程序中,会经常用到这种模式。
如果是编译运行,对于数据文件的打开和记录的读入,可能的方案有两种:
第一种情况是:用 Open/Read-xxx/Close 系列函数进行文件操作描述,编译成VLX之后也能正常运行。这种条件下,与上述程序相关的 *.TXT 数据文件也可以打包编译到VLX中,可实际上这是个假像。如果删除了相关的 *.TXT,程序将不能正常运行,将在文件操作中出错。可见这不是好方法。
第二种情况是:在程序中使用 (VL-Get-Resource  "TXT文件名") 函数进行文件内容的读取,这个函数将返回包装在VLX中的*.TXT文件中的全部内容。
参数<”TXT文件名”>是字符串,描述包装在VLX 中的 *.TXT文件。这种文件的扩展名只能是TXT,因此在表达式中不要写扩展名。运行编译之后程序,能够读出 *.TXT中的全部内容。如果删除了 *.TXT文件,VLX程序也能照样正常运行。可见这是真正的打包编译。参见如下例程:
(defun c:aa()
        (setq fil (vl-get-resource "00"))
        (princ fil )
        (princ)
)
00.TXT文件内容为:
(1 2 3 4)
(5 6 7 8)
(a b c d)

注意:
(VL-Get-Resource) 函数的设计构思比较古怪,当以解释方式运行时,上述程序的fil变量将返回nil,这说明,这个函数的作者没准备让我们在解释运行下调试!
(VL-Get-Resource) 函数的功能也比较古怪,它会将附加文件的全部内容一下子完全读出来之后返回,无论这个文件有多长。所以笔者曾经怀疑,过长的文件会造成数据溢出,目前最大的数据文件用到过1.5M大小,还没有发现问题。
(VL-Get-Resource) 函数的返回值也比较古怪,对于上述文件,返回结果是:
"(1 2 3 4)\r\n(5 6 7 8)\r\n(a b c d)"
这种现象在AutoCAD2002中也没有改进。

这样的结果当然很难直接使用,比较合理的办法是进行数据预处理:
(SetQ fil (Read (StrCat “(“ fil “)”)))
返回结果:
((1 2 3 4) (5 6 7 8) (A B C D))
这样,数据就相当顺利了。

笔者碰到一个怪现象:如果成功执行了编译程序之后,再在解释运行下执行源程序,(VL-Get-Resource) 出错的现象不再发生,而fil也具有了正常的返回值。这真不可思议,笔者也无法解释。但是这却是一种极其有用的功能,使我们可以进行这种程序的解释运行调试了。方法是:
1〉        先简单地将数据文件读取的描述写好,编译、运行。
2〉        之后可以在不改动这些描述的条件下,添加后面的、更多的数据处理描述,且可以在解释状态下进行调试。
3〉        如果要更改TXT数据文件,得需要重新编译。
4〉        程序调试结束后,也应当重新编译,形成最后的应用程序包。
这样,包括有 VL-Get-Resource 函数的程序就能够方便地进行继续编写和调试了。完成之后,再重新编译一次即可。
典型实用程序设计模式的模拟程序如下(T536.LSP/T536.DCL/Gear-M.TXT):
;; T536.LSP --------------------------------------------------------------------------------------------------
(Defun C:Test001 ()
        (SetQ ft (VL-Get-Resource "gear-m")
                  fo (Read (StrCat "(" ft ")"))
                  fn 0
                  fl '()
        )
        (While (SetQ aa (Nth fn fo))
                    (SetQ ab (Nth (1+ fn) fo)
                           fl (Cons (StrCat (VL-Symbol-Name aa)
                                                            (VL-Symbol-Name ab)
                                             ) fl
                               )
                    )
                    (SetQ fn (+ fn 2))
           )
        (SetQ fl (Reverse (Cons "其它..." fl)))
        (New_Dialog "test001" (Load_Dialog "t536"))
        (Start_List "o")
        (ForEach aa fl (Add_List aa))
           (End_List)
        (Action_Tile "o" "(SetQ oo $Value)")
        (Start_Dialog)
        (PrinC (Nth (Read oo) fl)) (PrinC)
)

// T536.DCL --------------------------------------------------------
test001 : dialog
         { label = "Test001";
           : list_box
             { label = "选定润滑油..."; width = 40; key = "o"; }
           ok_cancel;
         }
               
Gear-M.TXT ----------------------------------------------------------
10号机油 HJ-10/7-13厘拖
20号机油 HJ-20/17-23厘拖
30号机油 HJ-30/27-33厘拖
40号机油 HJ-40/37-43厘拖
50号机油 HJ-50/47-53厘拖
70号机油 HJ-70/67-73厘拖
22号汽轮机油 HU-22/20-23厘拖
30号汽轮机油 HU-30/28-32厘拖
46号汽轮机油 HU-46/44-48厘拖
57号汽轮机油 HU-57/55-59厘拖

摘自《VisualLISP程序设计——技巧与范例》

点评

陈老师,建议他还是利用excel或者VFP吧,数据如果分层级,txt确实不好维护。  发表于 2013-12-19 19:44
发表于 2003-7-28 11:42:00 | 显示全部楼层
陈大哥的书里,包罗万象,几乎含盖诸多热点问题,一书在手,万事莫愁!不过,我更支持陈大哥在回答问题时,能多指教解决问题的思路,而不是具体的.....
发表于 2003-7-30 20:12:00 | 显示全部楼层
我也看了陈大哥的书拉~~~~

好啊~~
发表于 2003-8-7 08:21:00 | 显示全部楼层
能将程序贴上来,给大家用吗?
发表于 2003-9-1 21:26:00 | 显示全部楼层
陈大哥你有关你著的编程书籍在广州或东莞有没没买呀?我很想学习学。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 22:40 , Processed in 0.173253 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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