找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 295|回复: 3

[源码] 截取多段线于精确两点

[复制链接]
发表于 2024-7-19 15:54:34 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 striver 于 2024-7-19 15:55 编辑

;截取多段线于精确两点,适用于闭合多段线和非闭合多段线
(defun c:partCopy ()
  (setq entpnt0 (entsel "\n选择要截取的多段线:"))
  (if (not entpnt0)
    (vl-exit-with-error "")
  )
  (if (not
        (wcmatch (cdr (assoc 0 (entget (car entpnt0)))) "*POLYLINE")
      )
    (vl-exit-with-error "")
  )
;;;  (redraw (car entpnt0) 3)

  (setq p1 (getpoint "\n指定第一个打断点:"))
  (if (not p1)
    (vl-exit-with-error "")
  )
  (setq p2 (getpoint "\n指定第二个打断点:"))
  (if (not p2)
    (vl-exit-with-error "")
  )
  (if (equal p1 p2 0.0001)
    (vl-exit-with-error "")
  )

  (if (isclosePL (car entpnt0))
    (progn
      (setq pmid (getpoint "\n指定中间点:"))
      (if (not pmid)
        (vl-exit-with-error "")
      )
      (if (or (equal p1 pmid 0.0001) (equal p2 pmid 0.0001))
        (vl-exit-with-error "")
      )
    )
  )

  (setvar "cmdecho" 0)
  (command "undo" "be")

  (vla-copy (vlax-ename->vla-object (car entpnt0)))
  (setq ent (entlast))
  (setq entpnt (list ent (cadr entpnt0)))
  (setq vlaObj (vlax-ename->vla-object ent))
  (setq stapnt (vlax-curve-getStartPoint vlaObj))
  (setq endpnt (vlax-curve-getEndPoint vlaObj))

  (setq pt1 (vlax-curve-getclosestpointto ent p1)) ;取得最近点
  (setq para1 (vlax-curve-getParamAtPoint ent pt1)) ;取得参数
  (setq pt2 (vlax-curve-getclosestpointto ent p2)) ;取得最近点
  (setq para2 (vlax-curve-getParamAtPoint ent pt2)) ;取得参数

  (if (> para1 para2)
    (progn
      (setq tempval0719 pt1)
      (setq pt1 pt2)
      (setq pt2 tempval0719)
    )
  )

  (if (not (isclosePL (car entpnt0)))
    (progn
      (command "BREAK" entpnt "f" stapnt pt1)
      (command "BREAK" entpnt "f" pt2 endpnt)
    )
    (progn
      (setq ptmid (vlax-curve-getclosestpointto ent pmid)) ;取得最近点
      (setq paramid (vlax-curve-getParamAtPoint ent ptmid)) ;取得参数
      (if (between paramid para1 para2)
        (progn
          (if (equal stapnt pt1)
            (progn
              (setq para2 (vlax-curve-getParamAtPoint vlaObj pt2))
              (setq paraEnd (vlax-curve-getEndParam vlaObj))
              (setq para2E (/ (+ para2 paraEnd) 2.0))
              (setq pt2E (vlax-curve-getPointAtParam vlaObj para2E))
              (command "BREAK" entpnt "f" pt2 pt2E)
              (command "BREAK" entpnt "f" pt2E endpnt)
            )
            (progn
              (command "BREAK" entpnt "f" stapnt pt1)
              (command "BREAK" entpnt "f" pt2 endpnt)
            )
          )
        )
        (progn
          (command "BREAK" entpnt "f" pt1 pt2)
        )
      )

    )
  )

  (setq layerName "复线")
  (if (not (tblsearch "layer" layerName))
    (command "layer" "m" layerName "")
  )
  (command "chprop" ent "" "LA" layerName "")

  (command "undo" "e")
  (setvar "cmdecho" 1)

  (princ)
)

;判断是否介于二者之间
(defun between (mynum num1 num2)
  (> 0.0 (* (- mynum num1) (- mynum num2)))
)
;;;判断曲线是否闭合
(defun isclosePL (ent / ed)
  (setq ed (entget ent))
  (or (= 1 (cdr (assoc 70 ed)))
      (equal (assoc 10 ed) (assoc 10 (reverse ed)))
  )
)

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

已领礼包: 226个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 226个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 00:16 , Processed in 0.175205 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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