明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1318|回复: 14

[提问] 又遇到一个表处理难题,请高手解决。顺带学习学习。

[复制链接]
发表于 2023-8-15 01:21:27 | 显示全部楼层 |阅读模式
想把其中连续而且颜色一样的线组合成一条线。
(setq waco1 '((0 1 1) (1 1 1) (3 2 2) (5 3 3) (9 1 4) (10 2 4) (12 1 5)))
如图:说明(12 1 5) 12是开始距离,1是线长,5是颜色
输出应该是((0 2 1) (3 2 2) (5 3 3) (9 3 4) (12 1 5))
下面的我写的,几乎成功,但最后一组没法加进去。(如果最后一组线和前面线是连续的颜色也一样就不需要)
(defun c:tt ( / d e waco waco1)
  (setq waco1 '((0 1 1) (1 1 1) (3 2 2) (5 3 3) (9 1 4) (10 2 4) (12 1 5)))
  (setq d 1)
  (setq e (nth (- d 1) waco1))
  (while (<= d (- (length waco1) 1))
   
    (if (and (= (+ (car e) (cadr e)) (car (nth d waco1))) (= (caddr e) (caddr (nth d waco1))))
      (progn
        (setq e (list (car e) (+ (cadr e) (cadr (nth d waco1))) (caddr e)))
       
        (setq waco (cons e waco))
        )
      (progn
        (setq waco (cons e waco))
        (setq e (nth d waco1))
        )
      )
      (setq d (+ d 1))
    )
  (setq waco (vl-sort waco '(lambda (s1 s2)(< (car s1) (car s2)))))
  (print waco)

  (princ)
  )
先谢谢各位大神!代码写得又长又烂,请多多指教。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-8-15 13:24:19 | 显示全部楼层
本帖最后由 gaics 于 2023-8-15 13:48 编辑

保留完全相同的元素
  1. (defun c:t8 (/ d e e2 waco i)
  2.   (setq waco '((0 1 1)(1 1 1)(3 2 2)(5 3 3)(9 1 4)(10 2 4)(12 1 5)))
  3.   (setq waco (vl-sort waco '(lambda (s1 s2) (< (car s1) (car s2)))))
  4.   (setq d 0)
  5.   (while (< d (length waco))
  6.     (setq e (nth d waco))
  7.     (setq i 0)
  8.     (while (< i (length waco))
  9.       (if (and (= (+ (car e) (cadr e)) (car (nth (+ d i 1) waco)))
  10.          (= (caddr e) (caddr (nth (+ d i 1) waco)))
  11.     )
  12.   (progn
  13.     (setq e2 (list (car e)(+ (cadr e)(cadr (nth (+ d i 1) waco)))(caddr e)))
  14.     ;;(setq waco (subst e2 e (vl-remove (nth (+ d i 1) waco) waco)))
  15.     (setq waco (subst e2 e (BF-List-RemoveIndex waco (+ d i 1))))
  16.     (setq e e2)
  17.   )
  18.   (setq i (1+ i))
  19.       )
  20.     )
  21.     (setq d (1+ d))
  22.   )
  23.   (print waco)
  24.   (setq waco (vl-sort waco '(lambda (s1 s2) (< (car s1) (car s2)))))
  25.   (princ)
  26. )
  27. (defun BF-List-RemoveIndex (lst index / i)
  28.   (setq i -1)
  29.   (vl-remove-if '(lambda (x) (= (setq i (1+ i)) index)) lst)
  30. )


回复 支持 1 反对 0

使用道具 举报

发表于 2023-8-16 06:53:52 | 显示全部楼层
本帖最后由 vitalgg 于 2023-8-16 06:57 编辑

  1. (setq waco1
  2. '((0 468.548 1) (468.548 1332.85 1) (3041.5 675.413 4) (5396.91 547.939 3) (5944.85 360.787 3) (7145.64 278.132 3) (7423.77 991.957 3) (8415.73 468.926 4)))
  3. (princ "原表:")(princ waco1)
  4. ;; 按色号排序并分组
  5. (setq waco1 (vl-sort
  6.               waco1
  7.               '(lambda (x y)
  8.                  (<
  9.                    (last x)
  10.                    (last y)))))
  11. (setq waco1 (list:group-by
  12.               waco1
  13.               '(lambda (x y)
  14.                  (=
  15.                    (last x)
  16.                    (last y)))))
  17. ;; 组内起点从小到大排序
  18. (setq waco1 (mapcar
  19.               '(lambda (x)
  20.                  (vl-sort
  21.                    x
  22.                    '(lambda (m n)
  23.                       (< (car m) (car n)))))
  24.               waco1))
  25. ;; (princ "\n排序表:")(princ waco1)

  26. ;; 合并同色且连续的,即前一个的起点+长度 >= 紧临表的起点
  27. (defun join-line (lst / res fuzz)
  28.   (setq fuzz 0.01)
  29.   (setq res (cons (car lst) nil))
  30.   (while (setq lst (cdr lst))
  31.     (if
  32.       (and
  33.         (setq f (car res))
  34.         (>= (+ (+ (car f) (cadr f)) fuzz) (caar lst)))
  35.       (setq res (cons
  36.                   (list
  37.                     (caar res)
  38.                     (max
  39.                       (+ (cadar lst) (- (caar lst) (caar res)))
  40.                       (cadar res))
  41.                     (last (car res)))
  42.                   (cdr res)))
  43.       (setq res (cons (car lst) res))))
  44.   (reverse res)
  45. )
  46. (princ "\n结果:")(princ (apply 'append (mapcar 'join-line waco1)))
  47. (princ)


非得有现成的函数才会用容差吗?
(>= (+ (+ (car f) (cadr f)) fuzz) (caar lst)))








本帖子中包含更多资源

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

x
发表于 2023-8-15 08:27:59 | 显示全部楼层
本帖最后由 vitalgg 于 2023-8-16 06:53 编辑



  1. (setq waco1 '((0 1 1) (1 1 1) (3 2 2) (5 3 3) (9 1 4) (10 2 4) (12 1 5)))
  2. (princ "原表:")(princ waco1)
  3. ;; 按色号排序并分组
  4. (setq waco1 (vl-sort
  5.               waco1
  6.               '(lambda (x y)
  7.                  (<
  8.                    (last x)
  9.                    (last y)))))
  10. (setq waco1 (list:group-by
  11.               waco1
  12.               '(lambda (x y)
  13.                  (=
  14.                    (last x)
  15.                    (last y)))))
  16. ;; 组内起点从小到大排序
  17. (setq waco1 (mapcar
  18.               '(lambda (x)
  19.                  (vl-sort
  20.                    x
  21.                    '(lambda (m n)
  22.                       (< (car m) (car n)))))
  23.               waco1))
  24. ;; 合并同色且连续的,即前一个的起点+长度 >= 紧临表的起点
  25. (defun join-line (lst / res)
  26.   (setq res (cons (car lst) nil))
  27.   (while (setq lst (cdr lst))
  28.     (if
  29.       (and
  30.         (setq f (car res))
  31.         (>= (+ (car f) (cadr f)) (caar lst)))
  32.       (setq res (cons
  33.                   (list
  34.                     (caar res)
  35.                     (max
  36.                       (+ (cadar lst) (- (caar lst) (caar res)))
  37.                       (cadar res))
  38.                     (last (car res)))
  39.                   (cdr res)))
  40.       (setq res (cons (car lst) res))))
  41.   (reverse res)
  42. )
  43. (princ "\n结果:")(princ (apply 'append (mapcar 'join-line waco1)))
  44. (princ)

本帖子中包含更多资源

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

x
发表于 2023-8-15 08:14:38 | 显示全部楼层
(setq d 1),最后已经超出范围了
 楼主| 发表于 2023-8-15 10:27:08 | 显示全部楼层
本帖最后由 `中微子 于 2023-8-15 10:34 编辑

大神,这里出错了。抱歉新手不会改。
错误: no function definition: LIST:GROUP-BY

你的是一种全新的思路,但我没看懂,不好意思。
发表于 2023-8-15 10:41:40 | 显示全部楼层
看注释了解思路就行。
带冒号的都是@lisp函数库中的函数。
这个支持重叠的线。不知道你的需求中有没有重叠的情况。

@lisp函数库全面开源
https://gitee.com/atlisp/atlisp-lib

https://gitee.com/atlisp/atlisp- ... c/list/group-by.lsp
 楼主| 发表于 2023-8-15 11:18:15 | 显示全部楼层
vitalgg 发表于 2023-8-15 10:41
看注释了解思路就行。
带冒号的都是@lisp函数库中的函数。
这个支持重叠的线。不知道你的需求中有没有重 ...

非常感谢!学习了。运行成功。谢谢!!
发表于 2023-8-15 12:21:41 | 显示全部楼层
本帖最后由 gaics 于 2023-8-15 13:49 编辑

我也来试一下
  1. (defun c:t7 (/ d e e2 waco i)
  2.   (setq waco '((0 1 1)(1 1 1)(3 2 2)(5 3 3)(9 1 4)(10 2 4)(12 1 5)))
  3.   (setq waco (vl-sort waco '(lambda (s1 s2) (< (car s1) (car s2)))))
  4.   (setq d 0)
  5.   (while (< d (length waco))
  6.     (setq e (nth d waco))
  7.     (setq i 0)
  8.     (while (< i (length waco))
  9.       (if (and (= (+ (car e) (cadr e)) (car (nth (+ d i 1) waco)))
  10.          (= (caddr e) (caddr (nth (+ d i 1) waco)))
  11.     )
  12.   (progn
  13.     (setq e2 (list (car e)(+ (cadr e)(cadr (nth (+ d i 1) waco)))(caddr e)))
  14.     (setq waco (subst e2 e (vl-remove (nth (+ d i 1) waco) waco)))
  15.     (setq e e2)
  16.   )
  17.   (setq i (1+ i))
  18.       )
  19.     )
  20.     (setq d (1+ d))
  21.   )
  22.   (print waco)
  23.   (setq waco (vl-sort waco '(lambda (s1 s2) (< (car s1) (car s2)))))
  24.   (princ)
  25. )


 楼主| 发表于 2023-8-15 16:11:14 | 显示全部楼层
vitalgg 发表于 2023-8-15 10:41
看注释了解思路就行。
带冒号的都是@lisp函数库中的函数。
这个支持重叠的线。不知道你的需求中有没有重 ...

刚试了,希望能加入一点容差进去。把表换成((0 468.548 1) (468.548 1332.85 1) (3041.5 675.413 4) (5396.91 547.939 3) (5944.85 360.787 3) (7145.64 278.132 3) (7423.77 991.957 3) (8415.73 468.926 4))
输出应该是:((0 1801.4 1) (3041.5 675.413 4) (5396.91 908.726 3) (7145.64 1270.09 3))(8415.73 468.926 4)
我把IF条件改成(>= (atof(rtos(+ (car f) (cadr f))2 2)) (atof(rtos(caar lst)2 2)))只保留后二位还是不行
输出是((0 1801.4 1) (3041.5 675.413 4) (5396.91 908.727 3) (7423.77 991.957 3) (8415.73 468.926 4))。
这一项是差的(7423.77 991.957 3)
 楼主| 发表于 2023-8-15 16:16:17 | 显示全部楼层
gaics 发表于 2023-8-15 13:24
保留完全相同的元素

请看9楼,也有同样的容差问题。求解决。辛苦了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 02:50 , Processed in 0.190469 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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