changyiran 发表于 2012-4-26 17:47:50

发一个移动房屋内注记至右上角的程序,欢迎大家提意见

本帖最后由 changyiran 于 2012-4-26 17:55 编辑

做测绘内业的都一种体会,就是需要将房屋内注记(含房屋性质注记和层数注记)移到房屋右上角,很是费时间,鉴于此,本人开发了个小程序,欢迎大家提出宝贵意见。
在此,感谢G版在文本注记和坐标排序方面给予的热心帮助,再谢!!!

(vl-load-com)
(defun fjdb(en / x);返回轻量多段线的点表
(vl-remove-if'not
   (mapcar'(lambda(x)(if(=(car x)10)(cdr x)))(entget en));mapcar返回的是一个表,lambda构造一个匿名函数
)   
)
(defun pfx(zdzb el / HZJ JD JD1 JD2 QZJ XH);求多段线(直线段组成)任意转角的内角平分线
(setq xh(vl-position zdzb el));求得指定坐标在多段线点表中的序号
(cond((= 0 xh)(setq qzj(last el)hzj(cadr el)));分3种情况取得前转角和后转角坐标
       ((= (length el)(1+ xh))(setq qzj(nth (1- xh)el)hzj(car el)))
       (t(setq qzj(nth (1- xh)el)hzj(nth (1+ xh)el)))
)
(setq jd1(angle zdzb qzj)jd2(angle zdzb hzj));获得指定坐标至前转角和后转角的角度
(setq jd(/ (+ jd1 jd2)2));获得角平分线的角度
)
(defun c:zjyd(/ DB DBJ EL1 EL2 EN FJ1 FJ2 FWZJEL FWZJEN J JJ NR NR1 NR2 SS SS1 SS2 X1 X2 Y1 Y2 ZJZB);房屋内注记性质移动
(command"undo""m")
(setq ss(ssget"x"'((0 . "lwpolyline")(8 . "jmd")(70 . 129)))j -1);建立房屋线选择集
(repeat (sslength ss)
    (setq en(ssname ss(setq j(1+ j))))
    (setq db(fjdb en))
    (setq fj1(vl-sort-i db;按x从大到小排序
            (function
         (lambda (a b)
         (setq x1 (car a)
               y1 (cadr a)
               x2 (car b)
               y2 (cadr b)
         )
         (if (equal x1 x2 1);当横坐标相差在一米内时认为两者相等
               (> y1 y2)
               (> x1 x2)
         )
         )
            )
         )
    fj2(vl-sort-i db;按y从大到小排序
            (function
         (lambda (a b)
         (setq x1 (car a)
               y1 (cadr a)
               x2 (car b)
               y2 (cadr b)
         )
         (if (equal y1 y2 1)
               (> x1 x2)
               (> y1 y2)
         )
         )
            )
          )
    )
    (setq fj1(nth (car fj1) db)fj2(nth (car fj2) db));获取可能的东北角(俩房角)坐标
    (if (equal fj1 fj2)
      (setq dbj fj1);为同一房角时
      (progn
             (setq jj(angle fj1 fj2));取得房角1、房角2夹角(弧度)
      (if (and (> jj(* 0.75 pi))(< jj pi));获得东北角点坐标
      (setq dbj fj1)
      (setq dbj fj2)
   )
)
    )
    (setq zjzb(polar dbj(pfx dbj db)3));获得注记坐标
    (setq ss1(ssget"cp"db'((1 . "..")(8 . "jmd"))));获得可能的房屋性质
    (setq ss2(ssget"cp"db'((1 . "~*[~.0-9]*")(8 . "jmd"))));获得可能的房屋层数
    (if ss1;存在房屋注记
      (progn
      (setq fwxzen(ssname ss1 0))
      (setq fwxzel(entget fwxzen))
      (if ss2
    (progn;存在房屋层数注记
      (setq csen(ssname ss2 0))
      (setq csel(entget csen))
      ;;;构造房屋性质和房屋层数图元表
      (setq fwxzel(list'(0 . "text")(assoc 1 fwxzel)(assoc 7 fwxzel)(assoc 40 fwxzel)(assoc 41 fwxzel)'(8 . "jmd")'(10 1 2)(list 11 (car zjzb)(cadr zjzb))'(72 . 2)'(73 . 2)))
      (setq csel(list'(0 . "text")(assoc 1 csel)(assoc 7 csel)(assoc 40 csel)(assoc 41 csel)'(8 . "jmd")'(10 1 2)(list 11 (car zjzb)(cadr zjzb))'(72 . 0)'(73 . 2)))
      (entmake fwxzel)
      (entmake csel)
      (entdel fwxzen);删除原注记
      (entdel csen)
    )
          (progn;房屋为1层即房屋内没有层数数字时   
      ;;;构造房屋性质图元表
      (setq fwxzel(list'(0 . "text")(assoc 1 fwxzel)(assoc 7 fwxzel)(assoc 40 fwxzel)(assoc 41 fwxzel)'(8 . "jmd")'(10 1 2)(list 11 (car zjzb)(cadr zjzb))'(72 . 1)'(73 . 2)))
      (entmake fwxzel)
      (entdel fwxzen)
    )
      )
)
    )
)
(alert"运行完毕")
(princ)
)

langjs 发表于 2012-4-26 17:56:30

真正的门外汉飘过……

changyiran 发表于 2012-4-26 17:59:26

langjs 发表于 2012-4-26 17:56 static/image/common/back.gif
真正的门外汉飘过……

大师严重了,涉及测绘的人比较少,故而大师对测绘不是很熟悉,但lisp方面还需要向大师学习。

fdb2007 发表于 2012-4-27 10:42:06

取之于明用之于明,谢楼主分享

树櫴希德 发表于 2015-8-31 11:54:44

将房屋内注记(含房屋性质注记和层数注记)移到房屋右上角到底是为了什么啊?难道图面好看些吗

yuanziyou 发表于 2015-8-31 17:04:36

树櫴希德 发表于 2015-8-31 11:54
将房屋内注记(含房屋性质注记和层数注记)移到房屋右上角到底是为了什么啊?难道图面好看些吗

2007版图示好像是要求放右上角

暮雨寒阳 发表于 2015-9-11 12:04:33

测试了一下,只有一部分能成功。是不是对房屋和注记有什么特殊要求?

wkq004 发表于 2016-5-7 14:12:56

yuanziyou 发表于 2015-8-31 17:04 static/image/common/back.gif
2007版图示好像是要求放右上角

图式要求都是注记在中间,宅基地有的县要求与宗地信息避让时,结构层数注在房屋的左下,右下等.

wkq004 发表于 2016-5-7 14:13:38

yuanziyou 发表于 2015-8-31 17:04 static/image/common/back.gif
2007版图示好像是要求放右上角

图式要求都是注记在中间,宅基地有的县要求与宗地信息避让时,结构层数注在房屋的左下,右下等.

l明了 发表于 2016-5-16 21:27:07

你好,这个程序不太明白怎么使用,能麻烦您说明一下吗?不懂程序的人。
页: [1]
查看完整版本: 发一个移动房屋内注记至右上角的程序,欢迎大家提意见