小毛草 发表于 2025-1-17 10:25:53

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

实现给定范围;; 全局变量,用于存储上次输入的等分数、层板厚度和方向
(setq *last-n* 3) ; 默认等分数为 3
(setq *last-nl* 20) ; 默认层板厚度为 20
(setq *last-direction* "Horizontal") ; 默认方向为水平

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

;; 初始化
(setq cm (getvar "cmdecho")
      oldos (getvar "osmode"))
(setvar "CMDECHO" 0)
(command "color" "bylayer")
(setvar "osmode" 443)
(command "_undo" "be")

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

;; 选择矩形区域
(if (setq pta (getpoint "\n选择矩形区域位置 <空格>两点定位: "))
    (progn
      (command "-BOUNDARY" pta "")
      (setq ent (entlast))
      (setq ss (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))))
      (if (= (length ss) 4)
      (progn
          (vl-load-com)
          (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint)
          (setq p1 (vlax-safearray->list maxpoint)
                p3 (vlax-safearray->list minpoint))
          (setq p2 (list (car p3) (cadr p1)))
          (setq p4 (list (car p1) (cadr p3)))
          (command "_.erase" ent "")
      )
      (progn
          (command "_.erase" ent "")
          (setq p1 (getpoint "\n洞口不是矩形,手动选择矩形的第一点: "))
          (setq p3 (getcorner p1 "\n第二点: "))
          (setvar "osmode" 0)
          (command "rectang" p1 p3)
          (setq ent (entlast))
          (vl-load-com)
          (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint)
          (setq p1 (vlax-safearray->list maxpoint)
                p3 (vlax-safearray->list minpoint))
          (setq p2 (list (car p3) (cadr p1)))
          (setq p4 (list (car p1) (cadr p3)))
          (command "_.erase" ent "")
      )
      )
    )
    (progn
      (setq p1 (getpoint "\n第一点: "))
      (setq p3 (getcorner p1 "\n第二点: "))
      (setvar "osmode" 0)
      (command "rectang" p1 p3)
      (setq ent (entlast))
      (vl-load-com)
      (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint)
      (setq p1 (vlax-safearray->list maxpoint)
            p3 (vlax-safearray->list minpoint))
      (setq p2 (list (car p3) (cadr p1)))
      (setq p4 (list (car p1) (cadr p3)))
      (command "_.erase" ent "")
    )
)

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

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

;; 计算等分间距
(if (eq direction "Horizontal")
    (progn
      (setq gl (distance p1 p4)) ; 高度
      (setq kl (distance p1 p2)) ; 宽度
      (setq l (/ (- gl (* nl n)) (1+ n))) ; 等分间距
      (repeat n
      (setq ptn (polar p1 (angle p2 p3) l))
      (setq ptny (polar ptn (angle p4 p3) kl))
      (entmake (list '(0 . "LINE") (cons 10 ptn) (cons 11 ptny)))
      (setq ptn1 (polar ptn (angle p2 p3) nl))
      (setq ptn1y (polar ptn1 (angle p4 p3) kl))
      (entmake (list '(0 . "LINE") (cons 10 ptn1) (cons 11 ptn1y)))
      (setq p1 ptn1)
      )
    )
    (progn
      (setq gl (distance p1 p2)) ; 宽度
      (setq kl (distance p1 p4)) ; 高度
      (setq l (/ (- gl (* nl n)) (1+ n))) ; 等分间距
      (repeat n
      (setq ptn (polar p1 (angle p4 p3) l))
      (setq ptny (polar ptn (angle p2 p3) kl))
      (entmake (list '(0 . "LINE") (cons 10 ptn) (cons 11 ptny)))
      (setq ptn1 (polar ptn (angle p4 p3) nl))
      (setq ptn1y (polar ptn1 (angle p2 p3) kl))
      (entmake (list '(0 . "LINE") (cons 10 ptn1) (cons 11 ptn1y)))
      (setq p1 ptn1)
      )
    )
)

;; 恢复系统变量
(setvar "osmode" oldos)
(setvar "cmdecho" cm)
(princ "\n已完成等分板布置")
(princ)
)

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

yefei812678 发表于 2025-1-17 11:31:12

谢谢分享谢谢分享谢谢分享

zmzk 发表于 2025-1-17 13:04:33

楼主,这几天真是 高产啊!出这么多作品!

tanxindong 发表于 2025-1-18 15:13:32

楼主大才:hug:谢谢分享

moranyuyan 发表于 2025-1-18 20:49:41

谢谢分享

puzb2023 发表于 2025-1-25 11:28:54

谢谢分享,楼主大才,这几天真是 高产啊!出这么多作品!
页: [1]
查看完整版本: 实现水平\竖向等分板,具有记忆功能,比较实用!