源码,批量矩形与直线平行,已实现,对齐重合未实现;
本意是,批量选择矩形和指定直线,使矩形和直线重合(以矩形形心到直线的垂直方向移动矩形,使矩形的最近边和直线重合)
目前自动旋转与直线平行做到了,但是移动重合失败
有能改好程序大神,看能否抽空完善
 - (defun c:A7 ( / ss lineObj lineData rects ptStart ptEnd lineAng lineVec rectEnt rectData vertices centroidRect distToLine rotAng moveVec moveDist)
- (setvar "cmdecho" 0)
-
- ;;; 步骤1:选择对象
- (princ "\n选择需要对齐的矩形(多段线): ")
- (setq ss (ssget '((0 . "LWPOLYLINE") (90 . 4)))) ; 过滤选择四顶点多段线[9]()
- (if (not ss) (progn (princ "\n未选择矩形!") (exit)))
-
- (princ "\n选择基准直线: ")
- (setq lineObj (car (entsel)))
- (setq lineData (entget lineObj))
- (setq ptStart (cdr (assoc 10 lineData))) ; 直线起点[7]()
- (setq ptEnd (cdr (assoc 11 lineData))) ; 直线终点
-
- ;;; 计算直线参数
- (setq lineAng (angle ptStart ptEnd)) ; 直线角度[7]()
- (setq lineVec (mapcar '- ptEnd ptStart)) ; 直线向量
-
- ;;; 遍历每个矩形
- (repeat (setq i (sslength ss))
- (setq rectEnt (ssname ss (setq i (1- i))))
- (setq rectData (entget rectEnt))
-
- ;;; 步骤2:计算形心
- (setq vertices (vl-remove-if-not '(lambda (x) (= (car x) 10)) rectData)) ; 提取顶点[3]()
- (setq centroidRect (mapcar '/
- (apply 'mapcar (cons '+ (mapcar 'cdr vertices)))
- (list 4.0 4.0)
- )) ; 四点坐标平均值
-
- ;;; 步骤3:计算距离和角度
- (setq distToLine (abs (cadr (trans (mapcar '- centroidRect ptStart) 0 lineVec)))) ; 垂距[7]()
- (setq rectAng (angle (cdar vertices) (cdadr vertices))) ; 矩形当前角度
-
- ;;; 步骤4:旋转矩形
- (setq rotAng (- lineAng rectAng))
- (command "_.rotate" rectEnt "" centroidRect (/ (* rotAng 180.0) pi)) ; 角度转换[4]()
-
- ;;; 步骤5:计算移动向量
- (setq moveDist (- distToLine (/ (distance (cdar vertices) (cdadr vertices)) 2.0))) ; 边距计算
- (setq moveVec (polar '(0 0 0) (+ lineAng (* pi 0.5)) moveDist)) ; 垂线方向[7]()
-
- ;;; 执行移动
- (command "_.move" rectEnt "" centroidRect (mapcar '+ centroidRect moveVec))
- )
- (setvar "cmdecho 1")
- (princ "\n已完成矩形对齐操作!")
- (princ)
- )
|