明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1176|回复: 8

[提问] 求高手们帮忙修改一下,增加一个容差

[复制链接]
发表于 2017-12-11 19:18:37 | 显示全部楼层 |阅读模式
5明经币
本帖最后由 ysq101 于 2017-12-11 19:20 编辑

首先注明:此程序作者BY:LL_sheng
  1. ;  2017-10-28更新  BY:LL_sheng

  2. (defun getcolor(e / c)
  3.   (if(setq e(entget e)c(assoc 62 e))
  4.     (cdr c)
  5.     (cdr(assoc 62(tblsearch"layer"(cdr(assoc 8 e)))))
  6.     ))
  7. (defun plinexy(e)
  8.   (mapcar'cdr(vl-remove-if'(lambda(x)(/=(car x)10))(entget e)))
  9.   )
  10. (defun Pldir(pt)
  11.   (<(apply'+(mapcar'(lambda(x y)(-(*(car x)(cadr y))(*(car y)(cadr x))))(cons(last pt)pt)pt))0))
  12. (defun c:wt(/ s f i e p pt txt c)
  13.   (if(and(setq s(ssget'((0 . "lwpolyline")(-4 . "&")(70 . 1))))
  14. (setq s(vl-remove-if'(lambda(x)(/=(type x)'ename))(mapcar'cadr(ssnamex s)))
  15.        f(getfiled "" "" "txt" 1))
  16. (setq txt""f(open f"w")))
  17.     (progn
  18.       (foreach e s
  19. (foreach i(if(pldir(setq p(plinexy e)))(setq p(reverse p))p)
  20.   (if(not(member i pt))(setq pt(append pt(list i))))
  21.   (setq txt(strcat(itoa(vl-position i pt))"\n"txt)))
  22. (setq c(getcolor e)
  23.       c(cadr(assoc c(append'((1" 0 0 0 0 0 0 276")
  24.    (2" 0 0 0 0 0 0 260")
  25.    (3" 0 0 0 0 0 0 400")
  26.    (4" 0 0 0 1 0 0 384")
  27.    (5" 0 0 0 3 0 0 384")
  28.    (6" 0 0 25 0 25 0 260")
  29.    (7" 0 0 0 2 0 0 384")
  30.    (8" 0 0 0 0 0 0 384"))
  31.    (list(list c(strcat" 0 0 0 0 0 0 "(itoa c)))))))
  32.       txt(strcat"\n"(itoa(length p))c"\n"txt)))
  33.       (setq txt(strcat"\n"(itoa(length s))"\n"txt)
  34.     i(length pt));;;;
  35.       (foreach p(reverse pt)
  36. (entmakex(mapcar'cons'(0 1 10 40 62)(list"text"(itoa i)p 2 1)));;;;
  37. (setq i(1- i)txt(strcat(rtos(car p)2 4)" "(rtos(* -1.5557 (cadr p))2 4)"\n"txt)))
  38.       (write-line(strcat(itoa(length pt))"\n\n"txt)f)
  39.       (close f))
  40.     ))



帮忙修改一下,判断各  闭合多线段  顶点时,
增加容差   差别0.01MM内  全按相同点排除

跪谢
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2017-12-11 19:18:38 | 显示全部楼层
  1. (defun getcolor        (e / c)
  2.   (if (setq e (entget e)
  3.             c (assoc 62 e)
  4.       )
  5.     (cdr c)
  6.     (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 e)))))
  7.   )
  8. )
  9. (defun PtFuzz (pt)
  10.   (list        (atof (rtos (car pt) 2 3))
  11.         (atof (rtos (cadr pt) 2 3))
  12.   )
  13. )
  14. (defun plinexy (e / ptn)
  15.   (setq ptn (vl-remove-if '(lambda (x) (/= (car x) 10)) (entget e)))
  16.   (mapcar 'PtFuzz (mapcar 'cdr ptn))
  17. )

  18. (defun Pldir (pt)
  19.   (< (apply '+
  20.             (mapcar '(lambda (x y) (- (* (car x) (cadr y)) (* (car y) (cadr x))))
  21.                     (cons (last pt) pt)
  22.                     pt
  23.             )
  24.      )
  25.      0
  26.   )
  27. )
  28. (defun c:tt (/ s f i e p pt txt c)
  29.   (princ "\n选择实体: ")
  30.   (if (setq s (ssget '((0 . "*polyline") (70 . 1))))
  31.     (progn
  32.       (setq s        (vl-remove-if
  33.                   '(lambda (x) (/= (type x) 'ename))
  34.                   (mapcar 'cadr (ssnamex s))
  35.                 )
  36.             f        (getfiled "" "" "txt" 1)
  37.             txt        ""
  38.             f        (open f "w")
  39.       )
  40.       (foreach e s
  41.         (foreach i (if (pldir (setq p (plinexy e)))
  42.                      (setq p (reverse p))
  43.                      p
  44.                    )
  45.           (if (not (member i pt))
  46.             (setq pt (append pt (list i)))
  47.           )
  48.           (setq txt (strcat (itoa (vl-position i pt)) "\n" txt))
  49.         )
  50.         (setq c          (getcolor e)
  51.               c          (cadr
  52.                     (assoc c
  53.                            (append '((1 " 0 0 0 0 0 0 276")
  54.                                      (2 " 0 0 0 0 0 0 260")
  55.                                      (3 " 0 0 0 0 0 0 400")
  56.                                      (4 " 0 0 0 1 0 0 384")
  57.                                      (5 " 0 0 0 3 0 0 384")
  58.                                      (6 " 0 0 25 0 25 0 260")
  59.                                      (7 " 0 0 0 2 0 0 384")
  60.                                      (8 " 0 0 0 0 0 0 384")
  61.                                     )
  62.                                    (list (list c (strcat " 0 0 0 0 0 0 " (itoa c))))
  63.                            )
  64.                     )
  65.                   )
  66.               txt (strcat "\n" (itoa (length p)) c "\n" txt)
  67.         )
  68.       )
  69.       (setq txt        (strcat "\n" (itoa (length s)) "\n" txt)
  70.             i        (length pt)
  71.       )
  72.       (foreach p (reverse pt)
  73.         (entmakex
  74.           (mapcar 'cons '(0 1 10 40 62) (list "text" (itoa i) p 2 1))
  75.         )
  76.         (setq i          (1- i)
  77.               txt (strcat (rtos (car p) 2 4)
  78.                           " "
  79.                           (rtos (* -1.5557 (cadr p)) 2 4)
  80.                           "\n"
  81.                           txt
  82.                   )
  83.         )
  84.       )
  85.       (write-line (strcat (itoa (length pt)) "\n\n" txt) f)
  86.       (close f)
  87.     )
  88.   )
  89.   (princ)
  90. )
回复

使用道具 举报

 楼主| 发表于 2017-12-11 19:26:20 | 显示全部楼层
符上图片和在测试文件




本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2017-12-11 21:54:32 | 显示全部楼层
问题在
(if (not (member i pt)) 和
(setq txt (strcat (itoa (vl-position i pt)) "\n" txt))
两句上,member 和vl-position两个函数不支持容差,要解决这个问题恐怕要改写整个数据结构,感觉非常复杂

或者能否对点数据进行一定规则的圆整,使得一定范围内的点合并成一个点,但貌似没有很可靠的算法。
回复

使用道具 举报

 楼主| 发表于 2017-12-11 23:56:31 | 显示全部楼层
vectra 发表于 2017-12-11 21:54
问题在
(if (not (member i pt)) 和
(setq txt (strcat (itoa (vl-position i pt)) "\n" txt))

数据可以  取整的...没多大影响
求帮修改一下
回复

使用道具 举报

 楼主| 发表于 2017-12-12 19:23:03 | 显示全部楼层

院长出手果然牛B。。。。

问题完美解决。。

谢谢大师~~~~
回复

使用道具 举报

 楼主| 发表于 2017-12-12 19:23:17 | 显示全部楼层

院长出手果然牛B。。。。
问题完美解决。。
谢谢大师~~~~
回复

使用道具 举报

 楼主| 发表于 2017-12-13 18:58:38 | 显示全部楼层

今天实测了一下,还是会间歇性出现同样的BUG


按说我改了这个精度参数,X轴座标输出的应该是1位点数才对。
但还是输出了4位小数,
Y轴因为*1.5557的原因。输出4位小数是正常的
(atof (rtos (car pt) 2 1))


可能后面的函数不取用你取整后的 座标点?
回复

使用道具 举报

 楼主| 发表于 2017-12-13 19:57:28 | 显示全部楼层

问题已经解决了。。。竟然是我打包一起的子程序重名了。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-3 03:39 , Processed in 0.180150 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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