明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3024|回复: 13

2多段线延伸相交捡懒

[复制链接]
发表于 2019-11-22 21:11:05 | 显示全部楼层 |阅读模式
  1. (defun vxs(e / p a b n ob q et d d1 en et)
  2.     (setq a(entget e)ob(vlax-ename->vla-object e)et(cdr(assoc 0 a))n 0 p nil d nil)
  3.     (cond((="LWPOLYLINE"et)
  4.     (repeat(length a)(setq b (nth n a) n (+ n 1))
  5.       (if (= 10 (car b))(progn
  6.         (setq q(list (cadr b) (caddr b))d1(vlax-curve-getDistAtPoint ob q))
  7.         (if p (if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
  8.           (setq p (list q)))))))
  9.    ((="POLYLINE"et)
  10.     (SETQ EN (ENTGET (SETQ E (ENTNEXT E))))
  11.     (WHILE (/= (CDR (ASSOC 0 EN)) "SEQEND")
  12.       (SETQ q (CDR (ASSOC 10 EN))d1(vlax-curve-getDistAtPoint ob q)q(reverse(cdr(reverse q))))
  13.       (if p(if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))(setq p(list q)))
  14.       (SETQ EN (ENTGET (SETQ E (ENTNEXT E)))))
  15.     (setq p(reverse p))))P)



  16. ;;示例(HHickSegEndPt (car(setq en(entsel))) (cadr en))


  17. (defun HHickSegEndPt (obj p / pp n)
  18.   (setq  pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  19.   n  (fix (vlax-curve-getparamatpoint obj pp))
  20.   )

  21.   (setq ll (length (vxs obj)));;避免最后一个点出创,加个判断(多这一句)

  22.   (list
  23.     (vlax-curve-getPointAtParam obj n)
  24.     (if  (> (+ n 1) (- ll 1))
  25.       (vlax-curve-getPointAtParam obj 1);;避免最后一个点出创,加个判断(多这一句)
  26.       (vlax-curve-getPointAtParam obj (1+ n))
  27.     )
  28.   )
  29. )

  30. ;3、点表生成多段线
  31. (defun makepl (lst / pt)
  32. (entmake (append    (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(8 . "XDDX") (cons 90 (length lst)) (cons 70 128))
  33.       (mapcar '(lambda (pt)(cons 10 pt)) lst ))
  34.   ) )

  35. (defun c:ed1 (/ p1 p2 j1 j2 jd a b ) ;p1 p2 j1 j2 jd

  36. (setq p1 (entsel "\n请选择多段线需要延伸端点1:")
  37.       p2 (entsel "\n请选择多段线需要延伸端点1:")
  38.       )
  39. (setq j1 (HHickSegEndPt (car p1) (cadr p1))
  40.       j2 (HHickSegEndPt (car p2) (cadr p2))
  41.       )
  42.   (setq jd (inters (CAR J1)(CADR J1) (CAR J2)(CADR J2) nil)
  43. )
  44.   (setq a (vxs (car p1)   ) b (vxs (car p2)   )
  45.   )
  46. (if (  >   (distance (CAR J1) jd)  (distance (CAdR J1) jd)  ) (setq a a) (setq a (reverse a) ) )
  47.   (if (  >   (distance (CAR J2) jd)  (distance (CAdR J2) jd)  ) (setq b (reverse b) ) (setq b b)  )
  48. (makepl (append a (list jd)    b )   )
  49.   (entdel (car p1)) (entdel (car p2))
  50.   (PRINC)
  51.   )

本帖子中包含更多资源

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

x
发表于 2021-11-27 02:25:44 | 显示全部楼层
请问这个和cad的倒角是不是一样的
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-12-15 16:42:40 | 显示全部楼层


重复多段线 重复表判别 73哥函数
  1. (defun plinexy(e / p a b n ob q et d d1 en et)
  2.     (setq a(entget e)ob(vlax-ename->vla-object e)et(cdr(assoc 0 a))n 0 p nil d nil)
  3.     (cond((="LWPOLYLINE"et)
  4.     (repeat(length a)(setq b (nth n a) n (+ n 1))
  5.       (if (= 10 (car b))(progn
  6.         (setq q(list (cadr b) (caddr b))d1(vlax-curve-getDistAtPoint ob q))
  7.         (if p (if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
  8.           (setq p (list q)))))))
  9.    ((="POLYLINE"et)
  10.     (SETQ EN (ENTGET (SETQ E (ENTNEXT E))))
  11.     (WHILE (/= (CDR (ASSOC 0 EN)) "SEQEND")
  12.       (SETQ q (CDR (ASSOC 10 EN))d1(vlax-curve-getDistAtPoint ob q)q(reverse(cdr(reverse q))))
  13.       (if p(if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))(setq p(list q)))
  14.       (SETQ EN (ENTGET (SETQ E (ENTNEXT E)))))
  15.     (setq p(reverse p))))P)


  16. (defun lst-(l1 l2 fuz / a l)
  17.   (while l1
  18.       (setq a(car l1)l1(cdr l1))
  19.       (or(vl-some(function(lambda(x)(equal a x fuz)))l2)
  20.    (setq l(cons a l))))
  21.       (reverse l))

  22. (defun lst-1 (l1 l2 fuz / l)
  23.   (if l2
  24.     (progn
  25.       (vl-every(function(lambda(a)
  26.         (or(vl-some(function(lambda(x)(equal a x fuz)))l2)
  27.            (setq l(cons a l)))))l1)
  28.       (reverse l))
  29.     l1))

  30.    

  31. (setq p1(lst-  (plinexy (car(entsel "\n请选择一条线:"))) (plinexy (car(entsel "\n请选择另一条线:"))) 0.0001 ))

 楼主| 发表于 2019-11-23 10:51:23 | 显示全部楼层
  1. (defun linezb (pp /)
  2. (list (cdr(assoc 10 (entget pp))) (cdr(assoc 11 (entget pp)))  )
  3.   )

  4. ;3、点表生成多段线
  5. (defun makepl (lst / pt)
  6. (entmake (append    (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(8 . "XDDX") (cons 90 (length lst)) (cons 70 128))
  7.       (mapcar '(lambda (pt)(cons 10 pt)) lst ))
  8.   ) )

  9. (defun c:ed2 ( / p1 p2 j1 j2 jd a b  ) ;p1 p2 j1 j2 jd a b

  10. (setq p1 (entsel "\n请选择直线需要延伸端点1:")
  11.       p2 (entsel "\n请选择直线需要延伸端点1:")
  12.       )
  13. (setq j1 (linezb (car p1))
  14.       j2 (linezb (car p2))
  15.       )
  16.   (setq jd (inters (CAR J1)(CADR J1) (CAR J2)(CADR J2) nil)
  17. )
  18.   (setq a (linezb (car p1)   ) b (linezb (car p2)   )
  19.   )
  20. (if (  >   (distance (CAR J1) jd)  (distance (CAdR J1) jd)  ) (setq a a) (setq a (reverse a) ) )
  21.   (if (  >   (distance (CAR J2) jd)  (distance (CAdR J2) jd)  ) (setq b (reverse b) ) (setq b b)  )
  22. (makepl (append a (list jd)    b )   )
  23.   (entdel (car p1)) (entdel (car p2))
  24.   (PRINC)
  25.   )

本帖子中包含更多资源

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

x
发表于 2020-5-7 19:48:14 | 显示全部楼层
老师 你好 我有个问题,想请您看看,也是关于PLINE延伸相交的问题。详细见http://bbs.mjtd.com/thread-181474-1-1.html 谢谢。相信您能解决,好吧
发表于 2020-9-10 14:11:06 | 显示全部楼层
支持支持,多谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 00:15 , Processed in 0.190258 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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