明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1909|回复: 9

[基础] 求助改一下代码,让它能按顺序放

[复制链接]
发表于 2013-3-21 16:27:08 | 显示全部楼层 |阅读模式
求助:
下列代码可以将文字提取到表格,一个个选没问题,但如果是框选一块,它提取到表格的文字并不按图中文字所在上下顺序放,能不能让它按CAD图中位置顺序放在表格里!


(defun c:Q (/ SS FF I)
  (if (and (setq SS (ssget '((0 . "*TEXT"))))
    (if (findfile "d:\\ABC.xls")
      (setq FF (open "d:\\ABC.xls" "a"))
      (setq FF (open "d:\\ABC.xls" "w"))
    )
      )
    (progn (setq I -1)
    (repeat (sslength SS)
      (princ (cdr (assoc 1 (entget (ssname ss (setq i (1+ i))))))
      FF
      )
      (princ "\n" FF)
    )
    (close ff)
    )
  )
  (prin1)
)

发表于 2013-3-22 17:15:42 | 显示全部楼层
sgyyuan 发表于 2013-3-22 16:09
感谢 ll_j,我对LISP是小白,只是应用需要,从坛里找的,挺好用,就差顺序,如果您没时间细弄,能否请您帮我 ...

  1. (defun c:Q (/ SS FF I ent e1 ey sel)
  2.   (if (and (setq SS (ssget '((0 . "*TEXT"))))
  3.      (if (findfile "d:\\ABC.csv")
  4.        (setq FF (open "d:\\ABC.csv" "a"))
  5.        (setq FF (open "d:\\ABC.csv" "w"))
  6.      )
  7.       )
  8.     (progn
  9.       (setq I  -1
  10.       sel  nil
  11.       )
  12.       (repeat (sslength SS)
  13.   (setq i    (1+ i)
  14.         ent (entget (ssname ss i))
  15.         e1  (cdr (assoc 1 ent))
  16.         ey  (caddr (assoc 10 ent))
  17.         sel (cons (list e1 ey) sel)
  18.   )
  19.       )
  20.       (setq sel (vl-sort sel '(lambda (y1 y2) (> (cadr y1) (cadr y2)))))
  21.       (mapcar '(lambda (e)
  22.      (princ e FF)
  23.      (princ "\n" ff)
  24.          )
  25.         (mapcar 'car sel)
  26.       )
  27.       (close ff)
  28.     )
  29.   )
  30.   (princ)
  31. )

评分

参与人数 1明经币 +1 金钱 +20 收起 理由
sgyyuan + 1 + 20 太给力了!我只有这么多都给了!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2013-3-21 18:52:39 | 显示全部楼层
给你一个思路:
把选择的文本和插入点提取出来,构成一个表,然后把所有这样的表构成一个大的表,在使用vl-sort来根据y值排序,再逐一写入文件中。

另:文本文件不要使用xls扩展名,如果想方便excel打开,可以使用csv后缀。
发表于 2013-3-21 18:55:12 | 显示全部楼层
电子表格内的数据一般用什么语言处理
 楼主| 发表于 2013-3-22 16:09:19 | 显示全部楼层
感谢 ll_j,我对LISP是小白,只是应用需要,从坛里找的,挺好用,就差顺序,如果您没时间细弄,能否请您帮我把每个文本的插入点一块提到表中,我自己在表里按插入点排顺序就行!
发表于 2013-3-22 19:37:02 | 显示全部楼层
感谢 ll_j,这么简洁的表达出来了!
 楼主| 发表于 2013-3-22 22:27:42 | 显示全部楼层


感谢 ll_j!!!!!

太激动了,我没准备大师能帮我啊,一下午,一下午啊,我小心翼翼地把那些字一个一个地选,生怕选大了位置乱了就不好分了啊,没想到 ll_j居然回贴了,而且回得这么彻底,连到表再排序都省了啊!!!

万分感谢 ll_j,你太牛了,顶礼膜拜中
发表于 2013-3-23 08:54:35 | 显示全部楼层
一步一步的缩小程序长度:
  (mapcar '(lambda (e) (princ e FF) (princ "\n" FF) (mapcar 'car sel));原来的
  (mapcar '(lambda (e) (princ (strcat e "\n") FF) (mapcar 'car sel));一改
  (mapcar '(lambda (e) (print e FF)) (mapcar 'car sel));二改
  (foreach e (mapcar 'car sel) (princ (strcat e "\n") FF));三改
  (foreach e (mapcar 'car sel) (print e FF));最后
发表于 2022-11-14 20:29:19 | 显示全部楼层

这代码逆天了,简洁明了!
发表于 2022-11-15 09:41:12 | 显示全部楼层

求助大神!!!

本帖最后由 suiran 于 2022-11-15 09:42 编辑

(defun c:Q (/ SS FF I ent e1 ey sel)  (if (and (setq SS (ssget '((0 . "*TEXT"))))     (if (findfile "d:\\ABC.csv")       (setq FF (open "d:\\ABC.csv" "a"))       (setq FF (open "d:\\ABC.csv" "w"))     )      )    (progn      (setq I  -1      sel  nil      )      (repeat (sslength SS)  (setq i    (1+ i)        ent (entget (ssname ss i))        e1  (cdr (assoc 1 ent))        ey  (caddr (assoc 10 ent))        sel (cons (list e1 ey) sel)  )      )      (setq sel (vl-sort sel '(lambda (y1 y2) (> (cadr y1) (cadr y2)))))      (mapcar '(lambda (e)     (princ e FF)     (princ "\n" ff)         )        (mapcar 'car sel)      )      (close ff)    )  )  (princ))


各位大侠,我试着修改了一下 ll_j 的这个程序,导出到记事本。浩辰可以正常换行,但是中望就不行了,没有实现换行,程序里面明明有换行符,可是为什么不行呢?不知哪位大侠能否指教?谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 02:43 , Processed in 0.202706 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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