明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3314|回复: 7

[讨论] 移动高程点注记压盖图块、文字等地物避让最快算法思路征集

[复制链接]
发表于 2018-3-6 07:12:49 | 显示全部楼层 |阅读模式
相信地形测量人员都蛋疼这高程点压盖图块‘文字等问题(属性文字避让)特别是图形面积太大时简直是要命的节奏,所以征求各位大神给点最快算法思路,要求只移动高程点注记避让压盖,第一排图片压盖效果想要实现第二排图片的效果,多谢不慎感激

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 金钱 +50 收起 理由
004 + 1 + 50 漂亮的提问,和有效的解决都值得赞扬!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-3-6 13:31:21 | 显示全部楼层
把要移动的物体按一定的规则移动,看移动后的位置是否有图元,有就继续移,没有就移好了。
 楼主| 发表于 2018-3-7 09:01:50 来自手机 | 显示全部楼层
大神我要算法思路谢谢
发表于 2018-11-12 14:15:02 | 显示全部楼层
(defun c:mgcd( / *error* data data_next dis e e_next i ii in_id key p1 p10 p11 p1010 p1-1 p2 p2-1 p3 p3-1 p4 p4-1 p5 p5-1 p6 p6-1 p7 p7-1 ppp ppp11 ss ssss  wz_cd wz_cd2 wz_gd)
(alert"高程点移位程序:\n只能处理1:500地形图。
                     \n\n不考虑等高线
                     \n\n高程点是CASS展出来没有拖动过的。
                     \n如果已经拖动了的不做处理。
                     \n\n如果程序无效
                     \n建议把高程回收一遍再重新展一次,然后运行本程序")
  (defun *error*(msg)(princ))
  (setq ssss(ssget '((2 . "GC200"))))
  (setvar 'cmdecho 0)(setvar 'osmode 0)
  (command "undo" "be")
  (if(tblsearch "layer" "dgx")(command "._layer" "off" "dgx" ""))
  (setq i -1)
  (repeat(setq ii(sslength ssss))
    (princ "\n")
    (princ (setq ii(- ii 1)))
  (setq e(ssname ssss (setq i(1+ i))))
(setq data(entget e '("*")))
(setq e_next(entnext e))
(setq data_next(entget e_next))
    (setq wz_gd (cdr(assoc 40 data_next)));文字高度
    (setq wz_cd (caadr(textbox data_next)));文字长度
    (setq wz_cd2 (strlen (cdr(assoc 1 data_next))));文字真长
  (setq in_id(assoc 10 data))
    (command "zoom" "c" (cdr in_id) 30)
  (setq p10(assoc 10 data_next))
  (setq p11(assoc 11 data_next))
    (setq dis(distance(list(cadr in_id)(caddr in_id))(list(cadr p11)(caddr p11))))
    (if(equal dis 0.6 1E-3)
      (progn
  (setq p1010(mapcar '+ p10 (list 0 wz_cd wz_gd 0)))  
;;;  ;;;下
;;;  (setq p1(mapcar '+ p10 (list 0 0 -1 0)))
;;;  (setq p1-1(mapcar '+ p1 (list 0 wz_cd wz_gd 0)))
;;;  ;;;下中
;;;  (setq p2(mapcar '+ p10 (list 0 -2 -1 0)))
;;;  (setq p2-1(mapcar '+ p2 (list 0 wz_cd wz_gd 0)))
;;;  ;;;左下
;;;  (setq p3(mapcar '+ p10 (list 0 -5.2 -1 0)))
;;;  (setq p3-1(mapcar '+ p3 (list 0 wz_cd wz_gd 0)))
;;;    ;;;左
;;;  (setq p4(mapcar '+ p10 (list 0 -5.2 -0 0)))
;;;  (setq p4-1(mapcar '+ p4 (list 0 wz_cd wz_gd 0)))
;;;      ;;;左上
;;;  (setq p5(mapcar '+ p10 (list 0 -5.2 1 0)))
;;;  (setq p5-1(mapcar '+ p5 (list 0 wz_cd wz_gd 0)))
;;;        ;;;上中
;;;  (setq p6(mapcar '+ p10 (list 0 -2 1 0)))
;;;  (setq p6-1(mapcar '+ p6 (list 0 wz_cd wz_gd 0)))
;;;          ;;;上
;;;  (setq p7(mapcar '+ p10 (list 0 0 1 0)))
;;;  (setq p7-1(mapcar '+ p7 (list 0 wz_cd wz_gd 0)))
;;;;;;  );;defun
(Setq key T)

(if
  (and key(setq ss(ssget "_C" (cdr p10)(cdr p1010) '((8 . "~GCD")))))
  (if(and  ;;;下
  (setq p1(mapcar '+ p10 (list 0 0 -1.2 0)))
  (setq p1-1(mapcar '+ p1 (list 0 wz_cd wz_gd 0)))
    (null(setq ss(ssget "_C" (cdr p1)(cdr p1-1) ))))
    (progn(setq ppp p1)(setq key nil)))
  (setq key nil)
        )
  (if
  (and key(setq ss(ssget "_C" (cdr p1)(cdr p1-1))))
  (if(and;;;下中
  (setq p2(mapcar '+ p10 (list 0 -2 -1.2 0)))
  (setq p2-1(mapcar '+ p2 (list 0 wz_cd wz_gd 0)))
    (null(setq ss(ssget "_C" (cdr p2)(cdr p2-1)))))
    (progn(setq ppp p2)(setq key nil)))
  (setq key nil)
        )
  (if
  (and key(setq ss(ssget "_C" (cdr p2)(cdr p2-1))))
  (if(and;;;左下
  (setq p3(mapcar '+ p10 (list 0 -5.2 -1.2 0)))
  (setq p3-1(mapcar '+ p3 (list 0 wz_cd wz_gd 0)))
    (null(setq ss(ssget "_C" (cdr p3)(cdr p3-1)))))
    (progn(setq ppp p3)(setq key nil)))
  (setq key nil)
        )
  (if
  (and key(setq ss(ssget "_C" (cdr p3)(cdr p3-1))))
  (if(and ;;;左
  (setq p4(mapcar '+ p10 (list 0 -5.2 -0 0)))
  (setq p4-1(mapcar '+ p4 (list 0 wz_cd wz_gd 0)))
    (null(setq ss(ssget "_C" (cdr p4)(cdr p4-1)))))
    (progn(setq ppp p4)(setq key nil)))
  (setq key nil)
        )
  (if
  (and key(setq ss(ssget "_C" (cdr p4)(cdr p4-1))))
  (if(and ;;;左上
  (setq p5(mapcar '+ p10 (list 0 -5.2 1.2 0)))
  (setq p5-1(mapcar '+ p5 (list 0 wz_cd wz_gd 0)))
    (null(setq ss(ssget "_C" (cdr p5)(cdr p5-1)))))
    (progn(setq ppp p5)(setq key nil)))
  (setq key nil)
        )
  (if
  (and key(setq ss(ssget "_C" (cdr p5)(cdr p5-1))))
  (if(and ;;;上中
  (setq p6(mapcar '+ p10 (list 0 -2 1.2 0)))
  (setq p6-1(mapcar '+ p6 (list 0 wz_cd wz_gd 0)))
    (null(setq ss(ssget "_C" (cdr p6)(cdr p6-1)))))
    (progn(setq ppp p6)(setq key nil)))
  (setq key nil)
        )
  (if
  (and key(setq ss(ssget "_C" (cdr p6)(cdr p6-1))))
  (if(and;;;上
  (setq p7(mapcar '+ p10 (list 0 0 1.2 0)))
  (setq p7-1(mapcar '+ p7 (list 0 wz_cd wz_gd 0)))
    (null(setq ss(ssget "_C" (cdr p7)(cdr p7-1)))))
    (progn(setq ppp p7)(setq key nil)))
  (setq key nil)
        )

;更新图元
(if (and ppp(null key))
  (progn
    (setq ppp11(mapcar '+ ppp '(1 0 0.5 0)))
    (setq data_next(subst ppp (assoc 10 data_next)data_next))
    (setq data_next(subst ppp11 (assoc 11 data_next)data_next))
(entmod data_next)
(entupd e)
    (setq ppp nil ppp11 nil)
    ))
  ))
    );repeat
  (command "undo" "e")
  (prin1)
  )

  
发表于 2018-11-15 20:06:25 | 显示全部楼层
yanshengjiang 发表于 2018-11-12 14:15
(defun c:mgcd( / *error* data data_next dis e e_next i ii in_id key p1 p10 p11 p1010 p1-1 p2 p2-1 p3 ...

谢谢你的程序,好用,速度快,就是有些高程注记移得有些远了。请问调整哪些数据可以改变移动距离?
 楼主| 发表于 2018-11-16 12:47:55 来自手机 | 显示全部楼层
多谢大神分享
发表于 2018-11-29 10:51:04 | 显示全部楼层
lioun4105 发表于 2018-11-15 20:06
谢谢你的程序,好用,速度快,就是有些高程注记移得有些远了。请问调整哪些数据可以改变移动距离?

不同方向 XY移动增量不一样  你自己研究吧。 我觉得这距离还行。
发表于 2019-6-21 17:35:52 来自手机 | 显示全部楼层
yanshengjiang 发表于 2018-11-12 14:15
(defun c:mgcd( / *error* data data_next dis e e_next i ii in_id key p1 p10 p11 p1010 p1-1 p2 p2-1 p3 ...

大神,这个怎么改成支持1:1000的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 20:46 , Processed in 0.267118 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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