明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 123523058

批量交点打断 支持多段线 <转帖>

    [复制链接]
发表于 2014-9-1 13:08:11 来自手机 | 显示全部楼层
好家伙,这么多
发表于 2015-10-30 10:53:57 | 显示全部楼层
lilq_78 发表于 2014-2-19 15:46
顶,但是矩形与矩形相交打断不行

对原程序243-266行代码进行了改进:
;;==========================================
;;  Break many objects with a single object
;;==========================================
(defun c:breakwobjects (/ cmd ss1 ss2)
  (defun ssredraw (ss mode / i num)
    (setq i -1)
    (while (setq ename (ssname ss (setq i (1+ i))))
      (redraw (ssname ss i) mode)
    )
  )
  (command ".undo" "begin")
  (setq cmd (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)

  ;;  get objects to break
  (prompt "\nSelect object(s) to break & press enter: ")
  (if (and (setq ss1 (ssget '((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))))
           (not (ssredraw ss1 3))
           (not (prompt "\n***  Select single object to break with:  ***"))
           (setq ss2 (ssget "+.:E:S" '((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))))
           (not (ssredraw ss1 4))
      )
    (break_with ss1 ss2 nil) ; ss2break ss2breakwith (flag nil = not to break with self)
  )

  (setvar "CMDECHO" cmd)
  (command ".undo" "end")
  (princ)
)

;;==========================================
;;  Break many objects with many object     
;;==========================================
(defun c:BreakWith (/ cmd ss1 ss2)
  (defun ssredraw (ss mode / i num)
    (setq i -1)
    (while (setq ename (ssname ss (setq i (1+ i))))
      (redraw (ssname ss i) mode)
    )
  )
  (command ".undo" "begin")
  (setq cmd (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (setq xuanz nil)
  ;;  get objects to break
  (prompt "\n选择要打断的直线或多线段,按回车确定: ")
  (if (and  (setq ss1
                      (ssget
                        '((0
                           .
                           "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
                          )
                         )
                      )
                  xuanz (ssget "P" '((0 . "LWPOLYLINE") (70 . 1)));取出选中的闭合多段线,一般为矩形或多边形命令创建
                  flag1 (if (/= ss1 nil) T);判断选择集ss1是否非空
               )
               
          
         (not (ssredraw ss1 3))
           (not
             (prompt
               "\n***  选择作为打断线的直线或多线段,按回车确定:  ***"
             )
           )
           (setq
             ss2 (ssget
                   '((0
                      .
                      "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
                     )
                    )
                 )
             ssd  (ssredraw ss1 4);新增
             flag2 (if (/= ss2 nil) T);判断选择集ss2是否非空
           )
           ;(not (ssredraw ss1 4))把该语句放在上面的setq语句群里,避免ss2为nil时本句不被执行的意外情况
      )
    (progn
      (if(/= xuanz nil)
        (progn
      (setq snum -1)
      (repeat (SSLENGTH xuanz)
        (setq a (entget (ssname xuanz (setq snum (+ 1 snum)))));取出xuanz中的每个闭合多线段
        (setq num (cdr (assoc 90 a)))        ;多线段顶点数量
        (setq pnum (- (length a) (length (member (assoc 10 a) a))))
                                        ;pnum为多线段第一个顶点坐标子列表所在项数(组码10)




        (setq qdlst (PARTLIST1 pnum (+ pnum 4) a))
        ;第一个端点列表
        (setq tou (PartList1 0 (- (length a) 2) a))
        ;原列表去掉最后一个元素后的新列表
        (setq zhong (append tou qdlst))
        ;新列表插入第一个端点坐标
        (setq wei (nth (- (length a) 1) a))
        ;保存原列表最后一个元素
        (setq a (append zhong (list wei)))
        ;加入原列表最后一个元素
        (setq a (subst (cons 70 0) (assoc 70 a) a))
        ;将闭合多线段改为非闭合多线段
        (setq a (subst (cons 90 (+ num 1)) (assoc 90 a) a))
        ;修改多线段顶点个数
        (entmod a)
      )
      )
    )
    (break_with ss1 ss2 nil)                ; ss2break ss2breakwith (flag nil = not to break with self)
      )
  )

  (setvar "CMDECHO" cmd)
  (command ".undo" "end")
  (princ)
)

其中用到了黄老师提供的函数:
;截取部分列表子函数
(defun PartList1 (from to lst / I L)
  (setq i -1)
  (foreach x lst
    (setq i (1+ i))
    (cond ((and (>= i from) (<= i to)) (setq l (cons x l))))
  )
  (REVERSE l)
)
发表于 2015-10-30 10:54:36 | 显示全部楼层
本帖最后由 布朗运动 于 2015-10-30 10:55 编辑
lilq_78 发表于 2014-2-19 15:46
顶,但是矩形与矩形相交打断不行

对原程序243-266行代码进行了改进:      
;;==========================================
;;  Break many objects with many object     
;;==========================================
(defun c:BreakWith (/ cmd ss1 ss2)
  (defun ssredraw (ss mode / i num)
    (setq i -1)
    (while (setq ename (ssname ss (setq i (1+ i))))
      (redraw (ssname ss i) mode)
    )
  )
  (command ".undo" "begin")
  (setq cmd (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (setq xuanz nil)
  ;;  get objects to break
  (prompt "\n选择要打断的直线或多线段,按回车确定: ")
  (if (and  (setq ss1
                      (ssget
                        '((0
                           .
                           "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
                          )
                         )
                      )
                  xuanz (ssget "P" '((0 . "LWPOLYLINE") (70 . 1)));取出选中的闭合多段线,一般为矩形或多边形命令创建
                  flag1 (if (/= ss1 nil) T);判断选择集ss1是否非空
               )
               
           
         (not (ssredraw ss1 3))
           (not
             (prompt
               "\n***  选择作为打断线的直线或多线段,按回车确定:  ***"
             )
           )
           (setq
             ss2 (ssget
                   '((0
                      .
                      "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
                     )
                    )
                 )
             ssd  (ssredraw ss1 4);新增
             flag2 (if (/= ss2 nil) T);判断选择集ss2是否非空
           )
           ;(not (ssredraw ss1 4))把该语句放在上面的setq语句群里,避免ss2为nil时本句不被执行的意外情况
      )
    (progn
      (if(/= xuanz nil)
        (progn
      (setq snum -1)
      (repeat (SSLENGTH xuanz)
        (setq a (entget (ssname xuanz (setq snum (+ 1 snum)))));取出xuanz中的每个闭合多线段
        (setq num (cdr (assoc 90 a)))        ;多线段顶点数量
        (setq pnum (- (length a) (length (member (assoc 10 a) a))))
                                        ;pnum为多线段第一个顶点坐标子列表所在项数(组码10)




        (setq qdlst (PARTLIST1 pnum (+ pnum 4) a))
        ;第一个端点列表
        (setq tou (PartList1 0 (- (length a) 2) a))
        ;原列表去掉最后一个元素后的新列表
        (setq zhong (append tou qdlst))
        ;新列表插入第一个端点坐标
        (setq wei (nth (- (length a) 1) a))
        ;保存原列表最后一个元素
        (setq a (append zhong (list wei)))
        ;加入原列表最后一个元素
        (setq a (subst (cons 70 0) (assoc 70 a) a))
        ;将闭合多线段改为非闭合多线段
        (setq a (subst (cons 90 (+ num 1)) (assoc 90 a) a))
        ;修改多线段顶点个数
        (entmod a)
      )
      )
    )
    (break_with ss1 ss2 nil)                ; ss2break ss2breakwith (flag nil = not to break with self)
      )
  )

  (setvar "CMDECHO" cmd)
  (command ".undo" "end")
  (princ)
)

其中用到了自贡黄明儒老师发表的函数:
;截取部分列表子函数
(defun PartList1 (from to lst / I L)
  (setq i -1)
  (foreach x lst
    (setq i (1+ i))
    (cond ((and (>= i from) (<= i to)) (setq l (cons x l))))
  )
  (REVERSE l)
)

评分

参与人数 1明经币 +1 收起 理由
guosheyang + 1 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2016-3-12 02:17:26 | 显示全部楼层
很强大,很好,支持下!
发表于 2018-3-28 01:18:56 | 显示全部楼层
谢谢楼主分享
发表于 2018-8-21 11:11:53 | 显示全部楼层
学习一下啊!!!!!!!!!!!!
发表于 2020-2-29 18:56:02 | 显示全部楼层
非常好的功能,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 16:46 , Processed in 0.176914 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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