悬赏大侠帮忙写个小程序,按文字查找边界并提取到新图层
现在需要这样的功能:在上面图中有砖、混2、泥等文字标注,希望批量选中这些文字,然后可以自动找到文字外面的边界,也就是那些房屋,生成边界后再希望分别提取到不同的图层,比如砖和砖的边界提取到图层“砖”(图层没有的要自动生成),混2和混2的边界自动提取到图层“混2”,图层“砖”、“混2”要关闭显示,同时把原来的图层上的砖、混2、泥等文字去掉。这样就能够方便的进行统计了。
不过在实际操作中,有些房屋存在细小的缺口,所以会导致不能提取边界,如果能解决这个问题就更好了,比如得到一个近似的边界也可以,只要能够自动闭合起来就可以了。
希望各位大侠帮忙一下!谢谢啦!
这是一个实例地形图。
本帖最后由 print1985 于 2013-1-23 10:23 编辑
;提取文字边界命令bj
(defun c:bj (/ en1 end1 en2 en3 end2 i ss txt txtpt)
(setvar "cmdecho" 0)
(command "_.undo" "_begin")
(princ "选择含有<砖、混、泥>的文字")
(if (setq ss (ssget '((1 . "砖*,混*,泥*")))) ;提取文字,文字内容请自行修改
(progn
(setq i 0)
(repeat (sslength ss)
(setq en1 (ssname ss i)
end1 (entget en1)
txt (cdr (assoc 1 end1))
txtpt (cdr (assoc 10 end1))
en3 (entlast)
)
(command "bpoly" txtpt "")
(setq en2 (entlast)
end2 (entget en2)
)
(if (equal en2 en3)
(princ "\n有未闭合区域,请检查!")
(progn
(entmod (setq end1 (subst(cons 8 txt)(assoc 8 end1)end1))) ;改文字图层
(entmod (setq end2 (subst(cons 8 txt)(assoc 8 end2)end2))) ;改边界图层
(command "layer" "off" txt "") ;关闭图层,不需要就删掉
)
)
(setq i (1+ i))
)
)
)
(command "_.undo" "_end")
(setvar "cmdecho" 1)
(princ)
)再试试 不知是不是你要的效果 补充一下,在有些线框里面是两个文字标注的,所以为了避免重复,是不是要再判断一下? 以文字的中心点向周围的线作最近点,然后比较出每个最近点离中心点距离最近的几条线,即为要找的边边界线。 crazylsp 发表于 2013-1-22 11:34 static/image/common/back.gif
以文字的中心点向周围的线作最近点,然后比较出每个最近点离中心点距离最近的几条线,即为要找的边边界线。
大侠帮忙写一个吧~ 谁来帮忙一下。 倒不是很难。关键是老大的明经币够不?
c#的可以不。 本帖最后由 print1985 于 2013-1-22 22:01 编辑
;提取文字边界命令bj
(defun c:bj (/ en1 end1 end2 i ss txt txtpt)
(setvar "cmdecho" 0)
(command "_.undo" "_begin")
(princ "选择含有<砖、混、泥>的文字")
(if (setq ss (ssget '((1 . "砖*,混*,泥*") (8 . "dx")))) ;dx为文字所在图层
(progn
(setq i 0)
(repeat (sslength ss)
(setq en1 (ssname ss i)
end1 (entget en1)
txt (cdr (assoc 1 end1))
txtpt (cdr (assoc 10 end1))
)
(command "bpoly" txtpt "")
(setq end2 (entget (entlast)))
(entmod (setq end1 (subst(cons 8 txt)(assoc 8 end1)end1))) ;改文字图层
(entmod (setq end2 (subst(cons 8 txt)(assoc 8 end2)end2))) ;改边界图层
(setq i (1+ i))
)
)
)
(command "_.undo" "_end")
(setvar "cmdecho" 1)
(princ)
)试试吧,只有基本功能,没对你说的特殊情况做处理
注意有2个相同文字在同一个边界内的,会生成2个重叠的边界
删掉重叠的相同图形请在本论坛另外找lisp 本帖最后由 abao2005 于 2013-1-22 23:19 编辑
print1985 发表于 2013-1-22 21:59 static/image/common/back.gif
试试吧,只有基本功能,没对你说的特殊情况做处理
注意有2个相同文字在同一个边界内的,会生成2个重叠的边 ...
谢谢大侠出手,基本上可以达到我的要求了,不过能不能修改下以下三点:
1、不要对选取的文字和图层做判断,只判断选取的是文字就可以了
2、有些文字外面的框不能用bo命令生成边界,但是却把这个文字也提取到对应的图层了。请加一个判断:如果不能用bo命令生成边界,就不要把这个文字提取到对应的图层。
3、生成的边界图层默认为隐藏。
destnity 发表于 2013-1-22 21:39 static/image/common/back.gif
倒不是很难。关键是老大的明经币够不?
c#的可以不。
呃,发布悬赏令的时候已经支付了对应的明经币,50个明经币已经在这个帖子里面咯,所以不要担心钱的问题啦。
最好还是autolisp吧。