CASS高程自动避让思路,希望各位老师能给个意见
能不能按图上的方法用POLYGON命令画出指定的多边形,然后提取多边形的坐标逐一移动然后判断是否与实体相交!请各位能人高手老师指点一下!还有,能不能换作画圆然后按角度计算在圆的边界线的坐标然后移动呢?这样的方法跟论坛里已经公开的“高程自动避让"中的方法,在批量处理时间上会不会相差很大呢?求教!!!! 原理差不多,处理速度都不敢恭维。而且你的这个想法不成熟,移到左边怎么办?是不是挡住了点? soly2006 发表于 2013-9-12 09:17 static/image/common/back.gif
原理差不多,处理速度都不敢恭维。而且你的这个想法不成熟,移到左边怎么办?是不是挡住了点?
我的想法是这样,POLYGON几次,第一次半径0.45,如果还是与实体相交,执行第二次POLYGON半径0.70,如此类推,第三次(第二次*2)、第四次(第三次*2)、第五次(第四次*2)这样!还有第一次的POLYGON边数可以设置为10、20、30、40都行,之后也可以边数类推!
如果,时间比不上之前那位老师的“高程自动移位”的少的话!也只好另想方法,或者放弃了!
谢谢你,老师! 这个题目,本论坛有的啊! 陈亚娣 发表于 2013-9-12 09:39 static/image/common/back.gif
我的想法是这样,POLYGON几次,第一次半径0.45,如果还是与实体相交,执行第二次POLYGON半径0.70,如此类 ...
按增量值不断扩大圆圈,分4个象限判断文字矩形框内是否有相交,找到空位即移动文字 无名指 发表于 2013-9-16 12:21 static/image/common/back.gif
按增量值不断扩大圆圈,分4个象限判断文字矩形框内是否有相交,找到空位即移动文字
你好,能不能可以给提供段代码啊?
因为我还算个初手,有些代码还不能完全自写!我想要是判断文字相交的代码! (while ss1;只要高程点选择集存在
(repeat (sslength ss1)
(setq data1 (entget (ssname ss1 n) '("*")));获取主对象(高程点块)的群码表
(setq data2 (entget (entnext (ssname ss1 n)) '("*")));获取子对象(高程注记值)的群码表
(setq l (nth 0 (cadr (textbox data2)))) ;根据注记值获取字长
(setq h (cdr (assoc 40 data2))) ;根据注记值获取字高
(setq blk_pt (cdr (assoc 10 data1))) ;高程点块的插入坐标
(command "zoom" "c" blk_pt 30 )
(setq text_pt1 (cdr (assoc 10 data2))) ;高程文本值的左下角插入点坐标
(setq text_pt2 (list (+ (nth 0 text_pt1) l) (+ (nth 1 text_pt1) h)));高程文本值的右上角点坐标
(setq s1 (ssget "c" text_pt1 text_pt2 '((-4 . "<not")(8 . "GCD")(-4 . "not>"))));以文本框框选除GCD之外的选择集
(if (/= s1 nil) ;意即框内仍有其它选择物,也就是高程点压线了
(progn
;以下是一个依次扩大范围不断寻找空位的过程
;(setq ii (/ 2 kkk));设定范围框的增量值
;(while (> ii 0)
;(calwp blk_pt ii 12);以高程点块为中心建立多边形选择框
(setq ii 0);设定范围框的增量值
(while (< ii 0.6)
(calwp blk_pt (+ (* h 0.2) ii) 32);以高程点块为中心建立多边形选择框
(setq i 0)
(repeat (length wppt)
;第八次循环(第三象项)
(if (and (<= (car (nth i wppt)) (nth 0 blk_pt))(<= (cadr (nth i wppt)) (nth 1 blk_pt)));第三象项
(progn
(setq pt_l (list (- (car (nth i wppt)) (* 1 l)) (- (cadr (nth i wppt)) h)))
(setq pt_r(nth i wppt))
);progn
);if
...................................
<按象限定义文本框,请自由编写>
....................................
(setq s2 (ssget "c" pt_l pt_r))
(if (= s2 nil);如果找到空位
(progn
(setq just_pt (list (nth 0 pt_l) (+ (nth 1 pt_l) (/ h 2)) ))
(setq data2 (subst (cons 11 just_pt) (assoc 11 data2) data2))
(entmod data2) ;更改子对象
(entupd (ssname ss1 n)) ;更改主对象
;(command "_rectang" pt_lpt_r "")
(setq ii 10);如找到空位则设ii等于10,因大于0.6,借此跳出循环直接进入下一个点的处理
);p
(setq i (1+ i));如果没找到空位,则开始判断下一个顶点
);if
);r
(setq ii (+ ii 0.05));多边形选择框外扩增值数,扩大一圈继续找空位处理
);w ii
);p
);if s1
(setq n (1+ n));开始处理下一个高程点
(princ (strcat "\n正在处理第 " (itoa n) " 个高程注记,还剩下" (itoa (- (sslength ss1) n)) "个,请耐心等待!"))
);r
(setq ss1 nil s1 nil s2 nil)
);w 只给出一部分,不是小气、保守。只是我自己感觉这个程序还不完善,主要是处理的速度太慢了,不好意思拿出手,只当抛砖引玉,仅供参考吧。希望有更好的,期盼中...... 给你一个好东东,在网上淘的 无名指 发表于 2013-9-18 22:30 static/image/common/back.gif
给你一个好东东,在网上淘的
谢谢,这个程序很好哦!
页:
[1]
2