明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 232|回复: 2

[源码] 画矩形小程序,可以选基点,画完可以移动旋转

[复制链接]
发表于 昨天 09:22 | 显示全部楼层 |阅读模式
本帖最后由 Qwer1243 于 2025-2-20 09:37 编辑

用deepseek调试的画矩形小程序,支持选择基点(左上角,上边中点,形心点),选择基点过程中还支持水平和竖直翻转,画完矩形后可以选择移动和旋转操作

特别感谢zml84 的支持对象捕捉的grread函数
  1. (defun c:e2 (/ *error* base_pt basept_type draw_l1 draw_l2 flip_h flip_v gr half_l1 half_l2 l1 l2 new_pt oldecho option osm ospt pt_右上 pt_右下 pt_左上 pt_左下 pt1 ptlst ref_pt target_pt)
  2.   ;; 保存原始系统设置
  3.   (setq oldecho (getvar "cmdecho"))
  4.   (setq osm (getvar "osmode"))      
  5.   (setvar "cmdecho" 0)              
  6.   
  7.   ;; 错误处理函数
  8.   (defun *error* (msg)
  9.     (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
  10.       (princ (strcat "\n错误: " msg))
  11.     )
  12.     (setvar "osmode" osm)         
  13.     (setvar "cmdecho" oldecho)     
  14.     (princ)
  15.   )
  16.   
  17.   ;; 获取基本参数
  18.   (setq l1 (getdist "\n请输入矩形长:"))
  19.   (setq l2 (getdist "\n请输入矩形宽:"))
  20.   (setvar "osmode" 14847)  ;; 删除这行代码
  21.   (setq basept_type "T")  ;; 默认基点为左上角
  22.   (setq flip_h nil)       ;; 水平翻转标志
  23.   (setq flip_v nil)       ;; 垂直翻转标志
  24.   
  25.   ;; 动态预览循环
  26.   (princ "\n指定基点 (T=左上角/M=上中点/C=形心) H=水平翻转 V=垂直翻转: ")
  27.   (while (and (setq gr (grread t 15 0))
  28.            (/= (car gr) 3)      
  29.            (/= (car gr) 25))   
  30.     (redraw)  ;; 清除之前的图形
  31.     ;; 处理键盘输入(兼容大小写)
  32.     (if (= (car gr) 2)
  33.       (cond
  34.         ;; 基点类型切换
  35.         ((member (cadr gr) '(84 116)) (setq basept_type "T"))  ; T/t
  36.         ((member (cadr gr) '(77 109)) (setq basept_type "M"))  ; M/m
  37.         ((member (cadr gr) '(67 99))  (setq basept_type "C"))  ; C/c
  38.         ;; 翻转操作  
  39.         ((member (cadr gr) '(72 104)) (setq flip_h (not flip_h))) ; H/h 水平翻转
  40.         ((member (cadr gr) '(86 118)) (setq flip_v (not flip_v))) ; V/v 垂直翻转
  41.       )
  42.     )
  43.    
  44.     ;; 处理鼠标移动
  45.     (if (= (car gr) 5)
  46.       (progn
  47.         ;; 调用对象捕捉功能获取点
  48.         (setq pt1 (cadr gr))
  49.         (if (setq ospt (GET-OSPOINT pt1))
  50.           (progn                  
  51.             ;; 绘制捕捉点的靶标
  52.             (apply 'DRAW-ATPOINT ospt)
  53.             (setq pt1 (car ospt))
  54.             
  55.           )
  56.         )
  57.         
  58.         ;; 根据翻转状态计算实际尺寸
  59.         (setq draw_l1 (* l1 (if flip_h -1 1))
  60.           draw_l2 (* l2 (if flip_v -1 1)))
  61.         
  62.         ;; 根据基点类型计算顶点
  63.         (cond
  64.           ;; 左上角基点
  65.           ((= basept_type "T")
  66.             (setq ptlst (list
  67.                           (polar pt1 (* pi 1.5) draw_l2)  ; 左下角
  68.                           pt1                             ; 左上角
  69.                           (polar pt1 0 draw_l1)           ; 右上角
  70.                           (polar (polar pt1 0 draw_l1) (* pi 1.5) draw_l2) ; 右下角
  71.                         )))
  72.           ;; 上中点基点
  73.           ((= basept_type "M")
  74.             (setq half_l1 (/ draw_l1 2.0))
  75.             (setq pt_左上 (polar pt1 pi half_l1))  ; 左上角
  76.             (setq pt_右上 (polar pt1 0 half_l1))   ; 右上角
  77.             (setq pt_右下 (polar pt_右上 (* pi 1.5) draw_l2)) ; 右下角
  78.             (setq pt_左下 (polar pt_左上 (* pi 1.5) draw_l2)) ; 左下角
  79.             (setq ptlst (list pt_左上 pt_右上 pt_右下 pt_左下)))
  80.           ;; 形心基点
  81.           ((= basept_type "C")
  82.             (setq half_l1 (/ draw_l1 2.0)
  83.               half_l2 (/ draw_l2 2.0))
  84.             (setq pt_左上 (polar (polar pt1 pi half_l1) (/ pi 2) half_l2)) ; 左上角
  85.             (setq pt_右上 (polar (polar pt1 0 half_l1) (/ pi 2) half_l2)) ; 右上角
  86.             (setq pt_右下 (polar (polar pt1 0 half_l1) (* pi 1.5) half_l2)) ; 右下角
  87.             (setq pt_左下 (polar (polar pt1 pi half_l1) (* pi 1.5) half_l2)) ; 左下角
  88.             (setq ptlst (list pt_左上 pt_右上 pt_右下 pt_左下)))
  89.         )
  90.         
  91.         ;; 绘制动态预览(红色)
  92.         (grvecs
  93.           (cons 1
  94.             (list
  95.               (nth 0 ptlst) (nth 1 ptlst)
  96.               (nth 1 ptlst) (nth 2 ptlst)
  97.               (nth 2 ptlst) (nth 3 ptlst)
  98.               (nth 3 ptlst) (nth 0 ptlst)
  99.             )
  100.           )
  101.         )
  102.         
  103.       )
  104.     )
  105.   )
  106.   
  107.   ;; 确认绘制时清除预览
  108.   (if (= (car gr) 3)
  109.     (progn
  110.       (command "_.rectang"
  111.         "_non" (nth 0 ptlst)  ; 第一个对角点
  112.         "_non" (nth 2 ptlst)  ; 第二个对角点
  113.       )
  114.       (redraw) ; 强制刷新屏幕清除临时图形
  115.     )
  116.   )
  117.   ;; 恢复系统设置
  118.   (setvar "osmode" osm)
  119.   (setvar "cmdecho" oldecho)  
  120.     ;; 增加移动和旋转选项
  121.   (initget "M R")  ; 使用 initget 定义选项
  122.   (setq option (getkword "\n选择操作 [移动[M]/旋转[R]]<确认>: "))
  123.   (setq base_pt pt1)
  124.   (cond
  125.     ;; 移动
  126.     ((= option "M")
  127.       (setq target_pt (getpoint base_pt "\n指定目标点: "))
  128.       (command "_.move" "_last" "" base_pt target_pt)
  129.     )
  130.     ;; 旋转
  131.     ((= option "R")
  132.       (setq ref_pt (getpoint base_pt "\n指定参照点: "))
  133.       (setq new_pt (getpoint base_pt "\n指定新角度点: "))
  134.       (command "_.rotate" "_last" "" base_pt "_reference" ref_pt ref_pt new_pt)
  135.     )
  136.     ;; 回车确认
  137.     ((not option)
  138.       (princ "\n已确认,无操作。")
  139.     )
  140.   )
  141.   
  142.   (princ)
  143. )

  144. ;;;功能:支持对象捕捉的grread
  145. ;;;          代码源自fools
  146. ;;;日期:zml84 修改于 2009-05-20
  147. (setq *LST*
  148.   '((1
  149.       "_end"
  150.       ((-1 1) (-1 -1))
  151.       ((-1 -1) (1 -1))
  152.       ((1 -1) (1 1))
  153.       ((1 1) (-1 1))
  154.     )
  155.      (2
  156.        "_mid"
  157.        ((0 1.414) (-1.225 -0.707))
  158.        ((-1.225 -0.707) (1.225 -0.707))
  159.        ((1.225 -0.707) (0 1.414))
  160.      )
  161.      (4
  162.        "_cen"
  163.        ((0 1) (-0.707 0.707))
  164.        ((-0.707 0.707) (-1 0))
  165.        ((-1 0) (-0.707 -0.707))
  166.        ((-0.707 -0.707) (0 -1))
  167.        ((0 -1) (0.707 -0.707))
  168.        ((0.707 -0.707) (1 0))
  169.        ((1 0) (0.707 0.707))
  170.        ((0.707 0.707) (0 1))
  171.      )
  172.      (8
  173.        "_nod"
  174.        ((0 1) (-0.707 0.707))
  175.        ((-0.707 0.707) (-1 0))
  176.        ((-1 0) (-0.707 -0.707))
  177.        ((-0.707 -0.707) (0 -1))
  178.        ((0 -1) (0.707 -0.707))
  179.        ((0.707 -0.707) (1 0))
  180.        ((1 0) (0.707 0.707))
  181.        ((0.707 0.707) (0 1))
  182.        ((-1 1) (1 -1))
  183.        ((-1 -1) (1 1))
  184.      )
  185.      (16
  186.        "_qua"
  187.        ((0 1.414) (-1.414 0))
  188.        ((-1.414 0) (0 -1.414))
  189.        ((0 -1.414) (1.414 0))
  190.        ((1.414 0) (0 1.414))
  191.      )
  192.      (32
  193.        "_int"
  194.        ((-1 1) (1 -1))
  195.        ((-1 -1) (1 1))
  196.        ((1 0.859) (-0.859 -1))
  197.        ((-1 0.859) (0.859 -1))
  198.        ((0.859 1) (-1 -0.859))
  199.        ((-0.859 1) (1 -0.859))
  200.      )
  201.      (64
  202.        "_ins"
  203.        ((-1 1) (-1 -0.1))
  204.        ((-1 -0.1) (0 -0.1))
  205.        ((0 -0.1) (0 -1.0))
  206.        ((0 -1.0) (1 -1))
  207.        ((1 -1) (1 0.1))
  208.        ((1 0.1) (0 0.1))
  209.        ((0 0.1) (0 1.0))
  210.        ((0 1.0) (-1 1))
  211.      )
  212.      (128
  213.        "_per"
  214.        ((-1 1) (-1 -1))
  215.        ((-1 -1) (1 -1))
  216.        ((0 -1) (0 0))
  217.        ((0 0) (-1 0))
  218.      )
  219.      (256
  220.        "_tan"
  221.        ((0 1) (-0.707 0.707))
  222.        ((-0.707 0.707) (-1 0))
  223.        ((-1 0) (-0.707 -0.707))
  224.        ((-0.707 -0.707) (0 -1))
  225.        ((0 -1) (0.707 -0.707))
  226.        ((0.707 -0.707) (1 0))
  227.        ((1 0) (0.707 0.707))
  228.        ((0.707 0.707) (0 1))
  229.        ((1 1) (-1 1))
  230.      )
  231.      (512
  232.        "_nea"
  233.        ((-1 1) (1 -1))
  234.        ((1 -1) (-1 -1))
  235.        ((-1 -1) (1 1))
  236.        ((1 1) (-1 1))
  237.      )
  238.      (1024 "_qui")
  239.      (2048
  240.        "_app"
  241.        ((-1 1) (-1 -1))
  242.        ((-1 -1) (1 -1))
  243.        ((1 -1) (1 1))
  244.        ((1 1) (-1 1))
  245.        ((-1 1) (1 -1))
  246.        ((-1 -1) (1 1))
  247.      )
  248.      (4096
  249.        "_ext"
  250.        ((0.1 0) (0.13 0))
  251.        ((0.2 0) (0.23 0))
  252.        ((0.3 0) (0.33 0))
  253.      )
  254.      (8192
  255.        "_par"
  256.        ((0 1) (-1 -1))
  257.        ((1 1) (0 -1))
  258.      )
  259.    )
  260. )
  261. ;;;=================================================================*
  262. ;;;功能:计算在当前对象捕捉设置情况下,指定点的对象捕捉点位         *
  263. ;;;思路:获取当前的对象捕捉模式;*
  264. ;;;      逐个使用osnap来尝试获取点位;*
  265. ;;;      比较点位距离指定点的距离,最近的即为结果。*
  266. ;;;返回:(捕捉到的点位   捕捉模式)                                  *
  267. ;;;      捕捉模式为0表示,不捕捉。*
  268. (defun GET-OSPOINT (PT / LST_JG OS N PT_NEW)
  269.   (setq LST_JG '()
  270.     OS   (getvar "osmode")
  271.   )
  272.   (if  (< 0 OS 16384)
  273.     (foreach N (reverse *LST*)
  274.       (if  (and (= (logand OS (car N)) (car N))
  275.             (setq PT_NEW (osnap PT (cadr N)))
  276.           )
  277.         (setq
  278.           LST_JG (cons (list (distance PT_NEW PT)
  279.                          PT_NEW
  280.                          (car N)
  281.                        )
  282.                    LST_JG
  283.                  )
  284.         )
  285.       )
  286.     )
  287.     (setq LST_JG (list (list 0 PT 0)))
  288.   )
  289.   ;;根据距离大小排序
  290.   (if  (> (length LST_JG) 1)
  291.     (setq LST_JG (vl-sort LST_JG
  292.                    (function  (lambda  (E1 E2)
  293.                                 (< (car E1) (car E2))
  294.                               )
  295.                    )
  296.                  )
  297.     )
  298.   )
  299.   ;;返回
  300.   ;;;    (print LST_JG)
  301.   (cdr (car LST_JG))
  302. )

  303. ;;;=================================================================*
  304. ;;;功能:在指定点  绘制  指定的靶标                                 *
  305. ;;;参数:PT -----要绘制的位置                                       *
  306. ;;;      I  -----捕捉模式单项值。例如:1 or 2 or 4 ...              *
  307. (defun DRAW-ATPOINT (PT I / SIZE COLOR MATRIX LST)
  308.   (foreach REAL '(-0.5 0 0.5)
  309.     (setq SIZE  (* (+ (read (getenv "AutoSnapSize")) REAL)
  310.                   (/ (getvar "VIEWSIZE")
  311.                     (cadr (getvar "SCREENSIZE"))
  312.                   )
  313.                 )
  314.       COLOR (read (getenv "AutoSnapColor"))
  315.     )
  316.    
  317.    
  318.     (setq MATRIX (list (list SIZE 0.0 0.0 (car PT))
  319.                    (list 0.0 SIZE 0.0 (cadr PT))
  320.                    (list 0.0 0.0 1.0 0.0)
  321.                    (list 0.0 0.0 0.0 1.0)
  322.                  )
  323.     )
  324.     (and (setq LST (cddr (assoc I *LST*)))
  325.       (setq LST
  326.         (mapcar (function (lambda (X) (cons COLOR X))) LST)
  327.       )
  328.       (setq LST (apply 'append LST))
  329.       (grvecs LST MATRIX)
  330.     )
  331.   )
  332. )
  333. ;;;=================================================================


本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 昨天 15:13 | 显示全部楼层
很好→很棒!很好~很棒!!很好……很棒!!!
回复 支持 反对

使用道具 举报

发表于 9 小时前 | 显示全部楼层

很好→很吊!很好→很吊!很好→很吊!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-21 21:11 , Processed in 0.187656 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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