明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 567|回复: 14

[提问] 关于断开多段线(请教龙龙仔)

[复制链接]
发表于 2019-5-29 17:41 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2019-5-29 22:32 编辑

龙龙仔有段程序,是断开多段线,且不改变宽度的,如下:

  • ;;--断开多段线于顶点处,宽度不变--------------------------------------------------
  • (defun SL-COORDS (PLINE / ENDPARAM PARAM LST)
  •   (setq ENDPARAM (vlax-curve-getendparam PLINE) PARAM  -1)
  •   (while (<= (setq PARAM (1+ PARAM)) ENDPARAM)
  •     (setq LST (cons (vlax-curve-getpointatparam PLINE PARAM) LST))
  •   )   ;;
  •   (if (= 1 (logand (cdr (assoc 70 (entget PLINE))) 1)) ;;
  •     (setq LST (reverse (cdr LST)))
  •     (setq LST (reverse LST))   ;;
  •   )
  • )
  • (defun C:EXPLINE (/ ENT LST N SS)
  •   (if (setq SS (ssget '((0 . "LWpolyline"))))
  •     (progn
  •       (setq N 0)
  •       (repeat (sslength SS)
  •         (setq ENT (ssname SS N))
  •         (setq LST (cdr (SL-COORDS ENT)))
  •         (if (> (length LST) 1)
  •           (repeat (1- (length LST))
  •             (command "_.break" ENT "end" (car LST) "end" "@")
  •             (setq ENT (entlast))
  •             (setq LST (cdr LST))
  •           )
  •         )
  •         (setq N (1+ N))
  •       )
  •     )
  •   )
  •   (princ)
  • )

经测试:这段程序对开口多段线完美,闭合的,将最后有一点断不开,希望找到毛病出来!
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-5-29 20:52 | 显示全部楼层
本帖最后由 1291500406 于 2019-5-29 21:40 编辑

(defun C:bb ()
(if (setq ss (ssget '((0 . "Lwpolyline")))n -1)(progn(repeat (sslength ss)(setq n (1+ n) ent (ssname ss n) lst (cdr (car (ACET-PLINE-SEGMENT-LIST ent ))))
(if (> (length lst) 1)(repeat (length lst)(command "_.break" ent "end"  (car lst)  "end" "@")(setq ent (entlast) lst (cdr lst)))))))(princ))


点评

请把你的函数发上吧?  发表于 2019-5-29 22:31
发表于 2019-5-29 20:54 | 显示全部楼层

(defun SL-COORDS (PLINE / ENDPARAM PARAM LST)
   (car (ACET-PLINE-SEGMENT-LIST pline))
)

点评

OK,看到了,  发表于 2019-5-29 22:43
赞一个  发表于 2019-5-29 20:58
 楼主| 发表于 2019-5-29 22:27 | 显示全部楼层
经过改写,我已经测试成功了。

  • ;;--断开多段线于顶点处,宽度不变-----(开始)---------------------------------------------
  • (vl-load-com)
  • (defun vertexs (ename / plist pp n)
  •   (setq obj (vlax-ename->vla-object ename))
  •   (setq plist (vlax-safearray->list
  •                 (vlax-variant-value
  •                   (vla-get-coordinates obj))))
  •   (setq n 0)
  •   (repeat (/ (length plist) 2)
  •     (setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
  •     (setq n (+ n 2))
  •   )
  •   pp
  • )
  • (defun C:EXPLINE (/ ent lst n ss p n1 p1)
  •   (setq ss (ssget '((0 . "LWpolyline"))))
  •   (setq p (sslength ss))
  •   (setq n 0)
  •   (setq p (- p 1))
  •   (while (<= n p)
  •     (setq ent (ssname ss n))
  •     (setq lst (vertexs ent))
  •     (if (> (length lst) 1)
  •       (progn
  •         (setq p1 (length lst))
  •         (setq n1 0)
  •         (setq p1 (- p1 1))
  •         (while (<= n1 p1)
  •           (command "_.break" ent "end" (car lst) "end" "@")
  •           (setq ent (entlast))   ;;;;;取得炸开后剩下的线段
  •           (setq lst (cdr lst))   ;;;;;取得下一个顶点
  •           (setq n1 (1+ n1 ))
  •         )
  •       )
  •     )
  •     (setq n (1+ n ))
  •   )
  •   (princ)
  • )
  • ;;--断开多段线于顶点处,宽度不变---(结束)-----------------------------------------------
发表于 2019-5-29 22:38 | 显示全部楼层
本帖最后由 1291500406 于 2019-5-29 22:44 编辑
尘缘一生 发表于 2019-5-29 22:27
经过改写,我已经测试成功了。

ACET-PLINE-SEGMENT-LIST是高版本cad才有的函数,我在2017中能用这个程序

(defun C:bb ()(if (setq ss (ssget '((0 . "Lwpolyline")))n -1)(progn(repeat (sslength ss)(setq n (1+ n) ent (ssname ss n) lst (cdr (bb-asssoc 10 (entget ent))))
(if (> (length lst) 1)(repeat (length lst)(command "_.break" ent "end"  (car lst)  "end" "@")(setq ent (entlast) lst (cdr lst)))))))(princ))
(defun bb-asssoc (a lst / b lst2)(while (setq b (assoc a lst))(setq lst  (cdr (member b lst)) lst2 (cons (cdr b) lst2)))(reverse lst2))


点评

需要屏幕外选择有效,否则,实体部分在屏幕内,不行。  发表于 2019-5-29 22:49
嗯,我测试了上面你俩发的,成功,  发表于 2019-5-29 22:47
发表于 2019-5-31 20:43 | 显示全部楼层
偷懒的办法:既然对闭合的有问题,那就在处理语句之前再加一句修改为open,这样就可以了吧?

点评

意思不明白,加OPEN,能是散开的吗?怎么个代码?  发表于 2019-5-31 21:50
发表于 2019-6-1 11:34 | 显示全部楼层
尘缘一生 发表于 2019-5-29 22:27
经过改写,我已经测试成功了。

这个代码试用了一下,直接用PL画的多段线断开是没有问题。但是用F倒直角的多段线,却无法断开,不知有没有发现这个问题。
发表于 2019-6-1 12:26 | 显示全部楼层
简单测试能断开

...用F倒直角的多段线...
得依您的Dwg调试...

点评

要用我那个代码,不要用VLISP的,不要看多高级,高级就又版本限制,不可取。  发表于 2019-6-2 19:35
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 21:10 , Processed in 0.463789 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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