snight523 发表于 2015-10-30 11:46:18

求助能否实现将断面数据导入图中绘制成复合线的命令

本帖最后由 snight523 于 2015-10-30 11:47 编辑

断面线数据格式为.txt数据如下:(分别为复合线的坐标X和Y)
-5.145,449.757
-2.091,449.623
0.174,449.214
1.826,448.779
3.308,448.400
7.106,446.958
能否通过lisp命令 选择txt文件将这些数据用复合线绘制在图中?
求大侠帮忙。。

革天明 发表于 2015-10-30 12:53:16

(defun str-lst (lj / data_list ff data)
(setq        data_list '()
        ff          (open lj "r")
        data          (read-line ff)
)
(while data
    (setq data_list (cons data data_list)
          data          (read-line ff)
    )
)
(reverse data_list)
)
(defun sparser (str delim / ptr lst)
(while (setq ptr (vl-string-search delim str))
    (setq lst (cons (substr str 1 ptr) lst))
    (setq str (substr str (+ ptr 2)))
)
(reverse (cons str lst))
)
(defun c:tt ()
(setq        strlst0        (str-lst (getfiled "选择数据文件"
                                   "C:\\"
                                   "txt"
                                   2
                       )
                )
)
(setq        lst (mapcar '(lambda (x / lst)
                     (mapcar '(lambda        (y)
                                  (atof y)
                                )
                             (sparser x ",")
                     )
                     )
                  strlst0
          )
)                     
(entmake (append (list '(0 . "LWPOLYLINE")
                       '(100 . "AcDbEntity")
                       '(100 . "AcDbPolyline")
                       (cons 90 (length lst))
                   )
                   (mapcar '(lambda (pt)
                              (cons 10 pt)
                          )
                           lst
                   )
           )
)
)


复制以上代码,打开记事本后粘贴,然后另存为tt.lsp(注意修改文件类型),然后在CAD中使用AP命令加载这个lsp文件,加载成功后使用TT命令,找到你保存有数据的txt文件,然后就生成了。


若还有不明白的,可在帖子中继续留言

snight523 发表于 2015-10-30 14:31:00

革天明 发表于 2015-10-30 12:53 static/image/common/back.gif
(defun str-lst (lj / data_list ff data)
(setq        data_list '()
        ff          (open lj "r")


真是太感激了, 已经可以解决问题了。如果数据的格式是这样的能否导入呢?
120,-36.485,457.523
120,-31.516,457.472
120,-29.564,457.257
120,-19.012,456.399
120,-14.897,456.042
120,-12.791,455.813
120,-4.181,454.899
120,2.454,454.257
120,4.036,454.094
120,11.18,451.29
数据第一列是断面里程,第二列是坐标X 第三列是坐标Y 如何能剔除第一个数据汇总后边的坐标

重慶崽兒 发表于 2015-10-30 19:33:54

snight523 发表于 2015-10-30 14:31 static/image/common/back.gif
真是太感激了, 已经可以解决问题了。如果数据的格式是这样的能否导入呢?
120,-36.485,457.523
120,-3 ...

也可以导入啊 将二楼的程序改一下就可以了
至于你说汇总坐标的话 也简单啊,将读取的坐标重新写入一个新文件就好
或者使用批处理

革天明 发表于 2015-11-3 18:35:45

(defun str-lst (lj / data_list ff data)
(setq        data_list '()
        ff          (open lj "r")
        data          (read-line ff)
)
(while data
    (setq data_list (cons data data_list)
          data          (read-line ff)
    )
)
(reverse data_list)
)
(defun sparser (str delim / ptr lst)
(while (setq ptr (vl-string-search delim str))
    (setq lst (cons (substr str 1 ptr) lst))
    (setq str (substr str (+ ptr 2)))
)
(reverse (cons str lst))
)
(defun c:tt ()
(setq        strlst0        (str-lst (getfiled "选择数据文件"
                                   "C:\\"
                                   "txt"
                                   2
                       )
                )
)
(setq        lst (mapcar '(lambda (x / lst)
                     (mapcar '(lambda        (y)
                                  (atof y)
                                )
                             (sparser x ",")
                     )
                     )
                  strlst0
          )
)
(setq        lst (mapcar '(Lambda (x)
                     (list (nth 1 x) (nth 2 x))
                     )
                  lst
          )
)
(entmake (append (list '(0 . "LWPOLYLINE")
                       '(100 . "AcDbEntity")
                       '(100 . "AcDbPolyline")
                       (cons 90 (length lst))
                   )
                   (mapcar '(lambda (pt)
                              (cons 10 pt)
                          )
                           lst
                   )
           )
)
)

llsheng_73 发表于 2015-11-3 22:19:04

革天明 发表于 2015-11-3 18:35 http://bbs.mjtd.com/static/image/common/back.gif
(defun str-lst (lj / data_list ff data)
(setq      data_list '()
      ff          (open lj "r")


将你的整理了下,去掉了一个函数
(defun str-lst(wj / a l )
(setq wj(open wj "r"))
(while(setq a(read-line wj))
    (setq l(cons(read(strcat"("(vl-string-translate";,      ""   "x)")"))l)))
(close wj)
(reverse l))
(defun c:tt (/ pt)
(setq pt(mapcar'(lambda(x)(cons 10(cdr x)))(str-lst(getfiled "选择数据文件" "C:\\" "txt" 2))))
(entmakex(append'((0 . "LWPOLYLINE")(100 . "AcDbEntity")(100 . "AcDbPolyline"))
               (list(cons 90 (length pt)))pt))
         )

革天明 发表于 2015-11-9 09:29:59

llsheng_73 发表于 2015-11-3 22:19 static/image/common/back.gif
将你的整理了下,去掉了一个函数

谢谢,越精简越好

yufr 发表于 2019-9-21 09:39:47

能否批量生成

f4800 发表于 2020-11-12 20:22:29

大神的代码不错。。支持

技术工作室 发表于 2022-9-8 14:20:59

不断学习,顶一个
页: [1]
查看完整版本: 求助能否实现将断面数据导入图中绘制成复合线的命令