源码,批量矩形与直线平行,已实现,对齐重合未实现
源码,批量矩形与直线平行,已实现,对齐重合未实现;本意是,批量选择矩形和指定直线,使矩形和直线重合(以矩形形心到直线的垂直方向移动矩形,使矩形的最近边和直线重合)
目前自动旋转与直线平行做到了,但是移动重合失败
有能改好程序大神,看能否抽空完善
(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)))) ; 过滤选择四顶点多段线()
(if (not ss) (progn (princ "\n未选择矩形!") (exit)))
(princ "\n选择基准直线: ")
(setq lineObj (car (entsel)))
(setq lineData (entget lineObj))
(setq ptStart (cdr (assoc 10 lineData))) ; 直线起点()
(setq ptEnd (cdr (assoc 11 lineData))) ; 直线终点
;;; 计算直线参数
(setq lineAng (angle ptStart ptEnd)) ; 直线角度()
(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)) ; 提取顶点()
(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)))) ; 垂距()
(setq rectAng (angle (cdar vertices) (cdadr vertices))) ; 矩形当前角度
;;; 步骤4:旋转矩形
(setq rotAng (- lineAng rectAng))
(command "_.rotate" rectEnt "" centroidRect (/ (* rotAng 180.0) pi)) ; 角度转换()
;;; 步骤5:计算移动向量
(setq moveDist (- distToLine (/ (distance (cdar vertices) (cdadr vertices)) 2.0))) ; 边距计算
(setq moveVec (polar '(0 0 0) (+ lineAng (* pi 0.5)) moveDist)) ; 垂线方向()
;;; 执行移动
(command "_.move" rectEnt "" centroidRect (mapcar '+ centroidRect moveVec))
)
(setvar "cmdecho 1")
(princ "\n已完成矩形对齐操作!")
(princ)
)
图形效果过程示意 又是ai代码找人修 旋转以后的点表需要重新获取不能用之前的矩形不是正方形边距计算是错的垂距也是错的按你的算出来是0 随便找个边,旋转到平行,然后找一个最近点,移到垂线位置就好。
xyp1964 发表于 2025-2-19 12:00
院长威武!比AI出来的代码好上几百倍! 谢谢大师分享
页:
[1]