明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15582|回复: 35

[wkq004]由三角网生等高线-我的Alisp之路

    [复制链接]
发表于 2012-12-10 00:33:16 | 显示全部楼层 |阅读模式
[wkq004]由三角网生等高线-我的Alisp之路
知道明经通道是2003的事.当时学校开设了CAD课程,同学在宿舍告诉我明经通道上有cad学习资料的一幕,到现在我还记忆犹新.我学的是测绘,毕业后一直从事外业.当时用的绘图软件主要是MS,MS几乎通过点鼠标完成所有工作.用cad只是转个文档格式,画接合表,点之记之类的.但我还是喜欢cad的命令栏,可以输一些"高深"的命令,达到目的.所以在工作的间隙我会试用cad的功能,翻看cad帮助.到2005年有幸看到一本cad的教材,上面有cad的定制,alisp入门,和dcl对话框,当时特别新奇,就抽空翻完了此书,当时的项目不太需要电脑,20人4台电脑,根本没有时间练习.在2005年年底去买书,可选择性太少,仅找到一本lisp教材,是张帆前辈的<AutoCAD2002开发教程>,就一直带在身边抽空看,看着很吃力,到现在看我还是觉得那本书不适合入门.有一天在看GPS基站,就静下心来反复读,看明白了DCL部分,让我兴奋了一把.有时也会去逛逛论坛,晓东的测绘板块较丰富,发过一些帖子.直到2008才有时间好好看alisp,在西安的汉唐书城买到一本李学志的<Visual LISP程序设计>,这本书很适合当时的我,就认认真真的一口气学完了,算是alisp入了门,同时也开始疯狂的上网看帖,加QQ群,加的第一个是由zml84创建的 摆渡者LISP 群很活跃,得到了zml84简洁给力的指点,和xyp1964不少的调侃和偷笑(表情),当时活跃的不少群友已成为了高手.从此以后就不时的写一些工作中能用到的小程序,挖掘一些能用程序实现的工序.曾经很疯狂的看测绘方面的帖子,差不多读遍了晓东和明经上所有的测绘贴.由于水平有限,没好意思跟贴,当最近觉得顶贴也是一种支持时,才开始跟帖,以至于2006年注册的号到今年才有第一贴.
我才疏学浅,很仰望各位大侠,请不吝赐教!我感激不尽!

