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

各位大侠太厉害了。长见识了。非常感谢
页: 1 2 [3]
查看完整版本: [讨论]征求轮廓线的lisp思路