本帖最后由 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)
- )
|