freshair
发表于 2003-11-9 21:44:00
好帖子,先顶到前边去看:)
无痕
发表于 2004-1-17 20:54:00
这篇帖子不错。保存
cy956
发表于 2004-1-20 11:16:00
本帖最后由 作者 于 2004-1-20 18:23:25 编辑
贴一个自己的,
(defun c:lkx1 (/ DX DY E E1 IN N P1 P2 P21 P3 P4 S XY)
(mapcar 'setvar '("cmdecho""blipmode") '(0 0))
(prompt "\n选择要画外轮廓线的物体:")
(setq s(ssget)
p1 (getpoint "\n输入框线左下点:")
p3 (getcorner p1 "\n输入框线右上点:")
xy(mapcar '- p3 p1)
dx (car xy) dy (cadr xy)
p2 (xd p1 0 dy) p4 (xd p1 dx 0)
p21(xd p2 100 -100))
(setvar "osmode" 0)
(#m_pl2 1 0 0 (list p1 p2 p3 p4) (getvar "clayer") -1)
(setq e1(entlast)s(ssadd e1 s))
(command "-boundary" "a" "b" "n" s """" p21 ""
"erase" e1 "")
(setq s(get-ss e1)n(sslength s)in 0)
(cond
((< n 2))
((= n 2)(entdel (ssname s 1)))
(t
(repeat (- n 2)
(setq e(ssname s in) in (1+ in))
(entdel e)
)
(entdel (ssname s (1- n)))
)
)
(mapcar 'setvar '("osmode""cmdecho""blipmode") '(32 1 1))(princ)
)
(defun xd(#pt #x #y)
(list (+ (car #pt) #x) (+ (cadr #pt) #y))
)
(defun #m_pl2 (d70 plw pla pl_list lay_pl color / pb)
(setq d90 (length pl_list)
pb'()
)
(foreach x pl_list
(progn
(setq pb
(append pb
(list (cons 10 x)
(cons 40 plw)
(cons 41 plw)
(cons 42 pla)
)
)
)
)
)
(setq en000 (append (list
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 8 lay_pl)
(cons 100 "AcDbPolyline")
(cons 90 d90)
(cons 70 d70)
)
pb
)
)
(if (/= -1 color) (setq en000 (append en000 (list (cons 62 color)))))
(if (= nil (entmake en000)) (princ "\n制造 LWPL 制造失败."))
)
程序是以前写的,不足有:
没加入过滤。
可能出现多个轮廓线,和bon的算法有关。
现在和育游的相比是手动的了。:)
meflying
发表于 2004-1-20 11:22:00
还有几个子函数没给出来吧
mmmmmm
发表于 2004-1-20 13:26:00
一点思路:
用WMFOUT/WMFIN将选择集内的物体处理成临时图块,去掉外边的框后在得到包围盒的焦点坐标,在包围盒和外框之间任意一点作boundary,如果图形吻合,应能找到边界(两个多义线,选面积小的)。
无痕
发表于 2004-1-23 01:06:00
本帖最后由 作者 于 2004-1-23 5:33:27 编辑
研究了一下,这样也行?
(defun x@outline1 ()
(setvar "qaflags" 1)
(setq ss0 (ssget "all")
ss(ssget))
(vl-cmdf "_.copy" ss "" "0,0" "@")
(vl-cmdf "_.region" "all" "r" ss0 ""
"_.union" "all" "r" ss0 ""
"_.explode" "all" "r" ss0 ""
"_.explode" "all" "r" ss0 ""
"_.pedit" "m" "all" "r" ss0 "" "y" "j" "1" ""
"_.region" "all" "r" ss0 ""
"_.union" "all" "r" ss0 ""
"_.explode" "all" "r" ss0 ""
"_.explode" "all" "r" ss0 ""
"_.pedit" "m" "all" "r" ss0 "" "y" "j" "1" ""
)
)
(defun x@outline2 ()
(vl-cmdf ".undo" "be")
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(setvar "qaflags" 1)
(setq ss0 (ssget "all")
ss(ssget '((0 . "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE")))
vmin(getvar "VSMIN")
vmax(getvar "VSMAX")
dist(* 2 (getvar "VIEWSIZE") (/ (getvar "PICKBOX") 100)))
(vl-cmdf ".RECTANGLE" (polar vmin (* 1.25 PI) dist) (polar vmax (* 0.25 PI) dist))
(setq em (entlast))
(vl-cmdf "_.boundary" "a" "o" "P" "i" "y" "b" "n" ss em "" ""emin "")
(setvar "osmode" os)
(vl-cmdf ".undo" "e")
)
测试了一下,用region只能对封闭实体有效,可惜,可惜。用boundary可以对line,arc等封闭的区域有效,但通用性又没region好。我觉得两者应该结合起来。
无痕
发表于 2004-9-29 05:53:00
再玩玩
zxzyp
发表于 2004-10-19 09:46:00
我的思路是:做一个能包含你图的大圆,然后在lisp中command"_boundary""region"生成边界。得到两个封闭的面域。其中一个就是你想要的。
flowerson
发表于 2012-6-12 19:36:03
各位大侠太厉害了。长见识了。
friendship12c
发表于 2014-4-14 17:56:42
各位大侠太厉害了。长见识了。非常感谢