明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2164|回复: 5

请教坐标点读入过程中遇到的问题

[复制链接]
发表于 2003-6-27 11:08:00 | 显示全部楼层 |阅读模式
各位大侠,请教一个问题
我有一组数据(文本格式),通过AUTOLISP程序可以直接读入绘出线段,但现在的问题是:我的数据实际上是多个线段构成,我手头的AUTOLISP程序只能一次性读入,将所有的数据绘成了一条线段,请教大侠指教一下,如何让LISP程序智能的读取我的文本数据,当其读到某个特定的情况,如遇到文本文件中的空行时自动结束上一条线的绘制,并自动读取后面的数据开始下一条线的绘制.
先对您的帮助致意最真诚的感谢!!!
发表于 2003-6-27 11:25:00 | 显示全部楼层
LISP读入的一般都是字符串,如果是空行,则读入"",可根据此判断
发表于 2003-6-27 11:30: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*"、"|"之类的字符串,甚至仅是一个空的记录行。
每读入一行,都判断一下是否是相关的结构片断的尾标,是:转向下一个结构片段的读入。否:继续读本结构中的下一个记录行。
为了今后系统维护,应保留一个有详细说明的数据文件结构样板文件,说明这类数据文件的各个结构的先后顺序,格式及对应的尾符。
数据文件结构应当根据设计数据的需要组建,什么样的结构最方便、最完整,就设计成什么样的结构。这与使用通常的数据库软件不同,我们不受任何限制。

摘自《VisualLISP程序设计——技巧与范例》
发表于 2003-6-28 09:23:00 | 显示全部楼层

有两种办法

1、在数据文件前边加几个控制参数,比如第一个控制参数说明你的第一条多段线有几个拐点,第二个控制参数说明你的第二条多段线有几个拐点,然后采用循环语句控制读入数据的过程和线段绘制过程;
   2、在数据文件中加标志点,当数据读到标志点时停止前一条线段的绘制,而从下一组数据开始绘制第二条线段。
 楼主| 发表于 2003-7-2 15:02:00 | 显示全部楼层
大侠,多谢了,我对AUTOLIP不熟,恳请大侠帮忙改改下面一个LISP程序,这个程序只能将所有数据绘成一条线,没有加判断语句。
先多谢了!!!
LISP程序如下:
; 可以将数据直接转换为点、直线、或多义线。
; 数据的每行开始与结尾处不能有空格。
; 修正:王敏 http://cadcam.126.com

   (defun C:ASC ( / f bm hi format input read-point line plist ss)
      (cond (  (eq "" (setq f (getstring "\nFile to read(文件名): "))))
            (  (not (setq f (open f "r")))
               (princ "\nCan't open file for input."))
            (t (initget "Space Comma")
               (setq format
                 (cond ((getkword "\nComma(逗号)/Space(空格) delimited <Comma>: "))
                       (t "Comma")))
               (initget "Copies Lines Nodes 3dpoly Pline")
               (setq input
                 (cdr (assoc
                   (cond
                      (  (getkword
                            "\nGenerate   Lines/Nodes/3Dpoly/<line>: "))
                      (t "line"))
                     '(("Lines" . ".line")
                       ("Copies"  .  ".copy")
                       ("Nodes" . ".point")
                       ("3Dpoly" . ".3dpoly")
                       ("line" . ".pline")))))
               (setq read-point (cond (  (eq format "Comma") cdf)
                                      (t sdf)))
               (setvar "cmdecho" 0)
               (command ".undo" "g")
               (setq bm (getvar "blipmode"))
               (setq hi (getvar "highlight"))
               (setvar "blipmode" 0)
               (princ "\nReading coordinate data...")
               (while (setq line (read-line f))
                      (cond (
;                        (setq line (strtrim line))
                               (setq line (read-point line))
                               (setq plist (append plist
                                  (cond (  (eq input ".pline")
                                           (list (noz line)))
                                        (t (list line))))))))
               (close f)
               (cond (  (eq input ".point")
                        (setvar "highlight" 0)
                        (command ".point" "0,0,0"
                                 ".copy" (setq ss (entlast)) "" "m" "0,0,0")
                        (apply 'command plist)
                        (command)
                        (entdel ss))
                     (  (eq input ".copy")
                        (princ "\nSelect objects to copy,")
                        (while (not (setq ss (ssget)))
                               (princ "\nNo objects selected,")
                               (princ " select objects to copy,"))
                        (setvar "highlight" 0)
                        (command ".copy" ss "" "m" "0,0,0")
                        (apply 'command plist)
                        (command))
                     (t (command input)
                        (apply 'command plist)
                        (command)))
               (command ".undo" "e")
               (setvar "highlight" hi)
               (setvar "blipmode" bm)))
      (princ)
   )

   (defun cdf (l)
     (command ".setvar" "lastpoint" l)
     (getvar "lastpoint")
   )

   (defun sdf (l)
      (read (strcat "(" l ")"))
   )

   (defun noz (p)
      (list (car p) (cadr p))
   )

   
(princ "\nC:ASC loaded.  Start command with ASC(用ASC命令调入点). ")
(princ)
 楼主| 发表于 2003-7-2 15:04:00 | 显示全部楼层
感谢大侠的热情帮助,恳请能帮忙修改一下上面的程式,再次感谢!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 18:28 , Processed in 0.192182 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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