找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1035|回复: 9

[LISP程序]:交叉线的断开

[复制链接]
发表于 2005-8-20 12:40:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
画流程图的时候,经常需要断开交叉的线段,以下是我找到的lisp,供大家参考:
[php]
; =============================================================================
; Filename    :   BreakGapsAtEdge.lsp
; Datum       :   28.10.04
; Author      :   jme
; Copyright   :   MENZI ENGINEERING GmbH, Switzerland
; Revision  1 :   28.10.04 jme - Check added on Offset method (offset can fail)
; Revision  2 :   __.__.__ ___ -
; -----------------------------------------------------------------------------
; Known bugs:
; - None
; -----------------------------------------------------------------------------
; Description:
; Multiple break at edge function.
; -----------------------------------------------------------------------------
; Global variables:
; Me:Gps
; -----------------------------------------------------------------------------
; Internal LISP-functions:
; MeGetClosestPoints MeGetInters
; -----------------------------------------------------------------------------
; External LISP-functions:
;
; -----------------------------------------------------------------------------
; Version notes:
; AutoCAD:        Version:        Language:        AddIns:
; 15+                1.01                English                ...
; -----------------------------------------------------------------------------
;
; == Message on loading =======================================================
;
(princ "\nBreakGapsAtEdge v1.01")
;
; == Main =====================================================================
;
(defun C:BreakGapsAtEdge ( / AcaDoc BrkEnt BrkObj BrkSet EdgObj EdgSet FltLst
                             FstObj NxtObj OldCmd OldOsm PntLst RefObj TmpObj)
(if (< (atof (getvar "ACADVER")) 15.0)
  (alert "BreakGapsAtEdge requires AutoCAD 2000 or higher. ")
  (progn
   (vl-load-com)
   (initget 6)
   (setq AcaDoc (vla-get-ActiveDocument (vlax-get-acad-object))
         Me:Gps (cond (Me:Gps) (1.0))
         Me:Gps (cond
                 ((getdist (strcat "\nGap size <" (rtos Me:Gps) ">: ")))
                 (Me:Gps)
                )
         FltLst '(
                  (0 . "ARC,ELLIPSE,LINE,LWPOLYLINE,POLYLINE,SPLINE")
                  (-4 . "<NOT")
                   (-4 . "<OR")
                    (-4 . "&=") (70 . 16)  ;3DMesh
                    (-4 . "&=") (70 . 64)  ;PolyFace
                   (-4 . "OR>")
                  (-4 . "NOT>")
                 )
   )
   (cond
    ((or
      (not (princ "\nSelect cutting edge..."))
      (not (setq EdgSet (ssget "_:S:E:L" FltLst)))
      (redraw (ssname EdgSet 0) 3)
     )
    )
    ((or
      (not (princ "\nSelect objects to break..."))
      (not (setq BrkSet (ssget "_:L" FltLst)))
     )
    )
    (T
     (vla-StartUndoMark AcaDoc)
     (setq OldOsm (getvar "OSMODE")
           OldCmd (getvar "CMDECHO")
           EdgObj (vlax-ename->vla-object (ssname EdgSet 0))
     )
     (if (and
          (not
           (vl-catch-all-error-p
            (setq FstObj (vl-catch-all-apply
                          'vlax-invoke (list EdgObj 'Offset (/ Me:Gps 2.0))
                         )
            )
           )
          )
          (not
           (vl-catch-all-error-p
            (setq NxtObj (vl-catch-all-apply
                          'vlax-invoke (list EdgObj 'Offset (- (/ Me:Gps 2.0)))
                         )
            )
           )
          )
         )
      (progn
       (setq FstObj (car FstObj)
             NxtObj (car NxtObj)
             RefObj NxtObj
       )
       (vla-put-Visible FstObj :vlax-false)
       (vla-put-Visible NxtObj :vlax-false)
       (setvar "CMDECHO" 0)
       (setvar "OSMODE" 0)
       (while (setq BrkEnt (ssname BrkSet 0))
        (setq BrkObj (vlax-ename->vla-object BrkEnt))
        (if (and
             (not (equal EdgObj BrkObj))
             (setq PntLst (append
                           (MeGetInters FstObj BrkObj acExtendNone)
                           (MeGetInters NxtObj BrkObj acExtendNone)
                          )
             )
             (> (length PntLst) 1)
             (apply 'and (setq PntLst (MeGetClosestPoints PntLst)))
             (not (command "_.BREAK" BrkEnt (car PntLst) (cadr PntLst)))
            )
         (if (and
              (setq TmpObj (vlax-ename->vla-object (entlast)))
              (not (equal RefObj TmpObj))
              (MeGetInters EdgObj TmpObj acExtendNone)
             )
          (setq RefObj TmpObj
                BrkSet (ssadd (vlax-vla-object->ename TmpObj) BrkSet)
          )
         )
         (ssdel BrkEnt BrkSet)
        )
        (if (not (MeGetInters EdgObj BrkObj acExtendNone))
         (ssdel BrkEnt BrkSet)
        )
       )
      )
      (alert "Error on offsetting cutting edge. ")
     )
     (if (= (type FstObj) 'VLA-OBJECT) (vla-Delete FstObj))
     (if (= (type NxtObj) 'VLA-OBJECT) (vla-Delete NxtObj))
     (if EdgSet (redraw (ssname EdgSet 0) 4))
     (setvar "CMDECHO" OldCmd)
     (setvar "OSMODE" OldOsm)
     (vla-EndUndoMark AcaDoc)
    )
   )
  )
)
(princ)
)
;
; == Subs =====================================================================
;
; == Function MeGetClosestPoints
; Returns the most closed points from a point list.
; Arguments [Typ]:
;   Lst = Point list [LIST]
; Return [Typ]:
;   > List of both most closed points [LIST]
; Notes:
;   None
;
(defun MeGetClosestPoints (Lst / FstPnt LasDst NxtPnt)
(setq LasDst 10E24)
(foreach Fst Lst
  (foreach Nxt Lst
   (if (and
        (< (distance Fst Nxt) LasDst)
        (not (equal Fst Nxt 1E-8))
       )
    (setq FstPnt Fst
          NxtPnt Nxt
          LasDst (distance Fst Nxt)
    )
   )
  )
)
(list FstPnt NxtPnt)
)
;
; -- Function MeGetInters
; Returns all intersection points between two objects.
; Arguments [Typ]:
;   Fst = First object [VLA-OBJECT]
;   Nxt = Second object [VLA-OBJECT]
;   Mde = Intersection mode [INT]
;         Constants:
;         - acExtendNone           Does not extend either object.
;         - acExtendThisEntity     Extends the Fst object.
;         - acExtendOtherEntity    Extends the Nxt object.
;         - acExtendBoth           Extends both objects.
; Return [Typ]:
;   > List of points '((1.0 1.0 0.0)... [LIST]
;   > False if no intersection found
; Notes:
;   - None
;
(defun MeGetInters (Fst Nxt Mde / IntLst PntLst)
(setq IntLst (vlax-invoke Fst 'IntersectWith Nxt Mde))
(if IntLst
  (progn
   (repeat (/ (length IntLst) 3)
    (setq PntLst (cons
                  (list (car IntLst) (cadr IntLst) (caddr IntLst))
                  PntLst
                 )
          IntLst (cdddr IntLst)
    )
   )
   (reverse PntLst)
  )
)
)
;
; == Copyright - Note (May be never deleted) ==================================
;
(princ "\n-------------------------------------------")
(princ "\n &#169;2004 MENZI ENGINEERING GmbH, Switzerland ")
(princ "\n-------------------------------------------")
(princ "\nType BreakGapsAtEdge in the command line to start the programm...")
(princ)
;
; == End BreakGapsAtEdge ======================================================
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-8-30 13:17:15 | 显示全部楼层
这个我现在也经常碰到,就是想到论坛来看看有没有这方面的资料,谢谢,等我现金够了,我来下载.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-2 13:26:08 | 显示全部楼层
几乎所有的线都可断开,程序设计的不错。类似于GIS系统中的自动剪断线功能。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-2 15:49:40 | 显示全部楼层
在r14上不能用的能有14的吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-3 12:54:37 | 显示全部楼层
能在什么版本上用啊!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-8 07:57:15 | 显示全部楼层
我在CAD2006使用不行啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-8 08:06:17 | 显示全部楼层
ABD中有一个经典的LSP程序,可以解决这个问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-25 22:18:36 | 显示全部楼层
2006不好用啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-26 22:53:36 | 显示全部楼层
可不可以改进一下,变成:选第一条线,然后断开所有与这条线相交的线.
那就更HAPPY了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 54个

财富等级: 招财进宝

发表于 2008-12-24 21:38:27 | 显示全部楼层
最初由 oyxx_1023 发布
[B]可不可以改进一下,变成:选第一条线,然后断开所有与这条线相交的线.
那就更HAPPY了. [/B]

我也想要这样一个程序……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-13 01:12 , Processed in 0.273840 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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