love1030312 发表于 2014-6-14 19:01:40

智能修剪 改进

这是论坛里一个大大的程序   
当我看见这程序非常喜欢但遗憾的是不支持PL线 还有圆弧线
请大大 版主们帮忙改改 谢谢

让他支持 PL线 圆弧线

sroo 发表于 2017-8-24 23:08:28

本帖最后由 sroo 于 2017-8-24 23:25 编辑

好厉害!:hug:

6楼代码好长。不过cad2006以上的版本输入剪切命令trim,按两下空格键,好像也可以实现吧,即
(defun c : Q() (command "TRIM") (command "") (princ "修剪Q") (princ))

zmzk 发表于 2022-1-29 18:20:22

我工作中 碰不到这种 案例

bluefcc1 发表于 2018-3-20 20:59:57

下載學習,謝謝版主!

依然低调 发表于 2014-6-15 08:53:44

可以上个动画吗?请问和EXTRIM有何区别?

荒野孤行 发表于 2014-6-15 11:11:26

trim再输入f就可以修剪多段线,圆弧。按照这个编写程序

love1030312 发表于 2014-6-15 16:35:50

荒野孤行 发表于 2014-6-15 11:11 static/image/common/back.gif
trim再输入f就可以修剪多段线,圆弧。按照这个编写程序

大哥 能帮我把程序改改吗????

荒野孤行 发表于 2014-6-15 20:57:40

love1030312 发表于 2014-6-15 16:35 static/image/common/back.gif
大哥 能帮我把程序改改吗????

论坛上已经有人发过了,直接找下就好了

edata 发表于 2014-6-16 22:05:34

估计论坛应该有完美解决的版本吧,我倒是有个凑合的程序
声明觉非原创。略加修改。
只能实现框选修剪,对于多段线,并不能完美处理。
闭合多段线得点再来一次,另外多段线的修剪后有的会是散的。。
暂时不打算深入研究
你在论坛继续找找吧,不过还得吐槽论坛的搜索功能,感觉搜索功能不是很理想。。。有的压根搜索不到。。

以下是代码,再次申明,非原创。
;;;=======================[ BreakObjects.lsp ]==============================
;;; Author: Copyright?2006,2007 Charles Alan Butler
;;; Contact @www.TheSwamp.org
;;; Version:1.3 April 9,2007
;;; Globalization by XANADU - www.xanadu.cz
;;; Purpose: Break All selected objects
;;;    permitted objects are lines, lwplines, plines, splines,
;;;    ellipse, circles & arcs
;;;                           
;;;Functionc:BreakAll -      Break all objects selected
;;;Functionc:BreakwObjects - Break many objects with a single object
;;;Functionc:BreakObject -   Break a single object with many objects
;;;Functionc:BreakWith -   Break selected objects with other selected objects
;;;Functionc:BreakTouching - Break objects touching the single Break object
;;;Functionc:BreakSelected - Break selected objects with anyobjects that touch it
;;;                  
;;; Sub_Routines:      
;;;    break_with      
;;;    ssget->vla-list
;;;    list->3pair   
;;;    onlockedlayer   
;;;    get_interpts Return a list of intersect points
;;;    break_objBreak entity at break points in list
;;; Requirements: objects must have the same z-value
;;; Restrictions: Does not Break objects on locked layers
;;; Returns:none
;;;=====================================================================
;;;   THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED    ;
;;;   WARRANTY.ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR ;
;;;   PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED.         ;
;;;                                                                   ;
;;;You are hereby granted permission to use, copy and modify this   ;
;;;software without charge, provided you do so exclusively for      ;
;;;your own use or for use by others in your organization in the    ;
;;;performance of their normal duties, and provided further that    ;
;;;the above copyright notice appears in all copies and both that   ;
;;;copyright notice and the limited warranty and restricted rights;
;;;notice below appear in all supporting documentation.             ;
;;;=====================================================================


