明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1080|回复: 3

[提问] 划线 剪断多段线

[复制链接]
发表于 2019-7-23 23:13:16 | 显示全部楼层 |阅读模式
有哪位大神 能帮忙给修改一下  这个代码   就是现在这个代码只能把与划线相交的线段给断开  ,不能自动连接和闭合 ,能修改修剪断开后,得到的图形自动连接和闭合吗, 如下图

本帖子中包含更多资源

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

x
 楼主| 发表于 2019-7-23 23:13:53 | 显示全部楼层
;;;=======================[ BreakAtObject.lsp ]=======================  
;;; Author: Charles Alan Butler & Will DeLoach  
;;; Version:  1.5 Feb. 22, 2006  
;;; Purpose: Break lines, plines, splines, ellipse, circles & arcs  
;;;          with a crossing object or user line, not blocks  
;;; Sub_Routines: ssget->vla-list  
;;;               list->3pair  
;;; Requirements:  
;;; Returns:   
;;;==============================================================  

;;  Ignores objects on locked layers  
;;  This code is still under deveopment  


(defun c:Bo1 (/ ss brk_obj ents ssobjs cmd obj_erase  
                      onlockedlayer ssget->vla-list list->3pair)  
  (vl-load-com)  

  (defun onlockedlayer (ename / entlst)  
    (setq entlst (tblsearch "LAYER" (cdr (assoc 8 (entget ename)))))  
    (= 4 (logand 4 (cdr (assoc 70 entlst))))  
  )  
  (defun ssget->vla-list (ss ent / i ename lst)  
    (setq i -1)  
    (while (setq ename (ssname ss (setq i (1+ i))))  
      ;; check for locked layer, do not use if on locked layer  
      (if (and (not (onlockedlayer ename))  
               (not (equal ename ent))) ; exclude break object  
         (setq lst (cons (vlax-ename->vla-object ename) lst))  
      )  
    )  
    lst  
  )  
   
  (defun list->3pair (old / new)  
    (while (setq new (cons (list (car old) (cadr old) (caddr old)) new)  
                 old (cdddr old)))  
    (reverse new)  
  )  

  (setq cmd (getvar "CMDECHO"))  
  (setvar "CMDECHO" 0)  
  (command ".undo" "begin")  


  ;;  get break line or object  
  (if (and  
        (progn  
          (prompt "\nSelect objects to break: ")  
          (setq ss (ssget' ((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))))  
        )  
        (setq p1 (getpoint "\nDraw Breaking line or press ENTER to select: "))  
        (setq p2 (getpoint p1 "\nPick end of line."))  
      )  
    (progn ; got points for a line  
      (vl-cmdf "._line" p1 p2 "")  
      (setq ent       (entlast)  
            obj_erase t ; remove it when done  
      )  
    )  
    (if ss  
      (while  
        (progn  
          (setq ent (car (entsel "\nSelect break entity, No blocks.")))  
          (cond  
            ((null ent)  nil)  
            ((member (cdr (assoc 0 (entget ent)))  
                    ' ("LINE" "ARC" "SPLINE" "LWPOLYLINE" "POLYLINE" "CIRCLE" "ELLIPSE"))  
             nil)  
            (t (prompt "\n*** Wrong object type, Try again.")  
             t)  
            )  
          )  
        )  
     )  
   )  

   
  (if (and ss ent  
           (setq ssobjs (ssget->vla-list ss ent)))  
    (progn  
      (setq brk_obj (vlax-ename->vla-object ent))  
      (mapcar  
       ' (lambda (obj2Break / iplist brkobjlst lastent) ; loop through list of objects to be broken  
           ; get list of intersect points  
           (setq iplist (vl-catch-all-apply' vlax-safearray->list  
                          (list (vlax-variant-value  
                             (vla-intersectwith brk_obj obj2Break acextendnone))))  
           )  
           (setq brkobjlst (cons obj2Break brkobjlst)) ; collect the original object to be broken  
           (if (not (vl-catch-all-error-p iplist));  error if no intersection  
             (mapcar  ; loop through  intersect points  
              ' (lambda (pt / cen elst maxparam minparam p1 p2 p1param p2param)  
                  ;;  get last entity created via break in case multiple breaks  
                     (if (and lastent (not (equal lastent (vlax-vla-object->ename brk_obj)))) ; ignore the break object  
                       (progn ; new object created via break, put in list  
                         (setq brkobjlst (cons (vlax-ename->vla-object (entlast)) brkobjlst))  
                         ;;  if pt not on object x, switch objects  
                         (if (not (vlax-curve-getdistatpoint obj2Break pt))  
                           (foreach obj brkobjlst ; find the one that pt is on  
                             (if (vlax-curve-getdistatpoint obj pt)  
                                (setq obj2Break obj) ; switch objects  
                               )  
                             )  
                         )  
                       )  
                     )  

                 ;;  Handle any objects that can not be use with the Break Command  
                 ;;  using one point  
                 (cond  
                    ((and (= "AcDbSpline" (vla-get-objectname obj2Break)) ; only closed splines  
                          (vlax-curve-isClosed obj2Break)  
                          )  
                      (setq p1param  (vlax-curve-getparamatpoint obj2Break pt)  
                            p2param  (+ p1param 0.000001)  
                            p2       (vlax-curve-getPointAtParam obj2Break p2param)  
                      )  
                     (command "._break" (vlax-vla-object->ename obj2Break) "non" (trans pt 0 1) "non" (trans p2 0 1))  
                    )  
                    ((= "AcDbCircle" (vla-get-objectname obj2Break)) ; break the circle  
                      (setq p1param  (vlax-curve-getparamatpoint obj2Break pt)  
                            p2param  (+ p1param 0.000001)  
                            p2       (vlax-curve-getPointAtParam obj2Break p2param)  
                      )  
                     (command "._break" (vlax-vla-object->ename obj2Break) "non" (trans pt 0 1) "non" (trans p2 0 1))  
                     (setq en (entlast))  
                    )  
                    ((and (= "AcDbEllipse" (vla-get-objectname obj2Break)) ; only closed ellipse  
                          (vlax-curve-isClosed obj2Break))  
                      ;;  Break the ellipse, code borrowed from Joe Burke  6/6/2005  
                      (setq p1param  (vlax-curve-getparamatpoint obj2Break pt)  
                            p2param  (+ p1param 0.000001) ;(vlax-curve-getparamatpoint obj p2)  
                            minparam (min p1param p2param)  
                            maxparam (max p1param p2param)  
                      )  
                      (vlax-put obj2Break' startparameter maxparam)  
                      (vlax-put obj2Break' endparameter (+ minparam (* pi 2)))  
                    )  
                    ;;==================================  
                    ;;   Objects that can be broken      
                    ;;==================================  
                    (t  
                     ;;(command "point"  "non" (trans pt 0 1))  
                     ;;(command "._break" (vlax-vla-object->ename obj2Break) "non" (trans pt 0 1) "@")  
                     (command "._break" (vlax-vla-object->ename obj2Break) "non" (trans pt 0 1) "non" (trans pt 0 1))  
                     ;;  could not get vl-cmdf "._break" to behave  
                     (setq lastent (entlast))  
                    )  
                  )  

                )
               (list->3pair iplist)  
             )  
           )  
         )  
        ssobjs  
      )  
      ;; remove the break line, if current layer is not locked  
      (if obj_erase  
         (vl-catch-all-apply' vla-delete (list brk_obj))  
      )  
    )  
  )  
  (setvar "CMDECHO" cmd)  
  (not (command ".undo" "end"))  
  (princ)  
)
 楼主| 发表于 2019-7-25 11:28:59 | 显示全部楼层
孙玉坤 发表于 2019-7-23 23:13
;;;=======================[ BreakAtObject.lsp ]=======================  
;;; Author: Charles Alan B ...

怎么没有大师来帮忙呢
发表于 2021-5-23 23:15:52 | 显示全部楼层
路过,顶起来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-17 09:41 , Processed in 0.161042 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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