明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: gzxl

高程点内插程序(已更新)

    [复制链接]
发表于 2013-6-13 10:31:10 | 显示全部楼层
谢谢分享!很实用!这下搞测量的方便多了!
发表于 2013-6-16 22:40:13 | 显示全部楼层
增加了默认图面选项 内插点坐标输出,
  1. ;
  2. (defun c:nc-gcd ( / dataop dcl_file dcl_id dgxop dialog_return gc2op gcjl gcjlop gconeop key keys writerimage)
  3.   (vl-load-com)
  4. (setq ff (open (getfiled "文件保存为" "f:/" "dat" 1) "a"));;;;;
  5.   (setq writerImage '((8 31 5 31 7) (5 31 5 32 7) (5 32 6 32 7) (6 32 7 32 7) (7 32 8 32 7) (8 32 8 31 7) (6 30 7 30 7) (7 30 6 30 7) (4 29 5 30 7) (5 30 5 39 7) (5 39 6 40 7) (6 40 7 40 7) (7 40 8 40 7) (8 40 9 40 7) (9 40 9 39 7) (9 39 10 39 7) (10 39 7 39 7) (7 39 6 38 7) (6 38 5 38 7) (5 38 5 31 7) (5 31 8 31 7) (8 31 7 31 7) (7 31 6 31 7) (6 31 6 30 7) (6 30 4 29 7) (7 21 7 22 7) (7 22 8 22 7) (8 22 7 21 7) (8 18 7 18 7) (7 18 8 19 7) (8 19 8 20 7) (8 20 8 21 7) (8 21 7 21 7) (7 21 8 22 7) (8 22 8 28 7) (8 28 8 29 7) (8 29 7 29 7) (7 29 4 29 7) (4 29 5 30 7) (5 30 6 30 7) (6 30 7 30 7) (7 30 7 31 7) (7 31 8 31 7) (8 31 8 30 7) (8 30 9 29 7) (9 29 9 27 7) (9 27 9 20 7) (9 20 9 19 7) (9 19 8 18 7) (7 17 7 18 7) (7 18 6 18 7) (6 18 6 20 7) (6 20 7 21 7) (7 21 7 20 7) (7 20 7 19 7) (7 19 8 18 7) (8 18 8 17 7) (8 17 7 17 7) (10 10 7 10 7) (7 10 8 10 7) (8 10 9 10 7) (9 10 9 11 7) (9 11 10 11 7) (10 11 11 12 7) (11 12 11 13 7) (11 13 11 14 7) (11 14 12 15 7) (12 15 12 17 7) (12 17 12 18 7) (12 18 12 19 7) (12 19 12 21 7) (12 21 12 27 7) (12 27 12 28 7) (12 28 12 30 7) (12 30 12 31 7) (12 31 12 32 7) (12 32 11 33 7) (11 33 11 34 7) (11 34 11 35 7) (11 35 11 36 7) (11 36 10 36 7) (10 36 10 37 7) (10 37 9 38 7) (9 38 8 39 7) (8 39 7 39 7) (7 39 10 39 7) (10 39 10 38 7) (10 38 11 37 7) (11 37 12 36 7) (12 36 12 35 7) (12 35 12 34 7) (12 34 13 31 7) (13 31 13 30 7) (13 30 13 29 7) (13 29 13 27 7) (13 27 13 21 7) (13 21 13 20 7) (13 20 13 19 7) (13 19 13 17 7) (13 17 13 16 7) (13 16 12 14 7) (12 14 12 13 7) (12 13 11 11 7) (11 11 11 10 7) (11 10 10 10 7) (7 9 6 9 7) (6 9 5 10 7) (5 10 4 11 7) (4 11 3 12 7) (3 12 3 13 7) (3 13 3 14 7) (3 14 2 15 7) (2 15 2 16 7) (2 16 2 17 7) (2 17 2 19 7) (2 19 2 20 7) (2 20 2 22 7) (2 22 2 23 7) (2 23 2 24 7) (2 24 3 25 7) (3 25 3 26 7) (3 26 3 27 7) (3 27 3 28 7) (3 28 4 29 7) (4 29 7 29 7) (7 29 6 29 7) (6 29 5 29 7) (5 29 5 28 7) (5 28 4 27 7) (4 27 4 26 7) (4 26 3 24 7) (3 24 3 23 7) (3 23 3 21 7) (3 21 3 20 7) (3 20 3 19 7) (3 19 3 17 7) (3 17 3 16 7) (3 16 3 15 7) (3 15 4 14 7) (4 14 4 13 7) (4 13 5 12 7) (5 12 5 11 7) (5 11 6 11 7) (6 11 7 10 7) (7 10 10 10 7) (10 10 10 9 7) (10 9 9 9 7) (9 9 8 9 7) (8 9 7 9 7) (24 9 13 9 7) (13 9 13 20 7) (13 20 16 20 7) (16 20 13 31 7) (13 31 14 30 7) (14 30 17 18 7) (17 18 14 18 7) (14 18 14 11 7) (14 11 23 11 7) (23 11 24 9 7) (24 9 23 11 7) (23 11 20 22 7) (20 22 23 22 7) (23 22 23 30 7) (23 30 14 30 7) (14 30 13 31 7) (13 31 24 31 7) (24 31 24 21 7) (24 21 21 21 7) (21 21 24 9 7) (29 22 28 24 7) (28 24 28 30 7) (28 30 25 30 7) (25 30 29 31 7) (29 31 29 24 7) (29 24 29 22 7) (29 22 29 24 7) (29 24 29 31 7) (29 31 30 30 7) (30 30 30 24 7) (30 24 30 22 7) (30 22 29 22 7) (29 9 29 15 7) (29 15 29 16 7) (29 16 30 17 7) (30 17 30 15 7) (30 15 30 11 7) (30 11 33 11 7) (33 11 29 9 7) (29 9 28 11 7) (28 11 28 15 7) (28 15 29 17 7) (29 17 30 17 7) (30 17 29 16 7) (29 16 29 15 7) (29 15 29 9 7) (34 9 29 9 7) (29 9 33 11 7) (33 11 33 15 7) (33 15 33 17 7) (33 17 33 18 7) (33 18 33 19 7) (33 19 32 20 7) (32 20 33 20 7) (33 20 33 21 7) (33 21 33 22 7) (33 22 33 23 7) (33 23 33 24 7) (33 24 33 30 7) (33 30 30 30 7) (30 30 29 31 7) (29 31 34 31 7) (34 31 34 24 7) (34 24 34 23 7) (34 23 34 22 7) (34 22 34 21 7) (34 21 34 19 7) (34 19 34 18 7) (34 18 34 16 7) (34 16 34 15 7) (34 15 34 9 7) (29 9 24 9 7) (24 9 24 14 7) (24 14 24 15 7) (24 15 24 16 7) (24 16 24 18 7) (24 18 25 19 7) (25 19 25 20 7) (25 20 25 21 7) (25 21 24 22 7) (24 22 24 23 7) (24 23 24 25 7) (24 25 24 31 7) (24 31 29 31 7) (29 31 25 30 7) (25 30 25 25 7) (25 25 25 24 7) (25 24 25 23 7) (25 23 25 22 7) (25 22 26 21 7) (26 21 26 20 7) (26 20 26 19 7) (26 19 26 18 7) (26 18 25 18 7) (25 18 25 17 7) (25 17 25 16 7) (25 16 25 14 7) (25 14 25 11 7) (25 11 28 11 7) (28 11 29 9 7) (40 2 35 2 7) (35 2 35 31 7) (35 31 36 30 7) (36 30 36 3 7) (36 3 39 3 7) (39 3 40 2 7) (40 2 39 3 7) (39 3 39 30 7) (39 30 36 30 7) (36 30 35 31 7) (35 31 40 31 7) (40 31 40 2 7)))
  6.   (setq dcl_id (load_dialog (setq Dcl_File (Write_Dcl_addgc))))
  7.   (vl-file-delete Dcl_File)
  8.   (setq Dialog_Return 2)
  9.   (while (> Dialog_Return 1)
  10.     (new_dialog "addgc" dcl_id)
  11.     (setq keys '("dataOp" "gc2Op" "dgxOp" "gconeOp" "gcjlOp" "gcjl" "accept" "cancel" "writerImage"))
  12.     (start_image "writerImage")
  13.     (fill_image 0 0 (dimx_tile "writerImage") (dimy_tile "writerImage") 1)
  14.     (mapcar 'eval (mapcar 'cons (mapcar '(lambda (x) 'vector_image) writerImage) writerImage))
  15.     (end_image)
  16.     (foreach key keys (action_tile key "(Action_addgc_Keys $$key $$value)"))
  17.     (mode_tile "gcjl" 1)
  18.     (setq Dialog_Return (start_dialog))
  19.     (cond
  20.       ((= Dialog_Return 3)
  21.          (sratAddgc dataOp gc2Op dgxOp gconeOp gcjlOp gcjl)
  22.          (unload_dialog dcl_id)
  23.       )
  24.     )
  25.   )
  26.   (unload_dialog dcl_id)
  27.   (princ)
  28. )
  29. ;;;参数 dataOp数据文件 gc2Op两端点高程 dgxOp两条等高线 gconeOp单个高程点 gcjlOp以距离间隔 gcjl距离
  30. (defun sratAddgc (dataOp gc2Op dgxOp gconeOp gcjlOp gcjl / acaddocument acadobject ang coord dgxobj dis ent i infolst inserd ist1 ist2 k l mspace n name num pl pt pt1 pt1x pt1y pt1z pt2 ptlst s scale sjwlst ss tag txt txth use x xsws y z zpt)
  31.   ;;;获取高程点的信息
  32.   (setq AcadObject   (vlax-get-acad-object)
  33.         AcadDocument (vla-get-ActiveDocument AcadObject)
  34.         mSpace       (vla-get-ModelSpace AcadDocument)
  35.   )

  36.   (cond
  37.     ((= dataOp "1") ;数据文件生成高程点
  38.       (progn
  39.         (if (setq i 0 s (ssget '((8 . "GCD") (0 . "INSERT") (2 . "GC200"))))
  40.           (progn
  41.             (repeat (sslength s)
  42.               (setq pl (cons (cdr (assoc 10 (entget (ssname s i)))) pl)
  43.                     i  (1+ i)
  44.               )
  45.             )
  46.             ;;;高程点信息(list Scale inserD Tag txt ist1 txth ist2 xsws)
  47.             (setq infolst (getgcinfo (ssname s 0)))
  48.             (setq Scale  (car infolst)
  49.                   inserD (cadr infolst)
  50.                   Tag    (caddr infolst)
  51.                   txt    (cadddr infolst)
  52.                   ist1   (cadddr (reverse infolst))
  53.                   txth   (caddr (reverse infolst))
  54.                   ist2   (cadr (reverse infolst))
  55.                   xsws   (car (reverse infolst))
  56.             )
  57.             ;;;建立三角网
  58.             (setq sjwlst (addgcsjw pl))

  59.             (cond
  60.               ((= gconeOp "1") ;单个高程点
  61.                 (progn

  62.                  (setq ni 0)
  63.                   (while (setq pt (getpoint "\n内插高程点"))

  64.                     (setq pt (list (car pt) (cadr pt)))
  65.                     ;;角度法判断点在那个三角形 返回((ptx pty ptz) ((p1x p1y p1z) (p2x p2y p2z) (p3x p3y p3z)))
  66.                     (setq ptlst (addgcptinpm pt sjwlst))
  67.                     (if ptlst ;如果点在三角形线上或三角形内
  68.                       (progn
  69.                         ;;双线性内插计算内插点的高程值 返回内插点(x y z)
  70.                         (setq zpt (zInsert ptlst))
  71.                         ;(Entmakegcd 插入点 高程 图块比例 属性 文字字符 文字插入点 小数位数)
  72.                         (Entmakegcd zpt (caddr zpt) Scale inserD Tag txt ist1 txth ist2 xsws)

  73. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  74. (setq ni (+ ni 1))
  75. (setq pni (rtos ni 2 0))
  76. (setq py(rtos (nth 1 pt)));提取测量坐标系Y值
  77. (setq px(rtos (nth 0 pt)));提取测量坐标洗X值
  78. (setq pz(rtos (nth 2 zpt)));提取测量坐标系Z值
  79. (setq pxyz (strcat  "测量坐标:" pni ",," px ","  py  ","  pz));;;输出为CASS数据格式;;
  80. (write-line pxyz ff);写入文本
  81. (print pxyz)
  82. (prin1)
  83. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  84.                       )
  85.                     )
  86.                   )
  87.                 )
  88. (close file)
  89.               )
  90.               ((= gcjlOp "1") ;以距离间隔
  91.                 (progn
  92.                   (while
  93.                     (and (setq pt1 (getpoint "\n选择第一点"))
  94.                          (setq pt2 (getpoint "\n选择第二点"))
  95.                     )
  96.                     (setq dis (distance pt1 pt2)
  97.                           ang (angle pt1 pt2)
  98.                           num (atoi (rtos (/ dis gcjl) 2 0)) ;循环次数
  99.                           n   0
  100.                     )
  101.                     (repeat num
  102.                       (setq pt (polar pt1 ang (* n gcjl)))
  103.                       (setq pt (list (car pt) (cadr pt)))
  104.                       (setq ptlst (addgcptinpm pt sjwlst))
  105.                       (if ptlst
  106.                         (progn
  107.                            (setq zpt (zInsert ptlst))
  108.                            (Entmakegcd zpt (caddr zpt) Scale inserD Tag txt ist1 txth ist2 xsws)
  109.                         )
  110.                       )
  111.                       (setq n (1+ n))
  112.                     )
  113.                     (setq pt (list (car pt2) (cadr pt2)))
  114.                     (setq ptlst (addgcptinpm pt sjwlst))
  115.                     (if ptlst
  116.                       (progn
  117.                         (setq zpt (zInsert ptlst))
  118.                         (Entmakegcd zpt (caddr zpt) Scale inserD Tag txt ist1 txth ist2 xsws)
  119.                       )
  120.                     )
  121.                   )
  122.                 )
  123.               )
  124.             )
  125.           )
  126.         )
  127.       )
  128.     )
  129.     ((= gc2Op "1") ;两端点高程内插高程点
  130.        (progn
  131.           (setvar "OSMODE" 4)
  132.           (while
  133.             (and (setq pt1 (getpoint "\n选择第一点高程"))
  134.                  (setq pt2 (getpoint "\n选择第二点高程"))
  135.             )
  136.             (setq pt1x (car pt1))
  137.             (setq pt1y (cadr pt1))
  138.             (setq pt1z (caddr pt1))
  139.             (setq s (ssget "X" (list '(-4 . "=,=,=") (list 10 pt1x pt1y pt1z) '(-4 . "<OR") '(8 . "GCD") '(-4 . "OR>") '(-4 . "<OR") '(0 . "INSERT") '(-4 . "OR>"))))
  140.             (setq infolst (getgcinfo (ssname s 0)))
  141.             (setq Scale  (car infolst)
  142.                   inserD (cadr infolst)
  143.                   Tag    (caddr infolst)
  144.                   txt    (cadddr infolst)
  145.                   ist1   (cadddr (reverse infolst))
  146.                   txth   (caddr (reverse infolst))
  147.                   ist2   (cadr (reverse infolst))
  148.                   xsws   (car (reverse infolst))
  149.             )
  150.             (setq dis (/ (distance (list (car pt1) (cadr pt1)) (list (car pt2) (cadr pt2))) 2))
  151.             (setq ang (angle (list (car pt1) (cadr pt1)) (list (car pt2) (cadr pt2))))
  152.             (setq pt (polar (list (car pt1) (cadr pt1)) ang dis))
  153.             (setq z (+ (caddr pt1) (/ (* (- (caddr pt2) (caddr pt1)) (- (car pt) (car pt1))) (- (car pt2) (car pt1)))))
  154.             (setq zpt (list (car pt) (cadr pt) z))
  155.             (Entmakegcd zpt (caddr zpt) Scale inserD Tag txt ist1 txth ist2 xsws)
  156.           )
  157.           (setvar "OSMODE" 0)
  158.        )
  159.     )
  160.     ((= dgxOp "1") ;图面等高线内插高程点
  161.        (progn
  162.          (if (= (getvar "USERR1") 0.0)
  163.            (progn
  164.              (setq USE (getint "\n绘图比例1:<500>"))
  165.              (if (= USE nil) (setq USE 500))
  166.              (setvar "USERR1" USE)
  167.            )
  168.          )
  169.          (setq USE   (getvar "USERR1")
  170.                scale (* USE 0.001)
  171.          )
  172.          (prompt "\n===请选择图层名为DGX或DSX的Polyline线===")
  173.          (setq ss (ssget '((0 . "POLYLINE") (8 . "DSX,DGX"))))
  174.          (if ss
  175.            (progn
  176.              (setq k -1)
  177.              (setq pl '())
  178.              (repeat (sslength ss)
  179.                (setq Name   (ssname ss (setq k (1+ k)))
  180.                      ent    (entget Name)
  181.                      z      (cadddr (assoc 10 ent))
  182.                      dgxObj (vlax-ename->vla-object Name)
  183.                      coord  (vlax-get dgxObj 'Coordinates )
  184.                      i      0
  185.                      L      (length coord)
  186.                )
  187.                (repeat (/ L 3)
  188.                  (setq x (nth (* i 1) coord))
  189.                  (setq y (nth (1+ (* i 1)) coord))
  190.                  (setq pl (cons (list x y z) pl))
  191.                  (setq i (+ i 3))
  192.                )
  193.              )
  194.              (setq sjwlst (addgcsjw pl))
  195.              (cond
  196.               ((= gconeOp "1") ;单个高程点
  197.                 (progn
  198.                   (while (setq pt (getpoint "\n内插高程点"))
  199.                     (setq pt (list (car pt) (cadr pt)))
  200.                     (setq ptlst (addgcptinpm pt sjwlst))
  201.                     (if ptlst
  202.                       (progn
  203.                         (setq zpt (zInsert ptlst))
  204.                         (gxl-cs:gcd zpt (caddr zpt) scale 2)
  205.                       )
  206.                     )
  207.                   )
  208.                 )
  209.                )
  210.                ((= gcjlOp "1") ;以距离间隔
  211.                 (progn
  212.                   (while
  213.                     (and (setq pt1 (getpoint "\n选择第一点"))
  214.                          (setq pt2 (getpoint "\n选择第二点"))
  215.                     )
  216.                     (setq dis (distance pt1 pt2)
  217.                           ang (angle pt1 pt2)
  218.                           num (atoi (rtos (/ dis gcjl) 2 0)) ;循环次数
  219.                           n   0
  220.                     )
  221.                     (repeat num
  222.                       (setq pt (polar pt1 ang (* n gcjl)))
  223.                       (setq pt (list (car pt) (cadr pt)))
  224.                       (setq ptlst (addgcptinpm pt sjwlst))
  225.                       (if ptlst
  226.                         (progn
  227.                            (setq zpt (zInsert ptlst))
  228.                            (gxl-cs:gcd zpt (caddr zpt) scale 2)
  229.                         )
  230.                       )
  231.                       (setq n (1+ n))
  232.                     )
  233.                     (setq pt (list (car pt2) (cadr pt2)))
  234.                     (setq ptlst (addgcptinpm pt sjwlst))
  235.                     (if ptlst
  236.                       (progn
  237.                         (setq zpt (zInsert ptlst))
  238.                         (gxl-cs:gcd zpt (caddr zpt) scale 2)
  239.                       )
  240.                     )
  241.                   )
  242.                 )
  243.               )
  244.              )            
  245.            )
  246.          )
  247.        )
  248.     )
  249.   )
  250. )
  251. (defun addgcDXF (code elist) (cdr (assoc code elist)))
  252. (defun MakeObject (obj)
  253.   (cond
  254.     ((= (type obj) 'VLA-OBJECT) obj)
  255.     ((= (type obj) 'ENAME) (vlax-ename->vla-object obj))
  256.   )
  257. )
  258. (defun VarArray->List (vaobj)
  259.   (vlax-safearray->list (vlax-variant-value vaobj))
  260. )
  261. (defun getgcinfo (obj / attlist attobj idx inserd ist1 ist2 scale tag txt txth xsws)
  262.   (if (and (= (addgcDXF 0 (entget obj)) "INSERT") (setq obj (MakeObject obj)))
  263.     (if (= (vla-get-HasAttributes obj) :vlax-true)
  264.       (progn
  265.         (setq attlist (varArray->List (vla-GetAttributes obj))
  266.               Scale   (vla-get-XScaleFactor obj)
  267.               inserD  (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint obj))) ;点(块)的坐标值
  268.               idx     0
  269.         )
  270.         (repeat (length attlist)
  271.           (setq attobj (nth idx attlist)
  272.                 Tag   (append Tag   (list (vla-get-TagString attobj)))
  273.                 txt   (append txt   (list (vla-get-TextString attobj))) ;(高程值字符)
  274.                 ist1  (append ist1 (list (vlax-safearray->list (vlax-variant-value (vla-get-TextAlignmentPoint attobj)))))
  275.                 txth  (append txth  (list (vla-get-Height attobj))) ;高程值字符高度
  276.                 ist2  (append ist2 (list (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint attobj)))))
  277.                 idx   (1+ idx)
  278.           )
  279.         )
  280.         (cond
  281.           ((= (car Tag) "height")
  282.             (setq xsws (strlen (substr (car txt) (+ 2 (vl-string-search "." (car txt))))))
  283.           )
  284.           ((= (car Tag) "integer")
  285.             (setq xsws (strlen (cadr txt)))
  286.           )
  287.         )
  288.         (list Scale inserD Tag txt ist1 txth ist2 xsws)
  289.       )
  290.     )
  291.   )
  292. )
  293. (defun addgcsjw (pl / a al b bb c cp el L ma mi p r sl tl tr x1 x2 y1 y2)
  294.   (if pl
  295.     (progn
  296.       (setq pl (vl-sort pl (function (lambda (a b) (< (car a) (car b)))))
  297.             bb (list (apply 'mapcar (cons 'min pl)) (apply 'mapcar (cons 'max pl)))
  298.             x1 (caar bb)
  299.             x2 (caadr bb)
  300.             y1 (cadar bb)
  301.             y2 (cadadr bb)
  302.       )
  303.       (setq cp (list (/ (+ x1 x2) 2.0) (/ (+ y1 y2) 2.0))
  304.             r (* (distance cp (list x1 y1)) 20)
  305.             ma (+ (car cp) r)
  306.             mi (- (car cp) r)
  307.             sl (list (list ma (cadr cp) 0) (list mi (+ (cadr cp) r) 0) (list mi (- (cadr cp) r) 0))
  308.             al (list (cons x2 (cons cp (cons (* 20 r) sl))))
  309.             ma (1- ma)
  310.             mi (1+ mi)
  311.       )
  312.       (repeat (length pl)
  313.         (setq p  (car pl)
  314.               pl (cdr pl)
  315.               el nil
  316.         )
  317.         (while al
  318.           (setq tr  (car al)
  319.                 al  (cdr al)
  320.           )
  321.           (cond
  322.             ((< (car tr) (car p)) (setq tl (cons (cdddr tr) tl)))
  323.             ((< (distance p (cadr tr)) (caddr tr))
  324.                 (setq
  325.                    tr (cdddr tr)
  326.                    a  (car tr)
  327.                    b  (cadr tr)
  328.                    c  (caddr tr)
  329.                    el (cons (list (+ (car a) (car b)) (+ (cadr a) (cadr b)) a b)
  330.                             (cons (list (+ (car b) (car c)) (+ (cadr b) (cadr c)) b c)
  331.                                   (cons (list (+ (car c) (car a)) (+ (cadr c) (cadr a)) c a) el)
  332.                             )
  333.                       )
  334.                 )
  335.             )
  336.             (t (setq L (cons tr L)))
  337.           )
  338.         )
  339.         (setq al L
  340.               L nil
  341.               el (vl-sort el (function (lambda (a b) (if (= (car a) (car b)) (<= (cadr a) (cadr b)) (< (car a) (car b))))))
  342.         )
  343.         (while el
  344.           (if (and (= (caar el) (caadr el)) (= (cadar el) (cadadr el)))
  345.               (setq el (cddr el))
  346.               (setq al (cons (addgcgetcir p (cddar el)) al)
  347.                     el (cdr el)
  348.               )
  349.           )
  350.         )
  351.       )
  352.       (foreach tr al (setq tl (cons (cdddr tr) tl)))
  353.       (setq tl (vl-remove-if-not (function (lambda (a) (and (< mi (caadr a) ma) (< mi (caaddr a) ma)))) tl))
  354.     )
  355.   )
  356. )
  357. (defun addgcgetcir (p el / ang b c c2 cp r)
  358.   (setq b (car el)
  359.         c (cadr el)
  360.         c2 (list (car c) (cadr c))
  361.   )
  362.   (if (not (zerop (setq ang (- (angle b c) (angle b p)))))
  363.     (progn
  364.       (setq cp (polar c2 (+ -1.570796326794896 (angle c p) ang) (setq r (/ (distance p c2) (sin ang) 2.0)))
  365.             r (abs r)
  366.       )
  367.       (list (+ (car cp) r) cp r p b c)
  368.     )
  369.   )
  370. )
  371. (defun addgcptinpm (pt lst / an anl i L n p1 p2 plst ret vlst)
  372.   (setq n 0 L (length lst))
  373.   (while (< n L)
  374.     (setq vlst (car lst))
  375.     (setq i -1
  376.           p1 (last vlst)
  377.     )
  378.     (while (and (not ret) (setq p2 (nth (setq i (1+ i)) vlst)))
  379.       (cond
  380.         ((equal p2 pt 1e-4) (setq ret t))
  381.         (t
  382.           (setq an (- (angle pt p1) (angle pt p2)))
  383.           (if (equal pi (abs an) 1e-4)
  384.             (setq ret t)
  385.             (setq anl (cons (rem an pi) anl))
  386.           )
  387.         )
  388.       )
  389.       (setq p1 p2)
  390.     )
  391.     (cond
  392.       (ret (setq plst (list pt vlst))) ;线上;
  393.       (t
  394.         (if (equal pi (abs (apply '+ anl)) 1e-4)
  395.           (setq plst (list pt vlst)) ;三角网内
  396.           nil ;外
  397.         )
  398.       )
  399.     )
  400.     (setq n (1+ n))
  401.     (setq lst (cdr lst))
  402.     (if plst (setq n L))
  403.   )
  404.   plst
  405. )
  406. ;;双线性内插计算内插高程值
  407. (defun zInsert (ptl / L pt0 pt0x pt0y pt1 pt2 pta ptb ptc ptz r xa xb xc ya yb yc za zb zc zl zr)
  408.   (setq pt0  (car ptl)
  409.         pt0X (car pt0)
  410.         pt0Y (cadr pt0)
  411.         pt1  (polar (list pt0X pt0Y) 0 1000)
  412.         pt2  (polar (list pt0X pt0Y) pi 1000)
  413.         ptA  (car (cadr ptl))
  414.         Xa (car ptA)
  415.         Ya (cadr ptA)
  416.         Za (caddr ptA)
  417.         ptB  (cadr (cadr ptl))
  418.         Xb (car ptB)
  419.         Yb (cadr ptB)
  420.         Zb (caddr ptB)
  421.         ptC  (caddr (cadr ptl))
  422.         Xc (car ptC)
  423.         Yc (cadr ptC)
  424.         Zc (caddr ptC)
  425.   )
  426.   ;求交点
  427.   (setq L (inters pt1 pt2 (list Xa Ya) (list Xb Yb)))
  428.   (cond
  429.     ((/= L nil)
  430.       (setq zL (+ Za (/ (* (- Zb Za) (- (car L) Xa)) (- Xb Xa))))
  431.     )
  432.     ((= L nil)
  433.       (progn
  434.          (setq L (inters pt1 pt2 (list Xb Yb) (list Xc Yc)))
  435.          (setq zL (+ Zb (/ (* (- Zc Zb) (- (car L) Xb)) (- Xc Xb))))
  436.       )
  437.     )
  438.   )
  439.   (setq R (inters pt1 pt2 (list Xa Ya) (list Xc Yc)))
  440.   (cond
  441.     ((/= R nil)
  442.       (setq zr (+ Za (/ (* (- Zc Za) (- (car R) Xa)) (- Xc Xa))))
  443.     )
  444.     ((= R nil)
  445.       (progn
  446.         (setq R (inters pt1 pt2 (list Xb Yb) (list Xc Yc)))
  447.         (setq zr (+ Zb (/ (* (- Zc Zb) (- (car R) Xb)) (- Xc Xb))))
  448.       )
  449.     )
  450.   )
  451.   (setq ptZ (+ zL (/ (* (- zr zL) (- pt0X (car L))) (- (car R) (car L)))))
  452.   (list pt0X pt0Y ptZ)
  453. )
  454. ;;;创建Cass高程点
  455. (defun Entmakegcd (inspt height scale inserD tag txt ist1 txth ist2 xsws / blkdef d1 d2 d3 d4 obj pt pt1 pt2 pt3 pt4 str1 str2)
  456.   (setvar "CMDECHO" 0)
  457.   (command "layer" "m" "GCD" "c" "1" "" "L" "CONTINUOUS" ""  "")
  458.   (if height
  459.     (setq height (rtos height 2 xsws))
  460.     (setq height "")
  461.   )
  462.   (regapp "SOUTH")
  463.   ;;;检查字体 "HZ" 是否存在
  464.   (if (not (tblobjname "style" "HZ"))
  465.     (command "style" "HZ" "rs.shx,hztxt.shx" 0 1 0 "" "" "")
  466.   )
  467.   ;;;检查是否存在高程点图块定义
  468.   (if (not (tblobjname "block" "GC200"))
  469.     (progn
  470.       (setq blkdef (vla-Add (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3D-point '(0 0 0)) "GC200"))
  471.       (setq obj
  472.         (vla-AddPolyline
  473.            blkdef
  474.            (vlax-make-variant
  475.               (vlax-safearray-fill
  476.                  (vlax-make-safearray vlax-vbdouble (cons 0 5))
  477.                  '(-0.2 0 0 0.2 0 0)
  478.               )
  479.            )
  480.         )
  481.       )
  482.       (vla-SetBulge obj 0 1) (vla-SetBulge obj 1 1)
  483.       (vla-put-Closed obj :vlax-true)
  484.       (vla-put-ConstantWidth obj 0.4)
  485.     )
  486.   )
  487.   (cond
  488.     ((= (car tag) "height")
  489.       ;;;插入高程点
  490.       (entmake (list '(0 . "INSERT") '(100 . "AcDbEntity") '(100 . "AcDbBlockReference") '(66 . 1) (cons 2 "GC200") (cons 10 inspt) (cons 41 scale) (cons 42 scale) (cons 43 scale) '(-3 ("SOUTH" (1000 . "202101")))))
  491.       (entmake (list '(0 . "ATTRIB") '(100 . "AcDbEntity") '(100 . "AcDbText") (cons 10 (setq pt (polar inspt 0 (* 1.2 scale)))) (cons 40 (* 2.0 scale)) (cons 50 0) (cons 41 0.8) (cons 51 0) (cons 1 height) (cons 7 "HZ") (cons 72 0) (cons 11 pt) '(100 . "AcDbAttribute") (cons 2 "height") (cons 70  0) (cons 74 2)))
  492.     )
  493.     ((= (car tag) "integer")
  494.       ;;;插入水深点
  495.       (progn
  496.         (setq d1 (distance (list (car (car ist1)) (cadr (car ist1))) (list (car inserD) (cadr inserD))))
  497.         (setq d2 (distance (list (car (car ist2)) (cadr (car ist2))) (list (car inserD) (cadr inserD))))
  498.         (setq d3 (distance (list (car (cadr ist1)) (cadr (cadr ist1))) (list (car inserD) (cadr inserD))))
  499.         (setq d4 (distance (list (car (cadr ist2)) (cadr (cadr ist2))) (list (car inserD) (cadr inserD))))
  500.         (setq pt1 (polar inspt (angle (list (car inserD) (cadr inserD)) (list (car (car ist1)) (cadr (car ist1)))) d1))
  501.         (setq pt2 (polar inspt (angle (list (car inserD) (cadr inserD)) (list (car (car ist2)) (cadr (car ist2)))) d2))
  502.         (setq pt3 (polar inspt (angle (list (car inserD) (cadr inserD)) (list (car (cadr ist1)) (cadr (cadr ist1)))) d3))
  503.         (setq pt4 (polar inspt (angle (list (car inserD) (cadr inserD)) (list (car (cadr ist2)) (cadr (cadr ist2)))) d4))
  504.         (setq str1 (substr height 1 (vl-string-search "." height)))
  505.         (setq str2 (substr height (+ 2 (vl-string-search "." height))))
  506.         (entmake (list '(0 . "INSERT") '(100 . "AcDbEntity") '(100 . "AcDbBlockReference") '(66 . 1) (cons 2 "GC200") (cons 10 inspt) (cons 41 scale) (cons 42 scale) (cons 43 scale) '(-3 ("SOUTH" (1000 . "186400")))))
  507.         (entmake (list '(0 . "ATTRIB") '(100 . "AcDbEntity") '(100 . "AcDbText") (cons 10 pt2) (cons 40 (car txth)) (cons 1 str1) (cons 2 "integer") (cons 70 2) (cons 50 0) (cons 41 0.8) (cons 51 0) (cons 7 "HZ") (cons 71 0) (cons 72 2) (cons 74 1) (cons 11 pt1) '(-3 ("SOUTH" (1000 . "186411")))))
  508.         (entmake (list '(0 . "ATTRIB") '(100 . "AcDbEntity") '(100 . "AcDbText") (cons 10 pt4) (cons 40 (car txth)) (cons 1 str2) (cons 2 "decimal") (cons 70 2) (cons 50 0) (cons 41 0.8) (cons 51 0) (cons 7 "HZ") (cons 71 0) (cons 72 0) (cons 74 1) (cons 11 pt3) '(-3 ("SOUTH" (1000 . "186412")))))
  509.       )
  510.     )
  511.   )
  512.   ;;;结束标志
  513.   (entmake '((0 . "SEQEND")))
  514.   (princ)
  515. )
  516. ;;;by Gu_xl
  517. (defun gxl-cs:gcd (inspt height scale xsws / pt blkdef obj)
  518.   (setvar "CMDECHO" 0)
  519.   (command "layer" "m" "GCD" "c" "1" "" "L" "CONTINUOUS" ""  "")
  520.   (if height
  521.     (setq height (rtos height 2 xsws))
  522.     (setq height "")
  523.   )
  524.   (regapp "SOUTH")
  525.   ;;;检查字体 "HZ" 是否存在
  526.   (if (not (tblobjname "style" "HZ"))
  527.     (command "style" "HZ" "rs.shx,hztxt.shx" 0 1 0 "" "" "")
  528.   )
  529.   ;;;检查是否存在高程点图块定义
  530.   (if (not (tblobjname "block" "GC200"))
  531.     (progn
  532.       (setq blkdef (vla-Add (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3D-point '(0 0 0)) "GC200"))
  533.       (setq obj
  534.         (vla-AddPolyline
  535.            blkdef
  536.            (vlax-make-variant
  537.               (vlax-safearray-fill
  538.                  (vlax-make-safearray vlax-vbdouble (cons 0 5))
  539.                  '(-0.2 0 0 0.2 0 0)
  540.               )
  541.            )
  542.         )
  543.       )
  544.       (vla-SetBulge obj 0 1) (vla-SetBulge obj 1 1)
  545.       (vla-put-Closed obj :vlax-true)
  546.       (vla-put-ConstantWidth obj 0.4)
  547.     )
  548.   )
  549.   ;;;插入块
  550.   (entmake (list
  551.              '(0 . "INSERT")
  552.              '(100 . "AcDbEntity")
  553.              '(100 . "AcDbBlockReference")
  554.              '(66 . 1);;;属性跟随标志,1跟随,0不跟随
  555.               (cons 2 "GC200")
  556.               (cons 10 inspt)
  557.               (cons 41 scale)
  558.               (cons 42 scale)
  559.               (cons 43 scale)
  560.               '(-3 ("SOUTH" (1000 . "202101")))
  561.            )
  562.   )
  563.   ;;;插入属性
  564.   (entmake (list
  565.              '(0 . "ATTRIB")
  566.              '(100 . "AcDbEntity")
  567.              '(100 . "AcDbText")
  568.               (cons 10 (setq pt (polar inspt 0 (* 1.2 scale))))
  569.               (cons 40 (* 2.0 scale))
  570.               (cons 50 0)
  571.               (cons 41 0.8)
  572.               (cons 51 0)
  573.               (cons 1 height)
  574.               (cons 7 "HZ")
  575.               (cons 72 0)
  576.               (cons 11 pt)
  577.               '(100 . "AcDbAttribute")
  578.               (cons 2 "height")
  579.               (cons 70  0)
  580.               (cons 74 2)
  581.            )
  582.    )
  583.    ;;;结束标志
  584.    (entmake '((0 . "SEQEND")))
  585.    (princ)
  586. )
  587. (defun Action_addgc_Keys (key Value)
  588.   (cond
  589.     ((= key "accept")
  590.       (setq dataOp (get_tile "dataOp") gc2Op (get_tile "gc2Op") dgxOp (get_tile "dgxOp") gconeOp (get_tile "gconeOp")
  591.             gcjlOp (get_tile "gcjlOp") gcjl (atof (get_tile "gcjl"))
  592.       )
  593.       (done_dialog 3)
  594.     )
  595.     ((= key "gconeOp") (mode_tile "gcjl" 1))
  596.     ((= key "gcjlOp") (mode_tile "gcjl" 0))
  597.     ((= key "gc2Op") (mode_tile "gcjl" 1) (mode_tile "gcjlOp" 1))
  598.     ((= key "dataOp") (mode_tile "gcjlOp" 0))
  599.     ((= key "dgxOp") (mode_tile "gcjlOp" 0))
  600.     ((= key "cancel") (done_dialog 0))
  601.   )
  602. )
  603. (defun Write_Dcl_addgc ( / Dcl_File file str)
  604.   (setq Dcl_File (vl-filename-mktemp nil nil ".Dcl"))
  605.   (setq file (open Dcl_File "w"))
  606.   (foreach str '(
  607.     "addgc:dialog"
  608.     "{"
  609.     " label = "高程点内插程序";"
  610.     "    :row"
  611.     "    {"
  612.     "        :boxed_column"
  613.     "        {"
  614.     "         label = "高程参考" ;"
  615.     "            :radio_button"
  616.     "            {"
  617.     "                key = "dataOp" ;"
  618.     "                label = "图面高程点" ;"
  619.     "                width = 10.95 ;"
  620.     "                height = 1.275 ;"
  621.     "                value = "1" ;"
  622.     "            }"
  623.     "            :radio_button"
  624.     "            {"
  625.     "                key = "gc2Op" ;"
  626.     "                label = "两端点高程" ;"
  627.     "                width = 12.15 ;"
  628.     "                height = 1.275 ;"
  629.     "            }"
  630.     "            :radio_button"
  631.     "            {"
  632.     "                key = "dgxOp" ;"
  633.     "                label = "图面等高线" ;"
  634.     "                width = 12.15 ;"
  635.     "                height = 1.275 ;"
  636.     "            }"
  637.     "        }"
  638.     "        :boxed_column"
  639.     "        {"
  640.     "         label = "生成方式" ;"
  641.     "            :radio_button"
  642.     "            {"
  643.     "                key = "gconeOp" ;"
  644.     "                label = "逐个内插" ;"
  645.     "                width = 10.15 ;"
  646.     "                height = 1.275 ;"
  647.     "                value = "1" ;"
  648.     "                fixed_width = true ;"
  649.     "            }"
  650.     "            :radio_button"
  651.     "            {"
  652.     "                key = "gcjlOp" ;"
  653.     "                label = "线状内插" ;"
  654.     "                width = 10.15 ;"
  655.     "                height = 1.275 ;"
  656.     "                fixed_width = true ;"
  657.     "            }"
  658.     "            :edit_box"
  659.     "            {"
  660.     "                key = "gcjl" ;"
  661.     "                label = "m=" ;"
  662.     "                width = 1.15 ;"
  663.     "                height = 0.675 ;"
  664.     "                value = "5" ;"
  665.     "                fixed_width = true ;"
  666.     "            }"
  667.     "        }"
  668.     "    }"
  669.     "    :row"
  670.     "    {"
  671.     "       :button"
  672.     "       {"
  673.     "          key = "accept" ;"
  674.     "          label = "确定" ;"
  675.     "          width = 3.15 ;"
  676.     "          height = 2.275 ;"
  677.     "          is_default = true;"
  678.     "       }"
  679.     "       :button"
  680.     "       {"
  681.     "          key = "cancel" ;"
  682.     "          label = "取消" ;"
  683.     "          width = 3.15 ;"
  684.     "          height = 2.275 ;"
  685.     "          is_cancel = true;"
  686.     "       }"
  687.     "       :image"
  688.     "       {"
  689.     "          key = "writerImage" ;"
  690.     "          width = 2.25 ;"
  691.     "          height = 3.275 ;"
  692.     "       }"
  693.     "    }"
  694.     "}"
  695.     )
  696.     (write-line str file)
  697.   )
  698.   (close file)
  699.   Dcl_File
  700. )

评分

参与人数 1明经币 +1 金钱 +5 收起 理由
gzxl + 1 + 5 很给力!

查看全部评分

 楼主| 发表于 2013-6-16 23:29:25 | 显示全部楼层
skg123 发表于 2013-6-16 22:40
增加了默认图面选项 内插点坐标输出,

老大,也帮忙把代码也优化下
发表于 2013-6-17 23:46:32 | 显示全部楼层
修改了一下,输出为CASS的格式,方便把内插点再应用

本帖子中包含更多资源

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

x
发表于 2013-6-17 23:47:40 | 显示全部楼层
gzxl 发表于 2013-6-16 23:29
老大,也帮忙把代码也优化下

你的水平在我之上,我是借鉴你的代码 加以利用。
发表于 2013-6-28 19:21:00 | 显示全部楼层
谢谢。学习了。。
发表于 2013-7-5 21:03:38 | 显示全部楼层
挺好的,顶一顶,不过为什么一次是横向10个点,另一次却变成了斜着的十个点呢?(怎么控制呢?
发表于 2013-7-20 18:13:00 | 显示全部楼层
好东西啊!!!
发表于 2013-7-22 06:53:39 | 显示全部楼层
不太适用!这个加的意义不大
发表于 2013-10-16 21:22:49 | 显示全部楼层
下载了怎么安装啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-19 08:35 , Processed in 0.183907 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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