下帖功能已实现,求更快算法.
  1. ;|功能:由三角网生等高线
  2. 日期:wkq004@qq.com于2012-12-9
  3. 参考:明经通道yfy2003[测绘]不规则点建立TIN和等高线的方法!
  4. http://bbs.mjtd.com/thread-15199-1-1.html
  5. 算法描述:
  6. 基于三角形搜索的等高线绘制算法如下:
  7. 对于记录了三角形表的TIN,按记录的三角形顺序搜索。其基本过程如下:
  8. 1)对给定的等高线高程h,与所有网点高程zi(i=1,2,?,n),进行比较,
  9. 若zi=h,则将zi加上(或减)一个微小正数ε> 0(如ε=10-4),
  10. 以使程序设计简单而又不影响等高线的精度。
  11. 2)设立三角形标志数组,其初始值为零,每一元素与一个三角形对应,
  12. 凡处理过的三角形将标志置为1,以后不再处理,直至等高线高程改变。
  13. 3)按顺序判断每一个三角形的三边中的两条边是否有等高线穿过。
  14. 若三角形一边的两端点为P1(x1,y1,z1),P2(x2,y2,z2)则
  15. (z1-h)(z2-h)<0表明该边有等高线点;
  16. (z1-h)(z2-h)>0表明该边无等高线点。
  17. 直至搜索到等高线与网边的第一个交点,称该点为搜索起点,
  18. 也是当前三角形的等高线进入边、线性内插该点的平面坐标(x,y):
  19. 4)搜索该等高线在该三角形的离去边,也就是相邻三角形的进人边,并内插其平面坐标。
  20. 搜索与内插方法与上面的搜索起点相同,不同的只是仅对该三角形的另两边作处理。
  21. 5)进入相邻三角形,重复第(4)步,直至离去边没有相邻三角形(此时等高线为开曲线)
  22. 或相邻三角形即搜索起点所在的三角形(此时等高线为闭曲线)时为止。
  23. 6)对于开曲线,将已搜索到的等高线点顺序倒过来,并回到搜索起点向另一方向搜索,
  24. 直至到达边界(即离去边没有相邻三角形)。
  25. 7)当一条等高线全部跟踪完后,将其光滑输出,方法与前面所述矩形格网等高线的绘制相同。
  26. 然后继续三角形的搜索,直至全部三角形处理完,再改变等高线高程,
  27. 重复以上过程,直到完成全部等高线的绘制为止。|;
  28. (vl-load-com)
  29. (setq myms (vla-get-ModelSpace
  30.              (vla-get-ActiveDocument (vlax-get-acad-object))
  31.            )
  32. )
  33. (defun mk2polyline (pts bh / lenn pts my2dpoly)
  34.   ;;功能:生成二次拟合的二维多段线
  35.   ;;参数:pts  点表  bh 闭合否T nil
  36.   ;;返回:未指定
  37.   ;;全局变量:elev 高程
  38.   ;;日期:wkq004@qq.com于2012-12-9
  39.   (setq pts (apply 'append pts))
  40.   (setq lenn (length pts))
  41.   (setq        pts (vlax-safearray-fill
  42.               (vlax-make-safearray vlax-vbDouble (cons 0 (1- lenn)))
  43.               pts
  44.             )
  45.   )
  46.   (setq my2dpoly (vla-AddPolyline myms (vlax-make-variant pts)))
  47.   (vla-put-Elevation my2dpoly elev) ;_标高
  48.   (if bh
  49.     (vla-put-Closed my2dpoly T) ;_闭合
  50.   )
  51.   (if (> lenn 6)
  52.     (vla-put-type my2dpoly acQuadSplinePoly) ;_二次拟合
  53.   )
  54. )

  55. (defun funptxlb        (xlb2 / A AZ B BZ DIST DT GAO GAOC PT)
  56.   ;;功能:计算边与等高线相交的控制点坐标.
  57.   ;;参数:xlb2 三角形的进入边(点1 点2)
  58.   ;;返回:未指定
  59.   ;;全局变量:ptlst 同一条线的点集
  60.   ;;日期:wkq004@qq.com于2012-12-9
  61.   (setq a (car xlb2))
  62.   (setq b (cadr xlb2))
  63.   (setq az (caddr a))
  64.   (setq bz (caddr b))
  65.   (setq a (list (car a) (cadr a) 0))
  66.   (setq dist (distance a (list (car b) (cadr b))))
  67.   (setq gaoc (abs (- az bz)))
  68.   (setq gao (abs (- az elev)))
  69.   (setq dt (* dist (/ gao gaoc)))
  70.   (setq pt (polar a (angle a b) dt))
  71.   (setq ptlst (append ptlst (list pt)))
  72. )

  73. (defun c:tt (/ DGJ ELEV        MAXZ MINZ PTLST        SJXELST        SJXLBLST SJXNLST SJXNNN
  74.              sjxlbnn sjxlbn SS
  75.             )
  76.   ;;功能:由三角网生等高线
  77.   ;;参数:xlb2 三角形的进入边(点1 点2)
  78.   ;;返回:未指定
  79.   ;;全局变量:ptlst 同一条线的点集
  80.   ;;日期:wkq004@qq.com于2012-12-9
  81.   (command ".undo" "end")
  82.   (command ".undo" "begin")
  83.   (defun sdgx (/ ABBC ELEV GCNUM I)
  84.     ;;生等高线
  85.     ;;全局变量:等高距 dgj 等高线最小值minz 等高线最大值maxz
  86.     (defun chuan (i3 / A AZ B BZ C CZ E JG1 JG2)
  87.       ;;功能:搜索三角形是否有给定高程的等高线穿过
  88.       ;;参数:i3 三角形的编号
  89.       ;;返回:穿过:返回穿过边的两点表 不穿过:返回nil
  90.       ;;全局变量:elev高程 sjxsdlst存放三角形三点的表
  91.       ;;日期:wkq004@qq.com于2012-12-9
  92.       (setq e (nth i3 sjxsdlst))
  93.       (setq a (car e))
  94.       (setq b (cadr e))
  95.       (setq c (caddr e))
  96.       (setq az (caddr a)) ;_顶点z坐标
  97.       (setq bz (caddr b))
  98.       (setq cz (caddr c))
  99.       (if (< (* (- az elev) (- bz elev)) 0)
  100.         (if (< (* (- cz elev) (- az elev)) 0)
  101.           (list (list a b) (list c a))
  102.           (list (list a b) (list b c))
  103.         )
  104.         (if (< (* (- cz elev) (- az elev)) 0)
  105.           (list (list c a) (list b c))
  106.           nil
  107.         )
  108.       )
  109.     )
  110.     (defun funxlb (aa / ab cd)
  111.       ;;功能:判断经过的三角形是否为将要连接
  112.       ;;参数:由等高线穿过的两边组成的表
  113.       ;;返回:是将要连接的返回离开边,否则返回原进入边
  114.       ;;全局变量:sjxnlst三角形编号表 sjxsdlst存放三角形三点的表
  115.       ;;日期:wkq004@qq.com于2012-12-9      
  116.       (setq ab (car aa))
  117.       (setq cd (cadr aa))
  118.       (cond ((or (equal xlb ab 0.001)
  119.                  (equal xlb (list (cadr ab) (car ab)) 0.001)
  120.              )
  121.              (setq sjxnlst (subst -1 (nth io sjxnlst) sjxnlst))
  122.              (funptxlb cd)
  123.              (setq io qsi)
  124.              cd
  125.             )
  126.             ((or (equal xlb cd 0.001)
  127.                  (equal xlb (list (cadr cd) (car cd)) 0.001)
  128.              )
  129.              (setq sjxnlst (subst -1 (nth io sjxnlst) sjxnlst))
  130.              (funptxlb ab)
  131.              (setq io qsi)
  132.              ab
  133.             )
  134.             (T xlb)
  135.       )
  136.     )
  137.     (setq dgj 1) ;_等高距
  138.     (setq minz (* (+ 1 (fix (/ minz dgj))) dgj)) ;_最小Z
  139.     (setq maxz (* (fix (/ maxz dgj)) dgj)) ;_最大Z
  140.     (setq gcnum (+ 1 (/ (- maxz minz) dgj))) ;_高差算出等高线数量
  141.     (setq elev minz) ;_从最小的高程画起
  142.     (repeat gcnum ;_等高线数量
  143.       ;;(maxz minz sjxelst sjxlblst sjxnlst sjxnnn)
  144.       (setq qsi 0)
  145.       (setq io 0)
  146.       (setq ptlst '())
  147.       (setq sjxnlst sjxnnn) ;_本条等高线的三角形编号表
  148.       (setq len (length sjxnlst))
  149.       (while (< io len)
  150.         ;;寻找每条线的起始三角形
  151.         (if (setq abbc (chuan io))
  152.           (progn
  153.             (setq sjxnlst (subst -1 (nth io sjxnlst) sjxnlst))
  154.             (setq qsi io)
  155.             (setq qsbian (car abbc))
  156.             (setq xlb (cadr abbc))
  157.             (funptxlb qsbian)
  158.             (funptxlb xlb)
  159.             ;;寻找相邻三角形
  160.             (while (or (while (= -1 (nth (setq io (+ io 1)) sjxnlst)))
  161.                        (< io len)
  162.                    )
  163.               (if (setq abbc (chuan io))
  164.                 (setq xlb (funxlb abbc))
  165.                 (setq sjxnlst (subst -1 (nth io sjxnlst) sjxnlst))
  166.               )
  167.             )
  168.             ;;第一个方向搜索完后判断等高线是否闭合
  169.             (if        (equal (car ptlst) (last ptlst) 0.001)
  170.               (progn (setq ptlst (cdr ptlst))
  171.                      (mk2polyline ptlst T) ;_闭合
  172.                      (setq ptlst '())
  173.               )
  174.               ;;不闭合就对点表反向用起始边从另一个方向搜索,直到所有三角形搜索完毕
  175.               ;;生成不闭合的等高线.
  176.               (progn
  177.                 (setq io qsi)
  178.                 (while (= -1 (nth (setq io (+ io 1)) sjxnlst)))
  179.                 (setq qsi (1- io))
  180.                 (if (< io len)
  181.                   (progn
  182.                     (setq ptlst (reverse ptlst))
  183.                     (setq xlb qsbian)
  184.                     (setq io qsi)
  185.                     (while
  186.                       (or (while (= -1 (nth (setq io (+ io 1)) sjxnlst)))
  187.                           (< io len)
  188.                       )
  189.                        (if (setq abbc (chuan io))
  190.                          (setq xlb (funxlb abbc))
  191.                          (setq
  192.                            sjxnlst (subst -1 (nth io sjxnlst) sjxnlst)
  193.                          )
  194.                        )
  195.                     )
  196.                   )
  197.                 )
  198.                 (mk2polyline ptlst nil) ;_不闭合
  199.                 (setq ptlst '())
  200.               )
  201.             )
  202.             (setq io qsi)
  203.             (while (= -1 (nth (setq io (+ io 1)) sjxnlst)))
  204.           )
  205.           (progn (setq sjxnlst (subst -1 (nth io sjxnlst) sjxnlst))
  206.                  (setq io (+ io 1))
  207.           )
  208.         )
  209.       )
  210.       ;;高程累加一个等高距
  211.       (setq elev (+ elev dgj))
  212.     )
  213.   )
  214.   (defun sjzl (/ E EL EMAIN EXDATA EXPTLST I A B C PTZ)
  215.     ;;数据整理(sjxelst sjxnlst sjxddlst ddsjxlst bxllst sjxsblst /)
  216.     ;;全局变量 maxz minz sjxelst sjxlblst sjxnlst sjxnnn
  217.     (setq sjxnlst  '() ;_三角形编号表
  218.           sjxsdlst '() ;_三角形与编号对应的三角形三点表
  219.           i           -1
  220.           minz           9999
  221.           maxz           -9999
  222.           sjxnnn   '()
  223.           sjxnnn   (repeat (sslength ss)
  224.                      (setq sjxnnn (append sjxnnn (list (setq i (+ 1 i)))))
  225.                    ) ;_三角形原始编号表
  226.           i           -1
  227.     )
  228.     (repeat (sslength ss)
  229.       (setq e (ssname ss (setq i (+ 1 i))))
  230.       (defun qpt (ee / el pt ptz)
  231.         ;;求三角形的顶点坐标
  232.         (setq e (entnext ee))
  233.         (setq el (entget e))
  234.         (setq pt (cdr (assoc '10 el)))
  235.         (setq ptz (caddr pt))
  236.         (if (< ptz minz)
  237.           (setq minz ptz)
  238.           (if (> ptz maxz)
  239.             (setq maxz ptz)
  240.           )
  241.         )
  242.         pt ;_返回
  243.       )
  244.       (setq a (qpt e))
  245.       (setq b (qpt e))
  246.       (setq c (qpt e))
  247.       (setq sjxsdlst (append sjxsdlst (list (list a b c))))
  248.     )
  249.   )
  250.   (if (setq ss (ssget '((0 . "POLYLINE") (8 . "SJW"))))
  251.     (progn (setq ti (car (_VL-TIMES))) ;_获得程序开始时间
  252.            (sjzl)
  253.            (sdgx)
  254.            (setq time (strcat "\n "
  255.                               (rtos (/ (- (car (_VL-TIMES)) ti) 1000.) 2 4)
  256.                               " secs."
  257.                       )
  258.            ) ;_计算程序耗时
  259.            (setq fl (open "d:\\111.txt" "a"))
  260.            (print time fl)
  261.     )
  262.   )
  263.   (command ".undo" "end")
  264.   (princ)
  265. ) ;_程序完毕


发表于 2013-7-17 12:46:25 | 显示全部楼层
004 发表于 2013-4-11 11:33
发个关于动态生等高线的,还没弄完,先给大家看看吧,请高手提供,不用command trim的裁切算法。
要求参看 ...

大侠,试用该插件,到第二步总是失败
命令: tt1
选择高程点...
选择对象: 指定对角点: 找到 464 个
已滤除 232 个。
选择对象:
0.1720 secs.
nil nil
命令: tt2
选择对象: 指定对角点: 找到 917 个
已滤除 467 个。
选择对象:
AAAAAAAAAAAAA; 错误: 参数类型错误: consp <Selection set: 7d>
不解
回复 支持 1 反对 0

使用道具 举报

发表于 2015-9-1 16:03:29 | 显示全部楼层
向高手学习
回复 支持 0 反对 1

使用道具 举报

发表于 2016-2-26 14:59:16 | 显示全部楼层
三角网编辑主要是能加特征线,这样三角网才会合理,不然会很失真。不知楼主在这方面怎么处理的。
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-25 22:16:01 | 显示全部楼层
gzxl 发表于 2012-12-11 10:38
前段时间在theswamp看到这么个思路:

(1) 用LWPOLYLINE全部将每个三角网的等值点勾绘出

说的对啊  
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2012-12-16 01:00:15 | 显示全部楼层
本帖最后由 004 于 2012-12-16 01:01 编辑

再贴个再论坛上找到的生三角网的程序,很快,最后一个子程序的算法,看了几遍都晕,还望大侠指点。
  1. (defun c:tt (/ i pl s)
  2. ;;;-------------------------------------------------------------------
  3. ;;;来自:明经通道网站   作者:雷锋
  4. ;;;功能:用高程点生成三角网
  5. ;;;参数:pl 点集
  6. ;;;分类:专业程序-测绘-高程点-三角网-TIN
  7.   (princ (strcat "\n选择高程点..."))
  8.   (setq lstlst '())
  9.   (setq delsl (ssadd))
  10.   (if (setq i 0
  11.             s (ssget '((8 . "GCD") (0 . "INSERT") (2 . "GC200")))
  12.       )
  13.     (progn (repeat (sslength s)
  14.              (setq pl (cons (cdr (assoc 10 (entget (ssname s i)))) pl)
  15.                    i  (1+ i)
  16.              )
  17.            )
  18.            (triangulate pl)
  19.     )
  20.   )
  21.   (print lstlst)
  22. )
  23. (defun triangulate (pl / a b c i i1 i2 bb sl al        el tl L        ma mi ti tr x1
  24.                     x2 y1 y2 p r cp)
  25.   (if pl
  26.     (progn
  27.       (setq ti (car (_VL-TIMES));_获取时间
  28.             i  1
  29.             i1 (/ (length pl) 100.)
  30.             i2 0
  31.             pl (vl-sort pl (function (lambda (a b) (< (car a) (car b)))));_将点集按x坐标从小到大排序
  32.             bb (list (apply 'mapcar (cons 'min pl));_取得点集X的最小坐标Y的最小坐标
  33.                      (apply 'mapcar (cons 'max pl));_取得点集X的最大坐标Y的最大坐标
  34.                )
  35.             x1 (caar bb);_x方向最小值
  36.             x2 (caadr bb);_x方向最大值
  37.             y1 (cadar bb);_y方向最小值
  38.             y2 (cadadr bb);_y方向最大值
  39.       )
  40.       
  41.       (command "rectang" (car bb) (cadr bb))
  42.       (command "text" (car bb) "" "" "x1 y1")
  43.       (command "text" (cadr bb) "" "" "x2 y2")
  44.       (setq cp (list (/ (+ x1 x2) 2.0) (/ (+ y1 y2) 2.0));_点集的中心点平面坐标
  45.             r  (* (distance cp (list x1 y1)) 20);_搜索半径,中心点到左下角点的20倍
  46.             ma (+ (car cp) r);_x最大设为中心点x加r
  47.             mi (- (car cp) r);_x最小设为中心点x减r
  48.             sl (list (list ma (cadr cp) 0);_初始化        x最大 y中心 0
  49.                      (list mi (+ (cadr cp) r) 0);_初始化  x最小 y最大 0
  50.                      (list mi (- (cadr cp) r) 0);_初始化  x最小 y最小 0
  51.                )
  52.             al (list (cons x2 (cons cp (cons (* 20 r) sl))));_((x大 (中心点) r*20 (x最大y中心 0) (x最小 y最大 0) (x最小 y最小 0)))
  53.             ma (1- ma);_                                      ((2.55524e+007 (2.55523e+007 4.29672e+006) 13900.2 (2.5553e+007 4.29672e+006 0) (2.55516e+007 4.29742e+006 0) (2.55516e+007 4.29603e+006 0)))
  54.             mi (1+ mi)
  55.       )
  56. ;;;      (command "circle" cp 2)
  57. ;;;      (command "circle" cp r)
  58. ;;;      (command "pline" (car sl) "h" 2 0 (cadr sl) (caddr sl) "")
  59. ;;;      (command "text" cp "" "" "cp")
  60. ;;;      
  61. ;;;      (command "text" (car sl) "" "" "sl-1")
  62. ;;;      (ssadd (entlast) delsl)
  63. ;;;      (command "text" (cadr sl) "" "" "sl-2")
  64. ;;;      (ssadd (entlast) delsl)
  65. ;;;      (command "text" (caddr sl) "" "" "sl-3")
  66. ;;;      (ssadd (entlast) delsl)
  67. ;;;      (command "pline" (car sl) (cadr sl) (caddr sl) (car sl) "")
  68.       (repeat (length pl)
  69.         (setq p         (car pl);_点集中的第一个点
  70.               pl (cdr pl)
  71.               el nil
  72.         )
  73.         (while al
  74.           (setq        tr (car al);_(x大 (中心点) r*20 (x最大y中心 0) (x最小 y最大 0) (x最小 y最小 0))
  75.                 al (cdr al);_((中心点) r*20 (x最大y中心 0) (x最小 y最大 0) (x最小 y最小 0))
  76.           )
  77.           (cond        ((< (car tr) (car p)) (setq tl (cons (cdddr tr) tl)));_x大小于p的x
  78.                 ((< (distance p (cadr tr)) (caddr tr))
  79.                  ;;p到中心点cp的距离小于r*20
  80.                  (setq tr (cdddr tr);_((x最大y中心 0) (x最小 y最大 0) (x最小 y最小 0))
  81.                        a  (car tr);_(x最大y中心 0)
  82.                        b  (cadr tr);_(x最小 y最大 0)
  83.                        c  (caddr tr);_(x最小 y最小 0)
  84.                        el (cons
  85.                             (list (+ (car a) (car b)) (+ (cadr a) (cadr b)) a b)
  86.                             (cons (list        (+ (car b) (car c))
  87.                                         (+ (cadr b) (cadr c))
  88.                                         b
  89.                                         c
  90.                                   )
  91.                                   (cons        (list (+ (car c) (car a))
  92.                                               (+ (cadr c) (cadr a))
  93.                                               c
  94.                                               a
  95.                                         )
  96.                                         el
  97.                                   )
  98.                             )
  99.                           );_((ax+bx ay+by a b) (bx+cx by+cy b c) (cx+ax cy+ay c a))
  100.                  )
  101.                 )
  102.                 (t (setq L (cons tr L)))
  103.           )
  104. ;;;          (command "text" a "" "" "a")
  105. ;;;          (command "text" b "" "" "b")
  106. ;;;          (command "text" c "" "" "c")
  107. ;;;          (command "pline" a "h" 2 0 b c a"")
  108.         )
  109.         (setq al L
  110.               L         nil
  111.               el (vl-sort el
  112.                           (function (lambda (a b)
  113.                                       (if (= (car a) (car b))
  114.                                         (<= (cadr a) (cadr b))
  115.                                         (< (car a) (car b))
  116.                                       )
  117.                                     )
  118.                           )
  119.                  );_用x的和排序,相等的再用y排
  120.         )
  121.         (while el
  122.           (if (and (= (caar el) (caadr el)) (= (cadar el) (cadadr el)))
  123.             (setq el (cddr el));_如ax+bx=bx+cx 且ay+by=by+cy
  124.             (setq al (cons (getcircumcircle p (cddar el)) al);_传入p 和 a b
  125.                   el (cdr el)
  126.             )
  127.           )
  128.         )
  129.         (if (and (< (setq i (1- i)) 1) (< i2 100))
  130.           (progn (setvar "MODEMACRO"
  131.                          (strcat "◎正在连三角网"
  132.                                  (itoa (setq i2 (1+ i2)))
  133.                                  " % "
  134.                                  (substr "..." 1 (- 100 i2))
  135.                          )
  136.                  )
  137.                  (setq i i1)
  138.           )
  139.         )
  140.       )
  141.       (foreach tr al (setq tl (cons (cdddr tr) tl)))
  142.       (setq tl
  143.              (vl-remove-if-not
  144.                (function (lambda (a)
  145.                            (and (< mi (caadr a) ma) (< mi (caaddr a) ma))
  146.                          )
  147.                )
  148.                tl
  149.              )
  150.       )
  151.       (or (tblsearch "LAYER" "SJW")
  152.           (entmake (list '(0 . "LAYER")
  153.                          '(100 . "AcDbSymbolTableRecord")
  154.                          '(100 . "AcDbLayerTableRecord")
  155.                          '(2 . "SJW")
  156.                          '(70 . 0)
  157.                          '(62 . 8)
  158.                          '(6 . "Continuous")
  159.                          '(290 . 1)
  160.                          '(370 . -3)
  161.                         )
  162.           )
  163.       )
  164.       (setvar "CLAYER" "SJW")
  165.    
  166.       
  167.       (foreach tr tl
  168.         (entmake '((0 . "POLYLINE")
  169.                    (8 . "SJW")
  170.                    (100 . "AcDb3dPolyline")
  171.                    (70 . 9)
  172.                    (62 . 5)
  173.                   )
  174.         )
  175.         (setq a (car tr))
  176.         (setq b (cadr tr))
  177.         (setq c (caddr tr))
  178.         (entmake
  179.           (list '(0 . "VERTEX") (cons 10 (car tr)) '(70 . 32))
  180.         )
  181.         (entmake
  182.           (list '(0 . "VERTEX") (cons 10 (cadr tr)) '(70 . 32))
  183.         )
  184.         (entmake
  185.           (list '(0 . "VERTEX") (cons 10 (caddr tr)) '(70 . 32))
  186.         )
  187.         (entmake (list '(0 . "SEQEND")))
  188.         
  189.         
  190.         
  191.       )
  192.     )
  193.   )
  194.   
  195.   
  196.   (setvar "MODEMACRO" "")
  197.   (princ (strcat "\n "
  198.                  (rtos (/ (- (car (_VL-TIMES)) ti) 1000.) 2 4)
  199.                  " secs."
  200.          )
  201.   )
  202.   (princ)
  203. )
  204. ;;这段麻烦哪位高人详细讲解下算法,我看了几遍还是晕.
  205. (defun getcircumcircle (a el / b c c2 cp r ang)
  206.   (setq        b  (car el)
  207.         c  (cadr el)
  208.         c2 (list (car c) (cadr c))
  209.   )
  210. ;;;  (command "pline" a "h" 2 0 b c "")
  211.   (if (not (zerop (setq ang (- (angle b c) (angle b a))))) ;_a b c不在同一方向的直线上
  212.     (progn (setq cp (polar c2
  213.                            (+ -1.570796326794896 (angle c a) ang)
  214.                            (setq r (/ (distance a c2) (sin ang) 2.0))
  215.                     )
  216.                  r  (abs r)
  217.            )
  218. ;;;           (command "circle" cp r)
  219.            (list (+ (car cp) r) cp r a b c)
  220.     )
  221.   )
  222. )

评分

参与人数 2明经币 +2 收起 理由
flytoday + 1 顶你。。楼主给测试图瞧下功能啊~
gzxl + 1 佩服

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2012-12-10 06:42:00 | 显示全部楼层
选择三角网
选择对象: 指定对角点: 找到 11904 个
选择对象:
程序运行用时16.3600 secs.
发表于 2012-12-10 09:02:47 来自手机 | 显示全部楼层
南方都有这个功能了,,,,
发表于 2012-12-11 10:38:02 | 显示全部楼层
前段时间在theswamp看到这么个思路:

(1) 用LWPOLYLINE全部将每个三角网的等值点勾绘出
(2) 再用加强的PEDIT连接
(3) 线型转换处理

速度超快的,10000个三角网形成等值线10秒不到
不知这种方法行否?

回复三楼的
南方有此功能只是代表你会使用
 楼主| 发表于 2012-12-11 14:58:35 | 显示全部楼层
gzxl 发表于 2012-12-11 10:38
前段时间在theswamp看到这么个思路:

(1) 用LWPOLYLINE全部将每个三角网的等值点勾绘出

这个方法好,我想试试用生成lwpolyline短线的点表直接组织点集,估计会更快点,但对大量点表的穷举判断也是很耗时的,等会我先写出来再让大侠们优化.
发表于 2012-12-11 22:48:51 | 显示全部楼层
004 发表于 2012-12-11 14:58
这个方法好,我想试试用生成lwpolyline短线的点表直接组织点集,估计会更快点,但对大量点表的穷举判断也是很 ...

肯定快很多的,你试试
 楼主| 发表于 2012-12-13 00:32:51 | 显示全部楼层
今天写不完了,先贴出来松口气,,顺便问大侠个问题:我用lst= ("1" "2" "3" ...)表中的名字创建了多个变量,程序运行结束后我怎么释放这些变量名呢??  (foreach a lst (set (read a) a) )

  1. ;|功能:由三角网生等高线
  2. 日期:wkq004@qq.com于2012-12-9
  3. 算法描述:
  4. 基于三角形搜索的等高线绘制算法如下:
  5. |;
  6. (vl-load-com)
  7. (defun mk2polyline (pts bh / lenn pts my2dpoly)
  8.   ;;功能:生成二次拟合的二维多段线
  9.   ;;参数:pts  点表  bh 闭合否T nil
  10.   ;;返回:未指定
  11.   ;;全局变量:elev 高程
  12.   ;;日期:wkq004@qq.com于2012-12-9
  13.   (setq pts (apply 'append pts))
  14.   (setq lenn (length pts))
  15.   (setq        pts (vlax-safearray-fill
  16.               (vlax-make-safearray vlax-vbDouble (cons 0 (1- lenn)))
  17.               pts
  18.             )
  19.   )
  20.   (setq my2dpoly (vla-AddPolyline myms (vlax-make-variant pts)))
  21.   (vla-put-Elevation my2dpoly elev) ;_标高
  22.   (if bh
  23.     (vla-put-Closed my2dpoly T) ;_闭合
  24.   )
  25.   (if (> lenn 6)
  26.     (vla-put-type my2dpoly acQuadSplinePoly) ;_二次拟合
  27.   )
  28. )

  29. (defun c:tt (/ A ABLST B BCLST C CALST DGJ E ELEVG ELEVGLST END        FL FUN
  30.              FX        G I JO LEN LINE        LINELST        N NN ONE PTLST QSI SS START TI
  31.              TIME TWO XH Y
  32.             )
  33.   (command ".undo" "end")
  34.   (command ".undo" "begin")
  35.   (setq        myms (vla-get-ModelSpace
  36.                (vla-get-ActiveDocument (vlax-get-acad-object))
  37.              )
  38.   )
  39.   (if (setq ss (ssget '((0 . "POLYLINE") (8 . "SJW"))))
  40.     (progn
  41.       (setq ti (car (_VL-TIMES))) ;_获得程序开始时间      
  42.       (setq dgj 1) ;_等高距
  43.       (setq i -1)
  44.       (repeat (sslength ss)
  45.         (setq e (ssname ss (setq i (+ 1 i))))
  46.         (defun qpt (ee / el pt ptz)
  47.           ;;求三角形的顶点坐标
  48.           (setq e (entnext ee))
  49.           (setq el (entget e))
  50.           (setq pt (cdr (assoc '10 el)))
  51.         )
  52.         (setq a (qpt e))
  53.         (setq b (qpt e))
  54.         (setq c (qpt e))
  55.         (defun bianpt (a b / ANG AZ BZ DIST DT ELEV GAOC GCNUM MAXZ MINZ
  56.                        PT TMP
  57.                       )
  58.           (setq y t) ;_等高线是否经过
  59.           (setq az (caddr a))
  60.           (setq bz (caddr b))
  61.           (if (< az bz)
  62.             ()
  63.             (if        (= az bz)
  64.               (setq y nil) ;_同高无等高线经过
  65.               (setq tmp        az
  66.                     az        bz
  67.                     bz        tmp
  68.                     tmp        a
  69.                     a        b
  70.                     b        tmp
  71.               )
  72.             )
  73.           )
  74.           (if y
  75.             (progn (setq a (list (car a) (cadr a) 0))
  76.                    (setq dist (distance a (list (car b) (cadr b))))
  77.                    (setq gaoc (- bz az))
  78.                    (setq ang (angle a b))
  79.                    (setq minz (* (+ 1 (fix (/ az dgj))) dgj)) ;_最小Z
  80.                    (setq maxz (* (fix (/ bz dgj)) dgj)) ;_最大Z
  81.                    (setq gcnum (/ (- maxz minz) dgj)) ;_高差算出等高线数量
  82.                    (setq elev minz) ;_从最小的高程画起
  83.                    (setq dt (* dist (/ (- elev az) gaoc)))
  84.                    (setq pt (polar a ang dt))
  85.                    (setq pt (list (car pt) (cadr pt)))
  86.                    (setq ptlst (append ptlst (list (list elev pt))))
  87.                    (setq dt (* dist (/ dgj gaoc)))
  88.                    (repeat gcnum
  89.                      (setq elev (+ elev dgj))
  90.                      (setq pt (polar pt ang dt))
  91.                      (setq pt (list (car pt) (cadr pt)))
  92.                      (setq ptlst (append ptlst (list (list elev pt))))
  93.                    )
  94.             )
  95.           )
  96.         )
  97.         (setq ablst (bianpt a b))
  98.         (setq bclst (bianpt b c))
  99.         (setq calst (bianpt c a))
  100.         (while ptlst
  101.           (setq one (car ptlst))
  102.           (setq g (car one))
  103.           (setq ptlst (cdr ptlst))
  104.           (setq two (assoc g ptlst))
  105.           (setq ptlst (vl-remove two ptlst))
  106.           (setq one (cadr one))
  107.           (setq two (cadr two))
  108.           (setq elevg (strcat "g" (itoa g)))
  109.           ;;创建符号名为elevg的表,或在elevg表的尾部加上此段线
  110.           (if (setq linelst (eval (read elevg)))
  111.             (set (read elevg)
  112.                  (append linelst (list (list one two) (list two one)))
  113.             )
  114.             (progn
  115.               (set (read elevg) (list (list one two) (list two one)))
  116.               (setq elevglst (append elevglst (list elevg))) ;_将此高加入等值线变量名表
  117.             )
  118.           )
  119.         )
  120.       )
  121.       ;;依次取出等值线变量名表
  122.       (foreach elevg elevglst
  123.         (setq g (atoi (substr elevg 2))) ;_高程值
  124.         (setq linelst (eval (read elevg))) ;_等值短线表
  125.         (setq len (length linelst))
  126.         (setq nn (vl-sort-i linelst
  127.                             '(lambda (a b) (equal (caar a) (caar b)))
  128.                  )
  129.         )
  130.         (setq qsi 0)
  131.         (while (< qsi len)
  132.           (setq i qsi)
  133.           (setq n (nth i nn))
  134.           (setq line (nth n linelst))
  135.           (setq ptlst line)
  136.           (setq jo (rem i 2))
  137.           (setq nn (subst -1 i nn))
  138.           (setq        nn (subst -1
  139.                           (if (= 0 jo)
  140.                             (1+ i)
  141.                             (1- i)
  142.                           )
  143.                           nn
  144.                    )
  145.           )
  146.           (setq start (car line))
  147.           (setq end (cadr line))
  148.           (if (< (car start) (car end))
  149.             (setq fx 1
  150.                   fun <
  151.             )
  152.             (setq fx -1
  153.                   fun >
  154.             )
  155.           )
  156.           (while (and xh (setq n (nth i nn)))
  157.             (setq two (nth n linelst))
  158.             (if        ((eval fun) (car end) (caar two))
  159.               ()
  160.               (if (equal end (car two))
  161.                 (progn (setq nn           (subst -1 i nn)
  162.                              ptlst (append ptlst (list (cadr two)))
  163.                              end   (cadr two)
  164.                              jo           (rem i 2)
  165.                              nn           (subst -1
  166.                                           (if (= 0 jo)
  167.                                             (1+ i)
  168.                                             (1- i)
  169.                                           )
  170.                                           nn
  171.                                    )
  172.                        )
  173.                        (if (< (caar two) (car end))
  174.                          (setq fx 1
  175.                                fun <
  176.                          )
  177.                          (setq fx -1
  178.                                fun >
  179.                          )
  180.                        )
  181.                 )
  182.                 (progn
  183.                   ;;生线
  184.                   (mk2polyline ptlst
  185.                                (equal (car ptlst) (last ptlst) 0.001)
  186.                   )
  187.                   (setq ptlst '())
  188.                   (setq xh nil)
  189.                   ;;设定
  190.                 )
  191.               )
  192.             )
  193.             (while (= -1 (setq i (+ i fx))))
  194.           )
  195.           (setq i qsi)
  196.           (while (= -1 (setq i (1+ i))))
  197.           (setq qsi i)
  198.         )
  199.       )
  200.       (setq time (strcat "\n "
  201.                          (rtos (/ (- (car (_VL-TIMES)) ti) 1000.) 2 4)
  202.                          " secs."
  203.                  )
  204.       ) ;_计算程序耗时
  205.       (setq fl (open "d:\\111.txt" "a"))
  206.       (print time fl)
  207.     )
  208.   )
  209.   (command ".undo" "end")
  210.   (princ)
  211. ) ;_程序完毕
发表于 2012-12-13 11:31:17 | 显示全部楼层
感谢楼主的分享,向高手学习下
发表于 2012-12-15 09:16:01 | 显示全部楼层
本帖最后由 NetBee 于 2012-12-15 09:17 编辑
今天写不完了,先贴出来松口气,,顺便问大侠个问题:我用lst= ("1" "2" "3" ...)表中的名字创建了多个变量,程序运行结束后我怎么释放这些变量名呢??  (foreach a lst (set (read a) a) )

将这些所有变量定义为局部变量。程序完成后自动释放。如变量v1 v2 v3
  1. (defun c:test(/ v1 v2 v3)
  2. ;;
  3. )



 楼主| 发表于 2012-12-16 00:38:28 | 显示全部楼层
NetBee 发表于 2012-12-15 09:16
将这些所有变量定义为局部变量。程序完成后自动释放。如变量v1 v2 v3

我可能没说清楚,我现在是用相同的办法赋空值的(foreach a lst (set (read a) nil)),,大侠还有更好的办法不?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 20:20 , Processed in 0.263533 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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