明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6383|回复: 23

悬赏大侠帮忙写个小程序,按文字查找边界并提取到新图层

  [复制链接]
发表于 2013-1-22 11:17:41 | 显示全部楼层 |阅读模式
1明经币



现在需要这样的功能:在上面图中有砖、混2、泥等文字标注,希望批量选中这些文字,然后可以自动找到文字外面的边界,也就是那些房屋,生成边界后再希望分别提取到不同的图层,比如砖和砖的边界提取到图层“砖”(图层没有的要自动生成),混2和混2的边界自动提取到图层“混2”,图层“砖”、“混2”要关闭显示,同时把原来的图层上的砖、混2、泥等文字去掉。这样就能够方便的进行统计了。

不过在实际操作中,有些房屋存在细小的缺口,所以会导致不能提取边界,如果能解决这个问题就更好了,比如得到一个近似的边界也可以,只要能够自动闭合起来就可以了。

希望各位大侠帮忙一下!谢谢啦!

这是一个实例地形图。

附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

再试试 不知是不是你要的效果
发表于 2013-1-22 11:17:42 | 显示全部楼层
本帖最后由 print1985 于 2013-1-23 10:23 编辑
  1. ;提取文字边界  命令bj
  2. (defun c:bj (/ en1 end1 en2 en3 end2 i ss txt txtpt)
  3.   (setvar "cmdecho" 0)
  4.   (command "_.undo" "_begin")
  5.   (princ "选择含有<砖、混、泥>的文字")
  6.   (if (setq ss (ssget '((1 . "砖*,混*,泥*")))) ;提取文字,文字内容请自行修改
  7.     (progn
  8.       (setq i 0)
  9.       (repeat (sslength ss)
  10.         (setq en1 (ssname ss i)
  11.               end1 (entget en1)
  12.               txt (cdr (assoc 1 end1))
  13.               txtpt (cdr (assoc 10 end1))
  14.               en3 (entlast)
  15.         )
  16.         (command "bpoly" txtpt "")
  17.         (setq en2 (entlast)
  18.                 end2 (entget en2)
  19.          )
  20.         (if (equal en2 en3)
  21.           (princ "\n有未闭合区域,请检查!")
  22.           (progn
  23.             (entmod (setq end1 (subst(cons 8 txt)(assoc 8 end1)end1))) ;改文字图层
  24.             (entmod (setq end2 (subst(cons 8 txt)(assoc 8 end2)end2))) ;改边界图层
  25.             (command "layer" "off" txt "") ;关闭图层,不需要就删掉
  26.           )
  27.         )
  28.         (setq i (1+ i))
  29.       )
  30.     )
  31.   )
  32.   (command "_.undo" "_end")
  33.   (setvar "cmdecho" 1)
  34.   (princ)
  35. )
再试试 不知是不是你要的效果

点评

大佬厉害  发表于 2023-8-25 10:32
回复

使用道具 举报

 楼主| 发表于 2013-1-22 11:31:57 | 显示全部楼层
补充一下,在有些线框里面是两个文字标注的,所以为了避免重复,是不是要再判断一下?
回复

使用道具 举报

发表于 2013-1-22 11:34:20 | 显示全部楼层
以文字的中心点向周围的线作最近点,然后比较出每个最近点离中心点距离最近的几条线,即为要找的边边界线。
回复

使用道具 举报

 楼主| 发表于 2013-1-22 11:38:58 | 显示全部楼层
crazylsp 发表于 2013-1-22 11:34
以文字的中心点向周围的线作最近点,然后比较出每个最近点离中心点距离最近的几条线,即为要找的边边界线。

大侠帮忙写一个吧~
回复

使用道具 举报

 楼主| 发表于 2013-1-22 18:58:55 | 显示全部楼层
谁来帮忙一下。
回复

使用道具 举报

发表于 2013-1-22 21:39:35 | 显示全部楼层
倒不是很难。关键是老大的明经币够不?
c#的可以不。
回复

使用道具 举报

发表于 2013-1-22 21:59:15 | 显示全部楼层
本帖最后由 print1985 于 2013-1-22 22:01 编辑
  1. ;提取文字边界  命令bj
  2. (defun c:bj (/ en1 end1 end2 i ss txt txtpt)
  3.   (setvar "cmdecho" 0)
  4.   (command "_.undo" "_begin")
  5.   (princ "选择含有<砖、混、泥>的文字")
  6.   (if (setq ss (ssget '((1 . "砖*,混*,泥*") (8 . "dx")))) ;dx为文字所在图层
  7.     (progn
  8.       (setq i 0)
  9.       (repeat (sslength ss)
  10.         (setq en1 (ssname ss i)
  11.               end1 (entget en1)
  12.               txt (cdr (assoc 1 end1))
  13.               txtpt (cdr (assoc 10 end1))
  14.         )
  15.         (command "bpoly" txtpt "")
  16.         (setq end2 (entget (entlast)))
  17.         (entmod (setq end1 (subst(cons 8 txt)(assoc 8 end1)end1))) ;改文字图层
  18.         (entmod (setq end2 (subst(cons 8 txt)(assoc 8 end2)end2))) ;改边界图层
  19.         (setq i (1+ i))
  20.       )
  21.     )
  22.   )
  23.   (command "_.undo" "_end")
  24.   (setvar "cmdecho" 1)
  25.   (princ)
  26. )
试试吧,只有基本功能,没对你说的特殊情况做处理
注意有2个相同文字在同一个边界内的,会生成2个重叠的边界
删掉重叠的相同图形请在本论坛另外找lisp
回复

使用道具 举报

 楼主| 发表于 2013-1-22 22:46:45 | 显示全部楼层
本帖最后由 abao2005 于 2013-1-22 23:19 编辑
print1985 发表于 2013-1-22 21:59
试试吧,只有基本功能,没对你说的特殊情况做处理
注意有2个相同文字在同一个边界内的,会生成2个重叠的边 ...

谢谢大侠出手,基本上可以达到我的要求了,不过能不能修改下以下三点:

1、不要对选取的文字和图层做判断,只判断选取的是文字就可以了

2、有些文字外面的框不能用bo命令生成边界,但是却把这个文字也提取到对应的图层了。请加一个判断:如果不能用bo命令生成边界,就不要把这个文字提取到对应的图层。
3、生成的边界图层默认为隐藏。
回复

使用道具 举报

 楼主| 发表于 2013-1-22 22:48:37 | 显示全部楼层
destnity 发表于 2013-1-22 21:39
倒不是很难。关键是老大的明经币够不?
c#的可以不。

呃,发布悬赏令的时候已经支付了对应的明经币,50个明经币已经在这个帖子里面咯,所以不要担心钱的问题啦。

最好还是autolisp吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-21 07:23 , Processed in 0.208382 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表