明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 391|回复: 7

[讨论] 源码,批量矩形与直线平行,已实现,对齐重合未实现

[复制链接]
发表于 前天 09:53 | 显示全部楼层 |阅读模式
源码,批量矩形与直线平行,已实现,对齐重合未实现;

本意是,批量选择矩形和指定直线,使矩形和直线重合(以矩形形心到直线的垂直方向移动矩形,使矩形的最近边和直线重合)

目前自动旋转与直线平行做到了,但是移动重合失败

有能改好程序大神,看能否抽空完善

  1. (defun c:A7 ( / ss lineObj lineData rects ptStart ptEnd lineAng lineVec rectEnt rectData vertices centroidRect distToLine rotAng moveVec moveDist)
  2.     (setvar "cmdecho" 0)
  3.    
  4.     ;;; 步骤1:选择对象
  5.     (princ "\n选择需要对齐的矩形(多段线): ")
  6.     (setq ss (ssget '((0 . "LWPOLYLINE") (90 . 4)))) ; 过滤选择四顶点多段线[9]()
  7.     (if (not ss) (progn (princ "\n未选择矩形!") (exit)))
  8.    
  9.     (princ "\n选择基准直线: ")
  10.     (setq lineObj (car (entsel)))
  11.     (setq lineData (entget lineObj))
  12.     (setq ptStart (cdr (assoc 10 lineData))) ; 直线起点[7]()
  13.     (setq ptEnd (cdr (assoc 11 lineData)))   ; 直线终点
  14.    
  15.     ;;; 计算直线参数
  16.     (setq lineAng (angle ptStart ptEnd))     ; 直线角度[7]()
  17.     (setq lineVec (mapcar '- ptEnd ptStart)) ; 直线向量
  18.    
  19.     ;;; 遍历每个矩形
  20.     (repeat (setq i (sslength ss))
  21.         (setq rectEnt (ssname ss (setq i (1- i))))
  22.         (setq rectData (entget rectEnt))
  23.         
  24.         ;;; 步骤2:计算形心
  25.         (setq vertices (vl-remove-if-not '(lambda (x) (= (car x) 10)) rectData)) ; 提取顶点[3]()
  26.         (setq centroidRect (mapcar '/
  27.             (apply 'mapcar (cons '+ (mapcar 'cdr vertices)))
  28.             (list 4.0 4.0)
  29.         )) ; 四点坐标平均值
  30.         
  31.         ;;; 步骤3:计算距离和角度
  32.         (setq distToLine (abs (cadr (trans (mapcar '- centroidRect ptStart) 0 lineVec)))) ; 垂距[7]()
  33.         (setq rectAng (angle (cdar vertices) (cdadr vertices))) ; 矩形当前角度
  34.         
  35.         ;;; 步骤4:旋转矩形
  36.         (setq rotAng (- lineAng rectAng))
  37.         (command "_.rotate" rectEnt "" centroidRect (/ (* rotAng 180.0) pi)) ; 角度转换[4]()
  38.         
  39.         ;;; 步骤5:计算移动向量
  40.         (setq moveDist (- distToLine (/ (distance (cdar vertices) (cdadr vertices)) 2.0))) ; 边距计算
  41.         (setq moveVec (polar '(0 0 0) (+ lineAng (* pi 0.5)) moveDist)) ; 垂线方向[7]()
  42.         
  43.         ;;; 执行移动
  44.         (command "_.move" rectEnt "" centroidRect (mapcar '+ centroidRect moveVec))
  45.     )
  46.     (setvar "cmdecho 1")
  47.     (princ "\n已完成矩形对齐操作!")
  48.     (princ)
  49. )


点评

AI代码还太烂  发表于 前天 12:13
回复

使用道具 举报

 楼主| 发表于 前天 10:01 | 显示全部楼层
图形效果过程示意

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 前天 10:24 | 显示全部楼层
又是ai代码  找人修
回复 支持 反对

使用道具 举报

发表于 前天 10:33 | 显示全部楼层
旋转以后的点表需要重新获取  不能用之前的  矩形不是正方形边距计算是错的  垂距也是错的  按你的算出来是0
回复 支持 反对

使用道具 举报

发表于 前天 10:52 | 显示全部楼层
随便找个边,旋转到平行,然后找一个最近点,移到垂线位置就好。
回复 支持 反对

使用道具 举报

发表于 前天 12:00 | 显示全部楼层




本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
zhoupeng220 + 1 赞一个!
lengxiaxi + 1 帅啊!

查看全部评分

回复 支持 反对

使用道具 举报

发表于 前天 12:29 | 显示全部楼层

院长威武!比AI出来的代码好上几百倍!
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-21 21:23 , Processed in 0.197785 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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