哪位大师帮忙改下
(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进行运算
(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 (p1 p2)
(mapcar '(lambda (x y) (* (+ x y) 0.5)) p1 p2)
)
(defun point (p0 dx dy)
(list (+ (car p0) dx) (+ (cadr p0) dy))
)
(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 / 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))
xkd (/ (- kd (* (1- spn) jx)) spn)
ss(ssadd)
)
(ssadd ent ss)
(repeat spn
(if (= hv 0)
(setq p1 (point bp xkd -1)
p2 (point p1 0 (+ gd 2))
p3 (point p1 jx 0)
p4 (point p2 jx 0)
p5 (point bp (* 0.5 xkd) -1)
p6 (point p5 0 (+ gd 2))
bp (point p3 0 1)
)
(setq p1 (point bp -1 xkd)
p2 (point p1 (+ gd 2) 0)
p3 (point p1 0 jx)
p4 (point p2 0 jx)
p5 (point bp -1 (* 0.5 xkd))
p6 (point p5 (+ gd 2) 0)
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
'(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:tt (/ 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 2 2))
(set_tile "jx1" (rtos pfdyxjx1 2 2))
(set_tile "spn" (itoa pfdyxspn))
(action_tile "jx" "(setq pfdyxjx (atof $value))")
(action_tile "jx1" "(setq pfdyxjx1 (atof $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)
tpfnil
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)
) 试试这种的:
xyp1964的东西就是好 楼主的代码似曾相识呀。 本帖最后由 hhh454 于 2025-5-3 00:03 编辑
楼主是想画模型的百叶窗吧,假如是还要考虑单线和双线,现在用单线居多。
1楼的代码中,下面的函数没有增加参数,所以没有小数
rtos
将数字转换成字符串
(rtos number ])
根据 mode、precision 参数和系统变量 UNITMODE、DIMZIN、LUNITS 和 LUPREC 的设置,rtos 函数返回代表 number 的字符串。
参数
number
数值。
mode
整数,指定现行单位模式。mode 的取值对应于 AutoCAD 系统变量 lunits 的允许值,如下所示:
1 科学
2 小数
3 工程(英尺和十进制英寸)
4 建筑(英尺和分数英寸)
5 分数
precision
整数,指定精度。
mode 和 precision 参数对应于系统变量 LUNITS 和 LUPREC。如果省略这两个参数,rtos 函数使用 LUNITS 和 LUPREC 的当前值。 xyp1964 发表于 2025-4-30 15:50
院长就是BN,!! xyp1964 发表于 2025-4-30 16:19
试试这种的:
大神的代码 真是没的说。。。。
页:
[1]