明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2963|回复: 9

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

[复制链接]
发表于 2012-4-26 17:47:50 | 显示全部楼层 |阅读模式
本帖最后由 changyiran 于 2012-4-26 17:55 编辑

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

  1. (vl-load-com)
  2. (defun fjdb(en / x);返回轻量多段线的点表
  3. (vl-remove-if'not
  4.      (mapcar'(lambda(x)(if(=(car x)10)(cdr x)))(entget en));mapcar返回的是一个表,lambda构造一个匿名函数
  5. )     
  6. )
  7. (defun pfx(zdzb el / HZJ JD JD1 JD2 QZJ XH);求多段线(直线段组成)任意转角的内角平分线
  8.   (setq xh(vl-position zdzb el));求得指定坐标在多段线点表中的序号
  9.   (cond((= 0 xh)(setq qzj(last el)hzj(cadr el)));分3种情况取得前转角和后转角坐标
  10.        ((= (length el)(1+ xh))(setq qzj(nth (1- xh)el)hzj(car el)))
  11.        (t(setq qzj(nth (1- xh)el)hzj(nth (1+ xh)el)))
  12.   )
  13.   (setq jd1(angle zdzb qzj)jd2(angle zdzb hzj));获得指定坐标至前转角和后转角的角度
  14.   (setq jd(/ (+ jd1 jd2)2));获得角平分线的角度
  15. )
  16. (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);房屋内注记性质移动
  17.   (command"undo""m")
  18.   (setq ss(ssget"x"'((0 . "lwpolyline")(8 . "jmd")(70 . 129)))j -1);建立房屋线选择集
  19.   (repeat (sslength ss)
  20.     (setq en(ssname ss(setq j(1+ j))))
  21.     (setq db(fjdb en))
  22.     (setq fj1(vl-sort-i db;按x从大到小排序
  23.             (function
  24.          (lambda (a b)
  25.            (setq x1 (car a)
  26.                  y1 (cadr a)
  27.                  x2 (car b)
  28.                  y2 (cadr b)
  29.            )
  30.            (if (equal x1 x2 1);当横坐标相差在一米内时认为两者相等
  31.                (> y1 y2)
  32.                (> x1 x2)
  33.            )
  34.          )
  35.             )
  36.            )
  37.     fj2(vl-sort-i db;按y从大到小排序
  38.             (function
  39.          (lambda (a b)
  40.            (setq x1 (car a)
  41.                  y1 (cadr a)
  42.                  x2 (car b)
  43.                  y2 (cadr b)
  44.            )
  45.            (if (equal y1 y2 1)
  46.                (> x1 x2)
  47.                (> y1 y2)
  48.            )
  49.          )
  50.             )
  51.           )
  52.     )
  53.     (setq fj1(nth (car fj1) db)fj2(nth (car fj2) db));获取可能的东北角(俩房角)坐标
  54.     (if (equal fj1 fj2)
  55.         (setq dbj fj1);为同一房角时
  56.         (progn
  57.              (setq jj(angle fj1 fj2));取得房角1、房角2夹角(弧度)
  58.         (if (and (> jj(* 0.75 pi))(< jj pi));获得东北角点坐标
  59.         (setq dbj fj1)
  60.         (setq dbj fj2)
  61.      )
  62.   )
  63.     )
  64.     (setq zjzb(polar dbj(pfx dbj db)3));获得注记坐标
  65.     (setq ss1(ssget"cp"db'((1 . "..")(8 . "jmd"))));获得可能的房屋性质
  66.     (setq ss2(ssget"cp"db'((1 . "~*[~.0-9]*")(8 . "jmd"))));获得可能的房屋层数
  67.     (if ss1;存在房屋注记
  68.         (progn
  69.         (setq fwxzen(ssname ss1 0))
  70.         (setq fwxzel(entget fwxzen))
  71.         (if ss2
  72.     (progn;存在房屋层数注记
  73.       (setq csen(ssname ss2 0))
  74.       (setq csel(entget csen))
  75.       ;;;构造房屋性质和房屋层数图元表
  76.       (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)))
  77.       (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)))
  78.       (entmake fwxzel)
  79.       (entmake csel)
  80.       (entdel fwxzen);删除原注记
  81.       (entdel csen)
  82.     )
  83.           (progn;房屋为1层即房屋内没有层数数字时   
  84.       ;;;构造房屋性质图元表
  85.       (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)))
  86.       (entmake fwxzel)
  87.       (entdel fwxzen)
  88.     )
  89.         )
  90.   )
  91.     )
  92. )
  93. (alert"运行完毕")
  94. (princ)
  95. )

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-4-26 17:56:30 | 显示全部楼层
真正的门外汉飘过……
 楼主| 发表于 2012-4-26 17:59:26 | 显示全部楼层
langjs 发表于 2012-4-26 17:56
真正的门外汉飘过……

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

点评

承担不起啊,G版高飞才是大师,我只是虾米……  发表于 2012-4-26 18:02
发表于 2012-4-27 10:42:06 | 显示全部楼层
取之于明用之于明,谢楼主分享
发表于 2015-8-31 11:54:44 | 显示全部楼层
将房屋内注记(含房屋性质注记和层数注记)移到房屋右上角到底是为了什么啊?难道图面好看些吗
发表于 2015-8-31 17:04:36 来自手机 | 显示全部楼层
树櫴希德 发表于 2015-8-31 11:54
将房屋内注记(含房屋性质注记和层数注记)移到房屋右上角到底是为了什么啊?难道图面好看些吗

2007版图示好像是要求放右上角
发表于 2015-9-11 12:04:33 | 显示全部楼层
测试了一下,只有一部分能成功。是不是对房屋和注记有什么特殊要求?
发表于 2016-5-7 14:12:56 | 显示全部楼层
yuanziyou 发表于 2015-8-31 17:04
2007版图示好像是要求放右上角

图式要求都是注记在中间,宅基地有的县要求与宗地信息避让时,结构层数注在房屋的左下,右下等.
发表于 2016-5-7 14:13:38 | 显示全部楼层
yuanziyou 发表于 2015-8-31 17:04
2007版图示好像是要求放右上角

图式要求都是注记在中间,宅基地有的县要求与宗地信息避让时,结构层数注在房屋的左下,右下等.
发表于 2016-5-16 21:27:07 | 显示全部楼层
你好,这个程序不太明白怎么使用,能麻烦您说明一下吗?不懂程序的人。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 19:35 , Processed in 0.226054 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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