明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 598|回复: 10

[提问] 求CAD 文本统计插件

[复制链接]
发表于 2024-1-29 11:15 | 显示全部楼层 |阅读模式


麻烦大家谁有这款CAD 文本统计插件的源码,在这先谢谢了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-1-29 18:23 | 显示全部楼层

里面是两个命令,一个是统计块的,一个是统计文字的,你是不是用错命令了
回复 支持 1 反对 0

使用道具 举报

发表于 2024-1-29 13:18 | 显示全部楼层
 楼主| 发表于 2024-1-29 16:37 | 显示全部楼层
xj6019 发表于 2024-1-29 13:18
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=179722&highlight=%CD%B3%BC%C6%CE%C4%D7%D6&_dsign=0e ...

显示找不到对象
  1. (defun c:tj(/ en mpl ss n nn m xx pt0 mpl_new i)
  2.         (if *table-zg (princ)(setq *table-zg (* 3 (getvar "DIMSCALE"))));设置模式全局变量,初始默认值=1
  3.         (setq ss (ssget '((0 . "INSERT"))))
  4.         (or ss (setq ss (ssadd)))
  5.         (setq n 0 nn (sslength ss) mpl '())
  6.         (while (< n nn)
  7.                 (setq en (ssname ss n) data (entget en))
  8.                 (setq n (1+ n))
  9.                 (setq name (cdr (assoc 2 data)));;;
  10.                 (setq xx (assoc name mpl))
  11.                 (if xx
  12.                         (setq m (cadr xx) m (1+ m) mpl (subst (list name m) xx mpl))
  13.                         (setq mpl (append (list (list name 1)) mpl))                       
  14.                 )
  15.   )
  16.         (if mpl
  17.                 (progn
  18.                         (setq i 0)
  19.                         (setq mpl_new '())
  20.                         (foreach x mpl
  21.                                 (setq mpl_new (append (list(cons (setq i (1+ i)) x)) mpl_new))                               
  22.                         )                               
  23.                         (setq mpl_new (append (list (list "序号" "图块名称" "数量")) (reverse mpl_new)))                       
  24.                         (initget 0 "S")
  25.                         (if (/= (setq pt0 (getpoint (strcat "\n点取表格插入点[设置(S)表格文字高度],当前文字高度:" (rtos *table-zg)))) nil)
  26.                                 (progn
  27.                                         (while (= pt0 "S")
  28.                                                 (setq str (strcat "\n(建议高度:"(rtos (* 3 (getvar "DIMSCALE"))) ")" "  请输表格文字高度:"  "<" (rtos *table-zg) ">"))
  29.                                                 (if (setq temp (getint str))(setq *table-zg temp));采用新输入值
  30.                                                 (initget 0 "S")
  31.                                                 (setq pt0 (getpoint (strcat "\n点取表格插入点[设置(S)表格文字高度],当前文字高度:" (rtos *table-zg))))
  32.                                                 (if (null pt0)(exit))
  33.                                         )                               
  34.                                         (if (and pt0 *table-zg)
  35.                                                 (TableLst2Table mpl_new pt0 *table-zg)                                               
  36.                                         )
  37.                                 )
  38.                         )
  39.                         (princ "/nNothing!")               
  40.                 )
  41.                 (princ)
  42.         )
  43. )
  44. (defun c:tjzf(/ en mpl ss n nn m xx pt0 mpl_new i)
  45.         (if *table-zg (princ)(setq *table-zg (* 3 (getvar "DIMSCALE"))));设置模式全局变量,初始默认值=1
  46.         (setq ss (ssget '((0 . "text"))))
  47.         (or ss (setq ss (ssadd)))
  48.         (setq n 0 nn (sslength ss) mpl '())
  49.         (while (< n nn)
  50.                 (setq en (ssname ss n) data (entget en))
  51.                 (setq n (1+ n))
  52.                 (setq name (cdr (assoc 1 data)));;;
  53.                 (setq xx (assoc name mpl))
  54.                 (if xx
  55.                         (setq m (cadr xx) m (1+ m) mpl (subst (list name m) xx mpl))
  56.                         (setq mpl (append (list (list name 1)) mpl))
  57.                         ;(setq m (cdr xx) m (1+ m) mpl (subst (cons name m) xx mpl))
  58.                         ;(setq mpl (cons (cons name 1) mpl))
  59.                 )
  60.   )
  61.         (if mpl
  62.                 (progn
  63.                         (setq i 0)
  64.                         (setq mpl_new '())
  65.                         (foreach x mpl
  66.                                 (setq mpl_new (append (list(cons (setq i (1+ i)) x)) mpl_new))                               
  67.                         )                               
  68.                         (setq mpl_new (append (list (list "序号" "提取字串" "数量")) (reverse mpl_new)))                       
  69.                         (initget 0 "S")
  70.                         (if (/= (setq pt0 (getpoint (strcat "\n点取表格插入点[设置(S)表格文字高度],当前文字高度:" (rtos *table-zg)))) nil)
  71.                                 (progn
  72.                                         (while (= pt0 "S")
  73.                                                 (setq str (strcat "\n(建议高度:"(rtos (* 3 (getvar "DIMSCALE"))) ")" "  请输表格文字高度:"  "<" (rtos *table-zg) ">"))
  74.                                                 (if (setq temp (getint str))(setq *table-zg temp));采用新输入值
  75.                                                 (initget 0 "S")
  76.                                                 (setq pt0 (getpoint (strcat "\n点取表格插入点[设置(S)表格文字高度],当前文字高度:" (rtos *table-zg))))
  77.                                                 (if (null pt0)(exit))
  78.                                         )                               
  79.                                         (if (and pt0 *table-zg)
  80.                                                 (TableLst2Table mpl_new pt0 *table-zg)                                               
  81.                                         )
  82.                                 )
  83.                         )
  84.                         (princ "/nNothing!")               
  85.                 )
  86.                 (princ)
  87.         )
  88. )
  89. ;参数:
  90. ;lis --- 表格型list
  91. ;pt --- 表格左上角(点)
  92. ;zg ---- 字高(数值型)
  93. ;测试(TableLst2Table '((1 12 123 1234 12345 123456 1234567 12345678 123456780 1234567890)(1.0 0.0 0.0)(100.0 12345.0 "5551000" "1234")) (getpoint) 10)
  94. (defun TableLst2Table (lis pt zg / emkLine emkText h len1 len2 i h1 w2 tab_h len j w1 w2 wlst p0 p1 txt)
  95.   (defun emkLine (p1 p2)
  96.     (entmake (list '(0 . "LINE") (cons 8 "DM_文字表格") (cons 10 p1) (cons 11 p2)))
  97.         )
  98.   (defun emkText (pt str h)
  99.     (entmake (list '(0 . "TEXT") (cons 1 str) (cons 8 "DM_文字表格") (cons 10 pt) (cons 40 h) (cons 11 pt) (cons 72 1) (cons 73 2)))
  100.         )
  101.   (setq h (* zg 2)                             ; 表格高
  102.                 len1 (length lis)                      ; 表格行数len1
  103.                 len2 (apply 'max (mapcar 'length lis)) ; 表格列数len2
  104.                 p0 (list (car pt) (- (cadr pt) (* 0.5 h))); 定义文字原点
  105.         )
  106.   (setq lis (mapcar '(lambda (y) (mapcar 'vl-princ-to-string y)) lis)) ; 将表中元素全部变为文本型
  107.   ; 以下获取列宽表 wlst
  108.   (setq i 0 w2 0 wlst '())
  109.   (repeat len2
  110.     (foreach e lis
  111.       (setq txt (nth i e))
  112.       (if (not txt) (setq txt ""))         ;如果没有字符
  113.       (setq w1 (* (+ (strlen txt) 1) zg))  ; 列宽=(文字长度+1)*zg
  114.       (if (> w1 w2) (setq w2 w1))          ;取最大列宽
  115.                 )
  116.     (setq wlst (cons w2 wlst) w2 0 i (1+ i))
  117.         )
  118.   ;以下按行写出文字
  119.   (setq wlst (reverse wlst))
  120.   (setq i 0 j 0 w1 0 w2 0)
  121.   (foreach e lis
  122.     (setq h1 (- (cadr p0) (* i h)))        ; 文字行的y坐标值
  123.     (foreach f e
  124.       (setq w1 (nth j wlst) w2 (+ w2 w1))
  125.       (setq p1 (list (- (+ (car p0) w2) (* w1 0.5)) h1)) ; 文字插入点
  126.       (emkText P1 f zg)
  127.       (setq j (1+ j))
  128.                 )
  129.     (setq i (1+ i) j 0 w1 0 w2 0)
  130.         )
  131.   ; 开始绘制竖线
  132.   (setq tab_h (* len1 h))                  ; 竖线长
  133.   (emkLine pt (polar pt (* pi 1.5) tab_h)) ; 绘制左侧第一根竖线
  134.   (setq len 0)
  135.   (foreach x wlst                          ; 绘制竖线
  136.     (setq len (+ x len) p1 (polar pt 0 len))
  137.     (emkLine p1 (polar p1 (* Pi 1.5) tab_h))
  138.         )
  139.   ; 开始绘制横线
  140.   (setq i 0 len 0)
  141.   (setq len (apply '+ wlst))              ; 横线长度
  142.   (repeat (1+ len1)                       ; 绘制横线
  143.     (setq p1 (polar pt (* Pi 1.5) (* i h)) i (1+ i))
  144.     (emkLine p1 (polar p1 0 len))
  145.         )
  146.   (princ)
  147. )
发表于 2024-1-29 19:45 | 显示全部楼层
本帖最后由 vitalgg 于 2024-1-30 15:24 编辑

  1. ;;加载必要的函数
  2. (progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))

  3. (defun C:stat-txt ()
  4.   ;; 统计选中的单行文字
  5.   (setq res
  6.         (stat:stat
  7.          (mapcar
  8.           '(lambda(x)(text:remove-fmt(text:get-mtext x )))
  9.           (pickset:to-list(ssget '((0 . "*text")))))))
  10.   ;; 对统计结果进行排序  car 是对统计项排序,cdr 是对统计数量排序
  11.   (setq res (list:sort res '(lambda(x y)
  12.                              (< (car x)(car y)))))
  13.   ;;绘制结果表
  14.   (table:make (getpoint)
  15.               "统计结果"
  16.               '("项目" "数量")
  17.               (mapcar '(lambda(x)
  18.                         (list (car x)
  19.                          (cdr x)))
  20.                       res)))


想要识别天正,把 (0 . "text") 改成 (0 . "text,tch_text")
想要识别多行文本和天正,把 (0 . "text") 改成 (0 . "*text") 。需要去格式字符。(entity:getdxf x 1)改为(text:remove-fmt(text:get-mtext x))



点评

天正的文字不能识别。  发表于 2024-1-30 14:18
发表于 2024-1-29 21:51 | 显示全部楼层
做了个类似的  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-1-30 21:41 | 显示全部楼层
发表于 2024-2-3 22:12 | 显示全部楼层
嘿嘿,这个东西用lisp做起来挺麻烦的,如果有hashmap的话,那就无脑value++就行了
 楼主| 发表于 2024-2-4 15:17 | 显示全部楼层

你这个CAD文本统计插件能给我一份吗?谢谢
发表于 2024-2-4 20:52 | 显示全部楼层
感谢分享,挺好用的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 05:42 , Processed in 0.406826 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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