乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 22|回复: 3

[编程交流] 选择多条多段线并

[复制链接]

6

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 15:24:43 | 显示全部楼层 |阅读模式
此lisp将多段线线段转换为圆弧。一次只做一行。我需要为次选择1000条多段线。我是autolisp新手,我知道代码中有什么变化:
 
  1. (defun c:lwsegs2arced ( / massoclst nthmassocsubst v^v unit _ilp doc lw enx gr enxb p1 p2 p3 b i n )
  2. (vl-load-com)
  3. (defun massoclst ( key lst )
  4.    (if (assoc key lst) (cons (assoc key lst) (massoclst key (cdr (member (assoc key lst) lst)))))
  5. )
  6. (defun nthmassocsubst ( n key value lst / k slst p j plst m tst pslst )
  7.    (setq k (length (setq slst (member (assoc key lst) lst))))
  8.    (setq p (- (length lst) k))
  9.    (setq j -1)
  10.    (repeat p
  11.      (setq plst (cons (nth (setq j (1+ j)) lst) plst))
  12.    )
  13.    (setq plst (reverse plst))
  14.    (setq j -1)
  15.    (setq m -1)
  16.    (repeat k
  17.      (setq j (1+ j))
  18.      (if (equal (assoc key (member (nth j slst) slst)) (nth j slst) 1e-6)
  19.        (setq m (1+ m))
  20.      )
  21.      (if (and (not tst) (= n m))
  22.        (setq pslst (cons (cons key value) pslst) tst t)
  23.        (setq pslst (cons (nth j slst) pslst))
  24.      )
  25.    )
  26.    (setq pslst (reverse pslst))
  27.    (append plst pslst)
  28. )
  29. (defun v^v ( u v )
  30.    (mapcar '(lambda ( s1 s2 a b ) (+ ((eval s1) (* (nth a u) (nth b v))) ((eval s2) (* (nth a v) (nth b u))))) '(+ - +) '(- + -) '(1 0 0) '(2 2 1))
  31. )
  32. (defun unit ( v )
  33.    (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  34. )
  35. (defun _ilp ( p1 p2 o nor / p1p p2p op tp pp p )
  36.    (if (not (equal (v^v nor (unit (mapcar '- p2 p1))) '(0.0 0.0 0.0) 1e-7))
  37.      (progn
  38.        (setq p1p (trans p1 0 (v^v nor (unit (mapcar '- p2 p1))))
  39.              p2p (trans p2 0 (v^v nor (unit (mapcar '- p2 p1))))
  40.              op  (trans o 0 (v^v nor (unit (mapcar '- p2 p1))))
  41.              op  (list (car op) (cadr op) (caddr p1p))
  42.              tp  (polar op (+ (* 0.5 pi) (angle '(0.0 0.0 0.0) (trans nor 0 (v^v nor (unit (mapcar '- p2 p1)))))) 1.0)
  43.        )
  44.        (if (inters p1p p2p op tp nil)
  45.          (progn
  46.            (setq p (trans (inters p1p p2p op tp nil) (v^v nor (unit (mapcar '- p2 p1))) 0))
  47.            p
  48.          )
  49.          nil
  50.        )
  51.      )
  52.      (progn
  53.        (setq pp (list (car (trans p1 0 nor)) (cadr (trans p1 0 nor)) (caddr (trans o 0 nor))))
  54.        (setq p (trans pp nor 0))
  55.        p
  56.      )
  57.    )
  58. )
  59. (or doc (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))))
  60. (vla-startundomark doc)
  61. (if (and (setq lw (entsel "\nPick LWPOLYLINE..."))
  62.          (= (cdr (assoc 0 (setq enx (entget (car lw))))) "LWPOLYLINE")
  63.      )
  64.    (progn
  65.      (setq i (fix (vlax-curve-getParamAtPoint
  66.                  (car lw)
  67.                  (vlax-curve-getClosestPointToProjection (car lw) (trans (cadr lw) 1 0) '(0.0 0.0 1.0))
  68.                  ) ;_  vlax-curve-getParamAtPoint
  69.              ) ;_  fix
  70.           p1 (vlax-curve-getPointAtParam (car lw) i)
  71.           p3 (vlax-curve-getPointAtParam (car lw) (1+ i))
  72.           lw (car lw)
  73.      )
  74.      (setq enxb (massoclst 42 enx))
  75.      (while (= 5 (car (setq gr (grread t))))
  76.        (setq p2 (_ilp (trans (cadr gr) 1 0) (mapcar '+ (trans (cadr gr) 1 0) '(0.0 0.0 1.0)) p1 (cdr (assoc 210 (entget lw)))))
  77.        (setq b ((lambda (a) (/ (sin a) (cos a)))
  78.                (/ (- (angle (trans p2 0 lw) (trans p3 0 lw)) (angle (trans p1 0 lw) (trans p2 0 lw))) 2.0)
  79.               )
  80.        )
  81.        (setq n -1)
  82.        (foreach dxf42 enxb
  83.          (setq n (1+ n))
  84.          (if (= n i)
  85.            (setq enx (nthmassocsubst n 42 b enx))
  86.            (setq enx (nthmassocsubst n 42 (+ (cdr dxf42) b) enx))
  87.          )
  88.        )
  89.        (entupd (cdr (assoc -1 (entmod enx))))
  90.      )
  91.    )
  92.    (prompt "\n Nothing selected or picked object not a LWPOLYLINE ")
  93. )
  94. (vla-endundomark doc)
  95. (princ)
  96. )
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 16:01:00 | 显示全部楼层
 
另一种建议vla setbulge方法
仅LWpoly
 
  1. ;another [url=";http://www.cadtutor.net/forum/showthread.php?87920-Is-there-any-routine-convert-Revcloud-to-Polyline"]old thread[/url]
  2. (defun c:test ( / foo s i _bulge )
  3. ;hanhphuc 02.04.2018
  4. (defun _bulge ( en n / l i ) (setq i -1 l (entget en))
  5. (repeat (if (zerop (cdr (assoc 70 l)))
  6.       (1- (cdr (assoc 90 l)))
  7.       (cdr (assoc 90 l))
  8.       )
  9.      (vla-setBulge (vlax-ename->vla-object en) (setq i (1+ i)) n )
  10.      )
  11. )
  12. (if
  13. (setq ss (ssget ":L" '((0 . "LWPOLYLINE"))))
  14. (repeat (setq i (sslength ss))
  15. (_bulge (ssname ss (setq i (1- i))) [color="red"][b]-0.5[/b][/color] ) [color="green"]; 0.5 or -0.5 default bulge [/color]
  16. )
  17. (princ "\nLWPolyline only!")
  18. )
  19. (princ)
  20. )
  21. (vl-load-com)

 
我们不知道你们的LW多段线都是顺时针方向还是其他方向?
 
也许您需要过滤方向、反转和清除零长度测试。。
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:11:15 | 显示全部楼层
尝试多种选择:
  1. (defun c:lwsegs2arced
  2.       (/ massoclst nthmassocsubst v^v unit _ilp d doc lw enx gr enxb p p1 p2 p3 b i n)
  3. (vl-load-com)
  4. (defun massoclst (key lst)
  5.    (if        (assoc key lst)
  6.      (cons (assoc key lst) (massoclst key (cdr (member (assoc key lst) lst))))
  7.    )
  8. )
  9. (defun nthmassocsubst        (n key value lst / k slst p j plst m tst pslst)
  10.    (setq k (length (setq slst (member (assoc key lst) lst))))
  11.    (setq p (- (length lst) k))
  12.    (setq j -1)
  13.    (repeat p (setq plst (cons (nth (setq j (1+ j)) lst) plst)))
  14.    (setq plst (reverse plst))
  15.    (setq j -1)
  16.    (setq m -1)
  17.    (repeat k
  18.      (setq j (1+ j))
  19.      (if (equal (assoc key (member (nth j slst) slst)) (nth j slst) 1e-6)
  20. (setq m (1+ m))
  21.      )
  22.      (if (and (not tst) (= n m))
  23. (setq pslst (cons (cons key value) pslst)
  24.       tst   t
  25. )
  26. (setq pslst (cons (nth j slst) pslst))
  27.      )
  28.    )
  29.    (setq pslst (reverse pslst))
  30.    (append plst pslst)
  31. )
  32. (defun v^v (u v)
  33.    (mapcar
  34.      '(lambda (s1 s2 a b) (+ ((eval s1) (* (nth a u) (nth b v))) ((eval s2) (* (nth a v) (nth b u)))))
  35.      '(+ - +)
  36.      '(- + -)
  37.      '(1 0 0)
  38.      '(2 2 1)
  39.     )
  40. )
  41. (defun unit (v) (mapcar '(lambda (x) (/ x (distance '(0.0 0.0 0.0) v))) v))
  42. (defun _ilp (p1 p2 o nor / p1p p2p op tp pp p)
  43.    (if        (not (equal (v^v nor (unit (mapcar '- p2 p1))) '(0.0 0.0 0.0) 1e-7))
  44.      (progn
  45. (setq p1p (trans p1 0 (v^v nor (unit (mapcar '- p2 p1))))
  46.       p2p (trans p2 0 (v^v nor (unit (mapcar '- p2 p1))))
  47.       op  (trans o 0 (v^v nor (unit (mapcar '- p2 p1))))
  48.       op  (list (car op) (cadr op) (caddr p1p))
  49.       tp  (polar op
  50.                  (+ (* 0.5 pi)
  51.                     (angle '(0.0 0.0 0.0) (trans nor 0 (v^v nor (unit (mapcar '- p2 p1)))))
  52.                  )
  53.                  1.0
  54.           )
  55. )
  56. (if (inters p1p p2p op tp nil)
  57.   (progn (setq p (trans (inters p1p p2p op tp nil) (v^v nor (unit (mapcar '- p2 p1))) 0)) p)
  58.   nil
  59. )
  60.      )
  61.      (progn (setq pp (list (car (trans p1 0 nor)) (cadr (trans p1 0 nor)) (caddr (trans o 0 nor))))
  62.      (setq p (trans pp nor 0))
  63.      p
  64.      )
  65.    )
  66. )
  67. (or doc (setq doc (vla-get-activedocument (vlax-get-acad-object))))
  68. (vla-startundomark doc)
  69. ;; RJP - added multiple selection 04.02.2018
  70. (if (setq s (ssget ":L" '((0 . "lwpolyline"))))
  71.    (foreach lw        (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
  72.      (setq i  (fix (vlax-curve-getparamatpoint
  73.               lw
  74.               (vlax-curve-getclosestpointtoprojection
  75.                 lw
  76.                 (trans (setq p (vlax-curve-getstartpoint lw)) 1 0)
  77.                 '(0.0 0.0 1.0)
  78.               )
  79.             ) ;_  vlax-curve-getParamAtPoint
  80.        ) ;_  fix
  81.     p1 (vlax-curve-getpointatparam lw i)
  82.     p3 (vlax-curve-getpointatparam lw (1+ i))
  83.      )
  84.      (setq enxb (massoclst 42 (setq enx (entget lw))))
  85.      (setq p2 (_ilp (trans p 1 0)
  86.              (mapcar '+ (trans p 1 0) '(0.0 0.0 1.0))
  87.              p1
  88.              (cdr (assoc 210 (entget lw)))
  89.        )
  90.      )
  91.      (setq
  92. b ((lambda (a) (/ (sin a) (cos a)))
  93.     (/ (- (angle (trans p2 0 lw) (trans p3 0 lw)) (angle (trans p1 0 lw) (trans p2 0 lw)))
  94.        2.0
  95.     )
  96.   )
  97.      )
  98.      (setq n -1)
  99.      (foreach dxf42 enxb
  100. (setq n (1+ n))
  101. (if (= n i)
  102.   (setq enx (nthmassocsubst n 42 b enx))
  103.   (setq enx (nthmassocsubst n 42 (+ (cdr dxf42) b) enx))
  104. )
  105.      )
  106.      (entupd (cdr (assoc -1 (entmod enx))))
  107.    )
  108.    (prompt "\n Nothing selected or picked object not a LWPOLYLINE ")
  109. )
  110. (vla-endundomark doc)
  111. (princ)
  112. )
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:39:54 | 显示全部楼层
同样的问题。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 21:04 , Processed in 0.480557 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表