ysq101 发表于 2017-12-11 19:18:37

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

本帖最后由 ysq101 于 2017-12-11 19:20 编辑

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

(defun getcolor(e / c)
(if(setq e(entget e)c(assoc 62 e))
    (cdr c)
    (cdr(assoc 62(tblsearch"layer"(cdr(assoc 8 e)))))
    ))
(defun plinexy(e)
(mapcar'cdr(vl-remove-if'(lambda(x)(/=(car x)10))(entget e)))
)
(defun Pldir(pt)
(<(apply'+(mapcar'(lambda(x y)(-(*(car x)(cadr y))(*(car y)(cadr x))))(cons(last pt)pt)pt))0))
(defun c:wt(/ s f i e p pt txt c)
(if(and(setq s(ssget'((0 . "lwpolyline")(-4 . "&")(70 . 1))))
(setq s(vl-remove-if'(lambda(x)(/=(type x)'ename))(mapcar'cadr(ssnamex s)))
       f(getfiled "" "" "txt" 1))
(setq txt""f(open f"w")))
    (progn
      (foreach e s
(foreach i(if(pldir(setq p(plinexy e)))(setq p(reverse p))p)
(if(not(member i pt))(setq pt(append pt(list i))))
(setq txt(strcat(itoa(vl-position i pt))"\n"txt)))
(setq c(getcolor e)
      c(cadr(assoc c(append'((1" 0 0 0 0 0 0 276")
   (2" 0 0 0 0 0 0 260")
   (3" 0 0 0 0 0 0 400")
   (4" 0 0 0 1 0 0 384")
   (5" 0 0 0 3 0 0 384")
   (6" 0 0 25 0 25 0 260")
   (7" 0 0 0 2 0 0 384")
   (8" 0 0 0 0 0 0 384"))
   (list(list c(strcat" 0 0 0 0 0 0 "(itoa c)))))))
      txt(strcat"\n"(itoa(length p))c"\n"txt)))
      (setq txt(strcat"\n"(itoa(length s))"\n"txt)
    i(length pt));;;;
      (foreach p(reverse pt)
(entmakex(mapcar'cons'(0 1 10 40 62)(list"text"(itoa i)p 2 1)));;;;
(setq i(1- i)txt(strcat(rtos(car p)2 4)" "(rtos(* -1.5557 (cadr p))2 4)"\n"txt)))
      (write-line(strcat(itoa(length pt))"\n\n"txt)f)
      (close f))
    ))


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

跪谢

xyp1964 发表于 2017-12-11 19:18:38

(defun getcolor        (e / c)
(if (setq e (entget e)
          c (assoc 62 e)
      )
    (cdr c)
    (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 e)))))
)
)
(defun PtFuzz (pt)
(list        (atof (rtos (car pt) 2 3))
        (atof (rtos (cadr pt) 2 3))
)
)
(defun plinexy (e / ptn)
(setq ptn (vl-remove-if '(lambda (x) (/= (car x) 10)) (entget e)))
(mapcar 'PtFuzz (mapcar 'cdr ptn))
)

(defun Pldir (pt)
(< (apply '+
          (mapcar '(lambda (x y) (- (* (car x) (cadr y)) (* (car y) (cadr x))))
                  (cons (last pt) pt)
                  pt
          )
   )
   0
)
)
(defun c:tt (/ s f i e p pt txt c)
(princ "\n选择实体: ")
(if (setq s (ssget '((0 . "*polyline") (70 . 1))))
    (progn
      (setq s        (vl-remove-if
                  '(lambda (x) (/= (type x) 'ename))
                  (mapcar 'cadr (ssnamex s))
                )
          f        (getfiled "" "" "txt" 1)
          txt        ""
          f        (open f "w")
      )
      (foreach e s
        (foreach i (if (pldir (setq p (plinexy e)))
                     (setq p (reverse p))
                     p
                   )
          (if (not (member i pt))
          (setq pt (append pt (list i)))
          )
          (setq txt (strcat (itoa (vl-position i pt)) "\n" txt))
        )
        (setq c          (getcolor e)
              c          (cadr
                  (assoc c
                           (append '((1 " 0 0 0 0 0 0 276")
                                     (2 " 0 0 0 0 0 0 260")
                                     (3 " 0 0 0 0 0 0 400")
                                     (4 " 0 0 0 1 0 0 384")
                                     (5 " 0 0 0 3 0 0 384")
                                     (6 " 0 0 25 0 25 0 260")
                                     (7 " 0 0 0 2 0 0 384")
                                     (8 " 0 0 0 0 0 0 384")
                                  )
                                   (list (list c (strcat " 0 0 0 0 0 0 " (itoa c))))
                           )
                  )
                  )
              txt (strcat "\n" (itoa (length p)) c "\n" txt)
        )
      )
      (setq txt        (strcat "\n" (itoa (length s)) "\n" txt)
          i        (length pt)
      )
      (foreach p (reverse pt)
        (entmakex
          (mapcar 'cons '(0 1 10 40 62) (list "text" (itoa i) p 2 1))
        )
        (setq i          (1- i)
              txt (strcat (rtos (car p) 2 4)
                          " "
                          (rtos (* -1.5557 (cadr p)) 2 4)
                          "\n"
                          txt
                  )
        )
      )
      (write-line (strcat (itoa (length pt)) "\n\n" txt) f)
      (close f)
    )
)
(princ)
)

ysq101 发表于 2017-12-11 19:26:20

符上图片和在测试文件




vectra 发表于 2017-12-11 21:54:32

问题在
(if (not (member i pt)) 和
(setq txt (strcat (itoa (vl-position i pt)) "\n" txt))
两句上,member 和vl-position两个函数不支持容差,要解决这个问题恐怕要改写整个数据结构,感觉非常复杂

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

ysq101 发表于 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))


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

ysq101 发表于 2017-12-12 19:23:03

xyp1964 发表于 2017-12-12 00:25


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

问题完美解决。。

谢谢大师~~~~

ysq101 发表于 2017-12-12 19:23:17

xyp1964 发表于 2017-12-12 00:25


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

ysq101 发表于 2017-12-13 18:58:38

xyp1964 发表于 2017-12-11 19:18


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


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


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

ysq101 发表于 2017-12-13 19:57:28

xyp1964 发表于 2017-12-11 19:18


问题已经解决了。。。竟然是我打包一起的子程序重名了。。。
页: [1]
查看完整版本: 求高手们帮忙修改一下,增加一个容差