明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 431|回复: 6

[源码] 实现水平\竖向等分板,具有记忆功能,比较实用!

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式
  1. ;; 全局变量,用于存储上次输入的等分数、层板厚度和方向
  2. (setq *last-n* 3) ; 默认等分数为 3
  3. (setq *last-nl* 20) ; 默认层板厚度为 20
  4. (setq *last-direction* "Horizontal") ; 默认方向为水平

  5. (defun C:cff ( / oldos cm pta ent ss p1 p2 p3 p4 nl n gl kl l ptn ptny ptn1 ptn1y direction)
  6.   ;; 错误处理函数
  7.   (defun *error* (msg)
  8.     (setvar "osmode" oldos)   ; 恢复原有对象捕捉模式
  9.     (princ (strcat "\n错误信息: " msg))
  10.     (princ)
  11.   )

  12.   ;; 初始化
  13.   (setq cm (getvar "cmdecho")
  14.         oldos (getvar "osmode"))
  15.   (setvar "CMDECHO" 0)
  16.   (command "color" "bylayer")
  17.   (setvar "osmode" 443)
  18.   (command "_undo" "be")

  19.   ;; 选择方向(水平或竖向),使用上次选择的方向作为默认值
  20.   (initget "Horizontal Vertical")
  21.   (setq direction (getkword (strcat "\n选择等分方向 [水平(H)/竖向(V)] <" *last-direction* ">: ")))
  22.   (if (null direction) (setq direction *last-direction*))
  23.   (setq *last-direction* direction) ; 更新全局变量

  24.   ;; 选择矩形区域
  25.   (if (setq pta (getpoint "\n选择矩形区域位置 <空格>两点定位: "))
  26.     (progn
  27.       (command "-BOUNDARY" pta "")
  28.       (setq ent (entlast))
  29.       (setq ss (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))))
  30.       (if (= (length ss) 4)
  31.         (progn
  32.           (vl-load-com)
  33.           (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint)
  34.           (setq p1 (vlax-safearray->list maxpoint)
  35.                 p3 (vlax-safearray->list minpoint))
  36.           (setq p2 (list (car p3) (cadr p1)))
  37.           (setq p4 (list (car p1) (cadr p3)))
  38.           (command "_.erase" ent "")
  39.         )
  40.         (progn
  41.           (command "_.erase" ent "")
  42.           (setq p1 (getpoint "\n洞口不是矩形,手动选择矩形的第一点: "))
  43.           (setq p3 (getcorner p1 "\n第二点: "))
  44.           (setvar "osmode" 0)
  45.           (command "rectang" p1 p3)
  46.           (setq ent (entlast))
  47.           (vl-load-com)
  48.           (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint)
  49.           (setq p1 (vlax-safearray->list maxpoint)
  50.                 p3 (vlax-safearray->list minpoint))
  51.           (setq p2 (list (car p3) (cadr p1)))
  52.           (setq p4 (list (car p1) (cadr p3)))
  53.           (command "_.erase" ent "")
  54.         )
  55.       )
  56.     )
  57.     (progn
  58.       (setq p1 (getpoint "\n第一点: "))
  59.       (setq p3 (getcorner p1 "\n第二点: "))
  60.       (setvar "osmode" 0)
  61.       (command "rectang" p1 p3)
  62.       (setq ent (entlast))
  63.       (vl-load-com)
  64.       (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint)
  65.       (setq p1 (vlax-safearray->list maxpoint)
  66.             p3 (vlax-safearray->list minpoint))
  67.       (setq p2 (list (car p3) (cadr p1)))
  68.       (setq p4 (list (car p1) (cadr p3)))
  69.       (command "_.erase" ent "")
  70.     )
  71.   )

  72.   ;; 获取层板厚度和数量(使用上次输入的值作为默认值)
  73.   (setq nl (getdist (strcat "\n层板厚度 <" (rtos *last-nl* 2 0) ">: ")))
  74.   (if (null nl) (setq nl *last-nl*))
  75.   (setq *last-nl* nl) ; 更新全局变量

  76.   (setq n (getint (strcat "\n层板数量 <" (itoa *last-n*) ">: ")))
  77.   (if (null n) (setq n *last-n*))
  78.   (setq *last-n* n) ; 更新全局变量

  79.   ;; 计算等分间距
  80.   (if (eq direction "Horizontal")
  81.     (progn
  82.       (setq gl (distance p1 p4)) ; 高度
  83.       (setq kl (distance p1 p2)) ; 宽度
  84.       (setq l (/ (- gl (* nl n)) (1+ n))) ; 等分间距
  85.       (repeat n
  86.         (setq ptn (polar p1 (angle p2 p3) l))
  87.         (setq ptny (polar ptn (angle p4 p3) kl))
  88.         (entmake (list '(0 . "LINE") (cons 10 ptn) (cons 11 ptny)))
  89.         (setq ptn1 (polar ptn (angle p2 p3) nl))
  90.         (setq ptn1y (polar ptn1 (angle p4 p3) kl))
  91.         (entmake (list '(0 . "LINE") (cons 10 ptn1) (cons 11 ptn1y)))
  92.         (setq p1 ptn1)
  93.       )
  94.     )
  95.     (progn
  96.       (setq gl (distance p1 p2)) ; 宽度
  97.       (setq kl (distance p1 p4)) ; 高度
  98.       (setq l (/ (- gl (* nl n)) (1+ n))) ; 等分间距
  99.       (repeat n
  100.         (setq ptn (polar p1 (angle p4 p3) l))
  101.         (setq ptny (polar ptn (angle p2 p3) kl))
  102.         (entmake (list '(0 . "LINE") (cons 10 ptn) (cons 11 ptny)))
  103.         (setq ptn1 (polar ptn (angle p4 p3) nl))
  104.         (setq ptn1y (polar ptn1 (angle p2 p3) kl))
  105.         (entmake (list '(0 . "LINE") (cons 10 ptn1) (cons 11 ptn1y)))
  106.         (setq p1 ptn1)
  107.       )
  108.     )
  109.   )

  110.   ;; 恢复系统变量
  111.   (setvar "osmode" oldos)
  112.   (setvar "cmdecho" cm)
  113.   (princ "\n已完成等分板布置")
  114.   (princ)
  115. )


评分

参与人数 1明经币 +1 收起 理由
zm880928 + 1 论坛有你更精彩

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
算是实用,不过关于记忆,应该是这样个写更好(setq a (sub a)),把记忆的代码写在子程序sub中,更简洁,另可以扩展一下,记忆字符串,记忆角度,记忆关键词。
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
CAD2020 无法加载!!!!
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
谢谢分享!
CAD20测试 O.K.
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
这个有问题 我修改了


(defun *error* (msg)
    (setvar "osmode" oldos)   ; 恢复原有对象捕捉模式
    (princ (strcat "\n错误信息: " msg))
    (princ)

回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
请问这个程序用在哪里呢
回复 支持 反对

使用道具 举报

发表于 3 天前 来自手机 | 显示全部楼层
试用了一下不是太好用
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-22 18:46 , Processed in 0.184990 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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