明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 323|回复: 5

根据三角网计算开挖边坡顶线,高程要够密度准确些PDPJ

[复制链接]
发表于 2023-6-2 12:37 | 显示全部楼层 |阅读模式
本帖最后由 树櫴希德 于 2023-6-2 12:40 编辑

根据三角网计算开挖边坡顶线,高程要够密度准确些

  1. (defun mkgcd (inspt height  scale  / pt  pt1 blkdef obj)
  2.   (setvar "CMDECHO" 0)
  3.   (command "layer" "m" "检查高程点" "c" "1" "" "L" "CONTINUOUS" ""  "")
  4.   (if height
  5.     (setq height (rtos height 2 3))
  6.     (setq height "")
  7.   )

  8.   
  9.   (regapp "SOUTH")
  10.   ;;;检查字体 "HZ" 是否存在
  11.   (if (not (tblobjname "style" "HZ"))
  12.     (command "style" "HZ" "rs.shx,hztxt.shx" 0 1 0 "" "" "")
  13.   )
  14.   ;;;检查是否存在高程点图块定义
  15.   (if (not (tblobjname "block" "GC2000"))
  16.     (progn
  17.       ;13、entmake生成普通块
  18. (defun emkblk ( pt name /  )
  19.   (entmake (list '(0 . "block") (cons 2 name) '(70 . 0) (cons 10 pt)))

  20.   
  21. (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 4) (cons 10 (list (+ (car pt) 0.75)  (+ (cadr pt) 1)   ))(cons 10 pt) (cons 10 (list (- (car pt) 0.75)  (+ (cadr pt) 1)   ))

  22. (cons 10 (list (+ (car pt) 4.25)  (+ (cadr pt) 1)   ))



  23.          ))
  24.   
  25.   (entmake '((0 . "ENDBLK")))
  26.   
  27.   ;(entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt)))
  28. )

  29.   (emkblk '(0 0) "GC2000")
  30.     )
  31.   )
  32.   ;;;插入块
  33.   (entmake (list
  34.              '(0 . "INSERT")
  35.              '(100 . "AcDbEntity")
  36.              '(100 . "AcDbBlockReference")
  37.              '(66 . 1);;;属性跟随标志,1跟随,0不跟随
  38.               (cons 2 "GC2000")
  39.               (cons 10 inspt)
  40.               (cons 41 scale)
  41.               (cons 42 scale)
  42.               (cons 43 scale)
  43.               '(-3 ("SOUTH" (1000 . "202101")))
  44.            )
  45.   )
  46.   ;;;插入属性
  47.   (entmake (list
  48.              '(0 . "ATTRIB")
  49.              '(100 . "AcDbEntity")
  50.              '(100 . "AcDbText")
  51.               (cons 10 (setq pt (polar inspt (* 0.5 PI) (* 2.25 scale))))
  52.               (cons 40 (* 2.0 scale))
  53.               (cons 50 0)
  54.                (cons 62 3)
  55.               (cons 41 0.8)
  56.               (cons 51 0)
  57.               (cons 1 height)
  58.               (cons 7 "HZ")
  59.               (cons 72 0)
  60.               (cons 11 pt)
  61.               '(100 . "AcDbAttribute")
  62.               (cons 2 "height")
  63.               (cons 70  0)
  64.               (cons 74 2)
  65.            )
  66.    )
  67. ;;;;;;;;;;;;;;;;;;;;;;;
  68. ;;;插入属性
  69.   
  70.   
  71.    ;;;结束标志
  72.    (entmake '((0 . "SEQEND")))
  73.    (princ)
  74. )


  75. ;;;;;;;;===========================================


  76. ;; 测量选定曲线上两点之间的距离
  77. (defun apkl (ENOBJ p1 p2 / DIST DIST1 DIST2 EN ENOBJ OSM P1 P2)
  78. ;;;来源:QQ群友:GreenWood(181976640)。属QQ群:SP编程,e派<a href="http://bbs.mjtd.com/forum-6-1.html" target="_blank" class="relatedlink">工具</a>箱,摄影  24942984
  79.   
  80.   
  81. ;(setq ENOBJ (CAR (ENTSEL)))
  82. ;(setq p1 (getpoint "\n选择曲线上的一点:"))
  83. ;(setq p2 (getpoint "\n选择曲线上的另一点:"))
  84. (setq dist1 (vlax-curve-getDistAtPoint enobj p1))
  85. (setq dist2 (vlax-curve-getDistAtPoint enobj p2))
  86. ;(print "\n测量段曲线长度:")
  87. (setq dist (abs (- dist1 dist2)))
  88. dist
  89. )

  90. (defun c:bg11 (  / ENOBJ p1 p2 s1 s2 p3  dist gcc bz dist1 xgc p33)

  91. (setq ENOBJ (CAR (ENTSEL "\n请选择线段")))
  92. (setq p1 (getpoint "\n选择曲线上的一点:"))
  93.   (setq s1 (getreal "\n请输入该点标高:"))
  94. (setq p2 (getpoint "\n选择曲线上的另一点:"))
  95. (setq s2 (getreal "\n请输入该点标高:"))
  96.   (setq dist (apkl ENOBJ p1 p2 ))
  97. (setq gcc (- s1 s2))
  98.   (setq bz (/ gcc dist))
  99.   (while (setq p33 (getpoint "\n选择曲线上要查询的一点:")
  100.                p3   (vlax-curve-getClosestPointTo ENOBJ p33 T)

  101.          )
  102.          
  103.    
  104.     (setq dist1 (apkl ENOBJ p3 p2 ) )
  105. (setq xgc (+ s2 (* dist1 bz )))

  106.     (mkgcd p3 xgc  1)
  107.     (command "rotate" (entlast) "" p3 (* (- (angle p3 p33) (/ pi 2) ) (/ 180 pi) )  )
  108.     ;(entmake (list '(0 . "TEXT") '(8 . "fgbj")(cons 1 (rtos xgc 2 3)) (cons 10 p3 ) (cons 40 1.0)))
  109.    )
  110. (princ)
  111.       )

  112. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  113. ;;;by Gu_xl
  114. (defun gxl-cs:gcd (inspt height scale / pt blkdef obj);展高程点函数(inspt:插入点,heitht:高程值,scale:缩放比例,xsws:高程注记位数)
  115. (vl-load-com) ;将 Visual LISP 扩展功能加载到 AutoLISP
  116.   (regapp "SOUTH")
  117.   (setvar "CMDECHO" 0)
  118.   (command "layer" "m" "GCD" "c" "1" "" "L" "CONTINUOUS" ""  "")
  119.   (if height
  120.     (setq height (rtos height 2 3));3为高程注记位数
  121.     (setq height "")
  122.   )
  123.   (regapp "SOUTH")
  124.   
  125.   ;;;检查字体 "HZ" 是否存在
  126.   (if (not (tblobjname "style" "宋体"))
  127.     ;(command "style" "HZ" "rs.shx,hztxt.shx" 0 1 0 "" "" "")
  128.     (command "style" "宋体" "" 0 1 0 "" "" "")
  129.   )
  130.   ;;;检查是否存在高程点图块定义
  131.   (if (not (tblobjname "block" "GC200"))
  132.     (progn
  133.       (setq blkdef (vla-Add (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3D-point '(0 0 0)) "GC200"))
  134.       (setq obj
  135.         (vla-AddPolyline
  136.            blkdef
  137.            (vlax-make-variant
  138.               (vlax-safearray-fill
  139.                  (vlax-make-safearray vlax-vbdouble (cons 0 5))
  140.                  '(-0.2 0 0 0.2 0 0)
  141.               )
  142.            )
  143.         )
  144.       )
  145.       (vla-SetBulge obj 0 1) (vla-SetBulge obj 1 1)
  146.       (vla-put-Closed obj :vlax-true)
  147.       (vla-put-ConstantWidth obj 0.4)
  148.     )
  149.   )
  150.   ;;;插入块
  151.   (entmake (list
  152.              '(0 . "INSERT")
  153.              '(100 . "AcDbEntity")
  154.              '(100 . "AcDbBlockReference")
  155.              '(66 . 1);;;属性跟随标志,1跟随,0不跟随
  156.               (cons 2 "GC200")
  157.               (cons 10 inspt)
  158.               (cons 41 scale)
  159.               (cons 42 scale)
  160.               (cons 43 scale)
  161.               (list -3 '("SOUTH" (1000 . "202101")))
  162.            )
  163.   )
  164.   ;;;插入属性
  165.   (entmake (list
  166.              '(0 . "ATTRIB")
  167.              '(100 . "AcDbEntity")
  168.              '(100 . "AcDbText")
  169.               (cons 10 (setq pt (polar inspt 0 (* 1.2 scale))))
  170.               (cons 40 (* 2.0 scale))
  171.               (cons 50 0)
  172.               (cons 41 0.8)
  173.               (cons 51 0)
  174.               (cons 1 height)
  175.               (cons 7 "宋体")
  176.        (cons 62 3)
  177.               (cons 72 0)
  178.               (cons 11 pt)
  179.               '(100 . "AcDbAttribute")
  180.               (cons 2 "height")
  181.               (cons 70  0)
  182.               (cons 74 2)
  183.            )
  184.    )
  185.    ;;;结束标志
  186.    (entmake '((0 . "SEQEND")))
  187.    (princ)
  188. )
  189. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  190. (defun PoInPl(pt p / n i va ang);;该过程由 StEf  44604813提供,本人只是把输出由原来的t,nil改为了-1,0,1
  191.       (setq n(length pt)
  192.       pt(append pt(list(car pt)))i 0 ang 0)
  193.       (while(< i n)
  194.   (setq va(-(angle p(nth i pt))(angle p(nth(1+ i)pt))))
  195.   (if (<(abs(-(abs va)pi))0.000001)(setq ang 2 i n)
  196.     (progn(cond((> va pi)(setq va (- va pi)))
  197.          ((< va (* -1 pi))(setq va (+ va pi))))
  198.       (setq ang(+ ang va)i(1+ i)))))
  199.       (if(= ang 2)0
  200.   (if(<(abs(-(abs ang) pi))0.000001)1 -1))
  201.       )
  202. ;defun
  203. (defun plinexy(e / a q m p);;;LWPolyline,POLYLINE顶点,去掉完全重合点
  204.     (setq a(vlax-ename->vla-object e)
  205.   q(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates a)))
  206.     m(vla-get-objectname a)a 0
  207.     m(if(= m"AcDb3dPolyline")3 2))
  208.     (repeat(/(length q)m)
  209.       (cond((= m 2)(setq p1(list(nth a q)(nth(+ a 1)q))))
  210.      ((= m 3)(setq p1(list(nth a q)(nth(+ a 1)q)(nth(+ a 2)q)))))
  211.       (setq p(if (member p1 p)p (append p(list p1)))
  212.       a(+ a m)))
  213.     p)
  214. (defun xyp-Pline (lst / lst pt)
  215. (entmake (append    (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst))'(70 . 129))
  216.       (mapcar '(lambda (pt)(cons 10 pt)) lst ))
  217.   ) (vl-cmdf "_.region" (entlast) "") (entlast)
  218. )
  219. ;;改改更贱康
  220. (defun temp (pa pb p0 p1 p2 / MAT:vxv {vp} {v} a b)
  221.   (defun MAT:vxv (u v)
  222.     (list
  223.       (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  224.       (- (* (car v) (caddr u)) (* (car u) (caddr v)))
  225.       (- (* (car u) (cadr v)) (* (car v) (cadr u)))
  226.     )
  227.   )
  228.   (setq {vp} (MAT:vxv (mapcar '- p1 p0) (mapcar '- p2 p0)))
  229.   (setq {v} (mapcar '- pa pb))
  230.   (setq  a (apply '+
  231. (mapcar '(lambda (n m vp) (* (- n m) vp)) p0 pa {vp})
  232.   )
  233.   )
  234.   (setq b (apply '+ (mapcar '* {vp} {v})))
  235.   (if (equal b 0.0 1e-6)
  236.     nil
  237.     (mapcar '(lambda (m v) (+ m (* v (/ a b)))) pa {v})
  238.   )
  239. )
  240. (defun insertgc ( e / e)
  241.   (cdr(assoc 10(entget e)))  )

  242. (defun c:pdpj (   /  ENOBJ p1 p2 s1 s2 p3 p33 dist gcc bz dist1 xgc p33 podu blc  p11 ang p22 pts1 pts ssa ii en ptb pzx pzx1 no)
  243.   
  244.   (setq blc (getint "\n请输入比例尺1:<500>"))
  245.   (if (= blc nil)(setq blc 500))
  246.   (setvar 'userr1 blc);设置比例尺
  247. (setq scale (* 0.001 blc));缩放比例
  248.   
  249.   (setq podu (getreal "\n请输入坡度1:(挖+填-)?"))

  250.   ;;;;;
  251.   (setq ENOBJ (CAR (ENTSEL "\n请选择线段")))
  252. (setq p1 (getpoint "\n选择曲线上的一点:"))
  253.   (setq s1 (getreal "\n请输入该点标高:"))
  254. (setq p2 (getpoint "\n选择曲线上的另一点:"))
  255. (setq s2 (getreal "\n请输入该点标高:"))
  256.   (setq dist (apkl ENOBJ p1 p2 ))
  257. (setq gcc (- s1 s2))
  258.   (setq bz (/ gcc dist))
  259.   (while (setq p33 (getpoint "\n选择曲线上要查询的一点:")
  260.               

  261.          )
  262.          (setq  p3   (vlax-curve-getClosestPointTo ENOBJ p33 T))
  263.    
  264.     (setq dist1 (apkl ENOBJ p3 p2 ) )
  265. (setq xgc (+ s2 (* dist1 bz )))

  266.     ;(mkgcd p3 xgc  1)
  267.     (gxl-cs:gcd p3 xgc scale)
  268. ;(setq p1 (insertgc(car(entsel "\n请选择坡顶或者坡脚:"))))
  269.     (setq p11 (list (car p3 ) (cadr p3) xgc))
  270. ;(setq ang (getangle p1 "\n请指定顶或者坡脚哪个方向? "))
  271.    (setq ang  (angle p11 p33))
  272. (setq p22 (polar p11 ang 100))
  273.   (setq pts1 (list p11 (append (vl-remove (last p22)p22) (list(+ (last p11 )(/ 100  podu ))))  ))
  274.   ;(print pts1)
  275.   (setq pts (list (vl-remove (last p11)p11) p22))
  276.   (vl-cmdf "zoom" "e")
  277. (setq ssa (ssget "f" pts'((0 . "POLYLINE") (8 . "sjw"))))
  278. ;(sssetfirst nil ssa)
  279. (setq ii   0
  280.        no  0)
  281.                   (repeat (sslength ssa)
  282.                        (setq en (ssname ssa ii)
  283.                             ptb (plinexy en)
  284.            ;demj (vlax-curve-getArea  (vlax-ename->vla-object en))
  285.           pzx (append pzx (list ptb))

  286.            ii  (1+ ii)  )                  
  287.                   )

  288.      

  289.   ;(setvar "osmode"16384)
  290. (foreach x pzx
  291.   
  292.   (setq pzx1 (temp (car pts1) (cadr pts1) (car x) (cadr x)(caddr x)   ))
  293. (if (and (/= pzx1 nil)
  294.     (>= (poinpl (mapcar '(lambda (b)  (vl-remove (last b)b)  )x) (vl-remove (last pzx1)pzx1)  )0)  )
  295.   (progn (print pzx1)(gxl-cs:gcd pzx1 (last pzx1) scale))
  296.   )

  297.   )
  298.     (vl-cmdf "zoom" "p")
  299.     ;(command "rotate" (entlast) "" p3 (* (- (angle p3 p33) (/ pi 2) ) (/ 180 pi) )  )
  300.     ;(entmake (list '(0 . "TEXT") '(8 . "fgbj")(cons 1 (rtos xgc 2 3)) (cons 10 p3 ) (cons 40 1.0)))
  301.    )
  302. (princ)
  303.   
  304.       )

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
bssurvey + 1 赞一个!

查看全部评分

 楼主| 发表于 2023-6-2 16:05 | 显示全部楼层
  1. (vlax-curve-getClosestPointToProjection (vlax-ename->vla-object (car(entsel)))  (getpoint) '(0.0 0.0 1.0) t)
复制代码
在将曲线投影到平面上之后,返回曲线上的最近点(在 WCS 上)

(vlax-curve-getClosestPointToProjection curve-obj  givenPnt normal [extend])
说明
1)参数 curve-obj 为要测量的 VLA 对象。
2)参数 givenPnt 为WCS 中的点,在曲线上寻找该点的最近点。
3)参数 normal 为WCS 中的法线矢量,指定投影平面。
4)参数 extend 若指定该参数且其值不为 nil,vlax-curve-getClosestPointToProjection 在搜索最近点时扩展曲线。
5)vlax-curve-getClosestPointToProjection 先将曲线投影到由 givenPnt 和 normal 定义的平面上,后在该平面上计算距 givenPnt 最近的点。最后,vlax-curve-getClosestPointToProjection 将结果点重新投影到原来的曲线上,并返回投影后的点。
返回值:
若成功,则返回表示曲线上一点的三维点表,否则返回 nil

 楼主| 发表于 2023-6-2 16:17 | 显示全部楼层
  1. (entmake (list '(0 . "CIRCLE") (cons 10 (vlax-curve-getClosestPointToProjection (vlax-ename->vla-object (car(entsel)))  (getpoint) '(0.0 0.0 1.0) t)) (cons 40 5)))

 楼主| 发表于 2023-6-2 19:34 | 显示全部楼层

如果坡顶坡脚是三维多段线还好用一些
  1. (defun mkgcd (inspt height  scale  / pt  pt1 blkdef obj)
  2.   (setvar "CMDECHO" 0)
  3.   (command "layer" "m" "检查高程点" "c" "1" "" "L" "CONTINUOUS" ""  "")
  4.   (if height
  5.     (setq height (rtos height 2 3))
  6.     (setq height "")
  7.   )

  8.   
  9.   (regapp "SOUTH")
  10.   ;;;检查字体 "HZ" 是否存在
  11.   (if (not (tblobjname "style" "HZ"))
  12.     (command "style" "HZ" "rs.shx,hztxt.shx" 0 1 0 "" "" "")
  13.   )
  14.   ;;;检查是否存在高程点图块定义
  15.   (if (not (tblobjname "block" "GC2000"))
  16.     (progn
  17.       ;13、entmake生成普通块
  18. (defun emkblk ( pt name /  )
  19.   (entmake (list '(0 . "block") (cons 2 name) '(70 . 0) (cons 10 pt)))

  20.   
  21. (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 4) (cons 10 (list (+ (car pt) 0.75)  (+ (cadr pt) 1)   ))(cons 10 pt) (cons 10 (list (- (car pt) 0.75)  (+ (cadr pt) 1)   ))

  22. (cons 10 (list (+ (car pt) 4.25)  (+ (cadr pt) 1)   ))



  23.          ))
  24.   
  25.   (entmake '((0 . "ENDBLK")))
  26.   
  27.   ;(entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt)))
  28. )

  29.   (emkblk '(0 0) "GC2000")
  30.     )
  31.   )
  32.   ;;;插入块
  33.   (entmake (list
  34.              '(0 . "INSERT")
  35.              '(100 . "AcDbEntity")
  36.              '(100 . "AcDbBlockReference")
  37.              '(66 . 1);;;属性跟随标志,1跟随,0不跟随
  38.               (cons 2 "GC2000")
  39.               (cons 10 inspt)
  40.               (cons 41 scale)
  41.               (cons 42 scale)
  42.               (cons 43 scale)
  43.               '(-3 ("SOUTH" (1000 . "202101")))
  44.            )
  45.   )
  46.   ;;;插入属性
  47.   (entmake (list
  48.              '(0 . "ATTRIB")
  49.              '(100 . "AcDbEntity")
  50.              '(100 . "AcDbText")
  51.               (cons 10 (setq pt (polar inspt (* 0.5 PI) (* 2.25 scale))))
  52.               (cons 40 (* 2.0 scale))
  53.               (cons 50 0)
  54.                (cons 62 3)
  55.               (cons 41 0.8)
  56.               (cons 51 0)
  57.               (cons 1 height)
  58.               (cons 7 "HZ")
  59.               (cons 72 0)
  60.               (cons 11 pt)
  61.               '(100 . "AcDbAttribute")
  62.               (cons 2 "height")
  63.               (cons 70  0)
  64.               (cons 74 2)
  65.            )
  66.    )
  67. ;;;;;;;;;;;;;;;;;;;;;;;
  68. ;;;插入属性
  69.   
  70.   
  71.    ;;;结束标志
  72.    (entmake '((0 . "SEQEND")))
  73.    (princ)
  74. )


  75. ;;;;;;;;===========================================


  76. ;; 测量选定曲线上两点之间的距离
  77. (defun apkl (ENOBJ p1 p2 / DIST DIST1 DIST2 EN ENOBJ OSM P1 P2)
  78. ;;;来源:QQ群友:GreenWood(181976640)。属QQ群:SP编程,e派<a href="http://bbs.mjtd.com/forum-6-1.html" target="_blank" class="relatedlink">工具</a>箱,摄影  24942984
  79.   
  80.   
  81. ;(setq ENOBJ (CAR (ENTSEL)))
  82. ;(setq p1 (getpoint "\n选择曲线上的一点:"))
  83. ;(setq p2 (getpoint "\n选择曲线上的另一点:"))
  84. (setq dist1 (vlax-curve-getDistAtPoint enobj p1))
  85. (setq dist2 (vlax-curve-getDistAtPoint enobj p2))
  86. ;(print "\n测量段曲线长度:")
  87. (setq dist (abs (- dist1 dist2)))
  88. dist
  89. )

  90. (defun c:bg11 (  / ENOBJ p1 p2 s1 s2 p3  dist gcc bz dist1 xgc p33)

  91. (setq ENOBJ (CAR (ENTSEL "\n请选择线段")))
  92. (setq p1 (getpoint "\n选择曲线上的一点:"))
  93.   (setq s1 (getreal "\n请输入该点标高:"))
  94. (setq p2 (getpoint "\n选择曲线上的另一点:"))
  95. (setq s2 (getreal "\n请输入该点标高:"))
  96.   (setq dist (apkl ENOBJ p1 p2 ))
  97. (setq gcc (- s1 s2))
  98.   (setq bz (/ gcc dist))
  99.   (while (setq p33 (getpoint "\n选择曲线上要查询的一点:")
  100.                p3   (vlax-curve-getClosestPointTo ENOBJ p33 T)

  101.          )
  102.          
  103.    
  104.     (setq dist1 (apkl ENOBJ p3 p2 ) )
  105. (setq xgc (+ s2 (* dist1 bz )))

  106.     (mkgcd p3 xgc  1)
  107.     (command "rotate" (entlast) "" p3 (* (- (angle p3 p33) (/ pi 2) ) (/ 180 pi) )  )
  108.     ;(entmake (list '(0 . "TEXT") '(8 . "fgbj")(cons 1 (rtos xgc 2 3)) (cons 10 p3 ) (cons 40 1.0)))
  109.    )
  110. (princ)
  111.       )

  112. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  113. ;;;by Gu_xl
  114. (defun gxl-cs:gcd (inspt height scale / pt blkdef obj);展高程点函数(inspt:插入点,heitht:高程值,scale:缩放比例,xsws:高程注记位数)
  115. (vl-load-com) ;将 Visual LISP 扩展功能加载到 AutoLISP
  116.   (regapp "SOUTH")
  117.   (setvar "CMDECHO" 0)
  118.   (command "layer" "m" "GCD" "c" "1" "" "L" "CONTINUOUS" ""  "")
  119.   (if height
  120.     (setq height (rtos height 2 3));3为高程注记位数
  121.     (setq height "")
  122.   )
  123.   (regapp "SOUTH")
  124.   
  125.   ;;;检查字体 "HZ" 是否存在
  126.   (if (not (tblobjname "style" "宋体"))
  127.     ;(command "style" "HZ" "rs.shx,hztxt.shx" 0 1 0 "" "" "")
  128.     (command "style" "宋体" "" 0 1 0 "" "" "")
  129.   )
  130.   ;;;检查是否存在高程点图块定义
  131.   (if (not (tblobjname "block" "GC200"))
  132.     (progn
  133.       (setq blkdef (vla-Add (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3D-point '(0 0 0)) "GC200"))
  134.       (setq obj
  135.         (vla-AddPolyline
  136.            blkdef
  137.            (vlax-make-variant
  138.               (vlax-safearray-fill
  139.                  (vlax-make-safearray vlax-vbdouble (cons 0 5))
  140.                  '(-0.2 0 0 0.2 0 0)
  141.               )
  142.            )
  143.         )
  144.       )
  145.       (vla-SetBulge obj 0 1) (vla-SetBulge obj 1 1)
  146.       (vla-put-Closed obj :vlax-true)
  147.       (vla-put-ConstantWidth obj 0.4)
  148.     )
  149.   )
  150.   ;;;插入块
  151.   (entmake (list
  152.              '(0 . "INSERT")
  153.              '(100 . "AcDbEntity")
  154.              '(100 . "AcDbBlockReference")
  155.              '(66 . 1);;;属性跟随标志,1跟随,0不跟随
  156.               (cons 2 "GC200")
  157.               (cons 10 inspt)
  158.               (cons 41 scale)
  159.               (cons 42 scale)
  160.               (cons 43 scale)
  161.               (list -3 '("SOUTH" (1000 . "202101")))
  162.            )
  163.   )
  164.   ;;;插入属性
  165.   (entmake (list
  166.              '(0 . "ATTRIB")
  167.              '(100 . "AcDbEntity")
  168.              '(100 . "AcDbText")
  169.               (cons 10 (setq pt (polar inspt 0 (* 1.2 scale))))
  170.               (cons 40 (* 2.0 scale))
  171.               (cons 50 0)
  172.               (cons 41 0.8)
  173.               (cons 51 0)
  174.               (cons 1 height)
  175.               (cons 7 "宋体")
  176.        (cons 62 3)
  177.               (cons 72 0)
  178.               (cons 11 pt)
  179.               '(100 . "AcDbAttribute")
  180.               (cons 2 "height")
  181.               (cons 70  0)
  182.               (cons 74 2)
  183.            )
  184.    )
  185.    ;;;结束标志
  186.    (entmake '((0 . "SEQEND")))
  187.    (princ)
  188. )
  189. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  190. (defun PoInPl(pt p / n i va ang);;该过程由 StEf  44604813提供,本人只是把输出由原来的t,nil改为了-1,0,1
  191.       (setq n(length pt)
  192.       pt(append pt(list(car pt)))i 0 ang 0)
  193.       (while(< i n)
  194.   (setq va(-(angle p(nth i pt))(angle p(nth(1+ i)pt))))
  195.   (if (<(abs(-(abs va)pi))0.000001)(setq ang 2 i n)
  196.     (progn(cond((> va pi)(setq va (- va pi)))
  197.          ((< va (* -1 pi))(setq va (+ va pi))))
  198.       (setq ang(+ ang va)i(1+ i)))))
  199.       (if(= ang 2)0
  200.   (if(<(abs(-(abs ang) pi))0.000001)1 -1))
  201.       )
  202. ;defun
  203. (defun plinexy(e / a q m p);;;LWPolyline,POLYLINE顶点,去掉完全重合点
  204.     (setq a(vlax-ename->vla-object e)
  205.   q(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates a)))
  206.     m(vla-get-objectname a)a 0
  207.     m(if(= m"AcDb3dPolyline")3 2))
  208.     (repeat(/(length q)m)
  209.       (cond((= m 2)(setq p1(list(nth a q)(nth(+ a 1)q))))
  210.      ((= m 3)(setq p1(list(nth a q)(nth(+ a 1)q)(nth(+ a 2)q)))))
  211.       (setq p(if (member p1 p)p (append p(list p1)))
  212.       a(+ a m)))
  213.     p)
  214. (defun xyp-Pline (lst / lst pt)
  215. (entmake (append    (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst))'(70 . 129))
  216.       (mapcar '(lambda (pt)(cons 10 pt)) lst ))
  217.   ) (vl-cmdf "_.region" (entlast) "") (entlast)
  218. )
  219. ;;改改更贱康
  220. (defun temp (pa pb p0 p1 p2 / MAT:vxv {vp} {v} a b)
  221.   (defun MAT:vxv (u v)
  222.     (list
  223.       (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  224.       (- (* (car v) (caddr u)) (* (car u) (caddr v)))
  225.       (- (* (car u) (cadr v)) (* (car v) (cadr u)))
  226.     )
  227.   )
  228.   (setq {vp} (MAT:vxv (mapcar '- p1 p0) (mapcar '- p2 p0)))
  229.   (setq {v} (mapcar '- pa pb))
  230.   (setq  a (apply '+
  231. (mapcar '(lambda (n m vp) (* (- n m) vp)) p0 pa {vp})
  232.   )
  233.   )
  234.   (setq b (apply '+ (mapcar '* {vp} {v})))
  235.   (if (equal b 0.0 1e-6)
  236.     nil
  237.     (mapcar '(lambda (m v) (+ m (* v (/ a b)))) pa {v})
  238.   )
  239. )
  240. (defun insertgc ( e / e)
  241.   (cdr(assoc 10(entget e)))  )

  242. (defun c:pdpj3 (   /  ENOBJ p1 p2 s1 s2 p3 p33 dist gcc bz dist1 xgc p33 podu blc  p11 ang p22 pts1 pts ssa ii en ptb pzx pzx1 no)
  243.   
  244.   (setq blc (getint "\n请输入比例尺1:<500>"))
  245.   (if (= blc nil)(setq blc 500))
  246.   (setvar 'userr1 blc);设置比例尺
  247. (setq scale (* 0.001 blc));缩放比例
  248.   
  249.   (setq podu (getreal "\n请输入坡度1:(挖+填-)?"))

  250.   ;;;;;
  251.   (setq ENOBJ (CAR (ENTSEL "\n请选择坡顶或者坡脚三维多段线POLYLINE线段")))
  252. ;(setq p1 (getpoint "\n选择曲线上的一点:"))
  253.   ;(setq s1 (getreal "\n请输入该点标高:"))
  254. ;(setq p2 (getpoint "\n选择曲线上的另一点:"))
  255. ;(setq s2 (getreal "\n请输入该点标高:"))
  256.   ;(setq dist (apkl ENOBJ p1 p2 ))
  257. ;(setq gcc (- s1 s2))
  258.   ;(setq bz (/ gcc dist))
  259.   (while (setq p33 (getpoint "\n选择曲线上要查询的一点:")                    )
  260.    
  261.          ;(setq  p3   (vlax-curve-getClosestPointTo ENOBJ p33 T))
  262.     (setq  p3   (vlax-curve-getClosestPointToProjection (vlax-ename->vla-object ENOBJ)  p33 '(0.0 0.0 1.0) t))
  263.     ;(setq dist1 (apkl ENOBJ p3 p2 ) )
  264. ;(setq xgc (+ s2 (* dist1 bz )))

  265.     ;(mkgcd p3 xgc  1)
  266.     (gxl-cs:gcd p3 (last p3) scale)
  267. ;(setq p1 (insertgc(car(entsel "\n请选择坡顶或者坡脚:"))))
  268.     (setq p11 (list (car p3 ) (cadr p3) (last p3) ))
  269. ;(setq ang (getangle p1 "\n请指定顶或者坡脚哪个方向? "))
  270.    (setq ang  (angle p11 p33))
  271. (setq p22 (polar p11 ang 100))
  272.   (setq pts1 (list p11 (append (vl-remove (last p22)p22) (list(+ (last p11 )(/ 100  podu ))))  ))
  273.   ;(print pts1)
  274.   (setq pts (list (vl-remove (last p11)p11) p22))
  275.   (vl-cmdf "zoom" "e")
  276. (setq ssa (ssget "f" pts'((0 . "POLYLINE") (8 . "sjw"))))
  277. ;(sssetfirst nil ssa)
  278. (setq ii   0
  279.        no  0)
  280.                   (repeat (sslength ssa)
  281.                        (setq en (ssname ssa ii)
  282.                             ptb (plinexy en)
  283.            ;demj (vlax-curve-getArea  (vlax-ename->vla-object en))
  284.           pzx (append pzx (list ptb))

  285.            ii  (1+ ii)  )                  
  286.                   )

  287.      

  288.   ;(setvar "osmode"16384)
  289. (foreach x pzx
  290.   
  291.   (setq pzx1 (temp (car pts1) (cadr pts1) (car x) (cadr x)(caddr x)   ))
  292. (if (and (/= pzx1 nil)
  293.     (>= (poinpl (mapcar '(lambda (b)  (vl-remove (last b)b)  )x) (vl-remove (last pzx1)pzx1)  )0)  )
  294.   (progn (print pzx1)(gxl-cs:gcd pzx1 (last pzx1) scale))
  295.   )

  296.   )
  297.     (vl-cmdf "zoom" "p")
  298.     ;(command "rotate" (entlast) "" p3 (* (- (angle p3 p33) (/ pi 2) ) (/ 180 pi) )  )
  299.     ;(entmake (list '(0 . "TEXT") '(8 . "fgbj")(cons 1 (rtos xgc 2 3)) (cons 10 p3 ) (cons 40 1.0)))
  300.    )
  301. (princ)
  302.   
  303.       )

本帖子中包含更多资源

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

x
发表于 2023-7-5 15:15 | 显示全部楼层
老哥,这个厉害了,一直都在纠结这问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 09:12 , Processed in 0.327280 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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