乐筑天下

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

[编程交流] 切割时需要Lisp程序固定

[复制链接]

20

主题

70

帖子

50

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 23:53:35 | 显示全部楼层 |阅读模式
我用lisp将多段线分割为指定长度的线段(加载此lisp后的MESCUT命令),
我需要的改进:
1) 能够选择多个图元(交叉窗口和多重选择)
2) 在随后创建的新段之间创建一个给定的间隙,但将新段保持在给定的长度。
3) Lisp程序应该记住我为下次输入的最后一个细节,直到我决定更改它。
 
再次感谢所有的天才,
  1. ;; Deux petites routines pour tronחonner des objets curvilignes
  2. ;; (arc, cercle, ellipse, ligne, polylignes, et spline)
  3. ;; soit en un nombre spיcifiי de tronחons : DivCut,
  4. ;; soit en des tronחons d'une longueur spיcifiיe : MesDiv
  5. ;; [url]http://www.cadxp.com/sujetXForum-16753.htm[/url]
  6. ;;
  7. ;; 2 commandes: DIVCUT & MESCUT
  8. ;;
  9. ;; EDIT : NOUVELLE VERSION, l'ancienne ne fonctionnait pas
  10. ;; avec les polylignes 2D et 3D, ni avec les polylignes fermיes
  11. ;;;;;;;;;
  12. ;; DIVCUT - [Editי le 17/9/2007 par (gile)]
  13. ;; Coupe l'objet sיlectionnי en le nombre spיcifiי de tronחons יgaux
  14. ;;;;;;;;;
  15. (defun c:divcut (/ ent end div len elst)
  16. (vl-load-com)
  17. (if
  18. (and
  19. (setq ent (car (entsel)))
  20. (not (vl-catch-all-error-p
  21. (setq end
  22. (vl-catch-all-apply 'vlax-curve-getEndParam (list ent))
  23. )
  24. )
  25. )
  26. (princ
  27. (strcat "\nLongueur de l'objet : "
  28. (rtos (setq len (vlax-curve-getDistAtParam ent end)))
  29. )
  30. )
  31. (setq div (getint "\nNombre de divisions: "))
  32. (< 0 div)
  33. (setq len (/ len div))
  34. )
  35. (progn
  36. (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  37. (repeat (1- div)
  38. (setq
  39. ent
  40. (cadr
  41. (CutCurveAtPoint ent (vlax-curve-getPointAtDist ent len))
  42. )
  43. )
  44. )
  45. (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  46. )
  47. (princ "\nEntitי non valide")
  48. )
  49. (princ)
  50. )
  51. ;;;;;;;;;
  52. ;; MESCUT
  53. ;; Coupe l'objet sיlectionnי en tronחons de la longueur spיcifiיe
  54. ;;;;;;;;;
  55. (defun c:mescut (/ ent end tot len div elst)
  56. (vl-load-com)
  57. (if
  58. (and
  59. (setq ent (car (entsel)))
  60. (not (vl-catch-all-error-p
  61. (setq end
  62. (vl-catch-all-apply 'vlax-curve-getEndParam (list ent))
  63. )
  64. )
  65. )
  66. (princ
  67. (strcat "\nLongueur de l'objet : "
  68. (rtos (setq tot (vlax-curve-getDistAtParam ent end)))
  69. )
  70. )
  71. (setq len (getdist "\nLongueur du segment: "))
  72. (< 0 len)
  73. (setq div (fix (/ tot len)))
  74. )
  75. (progn
  76. (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  77. (repeat div
  78. (setq
  79. ent
  80. (cadr
  81. (CutCurveAtPoint ent (vlax-curve-getPointAtDist ent len))
  82. )
  83. )
  84. )
  85. (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  86. )
  87. (princ "\nEntitי non valide")
  88. )
  89. (princ)
  90. )
  91. ;; Coupe un objet curviligne au point spיcifiי
  92. ;;
  93. ;; Arguments
  94. ;; ent : l'objet א couper (ename ou vla-object)
  95. ;; pt : le point de coupure (coordonnיes WCS)
  96. ;;
  97. ;; Retour
  98. ;; une liste des deux objets crייs (ename ou vla-object)
  99. (defun CutCurveAtPoint (ent pt / vl lst cl start end ec os)
  100. (vl-load-com)
  101. (and (= (type ent) 'VLA-OBJECT)
  102. (setq ent (vlax-vla-object->ename ent)
  103. vl T
  104. )
  105. )
  106. (cond
  107. ((equal pt (vlax-curve-getEndPoint ent) 1e-9)
  108. (setq lst (list ent nil))
  109. )
  110. ((equal pt (vlax-curve-getStartPoint ent) 1e-9)
  111. (setq lst (list nil ent))
  112. )
  113. ((null (vlax-curve-getParamAtPoint ent pt))
  114. (setq lst (list ent nil))
  115. )
  116. (T
  117. (setq start (trans (vlax-curve-getStartPoint ent) 0 1)
  118. end (trans (vlax-curve-getEndPoint ent) 0 1)
  119. ec (getvar "cmdecho")
  120. os (getvar "osmode")
  121. )
  122. (setvar "cmdecho" 0)
  123. (setvar "osmode" 0)
  124. (if (and (wcmatch (cdr (assoc 0 (entget ent))) "*POLYLINE")
  125. (= 1 (logand 1 (cdr (assoc 70 (entget ent)))))
  126. )
  127. (progn
  128. (command "_.break" ent (trans pt 0 1) "@")
  129. (setq cl (entlast))
  130. )
  131. (progn
  132. (if (= "POLYLINE" (cdr (assoc 0 (entget ent))))
  133. (progn
  134. (entmake (entget ent))
  135. (setq vx (entnext ent))
  136. (while (= "VERTEX" (cdr (assoc 0 (entget vx))))
  137. (entmake (entget vx))
  138. (setq vx (entnext vx))
  139. )
  140. (entmake '((0 . "SEQEND")))
  141. (setq cl (entlast)
  142. po T
  143. )
  144. )
  145. (setq cl (entmakex (entget ent)))
  146. )
  147. (command "_.break" ent (trans pt 0 1) end)
  148. (and po (setq ent (entlast)))
  149. (command "_.break" cl start (trans pt 0 1))
  150. (and po (setq cl (entlast)))
  151. )
  152. )
  153. (setvar "cmdecho" ec)
  154. (setvar "osmode" os)
  155. (setq lst (list ent cl))
  156. )
  157. )
  158. (if vl
  159. (mapcar '(lambda (x)
  160. (if x
  161. (vlax-ename->vla-object x)
  162. )
  163. )
  164. lst
  165. )
  166. lst
  167. )
  168. )                  
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 00:03:27 | 显示全部楼层
代码看起来很有趣,我稍后将对此进行研究。
 
顺便说一句:
请阅读代码发布指南并编辑代码以包含代码标签。
回复

使用道具 举报

20

主题

70

帖子

50

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 00:10:02 | 显示全部楼层
 
o、 k谢谢
回复

使用道具 举报

20

主题

70

帖子

50

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 00:10:35 | 显示全部楼层
任何人
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 00:17:15 | 显示全部楼层
也许,这可以帮助。。。
 
M、 R。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 00:21:12 | 显示全部楼层
  1. (defun c:moveseg (/ ss i e d ang pre dst)
  2. ;;;                pBe 17Nov2013                ;;;
  3. (if (setq ss (ssget '((0 . "LWPOLYLINE,LINE"))))
  4.    (progn
  5. (setq seg (cond
  6. ((getint (strcat "\nEnter number of segments:"
  7.          (if seg (strcat " <" (itoa seg) ">: ") ": ")
  8.                     )))(seg))
  9.         )
  10. (setq gap (cond
  11. ((getdist (strcat "\nEnter value for gap:"
  12.          (if gap (strcat " <" (rtos gap) ">: ") ": ")
  13.                     )))(gap))
  14.         )
  15.      (repeat (setq i (sslength ss))
  16. (setq pre (ssadd) e (ssname ss (setq i (1- i))))
  17. (setq dst
  18.        (/ (vlax-curve-getdistatparam e (vlax-curve-getendparam e))
  19.           seg
  20.        )
  21. )
  22. (repeat        seg
  23.   (setq pt (vlax-curve-getpointatdist e dst))
  24.   (setq        ang (angle '(0.0 0.0 0.0)
  25.                    (vlax-curve-getfirstderiv
  26.                      e
  27.                      (vlax-curve-getparamatpoint e pt)
  28.                    )
  29.             )
  30.   )
  31.   (command "_break" e "_non" pt "_non" pt)
  32.   (ssadd e pre)
  33.   (command "_move"
  34.            pre
  35.            ""
  36.            "_non"
  37.            pt
  38.            (polar pt (+ pi ang) gap)
  39.   )(setq e (entlast))
  40. )
  41.      )
  42.    )
  43. )
  44. (princ)
  45. )
  46. (vl-load-com)
回复

使用道具 举报

20

主题

70

帖子

50

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 00:31:43 | 显示全部楼层
工作得很好!是否可以对测量命令执行类似的步骤?
非常感谢你
回复

使用道具 举报

20

主题

70

帖子

50

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 00:35:58 | 显示全部楼层
很抱歉问了几次,但是可以对测量命令执行类似的过程吗?
我有很多行,这个命令可以节省我几个小时的工作
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 00:40:00 | 显示全部楼层
  1. (defun c:moveseg2 (/ ss i e ang pre)
  2. ;;;        MR 24Nov2013        ;;;
  3. (if (setq ss (ssget '((0 . "LWPOLYLINE,LINE"))))
  4.    (progn
  5.      (setq d (cond
  6.                ((getdist (strcat "\nEnter or pick measure distance"
  7.                                  (if d
  8.                                    (strcat " <" (rtos d) ">: ")
  9.                                    ": "
  10.                                  )
  11.                          )
  12.                 )
  13.                )
  14.                (d)
  15.              )
  16.      )
  17.      (setq gap (cond
  18.                  ((getdist (strcat "\nEnter value for gap"
  19.                                    (if gap
  20.                                      (strcat " <" (rtos gap) ">: ")
  21.                                      ": "
  22.                                    )
  23.                            )
  24.                   )
  25.                  )
  26.                  (gap)
  27.                )
  28.      )
  29.      (repeat (setq i (sslength ss))
  30.        (setq pre (ssadd)
  31.              e   (ssname ss (setq i (1- i)))
  32.        )
  33.        (repeat
  34.          (fix
  35.            (/ (vlax-curve-getdistatparam e (vlax-curve-getendparam e))
  36.               d
  37.            )
  38.          )
  39.           (setq pt (vlax-curve-getpointatdist e d))
  40.           (setq ang (angle '(0.0 0.0 0.0)
  41.                            (vlax-curve-getfirstderiv
  42.                              e
  43.                              (vlax-curve-getparamatpoint e pt)
  44.                            )
  45.                     )
  46.           )
  47.           (command "_break" e "_non" pt "_non" pt)
  48.           (ssadd e pre)
  49.           (command "_move"
  50.                    pre
  51.                    ""
  52.                    "_non"
  53.                    pt
  54.                    (polar pt (+ pi ang) gap)
  55.           )
  56.           (setq e (entlast))
  57.        )
  58.      )
  59.    )
  60. )
  61. (princ)
  62. )
  63. (vl-load-com)
HTH,M.R。
回复

使用道具 举报

20

主题

70

帖子

50

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 00:44:58 | 显示全部楼层
 
我没有看到差距(实际上在两个LISP中),我认为autocad中发生了一些变化,因为上次它起作用了
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 21:22 , Processed in 0.697993 second(s), 72 queries .

© 2020-2025 乐筑天下

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