77077 发表于 2012-3-21 13:33:41

求高手帮我修改下这个计算坡度的程序!

(defun c:podu( / a a1 d dx dy i os p1 p2 pt0 str stri)
(princ "\n欢迎使用坡度标注程序! 命令podu")
(princ "\n分别选择需要计算的两个高程数据:")
(princ "\n别多选,选多了计算一定会出错!")
(setq s (ssget))
(setq n (sslength s))
(setq k 0 )(setq hh 0.0)
(while (< k n)
      (setq name (ssname s k))
      (setq a (entget name))
      (setq t1 (assoc '0 a))
      (setq t1 (cdr t1))
      (if (= t1 "TEXT") (PROGN
          (setq tx (assoc '1 a))
          (setq tx (cdr tx))
          (setq tx (atof tx))
          (if (= k 0) (setq hh TX))
          (if (/= k 0) (setq hh (- hh tx)))
         ))
      (setq k (+ k 1))
)
; (setq hh (rtos hh 2 2));计算出高差
; (princ "\n高程差为:" hh)
;------------------------------------------------
(setq olay (getvar "clayer"))
(setvar "cmdecho" 0)
;==================================================
(princ "\n选择坡度线(可以是PL或L,支持多选):")
(vl-load-com)
(setq SUMLEN 0)
(setq SS (ssget '((0 . "CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE,ARC"))))
(setq N 0)
(repeat (sslength SS)
    (setq CURVE (vlax-ename->vla-object (ssname SS N)))
    (setq TLEN (vlax-curve-getdistatparam
CURVE
(vlax-curve-getendparam CURVE)
       )
    )
    (setq SUMLEN (+ SUMLEN TLEN))
    (setq N (1+ N))
)
;(setq SUMLEN1 (rtos SUMLEN 2 3));计算出坡长为SUMLEN1
;=======================开始计算坡度========================
(setq i (* (/ hh SUMLEN) 100);计算出坡度
      stri (rtos i 2 2);坡坡度取1位小数
      SUMLEN1 (rtos SUMLEN 2 2);坡长取2位小数
      text (if (= dx 0) "垂直" (strcat "i=" stri "%" "L=" SUMLEN1 "m"))
)
;===================开始输出结果==========================
(command "undo" "g")
(setq os (getvar "osmode"))
(setvar "osmode" 1)
(setq p1 (getpoint "\标注箭头的位置:")
      p2 (getpoint "\n标注箭尾的方向:" p1)
       ang (angle p1 p2)
      ang2 (* ang 57.3)
       ang5 (+ 70 ang)
       pt0 (polar p1 ang5 1.5) ; 确定文字距离箭头的偏移位置
)
(setvar "osmode" os)
(grdraw p1 p2 2)
      (setq olay (getvar "clayer"))
      (command "_layer" "m" "DM-坡度标注" "c" "3" "" "")
      (command "pline" p1 "w" "0" "1.3" (polar p1 ang 5) "w" "0" "0" (polar p1 ang 43) "")
      (command "text" "j" "bl" pt0 "3.0" ang2 text) ;pt0=文字位置,ang2=文字的角度,text=文本数据 ,bl表示文字对齐点为左下
    (command "undo" "e")
       (command "layer" "s" olay "")
(princ)
)

这个程序上半部分是从别人那里找来拼凑起来的,下半部分是我自己写的,请高手帮我修改下
1.按顺序选择第一个高程,第二个高程
2.判断两个数的大小并计算差值,这个程序目前会计算出负值来。。。。。
3.还有其他可以修改的更完善的,请高手修改下,谢谢!

hb198075 发表于 2012-3-21 16:24:34

本帖最后由 hb198075 于 2012-3-31 11:24 编辑

你这个不太好改,发个我的给你用用。
不知道为什么我30K的文件也说太大了不让传。
发的链接,我也不知道能不能用啊。

叮咚 发表于 2012-3-21 20:27:42

(defun c:podu ()
(vl-load-com)
(setq os (getvar "osmode"))
(princ "\n分别选择需要计算的两个高程数据:")
(setq en1 (car (entsel "\n选择第一个数:")))
(setq x1 (vlax-ename->vla-object en1))
(setq h1 (atof (vla-get-textstring x1)))
(while (null h1)
    (alert "\n选择一个数字!")
    (setq en1 (car (entsel "\n选择第一个数:")))
    (setq x1 (vlax-ename->vla-object en1))
    (setq h1 (atof (vla-get-textstring x1)))
)
(setq en2 (car (entsel "\n选择第二个数:")))
(setq x2 (vlax-ename->vla-object en2))
(setq h2 (atof (vla-get-textstring x2)))
(while (null h2)
    (alert "\n选择一个数字!")
    (setq en2 (car (entsel "\n选择第一个数:")))
    (setq x2 (vlax-ename->vla-object en2))
    (setq h2 (atof (vla-get-textstring x2)))
)
(setq hh (abs (- h1 h2)))
(setq olay (getvar "clayer"))
                                        ;==================================================
(princ "\n选择坡度线(可以是PL或L,支持多选):")
(setq SS (ssget '((0 . "CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE,ARC"))))
(setq        N 0
        SUMLEN 0
)
(repeat (sslength SS)
    (setq CURVE (vlax-ename->vla-object (ssname SS N)))
    (setq TLEN (vlax-curve-getdistatparam
               CURVE
               (vlax-curve-getendparam CURVE)
             )
    )
    (setq SUMLEN (+ SUMLEN TLEN))
    (setq N (1+ N))
)
                                        ;(setq SUMLEN1 (rtos SUMLEN 2 3));计算出坡长为SUMLEN1
                                        ;=======================开始计算坡度========================
(setq        i      (* (/ hh SUMLEN) 100)        ;计算出坡度
        stri   (rtos i 2 1)                ;坡坡度取1位小数
        SUMLEN (rtos SUMLEN 2 2)        ;坡长取2位小数
        text   (if (= i 0)
               "垂直"
               (strcat "i=" stri "%" "L=" SUMLEN "m")
             )
)
                                        ;===================开始输出结果==========================
(command "undo" "be")
(setq os (getvar "osmode"))
(setq        p1(getpoint "\标注箭头的位置:")
        p2(getpoint "\n标注箭尾的方向:" p1)
        ang (angle p1 p2)
        pt0 (polar p1 ang 1.5)                ; 确定文字距离箭头的偏移位置
)
(grdraw p1 p2 2)
(setq olay (getvar "clayer"))
(if (null (tblsearch "layer" "DM-坡度标注"))
    (command "_layer" "m" "DM-坡度标注" "c" "3" "" "")
)
(setvar "clayer" "DM-坡度标注")
(setvar "osmode" 0)
(command "pline"
           p1
           "w"
           "0"
           "1.3"
           (polar p1 ang 5)
           "w"
           "0"
           "0"
           (polar p1 ang 43)
           ""
)
(command "text" "bl" pt0 "3.0" (/ (* ang 180) pi) text)
                                        ;pt0=文字位置,ang=文字的角度,text=文本数据 ,bl表示文字对齐点为左下
(setvar "clayer" olay)
(command "undo" "e")
(princ)
)
(prompt "\n欢迎使用坡度标注程序! 命令podu")

77077 发表于 2012-3-22 14:39:13

收到,谢谢楼上!

夺天工 发表于 2014-11-12 17:31:36

hb198075,还是以毫米为单位的推算,牛x

waly008 发表于 2018-9-30 10:41:49

hb198075 发表于 2012-3-21 16:24
你这个不太好改,发个我的给你用用。
不知道为什么我30K的文件也说太大了不让传。
发的链接,我也不知道 ...

这个程序真牛x
页: [1]
查看完整版本: 求高手帮我修改下这个计算坡度的程序!