风树
发表于 2014-7-4 10:30:23
一步走不到就多走一步
ivde
发表于 2014-7-4 11:50:31
77077 发表于 2014-7-4 10:16 static/image/common/back.gif
有些时候,entsel不是那么好用.
如下图这种情况,你叫我如何能快速选中中间红色那个方框呢?所以才诞生了如 ...
可以 ssget 选择
77077
发表于 2014-7-4 13:00:16
ssget 选择的话,可能会选中相邻的红色多段线。
比如说我发出来那个色块图,怎么才能确保选中的是中间那个呢?
edata
发表于 2014-7-4 13:22:14
不知道是不是这样。
77077
发表于 2014-7-4 13:23:33
-HATCHEDIT OBJ "B" "P" "Y"
重建出来的边界居然是断的。。。
77077
发表于 2014-7-4 13:28:47
edata 发表于 2014-7-4 13:22 static/image/common/back.gif
不知道是不是这样。
没错,就是要这样的效果~
77077
发表于 2014-7-4 13:30:23
edata 发表于 2014-7-4 13:22 static/image/common/back.gif
不知道是不是这样。
求源码,学习学习。。
edata
发表于 2014-7-4 14:09:53
77077 发表于 2014-7-4 13:30 static/image/common/back.gif
求源码,学习学习。。
;;返回绘图区坐标点
;;from mjtd
(defun zj-get-scr-coods (/ half_h half_w pt_cen lst ptx pty)
(setq pt_cen (trans (GETVAR "VIEWCTR") 1 2)
ptx (car pt_cen)
pty (cadr pt_cen)
half_h (* 0.5 (GETVAR "VIEWSIZE"))
half_w (* half_h (/ (car (GETVAR "SCREENSIZE")) (cadr (GETVAR "SCREENSIZE"))))
)
(LIST (LIST (- ptx half_w) (- pty half_h)) (LIST (+ ptx half_w) (+ pty half_h)))
)
;;取组码值
(defun sk_dxf(ent code)(cdr(assoc code(entget ent))))
;;选择集或图元名转句柄列表
;;code by edata@mjtd
(defun sk_h5ss->lst(ss / en i lst)
(cond
((= (type ss) 'ENAME)(list (sk_dxf ss 5)))
((= (type ss) 'PICKSET)
(setq i -1 lst '())
(while(setq en(ssname ss(setq i(1+ i))))
(setq lst(cons (sk_dxf en 5) lst))
)
(if(/= lst '())(reverse lst))
)
)
)
;;主程序
;;点选红色闭合多段线(图层过滤自己修改)
;;code by edata@mjtd
;;2014-7-4
(defun c:tt(/ a b bak_h5lst2 h5lst1 h5lst2 h5_eq loop p0 ss1 ss2)
(if(and(setq p0(getpoint "请在红色闭合多段线内指定一点:"))
(setq ss1(ssget "f"(list p0(car(zj-get-scr-coods)))'((0 . "lwpolyline")(62 . 1)(70 . 1))))
(setq ss2(ssget "f"(list p0(cadr(zj-get-scr-coods)))'((0 . "lwpolyline")(62 . 1)(70 . 1))))
)
(progn
(setq h5lst1(sk_h5ss->lst ss1)
h5lst2(sk_h5ss->lst ss2)
loop t
)
(while(and loop (setq a(car h5lst1)))
(setq bak_h5lst2 h5lst2)
(while(and loop (setq b(car bak_h5lst2)))
(if (= a b)(setq h5_eq a loop nil))
(setq bak_h5lst2(cdr bak_h5lst2))
)
(setq h5lst1(cdr h5lst1))
)
(if h5_eq
(progn
;(redraw (ssname ss1 0) 3)
(sssetfirst nil (ssadd(handent h5_eq)) )
)
(alert "未找到红色闭合多段线")
)
)
(alert "未找到红色闭合多段线")
)
(princ)
)
77077
发表于 2014-7-4 16:59:04
给力,正在研究代码,待会写学习报告~
77077
发表于 2014-7-4 17:49:11
edata版的,完全能满足要求,用起来也很方便.不过我还是没看懂一部分~
(while(and loop (setq a(car h5lst1)))
(setq bak_h5lst2 h5lst2)
(while(and loop (setq b (car bak_h5lst2)))
(if (= a b)(setq h5_eq a loop nil))
(setq bak_h5lst2(cdr bak_h5lst2))
)
(setq h5lst1(cdr h5lst1))
)