AI 帮我写出来了 分享给你 但是目前来看 不太稳定 需要加固
 - (defun c:T5 (/ ss ent obj p1 p2 dir unit len p2new leftEnt rightEnt left right
- newp1 newp2 mid allLines i crossEnt crossP1 crossP2 x1 x2
- y1 y2 ip1 ip2)
- (vl-load-com)
- (prompt "\n[T5] 开始运行命令...")
- ;; 选择竖向直线
- (if (setq ss (ssget '((0 . "LINE,LWPOLYLINE"))))
- (progn
- (setq ent (ssname ss 0)
- obj (vlax-ename->vla-object ent)
- p1 (vlax-get obj 'StartPoint)
- p2 (vlax-get obj 'EndPoint)
- dir (mapcar '- p2 p1)
- len (distance p1 p2))
- ;; 判断竖线
- (if (< (abs (car dir)) 0.01)
- (progn
- (setq unit (mapcar '(lambda (x) (/ x len)) dir))
- (setq p2new (mapcar '+ p2 (mapcar '(lambda (x) (* x 18.0)) unit)))
- (vlax-put obj 'EndPoint p2new)
- (prompt (strcat "\n[T5] 已延申到新终点: "
- (rtos (car p2new) 2 2) ", "
- (rtos (cadr p2new) 2 2)))
- ;; 左右偏移
- (vla-offset obj 18.0)
- (setq rightEnt (entlast))
- (vla-offset obj -18.0)
- (setq leftEnt (entlast))
- ;; 获取偏移线坐标
- (setq right (vlax-ename->vla-object rightEnt))
- (setq left (vlax-ename->vla-object leftEnt))
- (setq newp1 (vlax-get obj 'StartPoint))
- (setq newp2 (vlax-get obj 'EndPoint))
- (setq mid (mapcar '(lambda (a b) (/ (+ a b) 2.0)) newp1 newp2))
- ;; 获取左右偏移的X范围
- (setq x1 (car (vlax-get left 'StartPoint)))
- (setq x2 (car (vlax-get right 'StartPoint)))
- (if (> x1 x2) (setq tmp x1 x1 x2 x2 tmp)) ; 交换x1 x2顺序
- ;; 查找在左右偏移线之间的横线
- (setq allLines (ssget "_X" '((0 . "LINE,LWPOLYLINE"))))
- (setq i -1)
- (while (and allLines (setq crossEnt (ssname allLines (setq i (1+ i)))))
- (setq crossObj (vlax-ename->vla-object crossEnt))
- (setq crossP1 (vlax-get crossObj 'StartPoint))
- (setq crossP2 (vlax-get crossObj 'EndPoint))
- ;; 横向判断:y 坐标相同,x 跨越 x1 ~ x2
- (if (and (equal (cadr crossP1) (cadr crossP2) 0.01)
- (< (min (car crossP1) (car crossP2)) x1)
- (> (max (car crossP1) (car crossP2)) x2))
- (progn
- ;; 计算交点:在左右偏移线 x1 和 x2 的交点处 break
- (setq y (cadr crossP1))
- (setq ip1 (list x1 y 0.0))
- (setq ip2 (list x2 y 0.0))
- ;; 执行 break
- (command "_.break" crossEnt ip1 ip2)
- (prompt "\n[T5] 成功剪切一条横线")
- (setq i (sslength allLines)) ; 跳出循环,只剪一条
- )
- )
- )
- )
- (prompt "\n[T5] 请只选择一条竖向的 LINE 或 LWPOLYLINE.")
- )
- )
- (prompt "\n[T5] 没有选择任何对象")
- )
- (princ)
- )
|