测量lisp小程序

1. 坐标展点

读取坐标文本文件,标出点位与点号,高程(属性块)

  (defun c:plot_point () ;;;坐标展点
    (if (not (tblsearch "block" "block_point"))
    (write_block))
    (setq osmode_old (getvar "osmode"))
    (setvar "osmode" 0)
    (setvar "attdia" 0)  ;;;设定块的属性由命令行输入
    (setq file (getfiled "选定点位数据文件" "d:/" "txt" 0))
    (setq f (open file "r"))
    (setvar "cmdecho" 0)
    (setq s (read-line f))
    (while (/= s "000")
      (setq pn (substr s 17 4))
      (setq x (atof (substr s 37 10)))
      (setq y (atof (substr s 21 10)))
      (setq h (atof (substr s 53 10)) h (rtos h 2 2))
      (command "_insert" "block_point" (list x y) 1 1 0 pn h "")
      (setq s (read-line f))
    )
      (close file)
      (setvar "cmdecho" 1)
      (setvar "osmode" osmode_old)
  )
  (defun write_block () ;;;创建一个名为block_point的块
    (command "_attdef" "" "No" "点号" "" '(1 0.5) 1 "")
    (setq e1 (entlast))
    (command "_attdef" "" "Height" "高程" "" '(1 -1.5) 1 "")
    (command "line" '(1 0) '(5 0) "")
    (command "point" '(0 0))
    (setq e2 (entnext e1) e3 (entnext e2) e4 (entnext e3))
    (setq ss (ssadd))
    (ssadd e1 ss)
    (ssadd e2 ss)
    (ssadd e3 ss)
    (ssadd e4 ss)
    (command "_block" "block_point" '(0 0) ss "") 
    (entdel e1)
    (entdel e2)
    (entdel e3)
    (entdel e4)
  )

2. 坐标解算:内外插点法

(捕捉两个已知点,输入与第一个点的距离)

  (defun c:insert_point ()
    (setq osmode (getvar "osmode"))
    (setvar "osmode" 9) ;;;只捕捉端点和节点
    (setq pt1 (getpoint "输入第一个点"))
    (setq pt2 (getpoint "输入第二个点" pt1))
    (setvar "osmode" 0)
    (setq dist (getdist "输入与第一个点的距离,同向为正,反向为负" pt1))
    (setq D (distance pt1 pt2))
    (setq lambda1 (/ dist (- D dist))) ;;;lambda为AP:PB的比值,方便用定比分点公式
    (setq x (/ (+ (car pt1) (* lambda1 (car pt2))) (1+ lambda1)))
    (setq y (/ (+ (cadr pt1) (* lambda1 (cadr pt2))) (1+ lambda1)))
    (command "point" (list x y))
    (setvar "osmode" osmode)
  )

3. 坐标解算:直角坐标法

(捕捉两个已知点,输入与第一个点的距离以及到连线的垂距)

  (defun c:verticle_dist ()
    (setq osmode (getvar "osmode"))
    (setvar "osmode" 16393) ;;;只捕捉端点和节点
    (setq pt1 (getpoint "输入第一个点"))
    (setq pt2 (getpoint "输入第二个点" pt1))
    (setvar "osmode" 0)
    (setq L (getdist "输入与第一个点沿线的距离,同向为正,反向为负" pt1))
    (setq h (getdist "输入到连线的垂距,逆时针为正,顺时针为负"))
    (setq x0 (car pt1) y0 (cadr pt1));;;运用直角坐标变换公式
    (setq theta (angle pt1 pt2))
    (setq x (+ (* (cos theta) L) (* (sin theta) (- 0 h)) x0))
    (setq y (+ (* (sin theta) L) (* (cos theta) h) y0))  
    (command "point" (list x y))
    (setvar "osmode" osmode)
  )

4. 坐标解算:距离交汇法

(捕捉两个已知点,输入两个距离)

  (defun c:dist_intersect(/ b a c)
    (setq osmode (getvar "osmode"))
    (setvar "osmode" 16393) ;;;只捕捉端点和节点
    (setq pt1 (getpoint "输入第一个点"))
    (setq pt2 (getpoint "输入第二个点" pt1))
    (setvar "osmode" 0)
    (setq b (getdist "输入与第一个点的距离" pt1))
    (setq a (getdist "输入与第二个点的距离" pt2))
    (setq c (distance pt1 pt2))
    (setq L (/ (+ (* b b) (* c c) (* a (- 0 a))) (* 2 c)))
    (setq h (sqrt (- (* b b) (* L L))))
    (setq x0 (car pt1) y0 (cadr pt1));;;运用直角坐标变换公式
    (setq theta (angle pt1 pt2))
    (setq x (+ (* (cos theta) L) (* (sin theta) (- 0 h)) x0))
    (setq y (+ (* (sin theta) L) (* (cos theta) h) y0)) 
    (command "point" (list x y))
    (setvar "osmode" osmode)
  )

5. 求某图层下lwpolyline的面积

    (defun c:areaPl()
      (setq lyr (getstring "输入图层名:\n"))
      (setq ss (ssget "x" (list (cons 8 lyr) (cons 0 "lw*"))))
      (setq len (sslength ss))
      (setq i 0)
      (if ss
        (progn
          (command "area" "a" "o")
          (while (< i len)
            (setq ent (ssname ss i))
            (command ent)
            (setq i (1+ i)) 
          )
        )
      )
      (command "" "")
      (setq s (getvar "area"))
      (princ "面积:")
      (princ s)
      (princ)
    )
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值