明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 18754|回复: 24

【求助】如何在cad中生成控制点坐标表【已解决】

    [复制链接]
发表于 2012-12-12 15:51 | 显示全部楼层 |阅读模式
本帖最后由 yuanziyou 于 2018-10-3 18:49 编辑

各位搞测绘的高手,谁可以帮忙编写一个在cad中生成控制点坐标表的小程序(直接生成在cad文件中)具体的样式见附件


======================================================================================
感谢gzxl提供的源代码与思路,下面是我整理后的代码,是在gzxl代码的基础上修改了提取点名的部分,表格重新调整了大小,获取的数据可以按点名排序,添加注释,方便学习,共同进步!



本帖子中包含更多资源

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

x
发表于 2012-12-12 18:49 | 显示全部楼层
是在CASS下面生成的控制点的话就有办法做,,
 楼主| 发表于 2012-12-12 20:10 | 显示全部楼层
xiabin68 发表于 2012-12-12 18:49
是在CASS下面生成的控制点的话就有办法做,,

就是cass,我想直接放在图上,导出到文件的倒是好解决
发表于 2012-12-12 23:59 | 显示全部楼层
yuanziyou 发表于 2012-12-12 20:10
就是cass,我想直接放在图上,导出到文件的倒是好解决

当练练
  1. (defun c:tt ( / i lst lstp osm pt ss)
  2.   (vl-load-com)
  3.   (setq osm (getvar "osmode"))
  4.   (setvar "osmode" 0)
  5.   (if (setq i 0 ss (ssget '((0 . "INSERT") (8 . "KZD"))))
  6.       (progn
  7.          (setq i 0 lstp '())
  8.          (repeat (sslength ss)
  9.             (setq pt   (cdr (assoc 10 (entget (ssname ss i))))
  10.                   lst  (SearchText pt)
  11.                   lstp (cons (append pt (list lst)) lstp)
  12.                   i    (1+ i)
  13.             )
  14.          )
  15.          (if (setq p0 (getpoint "\n指定表格绘制位置:"))
  16.              (progn
  17.                 (if (null p0) (setq p0 '(0 0 0)))
  18.                 (OutputHeader p0)
  19.                 (Outputtable lstp p0)
  20.              )
  21.          )
  22.       )
  23.   )
  24.   (setvar "osmode" osm)
  25.   (princ)
  26. )
  27. (defun SearchText (p / i kzdtext ob px py pz x1 x2 y1 y2)
  28.   (setq px  (car p)
  29.         py  (cadr p)
  30.         pz  (caddr p)
  31.         x1  (- px 4)
  32.         x2  (+ px 4)
  33.         y1  (- py 4)
  34.         y2  (+ py 4)
  35.   )
  36.   (setq ob (ssget "X" (list '(-4 . "<and") '(-4 . ">=,>=,*") (list 10 x1 y1 0) '(-4 . "<=,<=,*") (list 10 x2 y2 0) '(0 . "*TEXT") '(8 . "KZD")  '(-4 . "and>"))))
  37.   (cond
  38.      ((= ob nil) (setq kzdText ""))
  39.      ((= (sslength ob) 1) (setq kzdText (Vlax-Get (vlax-ename->vla-object (ssname ob 0)) 'TextString )))
  40.      ((>= (sslength ob) 2)
  41.         (progn
  42.           (setq i 0)
  43.           (repeat (sslength ob)
  44.             (setq kzdText (Vlax-Get (vlax-ename->vla-object (ssname ob i)) 'TextString ))
  45.             (cond
  46.               ((= (ascii kzdText) 75) (setq kzdText kzdText))
  47.               ;((> (ascii kzdText) 57) (setq kzdText kzdText))
  48.               ((/= (ascii kzdText) 75) (setq kzdText ""))
  49.               ;((<= (ascii kzdText) 57) (setq kzdText ""))
  50.             )
  51.             (setq i (1+ i))
  52.           )
  53.         )
  54.      )
  55.   )
  56.   kzdText
  57. )
  58. (defun OutputHeader (p0 / i k lst p0 p1 p2 p3 p4 p5 p6 ptlst strlst)
  59.    (setq p4 (polar p0 (* 0.5 pi) 6) p5 (polar p4 0 100) p6 (polar p0 0 100))
  60.    (EntmakeLine (list p0 p4 p5 p6 p0))
  61.    (EntmakeText "控制点坐标及高程成果表(单位:m)" (polar p0 (angle p0 p5) (/ (distance p0 p5) 2)))
  62.    (setq i 0 k 4 lst '() ptlst '() strlst '("点名" "北坐标(X)" "东坐标(Y)" "高程(H)"))
  63.    (while (< i k)
  64.       (setq p1    (polar p0 (* -0.5 pi) 6)
  65.             p2    (polar p0 0 25)
  66.             p3    (polar p1 0 25)   
  67.       )
  68.       (EntmakeText (nth i strlst) (polar p1 (angle p1 p2) (/ (distance p1 p2) 2)))
  69.       (setq lst   (cons p0 (cons p1 (cons p3 (cons p2 lst))))
  70.             ptlst (append ptlst lst)
  71.             p0 p2
  72.       )
  73.       (setq i (1+ i))
  74.    )
  75.    (EntmakeLine ptlst)
  76. )
  77. (defun Outputtable (lsp pt / i k p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 vlst)
  78.    (setq i 0 k (length lsp) p0 (polar pt (* -0.5 pi) 6))
  79.    (repeat k      
  80.       (setq vlst  (nth i lsp)
  81.             p1    (polar p0 (* -0.5 pi) 6)
  82.             p2    (polar p0 0 25)
  83.             p3    (polar p1 0 25)
  84.             p4    (polar p0 0 50)
  85.             p5    (polar p4 (* -0.5 pi) 6)
  86.             p6    (polar p0 0 75)
  87.             p7    (polar p6 (* -0.5 pi) 6)
  88.             p8    (polar p0 0 100)
  89.             p9    (polar p8 (* -0.5 pi) 6)
  90.       )
  91.       (EntmakeText (cadddr vlst) (polar p1 (angle p1 p2) (/ (distance p1 p2) 2)))
  92.       (EntmakeLine (list p0 p1 p3 p2 p0))
  93.       (EntmakeText (rtos (car vlst) 2 3) (polar p3 (angle p3 p4) (/ (distance p3 p4) 2)))
  94.       (EntmakeLine (list p2 p3 p5 p4 p2))
  95.       (EntmakeText (rtos (cadr vlst) 2 3) (polar p5 (angle p5 p6) (/ (distance p5 p6) 2)))
  96.       (EntmakeLine (list p4 p5 p7 p6 p4))
  97.       (EntmakeText (rtos (caddr vlst) 2 3) (polar p7 (angle p7 p8) (/ (distance p7 p8) 2)))
  98.       (EntmakeLine (list p6 p7 p9 p8 p6))
  99.       (setq p0 p1)
  100.       (setq i (1+ i))
  101.    )
  102. )
  103. (defun EntmakeText (str pt)
  104.   (entmake (list '(0 . "TEXT") (cons 1 str) (cons 10 pt) (cons 40 2.5) '(71 . 0) '(72 . 4) (cons 11 pt)))
  105. )
  106. (defun EntmakeLine (vertices / elist seg)
  107.   (setq elist
  108.      (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")
  109.             (cons 90 (length vertices)) (cons 70 0) (cons 38 (caddr (car vertices)))
  110.      )
  111.   )
  112.   (foreach seg vertices (setq elist (append elist (list (cons 10 seg) (cons 42 0)))))
  113.   (entmake elist)
  114. )


本帖子中包含更多资源

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

x

点评

相当给力!顶!只是有一点细节:在cad中显示的x(图上的横坐标)其实是测量中的Y坐标(东坐标),cad中显示的y(图上的纵坐标)其实是测量中的X坐标(北坐标)。能不能帮忙再完善下!  发表于 2012-12-13 11:17
发表于 2012-12-13 00:51 | 显示全部楼层
当练练----
发表于 2012-12-13 13:10 | 显示全部楼层
gzxl 发表于 2012-12-12 23:59
当练练

为什么我用你的程序,生成的表格没有点名呢???
发表于 2012-12-13 13:45 | 显示全部楼层
xiabin68 发表于 2012-12-13 13:10
为什么我用你的程序,生成的表格没有点名呢???

(= (ascii kzdText) 75)   就是"K"
如果点名字母是其他的,需要修改

点评

注释掉48行就行了  发表于 2012-12-14 11:32
可不可不判断是否为字母,直接根据cass中控制点坐标的属性值(点号)生成呢?  发表于 2012-12-14 11:21
发表于 2012-12-13 13:51 | 显示全部楼层
strlst '("点名" "北坐标(X)" "东坐标(Y)" "高程(H)"
换成
strlst '("点名" "东坐标(Y)" "北坐标(X)" "高程(H)"


或者
(EntmakeText (rtos (car vlst) 2 3) (polar p3 (angle p3 p4) (/ (distance p3 p4) 2)))
(EntmakeText (rtos (cadr vlst) 2 3) (polar p5 (angle p5 p6) (/ (distance p5 p6) 2)))
换成
(EntmakeText (rtos (cadr vlst) 2 3) (polar p3 (angle p3 p4) (/ (distance p3 p4) 2)))
(EntmakeText (rtos (car vlst) 2 3) (polar p5 (angle p5 p6) (/ (distance p5 p6) 2)))
 楼主| 发表于 2012-12-13 14:14 | 显示全部楼层
gzxl 发表于 2012-12-13 13:51
strlst '("点名" "北坐标(X)" "东坐标(Y)" "高程(H)"
换成
strlst '("点名" "东坐标(Y)" "北坐标(X)" "高 ...

感谢提供!
发表于 2012-12-14 14:38 | 显示全部楼层
yuanziyou 发表于 2012-12-13 14:14
感谢提供!

忘了cass的控制点是有扩展属性的
  1. (defun c:tt ( / i str lstp osm pt ss)
  2.   (vl-load-com)
  3.   (setq osm (getvar "osmode"))
  4.   (setvar "osmode" 0)
  5.   (if (setq i 0 ss (ssget '((0 . "INSERT") (8 . "KZD"))))
  6.       (progn
  7.          (setq i 0 lstp '())
  8.          (repeat (sslength ss)
  9.             (setq pt   (cdr (assoc 10 (entget (ssname ss i))))
  10.                   str  (XdataDh (ssname ss i))
  11.                   lstp (cons (append pt (list str)) lstp)
  12.                   i    (1+ i)
  13.             )
  14.          )
  15.          (if (setq p0 (getpoint "\n指定表格绘制位置:"))
  16.              (progn
  17.                 (if (null p0) (setq p0 '(0 0 0)))
  18.                 (OutputHeader p0)
  19.                 (Outputtable lstp p0)
  20.              )
  21.          )
  22.       )
  23.   )
  24.   (setvar "osmode" osm)
  25.   (princ)
  26. )
  27. (defun XdataDh (vlaObj / i lstAll lstSub safDXFValues safDXFValues strdh)
  28.   (if (= (type vlaObj) 'ENAME)
  29.       (setq vlaObj (vlax-ename->vla-object vlaObj))
  30.   )
  31.   (vla-getxdata vlaObj "" 'safDXFCodes 'safDXFValues)
  32.   (if (and safDXFCodes safDXFValues)
  33.       (progn
  34.          (setq lstDXFCodes (vlax-safearray->list safDXFCodes)
  35.                lstDXFValues (mapcar 'variant-value (vlax-safearray->list safDXFValues))
  36.          )
  37.          (setq i 0)
  38.          (foreach intDXFCode lstDXFCodes
  39.             (if (= intDXFCode 1001)
  40.                 (if lstSub
  41.                    (setq lstAll (cons (reverse lstSub) lstAll)
  42.                          lstSub (list (nth i lstDXFValues))
  43.                    )
  44.                    (setq lstSub (list (nth i lstDXFValues)))
  45.                 )
  46.                 (setq lstSub (cons (nth i lstDXFValues) lstSub))
  47.             )
  48.             (setq i (1+ i))
  49.          )
  50.          (if lstSub (reverse (cons (reverse lstSub) lstAll)))
  51.          (setq strdh (car lstSub))
  52.       )
  53.   )
  54. )
  55. (defun OutputHeader (p0 / i k lst p0 p1 p2 p3 p4 p5 p6 ptlst strlst)
  56.    (setq p4 (polar p0 (* 0.5 pi) 6) p5 (polar p4 0 100) p6 (polar p0 0 100))
  57.    (EntmakeLine (list p0 p4 p5 p6 p0))
  58.    (EntmakeText "控制点坐标及高程成果表(单位:m)" (polar p0 (angle p0 p5) (/ (distance p0 p5) 2)))
  59.    (setq i 0 k 4 lst '() ptlst '() strlst '("点名" "北坐标(X)" "东坐标(Y)" "高程(H)"))
  60.    (while (< i k)
  61.       (setq p1    (polar p0 (* -0.5 pi) 6)
  62.             p2    (polar p0 0 25)
  63.             p3    (polar p1 0 25)   
  64.       )
  65.       (EntmakeText (nth i strlst) (polar p1 (angle p1 p2) (/ (distance p1 p2) 2)))
  66.       (setq lst   (cons p0 (cons p1 (cons p3 (cons p2 lst))))
  67.             ptlst (append ptlst lst)
  68.             p0 p2
  69.       )
  70.       (setq i (1+ i))
  71.    )
  72.    (EntmakeLine ptlst)
  73. )
  74. (defun Outputtable (lsp pt / i k p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 vlst)
  75.    (setq i 0 k (length lsp) p0 (polar pt (* -0.5 pi) 6))
  76.    (repeat k      
  77.       (setq vlst  (nth i lsp)
  78.             p1    (polar p0 (* -0.5 pi) 6)
  79.             p2    (polar p0 0 25)
  80.             p3    (polar p1 0 25)
  81.             p4    (polar p0 0 50)
  82.             p5    (polar p4 (* -0.5 pi) 6)
  83.             p6    (polar p0 0 75)
  84.             p7    (polar p6 (* -0.5 pi) 6)
  85.             p8    (polar p0 0 100)
  86.             p9    (polar p8 (* -0.5 pi) 6)
  87.       )
  88.       (EntmakeText (cadddr vlst) (polar p1 (angle p1 p2) (/ (distance p1 p2) 2)))
  89.       (EntmakeLine (list p0 p1 p3 p2 p0))
  90.       (EntmakeText (rtos (cadr vlst) 2 3) (polar p3 (angle p3 p4) (/ (distance p3 p4) 2)))
  91.       (EntmakeLine (list p2 p3 p5 p4 p2))
  92.       (EntmakeText (rtos (car vlst) 2 3) (polar p5 (angle p5 p6) (/ (distance p5 p6) 2)))
  93.       (EntmakeLine (list p4 p5 p7 p6 p4))
  94.       (EntmakeText (rtos (caddr vlst) 2 3) (polar p7 (angle p7 p8) (/ (distance p7 p8) 2)))
  95.       (EntmakeLine (list p6 p7 p9 p8 p6))
  96.       (setq p0 p1)
  97.       (setq i (1+ i))
  98.    )
  99. )
  100. (defun EntmakeText (str pt)
  101.   (entmake (list '(0 . "TEXT") (cons 1 str) (cons 10 pt) (cons 40 2.5) '(71 . 0) '(72 . 4) (cons 11 pt)))
  102. )
  103. (defun EntmakeLine (vertices / elist seg)
  104.   (setq elist
  105.      (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")
  106.             (cons 90 (length vertices)) (cons 70 0) (cons 38 (caddr (car vertices)))
  107.      )
  108.   )
  109.   (foreach seg vertices (setq elist (append elist (list (cons 10 seg) (cons 42 0)))))
  110.   (entmake elist)
  111. )

点评

我自己又研究了一下,发现获取点名有更简单的方法:直接用entget读取扩展数据,即关联元素为-3后的表,见一楼代码  发表于 2012-12-19 15:28
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 18:19 , Processed in 0.320192 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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