乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 62|回复: 8

[编程交流] 属性提取到txt-

[复制链接]

3

主题

15

帖子

12

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 14:55:24 | 显示全部楼层 |阅读模式
我已经发现了一个Lisp程序在这个论坛上由米克洛斯Fuccaro(谢谢)这是非常接近我需要的,我已经修改了一些,但仍然有一个问题。Lisp将命名块的属性输出到文本文件,以便导入标签打印软件,这正是我所需要的,但用逗号分隔的文本字符串需要放在一列中。
i、 e.a、b、c、d应为

b
c
d
我需要保留任何空白属性,这样它们就会产生一个空白行。
代码如下:
  1. ; Global ATTribute EXtractor
  2. ; by Miklos Fuccaro [email="mfuccaro@hotmail.com"]mfuccaro@hotmail.com[/email]
  3. ;-------------------------November 2004 -------
  4. ;;Edited March 2006 by C. Bassler to allow specification of block and tage names to extract
  5. ;;Modified March 2009 by B.Leslie to write Attributes only and name txt file with DWG filename.
  6. (defun gattex()
  7.   (setq Blocklist '("Name1" "Name2" "Name3"));; ** edit to include block names to select
  8.   (setq TagList '("Tag1" "Tag2" "Tag3"));; ** edit to include tag names to extract
  9.   ;;create block names separated by columns, for selection filter
  10.   (setq Blocknames (List2String BlockList))
  11.   (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 BlockNames))))
  12.   (if (not ss) (quit))
  13.   (setq Root (getvar "DWGPREFIX"))
  14.   (setq file (open (strcat "F:\\ENGINEER\\GENERIC\\Label Schedule\\Extracted Labels\\MK_Equipment_" (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname"))4)) ".TXT") "a") i -1)
  15.   (repeat (sslength ss)
  16.       (setq Edata (entget (setq e (ssname ss (setq i (1+ i))))))
  17.       (while (/= (Dxf 0 Edata) "SEQEND")
  18.          (if
  19.              (and
  20.                  (= (Dxf 0 Edata) "ATTRIB")
  21.                  (member (dxf 2 Edata) TagList);;if tag is on list
  22.              );and
  23.              (progn
  24.                  (setq valRow (cons (Dxf 1 Edata) ValRow))
  25.              );progn
  26.          )
  27.          (setq Edata (entget (setq e (entnext e))))
  28.       );while
  29.       (write-line (List2String (reverse ValRow)) file)
  30.   );repeat
  31.   (close file)
  32.   (princ (strcat "\nDone writing file " Root "MK_Equipment.txt"))
  33.   (princ)
  34. );defun
  35. ;;-------------------------------
  36. (defun List2String (Alist)
  37.   (setq NumStr (length Alist))
  38.      (foreach Item AList
  39.         (if (= Item (car AList));;first item
  40.            (setq LongString (car AList))
  41.            (setq LongString (strcat LongString "," Item))
  42.          )
  43.      )
  44.   LongString
  45. );defun
  46. ;;--------------------------------
  47. (defun Dxf (code pairs)
  48.   (cdr (assoc code pairs))
  49. )
  50. (gattex)

 
谢谢你的帮助。
布莱恩
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:06:59 | 显示全部楼层
未经测试,但试一试:
 
  1. ; Global ATTribute EXtractor
  2. ; by Miklos Fuccaro mfuccaro@hotmail.com
  3. ;-------------------------November 2004 -------
  4. ;;Edited March 2006 by C. Bassler to allow specification of block and tage names to extract
  5. ;;Modified March 2009 by B.Leslie to write Attributes only and name txt file with DWG filename.
  6. (defun gattex()
  7.   (setq Blocklist '("Name1" "Name2" "Name3"));; ** edit to include block names to select
  8.   (setq TagList '("Tag1" "Tag2" "Tag3"));; ** edit to include tag names to extract
  9.   ;;create block names separated by columns, for selection filter
  10.   (setq Blocknames (List2String BlockList))
  11.   (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 BlockNames))))
  12.   (if (not ss) (quit))
  13.   (setq Root (getvar "DWGPREFIX"))
  14.   (setq file (open (strcat "F:\\ENGINEER\\GENERIC\\Label Schedule\\Extracted Labels\\MK_Equipment_" (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname"))4)) ".TXT") "a") i -1)
  15.   (repeat (sslength ss)
  16.       (setq Edata (entget (setq e (ssname ss (setq i (1+ i))))))
  17.       (while (/= (Dxf 0 Edata) "SEQEND")
  18.          (if
  19.              (and
  20.                  (= (Dxf 0 Edata) "ATTRIB")
  21.                  (member (dxf 2 Edata) TagList);;if tag is on list
  22.              );and
  23.              (progn
  24.                  (setq valRow (cons (Dxf 1 Edata) ValRow))
  25.              );progn
  26.          )
  27.          (setq Edata (entget (setq e (entnext e))))
  28.       );while
  29.       (foreach v (reverse ValRow) (write-line v file))
  30.   );repeat
  31.   (close file)
  32.   (princ (strcat "\nDone writing file " Root "MK_Equipment.txt"))
  33.   (princ)
  34. );defun
  35. ;;-------------------------------
  36. (defun List2String (Alist)
  37.   (setq NumStr (length Alist))
  38.      (foreach Item AList
  39.         (if (= Item (car AList));;first item
  40.            (setq LongString (car AList))
  41.            (setq LongString (strcat LongString "," Item))
  42.          )
  43.      )
  44.   LongString
  45. );defun
  46. ;;--------------------------------
  47. (defun Dxf (code pairs)
  48.   (cdr (assoc code pairs))
  49. )
  50. (gattex)
回复

使用道具 举报

3

主题

15

帖子

12

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 15:15:05 | 显示全部楼层
谢谢李,除了重复一遍之外,我还得到了30次同样的数据。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:18:18 | 显示全部楼层
我认为这是因为变量没有本地化,但我可以考虑只编写另一个变量,因为repeat方法无法处理大于32767个实体的选择集。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:26:04 | 显示全部楼层
再次尝试此操作-未经测试:
 
  1. (defun c:gattex2 (/ Blklst Tglst ss file aEnt)
  2. (setq Blklst '("Name1,Name2,Name3") Tglst '("Tag1" "Tag2" "Tag3"))
  3. (if (setq ss (ssget "X" (list (cons 0 "INSERT") (cons 2 Blklst) (cons 66 1))))
  4.    (progn
  5.      (setq file (open (strcat "F:\\ENGINEER\\GENERIC\\Label Schedule\\Extracted Labels\\MK_Equipment_"
  6.            (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname"))4)) ".txt") "a"))
  7.      (foreach Ent (mapcar 'cadr (ssnamex ss))
  8.    (setq aEnt (entnext Ent))
  9.    (while (/= "SEQEND" (cdadr (entget aEnt)))
  10.      (if (member (cdr (assoc 2 (entget aEnt))) Tglst)
  11.        (write-line (cdr (assoc 1 (entget aEnt))) file))
  12.      (setq aEnt (entnext aEnt))))
  13.      (close file))
  14.    (princ "\n<!> No Blocks Found <!>"))
  15. (princ))
回复

使用道具 举报

3

主题

15

帖子

12

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 15:37:52 | 显示全部楼层
运行时获取此错误-;错误:错误的SSGET列表值
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:42:22 | 显示全部楼层
天哪,今天真的不是我的日子!
 
  1. (defun c:gattex2 (/ Blklst Tglst ss file aEnt)
  2. (setq Blklst "Name1,Name2,Name3" Tglst '("Tag1" "Tag2" "Tag3"))
  3. (if (setq ss (ssget "X" (list (cons 0 "INSERT") (cons 2 Blklst) (cons 66 1))))
  4.    (progn
  5.      (setq file (open (strcat "F:\\ENGINEER\\GENERIC\\Label Schedule\\Extracted Labels\\MK_Equipment_"
  6.            (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname"))4)) ".txt") "a"))
  7.      (foreach Ent (mapcar 'cadr (ssnamex ss))
  8.    (setq aEnt (entnext Ent))
  9.    (while (/= "SEQEND" (cdadr (entget aEnt)))
  10.      (if (member (cdr (assoc 2 (entget aEnt))) Tglst)
  11.        (write-line (cdr (assoc 1 (entget aEnt))) file))
  12.      (setq aEnt (entnext aEnt))))
  13.      (close file))
  14.    (princ "\n<!> No Blocks Found <!>"))
  15. (princ))

 
我想我应该回去睡觉了
回复

使用道具 举报

3

主题

15

帖子

12

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 15:53:01 | 显示全部楼层
成功了,你现在可以回去睡觉了。
非常感谢你的帮助。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:55:31 | 显示全部楼层
太好了,很高兴对你有用
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 21:00 , Processed in 1.028151 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表