找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 661|回复: 5

[分享]:複制多義線的某一段

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-12-14 09:05:44 | 显示全部楼层 |阅读模式

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

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

×
[PHP]; =============================================================================
; Filename    :   CopyPlineSeg.lsp
; Datum       :   23.08.04
; Author      :   jme
; Copyright   :   MENZI ENGINEERING GmbH, Switzerland
; Revision  1 :   19.01.05 jme - Basepoint for copy imroved
;                              - Checking for A2k+ added
; Revision  2 :   __.__.__ ___ -
; -----------------------------------------------------------------------------
; Known bugs:
; - None
; -----------------------------------------------------------------------------
; Description:
; Copies a segment of a Polyline.
; -----------------------------------------------------------------------------
; Global variables:
;
; -----------------------------------------------------------------------------
; Internal LISP-functions:
; MeGetObjLength  MeSelPline
; -----------------------------------------------------------------------------
; External LISP-functions:
;
; -----------------------------------------------------------------------------
; Version notes:
; AutoCAD:        Version:        Language:        AddIns:
; 15+                1.01                English                ...
; -----------------------------------------------------------------------------
;
; == Message on loading =======================================================
;
(princ "\nCopyPlineSeg v1.01")
;
; == Main =====================================================================
;
(defun C:CopyPlineSeg ( / BasPnt CpyEnt CpyObj CpySet CurObj CurEnt ObjLen
                          ObjLst OldCmd PicPnt PntDst *Error*)
(if (< (atof (getvar "ACADVER")) 15.0)
  (progn
   (alert "CopyPlineSeg requires AutoCAD 2000 or higher. ")
   (princ)
  )
  (progn
   (vl-load-com)
   (setq OldCmd (getvar "CMDECHO")
         CurEnt (MeSelPline "\nSelect Polyline segment: " T nil)
   )
   (defun *Error* (Msg)
    (setvar "CMDECHO" OldCmd)
    (if Msg (princ Msg))
    (princ)
   )
   (if CurEnt
    (progn
     (setq CurObj (vlax-ename->vla-object (car CurEnt))
           PicPnt (vlax-curve-getClosestPointTo CurObj (cadr CurEnt))
           ObjLst (vlax-invoke CurObj 'Explode)
     )
     (vla-put-Visible CurObj :vlax-false)
     (mapcar 'vla-Update ObjLst)
     (if (setq CpyEnt (nentselp PicPnt))
      (progn
       (vla-put-Visible CurObj :vlax-true)
       (setq CpyObj (vlax-ename->vla-object (car CpyEnt))
             ObjLen (MeGetObjLength CpyObj)
             PntDst (vlax-curve-getDistAtPoint CpyObj PicPnt)
             BasPnt (cond
                     ((<= PntDst (/ ObjLen 3.0))
                      (vlax-curve-getStartPoint CpyObj)
                     )
                     ((>= PntDst (/ ObjLen 1.5))
                      (vlax-curve-getEndPoint CpyObj)
                     )
                     ((vlax-curve-getPointAtDist CpyObj (/ ObjLen 2.0)))
                    )
       )
       (foreach Obj ObjLst
        (if (not (equal Obj CpyObj)) (vla-delete Obj))
       )
       (setvar "CMDECHO" 0)
       (vl-cmdf "_.MOVE" (car CpyEnt) "")
       (setvar "CMDECHO" 1)
       (vl-cmdf BasPnt pause)
      )
      (vla-put-Visible CurObj :vlax-true)
     )
    )
   )
   (*Error* nil)
  )
)
)
;
; == Subs =====================================================================
;
; -- Function MeGetObjLength
; Returns the length of all kind of objects.
; Arguments [Type]:
;   Obj = Object [VLA-OBJECT]
; Return [Type]:
;   > Length of the object [REAL]
; Notes:
;   - Proceedes *Polylines, Splines, Lines, Arcs, Circles and Ellipses
;
(defun MeGetObjLength (Obj)
(vlax-curve-getDistAtParam Obj (vlax-curve-getEndParam Obj))
)
;
; -- Function MeSelPline
; Extended Polyline selection function.
; Arguments [Type]:
;   Pmt = User prompt [STR]
;   3Dp = 3Dpolyline flag (3Dpolyline allowed) [SYM]
;   Cls = Close flag (pline must be closed) [SYM]
; Return [Type]:
;   > List with entity name and pickpoint '((Ename (x y z)) [LIST]
; Notes:
;   - Returns nil when user press 'Return' or 'Space'
;
(defun MeSelPline (Pmt 3Dp Cls / CurEnt EntFlg EntLst EntNme ExLoop)
(while (not ExLoop)
  (initget " ")
  (setq CurEnt (entsel Pmt))
  (cond
   ((= CurEnt "") (setq ExLoop T CurEnt nil))
   (CurEnt
    (setq EntLst (entget (car CurEnt))
          EntNme (cdr (assoc  0 EntLst))
          EntFlg (cdr (assoc 70 EntLst))
    )
    (cond
     ((or
       (not (member EntNme '("LWPOLYLINE" "POLYLINE")))
       (and (not 3Dp) (= (logand EntFlg  8)  8))
       (= (logand EntFlg 16) 16)
       (= (logand EntFlg 64) 64)
      )
      (princ "selected entity is not a Polyline. ")
     )
     ((and Cls (/= (logand EntFlg 1) 1))
      (princ "selected Polyline is not closed. ")
     )
     ((setq ExLoop T))
    )
   )
   ((princ "1 selected, 0 found. "))
  )
)
CurEnt
)
;
; == Copyright - Note (May be never deleted) ==================================
;
(princ "\n------------------------------------------------")
(princ "\n ?004-2005 MENZI ENGINEERING GmbH, Switzerland ")
(princ "\n------------------------------------------------")
(princ "\nType CopyPlineSeg in the command line to start the programm...")
(princ)
;
; == End CopyPlineSeg =========================================================
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-12-14 19:14:22 | 显示全部楼层
楼主能否请您说明下这个程序主要派什么用场谢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2005-12-14 22:18:00 | 显示全部楼层
最初由 xlmx-whj 发布
[B]楼主能否请您说明下这个程序主要派什么用场谢了。 [/B]


作用就是不用炸開多義直接COPY多義線的某段.

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 01:22 , Processed in 0.199105 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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