107627ZJ 发表于 2015-3-23 20:47:19

高程与坐标

指定起点按照顺序一次性提取多段线各端点高程及坐标

newbuser 发表于 2015-3-24 10:36:10

从网上搜了个获取三维多段线顶点坐标高程的函数,希望对你有用。(Defun ayGetPolyLineVTX        (LwPolyEntName /      entData1          entName1
                       pel        ptp    wpl    wpll   plp    par
                       ct        pen    rl   pn   clk    pt
                       al        gx   bj   np   xc          gg
                       rr        cp   retList
                        )
(setq entName1 LwPolyEntName)
(setq retList nil)
(setq entData1 (entget entName1))
(if (= "POLYLINE" (Cdr (Assoc 0 entData1)))
    (progn
      (setq pel             entData1                ;取出对象表.
          ptp             (Cdr (Assoc 70 pel)) ;取出结束片段型.
          wpl             '()                ;自建的点位数表.
          wpll   '()
          entName1 (EntNext entName1)
          pen             entName1
      )                                        ;end_setq
      (While (/= "SEQEND" (Cdr (Assoc 0 (entget pen)))) ;如果没束.
        (setq pel(entget pen)                ;取得顶点对象数据表.
              plp(Cdr (Assoc 10 pel))        ;取出控制点点位.
              par(Cdr (Assoc 42 pel))        ;取出弓弦比.
              wpl(Cons (List plp par) wpl) ;将数据加到WPL表中.
              wpll (cons plp wpll)
        )                                ;end_setq
        (setq pen (EntNext pen))        ;搜索下一个对象.
      )                                        ;end_while
      (setq wpll (Reverse wpll))
                                        ;以下代码暂时没有用!
      (setq ct (If (= 0 (Cadr (Car wpl)))
               "直线片段封闭"
               "弧片段封闭"
             )
      )
      (setq wpl        (Cons (Last wpl) wpl)        ;加入封闭点.
          wpl        (Reverse wpl)                ;整理WPL表.
          rl        (Length wpl)
          pn        0
      )                                        ;end_setq
      (setq clk        (If (Or (= 0 ptp) (= 128 ptp))
                  "开口"
                  "封闭"
                )
      )
      (Repeat (1- rl)                        ;逐点分析.
        (setq al (Nth pn wpl)                ;取出点数据表.
              pt (Car al)                ;取出点位.
        )                                ;end_setq
        (If (And (/= 0.0 (Cadr al)) (Nth pn wpl)) ;如果是断.
          (Progn (setq gx (Cadr al)        ;取出弓比.
                     bj (* (ATAN (ABS gx)) 4) ;计算包角.
                     np (Car (Nth (1+ pn) wpl)) ;取出下一点位.
                     xc (* 0.5 (Distance pt np)) ;半弦长计算.
                     gg (* gx xc)        ;弓高计算.
                     rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg))
               )                        ;end_setq
               (setq cp (Polar pt (setq pa (Angle pt np)) xc)
                     cp (Polar cp (+ pa (* 0.5 PI)) (- rr gg))
               )                        ;end_setq
          )                                ;end_progn
        )                                ;end_if
        (setq pn (1+ pn))
      )                                        ;end_repeat
      (setq retList wpll)
    )                                        ;end_progn
)                                        ;end_if
)

知行ooo李肖坪 发表于 2015-12-23 19:13:44

不错的东西,谢谢
页: [1]
查看完整版本: 高程与坐标