明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1169|回复: 4

[讨论] 初学Lisp,批量打断多段线,无法循环,请教!

[复制链接]
发表于 2019-11-13 14:11:02 | 显示全部楼层 |阅读模式
本帖最后由 wjlaugh 于 2019-11-14 11:27 编辑

本人初学Lisp,写了个小程序,由于工作需要,希望能批量打断交叉管线。但是现在程序执行结果只能打断局部的交叉管线,还请各位大神帮忙看下是哪边有问题。已经成功循环打断

复制代码
  1. (vl-load-com)
  2. (defun c:GDDX ()
  3.   (setvar "cmdecho" 0)
  4.   (setq osmtmp (getvar "osmode"))
  5.   (setvar "osmode" 0)
  6.   (print "框选路灯管线:")
  7.     (setq gxld (ssget '((8 . "GX-路灯") (100 . "AcDbPolyline"))));提取路灯管线
  8.     (print "框选通信管线:")
  9.   (setq gxtx (ssget '((8 . "GX-通信") (100 . "AcDbPolyline"))));提取通信管线
  10.   (setq nld 0)
  11.   (setq of 0.5);设置打断距离0.5
  12.   (while (ssname gxld nld);打断与路灯交叉的通信管线
  13.     (setq entgxld (ssname gxld nld))
  14.     (setq e1 (vlax-ename->vla-object entgxld))
  15.     (setq nld (1+ nld))
  16.     (setq ntx 0);重新循环选取通信管线
  17.     (while (ssname gxtx ntx)
  18.       (setq entgxtx (ssname gxtx ntx))
  19.       (setq e2 (vlax-ename->vla-object entgxtx))
  20.       (setq jiaochadian (acet-geom-intersectwith entgxld entgxtx 0));所获得坐标((6996.58 -537.511 0.0)),需要car提取出(6996.58 -537.511 0.0)
  21.       (if jiaochadian
  22.         (progn
  23.       (vla-offset e1 of)
  24.       (setq tmpl1 (entlast))
  25.       (vla-offset e1 (* of -1))
  26.       (setq tmpl2 (entlast))
  27.       (setq tmpjcd1 (acet-geom-intersectwith entgxtx tmpl1 0)
  28.           tmpjcd2 (acet-geom-intersectwith entgxtx tmpl2 0))
  29.       (setq line1 (list entgxtx (car jiaochadian)));返回图原名和坐标值,与entsel返回值类似,以用于打断时选中多段线
  30.       (command "break" line1 "f" (list (car (car tmpjcd1)) (cadr (car tmpjcd1))) (list (car (car jiaochadian)) (cadr (car jiaochadian))));打断命令需要二维坐标
  31.       (ssadd (entlast) gxtx);将打断生成的新通信管线加入通信管线选择集合
  32.       (setq entgxtxtmp (entlast));获取打断生成的新通信管线
  33.       (setq line2 (list entgxtxtmp (car jiaochadian)))
  34.       (command "break" line1 "f" (list (car (car tmpjcd2)) (cadr (car tmpjcd2))) (list (car (car jiaochadian)) (cadr (car jiaochadian))))
  35.       (entdel tmpl1)
  36.       (entdel tmpl2)
  37.         )        
  38.       )
  39.       (setq ntx (1+ ntx))
  40.       )
  41.   )
  42.   )
  43.   (setvar "osmode" osmtmp)
  44.   (princ)
  45.   )


本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
magicheno + 1 很给力!

查看全部评分

 楼主| 发表于 2019-11-13 19:28:37 | 显示全部楼层
本帖最后由 wjlaugh 于 2019-11-14 11:26 编辑

想到了可能的问题:由于打断了一部分线后,新增的线不在选择集里,因此循环无法继续下去。重新改了下,现在没节点的多段线可以循环打断了,但是有节点的还是没法循环起来。麻烦哪位大神帮忙看下,提下优化策略。已经成功循环打断
  1. (vl-load-com)
  2. (defun c:GDDX ()
  3.   (setvar "cmdecho" 0)
  4.   (setq osmtmp (getvar "osmode"))
  5.   (setvar "osmode" 0)
  6.   (print "框选路灯管线:")
  7.     (setq gxld (ssget '((8 . "GX-路灯") (100 . "AcDbPolyline"))));提取路灯管线
  8.     (print "框选通信管线:")
  9.   (setq gxtx (ssget '((8 . "GX-通信") (100 . "AcDbPolyline"))));提取通信管线
  10.   (setq nld 0)
  11.   (setq of 0.5);设置打断距离0.5
  12.   (while (ssname gxld nld);打断与路灯交叉的通信管线
  13.     (setq entgxld (ssname gxld nld))
  14.     (setq e1 (vlax-ename->vla-object entgxld))
  15.     (setq nld (1+ nld))
  16.     (setq ntx 0);重新循环选取通信管线
  17.     (while (ssname gxtx ntx)
  18.       (setq entgxtx (ssname gxtx ntx))
  19.       (setq e2 (vlax-ename->vla-object entgxtx))
  20.       (setq jiaochadian (acet-geom-intersectwith entgxld entgxtx 0));所获得坐标((6996.58 -537.511 0.0)),需要car提取出(6996.58 -537.511 0.0)
  21.       (if jiaochadian
  22.         (progn
  23.       (vla-offset e1 of)
  24.       (setq tmpl1 (entlast))
  25.       (vla-offset e1 (* of -1))
  26.       (setq tmpl2 (entlast))
  27.       (setq tmpjcd1 (acet-geom-intersectwith entgxtx tmpl1 0)
  28.           tmpjcd2 (acet-geom-intersectwith entgxtx tmpl2 0))
  29.       (setq line1 (list entgxtx (car jiaochadian)));返回图原名和坐标值,与entsel返回值类似,以用于打断时选中多段线
  30.       (command "break" line1 "f" (list (car (car tmpjcd1)) (cadr (car tmpjcd1))) (list (car (car jiaochadian)) (cadr (car jiaochadian))));打断命令需要二维坐标
  31.       (ssadd (entlast) gxtx);将打断生成的新通信管线加入通信管线选择集合
  32.       (setq entgxtxtmp (entlast));获取打断生成的新通信管线
  33.       (setq line2 (list entgxtxtmp (car jiaochadian)))
  34.       (command "break" line1 "f" (list (car (car tmpjcd2)) (cadr (car tmpjcd2))) (list (car (car jiaochadian)) (cadr (car jiaochadian))))
  35.       (entdel tmpl1)
  36.       (entdel tmpl2)
  37.         )        
  38.       )
  39.       (setq ntx (1+ ntx))
  40.       )
  41.   )
  42.   )
  43.   (setvar "osmode" osmtmp)
  44.   (princ)
  45.   )

复制代码





本帖子中包含更多资源

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

x
发表于 2019-11-14 10:42:57 | 显示全部楼层
打断是一种方法,也可以考虑重新生成,根据交点坐标和打断距离,删掉原线,重新生成各段。
重新生成可以用entmake。
 楼主| 发表于 2019-11-14 11:21:54 | 显示全部楼层
satan421 发表于 2019-11-14 10:42
打断是一种方法,也可以考虑重新生成,根据交点坐标和打断距离,删掉原线,重新生成各段。
重新生成可以用 ...

多谢提供思路,换了一个方法获取多段线交点,再把打断生成的多段线添加到选择集里,已经可以正常运行了
  1. (setq tmpjcd1 (vlax-invoke e2 'IntersectWith e3 0));
发表于 2022-4-30 15:17:06 | 显示全部楼层
大佬你这个太赞了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 13:15 , Processed in 0.165963 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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