明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 185|回复: 4

[基础] 哪位大师帮忙改下

[复制链接]
发表于 昨天 15:34 | 显示全部楼层 |阅读模式
(defun boundbox(ent / mi ma)
(vla-getboundingbox (vlax-ename->vla-object ent) 'mi 'ma)
(list (vlax-safearray->list mi)(vlax-safearray->list ma)))
(defun midpoint (pt1 pt2)(mapcar '(lambda(x y) (/ (+ x y) 2.0)) pt1 pt2))
(defun point(pbase sx sy)(list (+ (car pbase) sx)(+ (cadr pbase) sy)))
(defun getbop(lss ip / el lss)
        (setq el (cdr (assoc 5 (entget (entlast)))))
        (vl-cmdf "boundary" "A" "I" "N" "N" "B" "N" lss "" "" "none" ip "")
        (if  (/= el (cdr (assoc 5 (entget (entlast)))))(entlast) nil))
(defun pfdyx(ent spn jx hv)
        (setq spn 5 jx 10)
        (setq pt (boundbox ent) bp (car pt) kd (- (car (cadr pt))(car bp)) gd (- (cadr (cadr pt))(cadr bp)))
        (setq xkd (/ (- kd (* (1- spn) jx)) spn))
        (setq ss (ssadd)) (ssadd ent ss)
        (repeat spn
        (setq p1 (point bp xkd -1) p2 (point p1 0 (+ gd 2)))
        (setq p3 (point p1 jx 0) p4 (point p2 jx 0))
        (setq p5 (point bp (* 0.5 xkd) -1) p6 (point p5 0 (+ gd 2)))
        (setq bp (point p3 0 1))
        (if (< (car bp)(car(cadr pt)))
(progn        (entmake (list (cons 0 "LINE")(cons 10 p1)(cons 11 p2)))(ssadd (entlast) ss)
                (entmake (list (cons 0 "LINE")(cons 10 p3)(cons 11 p4)))(ssadd (entlast) ss)  ))
                (entmake (list (cons 0 "LINE")(cons 10 p5)(cons 11 p6)))
                (setq plst (vlax-invoke (vlax-ename->vla-object (entlast)) 'IntersectWith (vlax-ename->vla-object ent) acextendnone))
                (entdel (entlast))
                (setq i -3 ptlst nil)
   (while(nth(setq i (+ i 3))plst)(setq ptlst(cons(list(nth i plst)(nth(1+ i) plst))ptlst)))
                (setq ptlst (vl-sort ptlst (function(lambda(e1 e2)(< (cadr e1)(cadr e2))))))
                (getbop ss (trans (midpoint (car ptlst)(cadr ptlst)) 0 1))
        )(vl-cmdf "erase" ss "")(princ))

(defun pfdyx(ent spn jx hv / pt bp kd gd ss p1 p2 p3 p4 p5 p6 bp plst ptlst i)
(setq pt (boundbox ent) bp (car pt) kd (- (nth hv (cadr pt))(nth hv bp)) gd (- (nth (- 1 hv) (cadr pt))(nth (- 1 hv) bp)))
        (setq xkd (/ (- kd (* (1- spn) jx)) spn))
        (setq ss (ssadd)) (ssadd ent ss)
(repeat spn(if (= hv 0)
                    (progn        (setq p1 (point bp xkd -1) p2 (point p1 0 (+ gd 2)))
                        (setq p3 (point p1 jx 0) p4 (point p2 jx 0))
                        (setq p5 (point bp (* 0.5 xkd) -1) p6 (point p5 0 (+ gd 2)))
                        (setq bp (point p3 0 1))                    )
                    (progn        (setq p1 (point bp -1 xkd) p2 (point p1 (+ gd 2) 0))
                        (setq p3 (point p1 0 jx) p4 (point p2 0 jx))
                        (setq p5 (point bp -1 (* 0.5 xkd)) p6 (point p5 (+ gd 2) 0))
                        (setq bp (point p3 1 0))                    )                )
                (if (< (nth hv bp)(nth hv (cadr pt)))
(progn        (entmake (list (cons 0 "LINE")(cons 10 p1)(cons 11 p2)))(ssadd (entlast) ss)
                (entmake (list (cons 0 "LINE")(cons 10 p3)(cons 11 p4)))(ssadd (entlast) ss)    ))
                (entmake (list (cons 0 "LINE")(cons 10 p5)(cons 11 p6)))
                (setq plst (vlax-invoke (vlax-ename->vla-object (entlast)) 'IntersectWith (vlax-ename->vla-object ent) acextendnone))
                (entdel (entlast))
                (setq i -3 ptlst nil)
(while(nth(setq i (+ i 3))plst)(setq ptlst(cons(list(nth i plst)(nth (1+ i) plst))ptlst)))
(setq ptlst (vl-sort ptlst (function(lambda(e1 e2)(< (nth (- 1 hv) e1)(nth (- 1 hv) e2))))))
        (getbop ss (trans (midpoint (car ptlst)(cadr ptlst)) 0 1))
        )(vl-cmdf "erase" ss "")(princ))

(defun c:df( / dd jx pfstr dd1)
   (setq dd1 (getpoint "\n指定封闭图形内一点 "))
  (vl-cmdf "-boundary" dd1 "")
  (if (not hv)(setq hv 1))
   (if (not pfdyxjx)(setq pfdyxjx 30))
   (if (not pfdyxjx1)(setq pfdyxjx1 30))
   (if (not pfdyxspn)(setq pfdyxspn 3))
(setq dclf (vl-filename-mktemp "dcl.dcl") tpf (open dclf "W"))
        (foreach pfstr (setq tempdcllst (list
            "pf:dialog{label=\"平分闭合区域\";        "
           ":edit_box{label=\" 平分间距 \";key=\"jx\";}"
           ":edit_box{label=\"离边界距离\";key=\"jx1\";}"
           ":edit_box{label=\" 平分数量 \";key=\"spn\";}"
         ":row{:radio_button{label=\"水平平分\";key=\"1\";} :radio_button{label=\"垂直平分\";key=\"0\";}}        "
            "ok_cancel;}        "        ))  
        (write-line pfstr tpf))
        (close tpf)
        (while (null (findfile dclf)) (princ))
        (new_dialog "pf" (load_dialog dclf))
        (set_tile "jx" (rtos pfdyxjx))
        (set_tile "jx1" (rtos pfdyxjx1))
        (set_tile "spn" (itoa pfdyxspn))
        (action_tile "jx" "(setq pfdyxjx (atoi $value))")
        (action_tile "jx1" "(setq pfdyxjx1 (atoi $value))")
        (action_tile "spn" "(setq pfdyxspn (atoi $value))")
        (if (= hv 1)(set_tile "1" "1")(set_tile "0" "1"))
        (action_tile "0" "(setq hv (atoi $key))")
        (action_tile "1" "(setq hv (atoi $key))")
        (action_tile "cancel" "(done_dialog 0)")
        (action_tile "accept" "(done_dialog 1)")
        (vl-file-delete dclf)
        (setq dd (start_dialog) tpf nil dclf nil)
        (if (= dd 0)(vl-exit-with-value 0))
   (if (/= pfdyxjx1 0)(command "offset" "e" "y" pfdyxjx1 (entlast) dd1 "" ))
   (pfdyx (entlast) pfdyxspn pfdyxjx hv)
(princ))
求哪位大师帮忙改下平分间距跟离边界能帮改成浮点数值;比如说:2.3和2.66这类的都用,目前只能是整数,如运行时输入2.5,直接是2进行运算

回复

使用道具 举报

发表于 昨天 15:50 | 显示全部楼层
  1. (defun boundbox (ent / mi ma)
  2.   (vla-getboundingbox (vlax-ename->vla-object ent) 'mi 'ma)
  3.   (list (vlax-safearray->list mi) (vlax-safearray->list ma))
  4. )
  5. (defun midpoint (p1 p2)
  6.   (mapcar '(lambda (x y) (* (+ x y) 0.5)) p1 p2)
  7. )
  8. (defun point (p0 dx dy)
  9.   (list (+ (car p0) dx) (+ (cadr p0) dy))
  10. )

  11. (defun getbop (lss ip / el lss)
  12.   (setq el (cdr (assoc 5 (entget (entlast)))))
  13.   (vl-cmdf "boundary" "A" "I" "N" "N" "B" "N" lss "" "" "none" ip "")
  14.   (if (/= el (cdr (assoc 5 (entget (entlast)))))
  15.     (entlast)
  16.     nil
  17.   )
  18. )

  19. (defun pfdyx (ent spn jx hv / pt bp kd gd ss p1 p2 p3 p4 p5 p6 bp plst ptlst i)
  20.   (setq pt  (boundbox ent)
  21.         bp  (car pt)
  22.         kd  (- (nth hv (cadr pt)) (nth hv bp))
  23.         gd  (- (nth (- 1 hv) (cadr pt)) (nth (- 1 hv) bp))
  24.         xkd (/ (- kd (* (1- spn) jx)) spn)
  25.         ss  (ssadd)
  26.   )
  27.   (ssadd ent ss)
  28.   (repeat spn
  29.     (if (= hv 0)
  30.       (setq p1 (point bp xkd -1)
  31.             p2 (point p1 0 (+ gd 2))
  32.             p3 (point p1 jx 0)
  33.             p4 (point p2 jx 0)
  34.             p5 (point bp (* 0.5 xkd) -1)
  35.             p6 (point p5 0 (+ gd 2))
  36.             bp (point p3 0 1)
  37.       )
  38.       (setq p1 (point bp -1 xkd)
  39.             p2 (point p1 (+ gd 2) 0)
  40.             p3 (point p1 0 jx)
  41.             p4 (point p2 0 jx)
  42.             p5 (point bp -1 (* 0.5 xkd))
  43.             p6 (point p5 (+ gd 2) 0)
  44.             bp (point p3 1 0)
  45.       )
  46.     )
  47.     (if (< (nth hv bp) (nth hv (cadr pt)))
  48.       (progn
  49.         (entmake (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2)))
  50.         (ssadd (entlast) ss)
  51.         (entmake (list (cons 0 "LINE") (cons 10 p3) (cons 11 p4)))
  52.         (ssadd (entlast) ss)
  53.       )
  54.     )
  55.     (entmake (list (cons 0 "LINE") (cons 10 p5) (cons 11 p6)))
  56.     (setq plst (vlax-invoke
  57.                  (vlax-ename->vla-object (entlast))
  58.                  'IntersectWith
  59.                  (vlax-ename->vla-object ent)
  60.                  acextendnone
  61.                )
  62.     )
  63.     (entdel (entlast))
  64.     (setq i -3
  65.           ptlst nil
  66.     )
  67.     (while (nth (setq i (+ i 3)) plst)
  68.       (setq ptlst (cons (list (nth i plst) (nth (1+ i) plst)) ptlst))
  69.     )
  70.     (setq ptlst (vl-sort ptlst
  71.                          '(lambda (e1 e2) (< (nth (- 1 hv) e1) (nth (- 1 hv) e2)))
  72.                 )
  73.     )
  74.     (getbop ss (trans (midpoint (car ptlst) (cadr ptlst)) 0 1))
  75.   )
  76.   (vl-cmdf "erase" ss "")
  77.   (princ)
  78. )

  79. (defun c:tt (/ dd jx pfstr dd1)
  80.   (setq dd1 (getpoint "\n指定封闭图形内一点: "))
  81.   (vl-cmdf "-boundary" dd1 "")
  82.   (if (not hv)
  83.     (setq hv 1)
  84.   )
  85.   (if (not pfdyxjx)
  86.     (setq pfdyxjx 30.)
  87.   )
  88.   (if (not pfdyxjx1)
  89.     (setq pfdyxjx1 30.)
  90.   )
  91.   (if (not pfdyxspn)
  92.     (setq pfdyxspn 3)
  93.   )
  94.   (setq dclf (vl-filename-mktemp "dcl.dcl")
  95.         tpf  (open dclf "W")
  96.   )
  97.   (foreach pfstr (setq tempdcllst
  98.                         (list
  99.                           "pf:dialog{label=\"平分闭合区域\";"                           ":edit_box{label=\" 平分间距 \";key=\"jx\";}"
  100.                           ":edit_box{label=\"离边界距离\";key=\"jx1\";}"                ":edit_box{label=\" 平分数量 \";key=\"spn\";}"
  101.                           ":row{:radio_button{label=\"水平平分\";key=\"1\";} "          ":radio_button{label=\"垂直平分\";key=\"0\";}}"
  102.                           "ok_cancel;}        "
  103.                          )
  104.                  )
  105.     (write-line pfstr tpf)
  106.   )
  107.   (close tpf)
  108.   (while (null (findfile dclf)) (princ))
  109.   (new_dialog "pf" (load_dialog dclf))
  110.   (set_tile "jx" (rtos pfdyxjx 2 2))
  111.   (set_tile "jx1" (rtos pfdyxjx1 2 2))
  112.   (set_tile "spn" (itoa pfdyxspn))
  113.   (action_tile "jx" "(setq pfdyxjx (atof $value))")
  114.   (action_tile "jx1" "(setq pfdyxjx1 (atof $value))")
  115.   (action_tile "spn" "(setq pfdyxspn (atoi $value))")
  116.   (if (= hv 1)
  117.     (set_tile "1" "1")
  118.     (set_tile "0" "1")
  119.   )
  120.   (action_tile "0" "(setq hv (atoi $key))")
  121.   (action_tile "1" "(setq hv (atoi $key))")
  122.   (action_tile "cancel" "(done_dialog 0)")
  123.   (action_tile "accept" "(done_dialog 1)")
  124.   (vl-file-delete dclf)
  125.   (setq dd   (start_dialog)
  126.         tpf  nil
  127.         dclf nil
  128.   )
  129.   (if (= dd 0)
  130.     (vl-exit-with-value 0)
  131.   )
  132.   (if (/= pfdyxjx1 0)
  133.     (command "offset" "e" "y" pfdyxjx1 (entlast) dd1 "")
  134.   )
  135.   (pfdyx (entlast) pfdyxspn pfdyxjx hv)
  136.   (princ)
  137. )
回复 支持 反对

使用道具 举报

发表于 昨天 16:19 | 显示全部楼层
试试这种的:


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 昨天 20:49 | 显示全部楼层
xyp1964  的东西就是好
回复 支持 反对

使用道具 举报

发表于 昨天 22:59 | 显示全部楼层
楼主的代码似曾相识呀。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-1 06:09 , Processed in 0.152722 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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