明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 290|回复: 7

[经验] 快速读取线条表格数据

[复制链接]
发表于 昨天 14:27 | 显示全部楼层 |阅读模式
经常遇到一写表格需要读取,所以写了一个快速读取方法,但是,遇到杂乱的表格,我也写了一个,调用的是cgal来分析的(以后分享,需要cgal的支撑)

  1. (defun $kxbg$ (pt1 pt2 lst / entitys $zheng-li$  msg $fen-zu$ pts result
  2.          fz ss xts)
  3.           ;框选表格,非中线的表格,太烂的表格不行,还有一个函数$kxbg2$准确率高但是效率低
  4.   ;示例$kxbg$ (getpoint) (getpoint) (list (CONS "标题位置" "顶部")(cons "选择集" (ssget))))
  5.   (defun $fen-zu$ (entitys    /     a      b
  6.        coords     current   data      datas
  7.        dxf-0      dxf-10   dxf-11      entdata
  8.        hf        hori   hori-line  horzone
  9.        hr        new-datas   swap      text-height
  10.        vertical   vertical-line      verzone
  11.        vf        vr   verzone-key
  12.        horzone-key     h-jbs      v-jbs
  13.       )
  14.     (foreach entity entitys
  15.       (setq entData (entget entity))
  16.       (setq dxf-0 (cdr (assoc 0 entData)))
  17.       (cond
  18.   ((wcmatch dxf-0 "[,LINE,LWPOLYLINE,]")
  19.    (setq dxf-10 (cdr (assoc 10 entData)))
  20.    (setq dxf-11 (cdr (assoc 11 entData)))
  21.    (if (and (not dxf-11) (wcmatch dxf-0 "[,LWPOLYLINE,]"))
  22.      (progn
  23.        (setq dxf-11
  24.         (cdr (cadr (vl-remove-if-not
  25.          (function (lambda (a)
  26.                (member (car a) (list '10 '11))
  27.              )
  28.          )
  29.          entData
  30.              )
  31.        )
  32.         )
  33.        )
  34.      )
  35.    )
  36.    (progn
  37.      (cond ((< (abs (- (car dxf-10)
  38.            (car dxf-11)
  39.         )
  40.          )
  41.          0.18
  42.       )      ;竖向直线         
  43.       (setq
  44.         vertical (cons (car dxf-10) vertical)
  45.       )
  46.       (setq vertical-line (cons entity vertical-line))
  47.      )
  48.      ((< (abs (- (cadr dxf-10)
  49.            (cadr dxf-11)
  50.         )
  51.          )
  52.          0.18
  53.       )      ;水平直线        
  54.       (setq hori (cons (cadr dxf-10) hori))
  55.       (setq hori-line (cons entity hori-line))
  56.      )
  57.      )
  58.    )
  59.   )
  60.   ((and (eq dxf-0 "TEXT")
  61.         (cdr (assoc 1 entData))
  62.         (> (strlen (cdr (assoc 1 entData))) 0)
  63.    )
  64.           ;表格内文字
  65.    (IF (= (cdr (assoc 1 entData)) "M30100866")
  66.      (PRINT)
  67.    )
  68.    (progn
  69.      (vla-getboundingbox
  70.        (vlax-ename->vla-object entity)
  71.        'a
  72.        'b
  73.      )        ;外包围
  74.      (setq a (vlax-safearray->list a))
  75.      (setq b (vlax-safearray->list b))
  76.           ;(makerec a b)
  77.      (setq
  78.        coords (mapcar (function (lambda (x y) (* (+ x y) 0.5)))
  79.           a
  80.           b
  81.         )
  82.      )        ;居中点
  83.      (setq datas (cons (cons (cdr (assoc 1 entData))
  84.            coords
  85.            )
  86.            datas
  87.            )
  88.      )
  89.    )
  90.   )
  91.       )
  92.     )
  93.     (setq
  94.       v-jbs (mapcar (function (lambda (a) (cdr (assoc 5 (entget a)))))
  95.         vertical-line
  96.       )
  97.     )
  98.     (setq
  99.       h-jbs (mapcar (function (lambda (a) (cdr (assoc 5 (entget a)))))
  100.         hori-line
  101.       )
  102.     )
  103.     (setq swap nil)
  104.     (setq vertical (vl-sort vertical '<))
  105.     (while (progn (setq data (car vertical))
  106.       (setq vertical (cdr vertical))
  107.      )
  108.       (if (> (abs (- data (car vertical))) 0.18)
  109.   (setq swap (cons data swap))
  110.       )
  111.     )
  112.     (setq swap (cons data swap))
  113.     (setq vertical (reverse swap)
  114.     swap     nil
  115.     )
  116.     (setq hori (vl-sort hori '<))
  117.     (while (progn (setq data (car hori))
  118.       (setq hori (cdr hori))
  119.      )
  120.       (if (> (abs (- data (car hori))) 0.18)
  121.   (setq swap (cons data swap))
  122.       )
  123.     )
  124.     (setq swap (cons data swap))
  125.     (setq hori (reverse swap))
  126.     (setq swap nil)
  127.     (setq verzone (mapcar 'list vertical (cdr vertical)))
  128.     (setq verzone-key
  129.      (mapcar
  130.        (function
  131.          (lambda (a i / key)
  132.      (cons i a)
  133.          )
  134.        )
  135.        verzone
  136.        (wire:range (length verzone))
  137.      )
  138.     )
  139.     (setq horzone (mapcar 'list hori (cdr hori)))
  140.     (setq horzone-key
  141.      (mapcar
  142.        (function
  143.          (lambda (a i / key)
  144.      (cons i a)
  145.          )
  146.        )
  147.        horzone
  148.        (wire:range (length horzone))
  149.      )
  150.     )
  151.     (IF  horzone
  152.       ()
  153.       (PRINT "horzone 空值")
  154.     )
  155.     (setq
  156.       datas (vl-sort datas
  157.          (FUNCTION (lambda (a b) (< (cadr a) (cadr b))))
  158.       )
  159.     )
  160.     (IF  verzone
  161.       (PROGN
  162.   (setq current 0)
  163.   (setq new-datas '())
  164.   (foreach data datas
  165.     (setq current nil)
  166.     (setq  current  (VL-SOME
  167.         (FUNCTION
  168.           (LAMBDA (A / pts pt1 pt2)
  169.             (if (and
  170.             (setq pt1 (cadr a))
  171.             (setq pt2 (caddr a))
  172.             (and (> (cadr data) pt1)
  173.            (< (cadr data) pt2)
  174.             )
  175.           )
  176.         (car a)
  177.             )
  178.           )
  179.         )
  180.         verzone-key
  181.       )
  182.     )
  183.     (if current
  184.       (setq new-datas (cons (subst current (cadr data) data)
  185.           new-datas
  186.           )
  187.       )
  188.     )
  189.   )
  190.       )
  191.     )
  192.     (setq datas new-datas)
  193.     (setq
  194.       datas (vl-sort datas
  195.          (FUNCTION (lambda (a b) (< (caddr a) (caddr b))))
  196.       )
  197.     )
  198.     (setq current 0)
  199.     (setq new-datas '())
  200.     (foreach data datas
  201.       (setq current nil)
  202.       (setq current (VL-SOME
  203.           (FUNCTION
  204.       (LAMBDA  (A / pts pt1 pt2)
  205.         (if (and
  206.         (setq pt1 (cadr a))
  207.         (setq pt2 (caddr a))
  208.         (and (> (caddr data) pt1)
  209.              (< (caddr data) pt2)
  210.         )
  211.             )
  212.           (car a)
  213.         )
  214.       )
  215.           )
  216.           horzone-key
  217.         )
  218.       )
  219.       (setq new-datas (cons (subst current (caddr data) data)
  220.           new-datas
  221.           )
  222.       )
  223.     )
  224.     (setq datas new-datas)
  225.     (setq new-datas '())
  226.     (foreach data datas
  227.       (PROGN
  228.   (if (and (car data)
  229.      (= (type (cadr data)) 'INT)
  230.      (= (type (caddr data)) 'INT)
  231.       )
  232.     (setq  new-datas (cons  (list (car data)
  233.               (cadr data)
  234.               (caddr data)
  235.         )
  236.         new-datas
  237.         )
  238.     )
  239.   )
  240.       )
  241.     )
  242.     (setq datas new-datas)
  243.     (setq new-datas '())
  244.     (setq datas (reverse datas))
  245.     (list datas
  246.     (list  (cons "表格横向线条" h-jbs)
  247.     (cons "表格竖向线条" v-jbs)
  248.     )
  249.     )
  250.   )
  251.   (defun $zheng-li$ (dataz lst / a bts btwz data old old-cdr y y-key ys)
  252.     (SETQ BTWZ (CDR (ASSOC "标题位置" lst)))
  253.     (SETQ YS (MAPCAR 'CADDR dataz))  ;Y轴
  254.     (SETQ YS (DELSAME YS))    ;排重
  255.     (SETQ YS (VL-SORT YS '>))    ;排序
  256.     (SETQ Y-KEY NIL)
  257.     (while (setq a (car dataz))
  258.       (SETQ Y (CADDR A))
  259.       (SETQ OLD (ASSOC Y Y-KEY))
  260.       (SETQ OLD-CDR (CDR OLD))
  261.       (SETQ OLD-CDR (CONS A OLD-CDR))
  262.       (SETq Y-KEY (VL-REMOVE OLD Y-KEY))
  263.       (SETq Y-KEY (CONS (CONS Y OLD-CDR) Y-KEY))
  264.       (setq dataz (cdr dataz))
  265.     )          ;按照Y轴建立KEY
  266.     (cond ((= BTWZ "底部") t)    ;标题在底部的时候,rows不翻转(上面是cons拼接的,上面的被拼接到下面去了)
  267.     (t (setq Y-KEY (reverse Y-KEY)))
  268.           ;默认标题在顶部,所以,这里翻转一下(上面是cons拼接的,上面的被拼接到下面去了,翻转后才能到上面去)
  269.     )
  270.     (SETQ DATA
  271.      (MAPCAR (FUNCTION (LAMBDA (A / A-CDR)
  272.              (SETQ A-CDR (CDR A))
  273.              (VL-SORT  A-CDR
  274.           (FUNCTION (LAMBDA (E1 E2)
  275.                 (< (CADR E1) (CADR E2))
  276.               )
  277.           )
  278.              )
  279.            )
  280.        )
  281.        Y-KEY
  282.      )
  283.     )          ;每个X轴排序
  284.     (SETQ BTS (CAR DATA))
  285.     (MAPCAR
  286.       (FUNCTION
  287.   (lambda  (A)
  288.     (MAPCAR (FUNCTION
  289.         (LAMBDA (B / tag v)
  290.           (setq tag (car b))
  291.           (setq
  292.       v (vl-some (function (lambda (c)
  293.                  (if (= (cadr c) (cadr b))
  294.           ;c的X轴等于B的X轴
  295.              (car c) ;返回第一个值
  296.                  )
  297.                )
  298.            )
  299.            a
  300.         )
  301.           )
  302.           (or v (setq v ""))
  303.           (cons tag v)
  304.         )
  305.       )
  306.       BTS
  307.     )
  308.   )
  309.       )
  310.       (CDR DATA)
  311.     )          ;整理数据
  312.   )
  313.   (setq msg (cdr (assoc "提示语" lst)))
  314.   (IF (and PT1 PT2)
  315.     ()
  316.     (PROGN
  317.       (setq pts ($shu-biao-tuo-zhuai$ MSG)) ;获取用户鼠标框选的坐标  
  318.       (SETQ PT1 (CAR PTS))
  319.       (SETQ PT2 (LAST PTS))
  320.     )
  321.   )
  322.   (or (and lst
  323.      (setq ss (cdr (assoc "选择集" lst)))
  324.      (setq entitys (vl-remove-if
  325.          (function listp)
  326.          (mapcar (function cadr) (ssnamex SS))
  327.        )
  328.      )
  329.       )
  330.       (and lst
  331.      (setq entitys (cdr (assoc "图元列表" lst)))
  332.       )
  333.       (and pt1
  334.      pt2
  335.      (SETQ
  336.        SS  (ssget "CP"
  337.            (2PT->4PT (LIST pt1 pt2))
  338.            (LIST (CONS 0 "TEXT,LINE,LWPOLYLINE"))
  339.     )
  340.      )
  341.      (setq entitys (vl-remove-if
  342.          (function listp)
  343.          (mapcar (function cadr) (ssnamex SS))
  344.        )
  345.      )
  346.       )
  347.   )
  348.   (setq ss nil)
  349.   (setq fz nil)
  350.   (setq xts nil)
  351.   (mapcar 'set (list 'fz 'xts) ($fen-zu$ entitys)) ;分组
  352.   (setq result ($zheng-li$ fz lst))  ;整理
  353.   (setq result (mapcar (function (lambda (a) (append a xts))) result))
  354.   (setq ss nil)
  355.   result
  356. )

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 昨天 15:02 | 显示全部楼层
感觉你这个简单了,因为代码太短,一般都喜欢长的
发表于 昨天 15:21 | 显示全部楼层
具体是做什么用的?
发表于 昨天 16:25 | 显示全部楼层
huisguiji 发表于 2024-10-21 15:21
具体是做什么用的?

嗯,楼主太懒了,应该有个动画

本帖子中包含更多资源

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

x

点评

你的对话框哪里来的.代码里面没有对话框.  发表于 昨天 20:36
发表于 昨天 19:35 | 显示全部楼层
APPLOAD 已成功加载 kxbg.lsp。
命令: ; 错误: 输入的字符串有缺陷


大佬,这个应该怎么解决
 楼主| 发表于 8 小时前 | 显示全部楼层
自贡黄明儒 发表于 2024-10-21 15:02
感觉你这个简单了,因为代码太短,一般都喜欢长的

我有调用cgal的代码,哪个准确率极高,效率低
 楼主| 发表于 8 小时前 | 显示全部楼层
自贡黄明儒 发表于 2024-10-21 16:25
嗯,楼主太懒了,应该有个动画

如果是倾斜的表格,需要用我的cte功能,cte功能做了很多判断,包括表格里面有合并单元格、倾斜等等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-22 18:49 , Processed in 0.201510 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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