;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;               M A I N   S U B R O U T I N E                  
;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;打断对象,隔断对象,自断
(defun NBTF_break_with (ss2brk             ss2brkwith          self
                        /             cmd          intpts
                        lst             masterlist          ss
                        ssobjs             onlockedlayer
                        ssget->vla-list                  list->3pair
                        get_interpts break_obj
                     )
;; ss2brk   selection set to break
;; ss2brkwith selection set to use as break points
;; self       when true will allow an object to break itself
;;            note that plined will break at each vertex
(vl-load-com)


;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;                S U B   F U N C T I O N S                     
;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

(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 / i ename lst)
    (setq i -1)
    (while (setq ename (ssname ss (setq i (1+ i))))
      (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)
)

;;==============================================================
;;return a list of intersect points
;;==============================================================
(defun get_interpts (obj1 obj2 / iplist)
    (if        (not (vl-catch-all-error-p
             (setq
               iplist        (vl-catch-all-apply
                          'vlax-safearray->list
                          (list
                          (vlax-variant-value
                              (vla-intersectwith obj1 obj2 acextendnone)
                          )
                          )
                        )
             )
             )
        )
      iplist
    )
)


;;==============================================================
;;Break entity at break points in list
;;==============================================================
(defun break_obj        (ent          brkptlst   /          brkobjlst
                       en          enttype    maxparam          closedobj
                       minparam   obj             obj2breakp1param
                       p2          p2param
                        )

    (setq obj2break ent
          brkobjlst (list ent)
          enttype   (cdr (assoc 0 (entget ent)))
    )

    (foreach brkpt brkptlst
      ;;get last entity created via break in case multiple breaks
      (if brkobjlst
        (progn
          ;;if pt not on object x, switch objects
          (if (not (numberp (vl-catch-all-apply
                              'vlax-curve-getdistatpoint
                              (list obj2break brkpt)
                          )
                   )
              )
          (foreach obj brkobjlst        ; find the one that pt is on
              (if (numberp (vl-catch-all-apply
                             'vlax-curve-getdistatpoint
                             (list obj brkpt)
                           )
                  )
                (setq obj2break obj)        ; switch objects
              )
          )
          )
        )
      )

      ;;Handle any objects that can not be used with the Break Command
      ;;using one point, gap of 0.000001 is used
      (cond
        ((and (= "SPLINE" enttype)        ; only closed splines
              (vlax-curve-isclosed obj2break)
       )
       (setq p1param (vlax-curve-getparamatpoint obj2break brkpt)
             p2      (vlax-curve-getpointatparam
                       obj2break
                       (+ p1param 0.000001)
                     )
       )
       (command "._break"
                  obj2break
                  "_non"
                  (trans brkpt 0 1)
                  "_non"
                  (trans p2 0 1)
       )
        )
        ((= "CIRCLE" enttype)                ; break the circle
       (setq p1param (vlax-curve-getparamatpoint obj2break brkpt)
             p2      (vlax-curve-getpointatparam
                       obj2break
                       (+ p1param 0.000001)
                     )
       )
       (command "._break"
                  obj2break
                  "_non"
                  (trans brkpt 0 1)
                  "_non"
                  (trans p2 0 1)
       )
       (setq enttype "ARC")
        )
        ((and (= "ELLIPSE" enttype)        ; only closed ellipse
              (vlax-curve-isclosed obj2break)
       )
       ;;Break the ellipse, code borrowed from Joe Burke6/6/2005
       (setq p1param        (vlax-curve-getparamatpoint obj2break brkpt)
             p2param        (+ p1param 0.000001)
             minparam        (min p1param p2param)
             maxparam        (max p1param p2param)
             obj        (vlax-ename->vla-object obj2break)
       )
       (vlax-put obj 'startparameter maxparam)
       (vlax-put obj 'endparameter (+ minparam (* pi 2)))
        )

        ;;==================================
        (t                                ;   Objects that can be broken   
       (setq closedobj (vlax-curve-isclosed obj2break))
       (command "._break"
                  obj2break
                  "_non"
                  (trans brkpt 0 1)
                  "_non"
                  (trans brkpt 0 1)
       )
       (if (not closedobj)                ; new object was created
           (setq brkobjlst (cons (entlast) brkobjlst))
       )
        )
      )
    )
)



;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;                   S T A R T   H E R E                        
;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(if (and ss2brk ss2brkwith)
    (progn
      ;;CREATE a list of entity & it's break points
      (foreach obj (ssget->vla-list ss2brk)
                                        ; check each object in ss2brk
        (if (not (onlockedlayer (vlax-vla-object->ename obj)))
          (progn
          (setq lst nil)
          ;; check for break pts with other objects in ss2brkwith
          (foreach intobj (ssget->vla-list ss2brkwith)
              (if (and (or self (not (equal obj intobj)))
                     (setq intpts (get_interpts obj intobj))
                  )
                (setq lst (append (list->3pair intpts) lst))
                                        ; entity w/ break points
              )
          )
          (if        lst
              (setq masterlist
                     (cons (cons (vlax-vla-object->ename obj) lst)
                           masterlist
                     )
              )
          )
          )
        )
      )
      ;;masterlist = ((ent brkpts)(ent brkpts)...)
      (if masterlist
        (foreach obj2brk masterlist
          (break_obj (car obj2brk) (cdr obj2brk))
        )
      )
    )
)
;;==============================================================
)




;;==========================================================
;;选择对象被图中对象打断
;;==========================================================


;(defun c:BreakSelected (/ cmd ss1 ss2)

(defun c:tt (/ cmd ss1 ss2)
;;get all objects touching entities in the sscross
;;limited obj types to "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
(defun gettouching (sscros / ss lst lstb lstc objl)
    (and
      (setq lstb (vl-remove-if 'listp (mapcar 'cadr (ssnamex sscros)))
            objl (mapcar 'vlax-ename->vla-object lstb)
      )
      (setq
      ss (ssget "_A" (list (cons 0 "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE")
                           (cons 410 (getvar "ctab"))))
      )
      (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
      (setq lst (mapcar 'vlax-ename->vla-object lst))
      (mapcar
      '(lambda (x)
         (mapcar
             '(lambda (y)
                (if (not
                      (vl-catch-all-error-p
                        (vl-catch-all-apply
                        '(lambda ()
                           (vlax-safearray->list
                               (vlax-variant-value
                                 (vla-intersectwith y x acextendnone)
                               ))))))
                  (setq lstc (cons (vlax-vla-object->ename x) lstc))
                )
            ) objl)
         ) lst)
    )
    lstc
)
(setq cmd (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(command "._undo" "_begin")
;;get objects to break
(while(and (setq p1(getpoint "\n指定第一点:"))
          (setq p3(getcorner p1 "\n指定第二点:"))
          )
    (setq ss1 (ssadd))
(if (and ;(not (prompt "\n(选择对象被图中对象打断)选择需要打断的对象<退出>: "))
         (setq ss2 (ssget "c" p1 p3 '((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))))
         (mapcar '(lambda (x) (ssadd x ss1)) (gettouching ss2))
      )
    (progn
      
    (NBTF_break_with ss2 ss1 nil); ss2break ss2breakwith (flag nil = not to break with self)
    (if(setq ss3(ssget "w" p1 p3 '((0 . "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"))))
      (command "_.ERASE" ss3"")
      )
    )
)
    )
    (command "._undo" "_end")
    (setvar "CMDECHO" cmd)
(princ)
)


;;/'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\.
;;    E n d   O f   F i l e   I f   y o u   A r e   H e r e      
;;/'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\./'\.

love1030312 发表于 2014-6-17 08:20:57

大大   你 说话太经典了都是我的心声啊    感谢大大

love1030312 发表于 2014-6-17 08:21:27

edata 发表于 2014-6-16 22:05 static/image/common/back.gif
估计论坛应该有完美解决的版本吧,我倒是有个凑合的程序
声明觉非原创。略加修改。
只能实现框选修剪,对 ...

大大   你 说话太经典了都是我的心声啊    感谢大大

love1030312 发表于 2014-6-17 09:09:56

edata 发表于 2014-6-16 22:05 static/image/common/back.gif
估计论坛应该有完美解决的版本吧,我倒是有个凑合的程序
声明觉非原创。略加修改。
只能实现框选修剪,对 ...

大大 圆角部分怎么没有了

longshentaizi 发表于 2015-9-8 10:25:04

为什么不能下载?
页: [1] 2
查看完整版本: 智能修剪 改进