本帖最后由 qifeifei 于 2025-6-27 13:43 编辑
平时做平面图衣柜
需要用到这个代码;使用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)
- )
成功展示:
|