明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6381|回复: 18

[讨论] 自动精确横断面绘制

[复制链接]
发表于 2013-5-24 11:58:50 | 显示全部楼层 |阅读模式
本帖最后由 yxh1202 于 2013-5-24 17:01 编辑

如图所示,因为工作中经常计算工程量,就是原始测量回来,展测量点,要精确计算断面面积,采取将测量点投影到横断面线上,求得各点的修正平距,然后根据平距和高差绘制一个精确的横断面。
现在想进行自动化,思路如下:
1、选择第N个横断面的测量点(已经展到图上)。
2、根据所选定的点,求出各点在垂线上的垂足点。
3、利用垂足点求得相邻两点的投影距离
4、利用投影距离,高差绘制一条多线段。
目前的难点是:
    一、选定多个点后,能不能按照点得生成顺序来产生循环,因为野外测量各点都有编号,但展点后看属性没有顺序。
请高人指点迷津

本帖子中包含更多资源

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

x
发表于 2013-5-24 13:47:32 | 显示全部楼层
请在论坛搜索点沿曲线排序的相关代码
 楼主| 发表于 2013-5-24 14:23:57 | 显示全部楼层
Gu_xl 发表于 2013-5-24 13:47
请在论坛搜索点沿曲线排序的相关代码

按道理说每个断面上的地面点是按照测量的顺序展绘的,应当有顺序啊。谢谢
发表于 2013-5-25 15:11:50 | 显示全部楼层
本帖最后由 soly2006 于 2013-5-25 16:21 编辑

  1. ;本程序为 南方cass高程点自动吸附到直接上,作断面时经常用到
  2. ;选择直接->输入直线附近点的范围->OK
  3. ;季鸟 2012-6-6
  4. (defun c:s3(/ osm_old line1 qq h i pt1 pt2 ranlst ss centn xyh xyh1)
  5. (Setvar "Cmdecho" 0)
  6. (command "undo" "be")
  7. (setq osm_old (getvar "osmode"))
  8. (setvar "osmode" 0)
  9. (setq line1 (car (entsel "  选择直线L:  ")))
  10. (setq dis2line (getreal "\n 输入点范围: "))
  11. (if (and line1 dis2line)
  12. (progn
  13.   (setq pt1 (cdr (assoc 10 (entget line1))))

  14.   (setq pt2 (cdr (assoc 11 (entget line1))))  
  15.     (princ (angle pt1 pt2))
  16.   (setq ranlst (list (polar pt1 (- (angle pt1 pt2) (/ PI 2)) dis2line)
  17.                      (polar pt1 (+ (angle pt1 pt2) (/ PI 2)) dis2line)
  18.                    (polar pt2 (- (angle pt2 pt1) (/ PI 2)) dis2line)
  19.                    (polar pt2 (+ (angle pt2 pt1) (/ PI 2)) dis2line)))
  20.   (setq ss (ssget "CP" ranlst '((0 . "INSERT") (8 . "GCD"))))
  21.   )
  22. )
  23. (setq i 0)
  24. (while (setq s ( ssname ss i ))
  25.   (setq centn (entget s))
  26.   (setq xyh (cdr (assoc 10 centn)))
  27.   (setq h (caddr xyh))
  28.   (setq qq (vlax-curve-getclosestpointto (vlax-ename->vla-object line1) xyh t));垂点
  29.   (setq xyh1  (list (car qq) (cadr qq) h))
  30.   (command "_move" s "" xyh xyh1)
  31.   (command "change" s "" "p" "e" h "");;置对象标高
  32.   (setq i (1+ i))
  33.   
  34.   );endwhile
  35.   (setvar "osmode" osm_old)
  36.    (Setvar "Cmdecho" 1)
  37.    (command "undo" "e")
  38. )



本帖子中包含更多资源

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

x

点评

吸附范围如果大于3倍正常测量误差,如果用于高精度的施工有可能造成谁都不愿承担责任的后果  发表于 2014-11-8 05:10
 楼主| 发表于 2013-5-26 12:52:13 | 显示全部楼层
本帖最后由 yxh1202 于 2013-5-26 12:54 编辑

排序问题已经解决了
(vl-load-com)
(defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
  ;;建立排序列表
  (setq        LST '()
        INDEX 0
  )
  (repeat (sslength SE)
    (setq ENT (entget (ssname SE INDEX))
          TMP (cdr (assoc DXF ENT))
    )
    (if        (and INT
             (= (type INT) 'INT)
             (= (type TMP) 'list)
             (< INT (length TMP))
        )
      (setq TMP (nth INT TMP))
    )
    (setq LST (cons
                (list TMP (cdr (assoc 5 ENT)))
                LST
              )
    )
    (setq INDEX (1+ INDEX))
  )
  ;;排序操作
  (if (and FUZZ
           (or
             (= (type FUZZ) 'INT)
             (= (type FUZZ) 'REAL)
           )
           (or
             (= (type TMP) 'INT)
             (= (type TMP) 'REAL)
           )
      )
    (setq NEWLST
           (vl-sort LST
                    (function (lambda (E1 E2)
                                (< (+ (car E1) FUZZ) (car E2))
                              )
                    )
           )
    )
    (setq NEWLST
           (vl-sort LST
                    (function (lambda (E1 E2)
                                (< (car E1) (car E2))
                              )
                    )
           )
    )
  )
  ;;如果K为T,则倒置
  (if K
    (setq NEWLST (reverse NEWLST))
  )
  ;;组织排序后的选择集
  (setq NEWSE (ssadd))
  (foreach TMP NEWLST
    (setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
  )
  ;;返回值
  NEWSE
) ;_结束defun
;;;=============================================================
;;;测试
(defun C:TT (/ S1 S2 I SIZE)
  (IF (SETQ S1 (SSGET))
                                        ;(if (setq S1 (ssget '((0 . "TEXT"))))
    (progn
      ;;
                                        ;(setq SIZE (cdr (assoc 40 (entget (ssname S1 0)))))
      (setq size 0.1)
      ;;排序
;;;     ;;x坐标排序:
                                ;(setq S2 (SORT-SE S1 10 0 (* 0.6 SIZE) nil))
;;;     ;;y坐标排序:
                                        (setq S2 (SORT-SE S1 10 1 (* 0.6 SIZE) t))
      ;;先y后x排序:
      ;(setq S2 (SORT-SE        (SORT-SE S1 10 1 (* 0.4 SIZE) nil)        10        0        (* 0.8 SIZE)        nil      )     )
;;;     ;;按照颜色排序:
;;;     (setq S2 (SORT-SE S1 62 nil nil nil))
;;;     ;;按照内容排序:
;;;     (setq S2 (SORT-SE S1 1 nil nil nil))
      ;;
      (setq I 0)
      (repeat (sslength S2)
        (princ "\n")
        (princ (cdr (assoc 10 (entget (ssname S2 I))))) ;显示排序结果。
        (setq I (1+ I))
      )
    )
  )
  (princ)
)
问题提出:选定这些块后,应当尽快求出点位的最大和最小X,Y值,然后根据    maxX-minX    与 maxY-minY    的大小来确定按照X还是Y排序。那么求最大和最小X,Y值怎么办呢,求指导
 楼主| 发表于 2013-5-27 11:27:13 | 显示全部楼层
本帖最后由 yxh1202 于 2013-5-27 11:28 编辑

请高人指点:
(vl-load-com)
                                        ;---------排序操作-------------------------------------------------
(defun SORT-SE (SE DXF INT FUZZ K / ENT INDEX LST NEWLST NEWSE TMP)
  ;;建立排序列表
  (setq        LST '()
        INDEX 0
  )
  (repeat (sslength SE)
    (setq ENT (entget (ssname SE INDEX))
          TMP (cdr (assoc DXF ENT))
    )
    (if        (and INT
             (= (type INT) 'INT)
             (= (type TMP) 'list)
             (< INT (length TMP))
        )
      (setq TMP (nth INT TMP))
    )
    (setq LST (cons
                (list TMP (cdr (assoc 5 ENT)))
                LST
              )
    )
    (setq INDEX (1+ INDEX))
  )
  ;;排序操作
  (if (and FUZZ
           (or
             (= (type FUZZ) 'INT)
             (= (type FUZZ) 'REAL)
           )
           (or
             (= (type TMP) 'INT)
             (= (type TMP) 'REAL)
           )
      )
    (setq NEWLST
           (vl-sort LST
                    (function (lambda (E1 E2)
                                (< (+ (car E1) FUZZ) (car E2))
                              )
                    )
           )
    )
    (setq NEWLST
           (vl-sort LST
                    (function (lambda (E1 E2)
                                (< (car E1) (car E2))
                              )
                    )
           )
    )
  )
  ;;如果K为T,则倒置
  (if K
    (setq NEWLST (reverse NEWLST))
  )
  ;;组织排序后的选择集
  (setq NEWSE (ssadd))
  (foreach TMP NEWLST
    (setq NEWSE (ssadd (handent (cadr TMP)) NEWSE))
  )
  ;;返回值
  NEWSE
) ;_结束defun
;;;=============================================================
;;;测试
(defun C:HDM (/ S1 S2 I SIZE)
  (setvar "cmdecho" 0)
  (setq en (entsel "选择一条直线:"))
    (IF (SETQ S1 (SSGET))
    (setq xmin 0 ymin 0 xmax 0 ymax 0)
    (setq I 0)
      (repeat (sslength S1)
        (setq x (cadr (assoc 10 (entget (ssname S1 I)))))
        (setq y (caddr (assoc 10 (entget (ssname s1 I)))))
        (cond
          ((> xmin x) (setq xmin x))
          ((> ymin y) (setq ymin y))
          ((< xmax x) (setq xmax x))
          ((< ymax y) (setq ymax y))
          )
        (setq I (1+ I))
      )
    (if (> (- xmax xmin) (- ymax ymin))
      ;;x坐标排序:
        (setq S2 (SORT-SE S1 10 0 (* 0.6 SIZE) nil))
    ;;y坐标排序:
      ;(setq S2 (SORT-SE S1 10 1 (* 0.6 SIZE) t))
    )
      (progn
      (setq size 0.1)
      (setq I 0)
      (repeat (sslength S2)
        (setq pen_data (entget (SSNAME S2 I)))
        (setq ppt (assoc 10 pen_data))
        (setq pp (cdr ppt))
        (setq en_data (entget (car en)))
        (setq Perpt (vlax-curve-getClosestPointTo (car en) pp T))
        (entmake (APPEND '((0 . "LINE")
                           (100 . "AcDbEntity")
                           (100 . "AcDbLine")
                           (8 . "0")
                          )
                         (LIST (CONS 10 pp) (CONS 11 perpt))  ;产生线的起点10,端点11列表

                 )
        )
        (princ "\n")
        (princ (cdddr (assoc 10 (entget (ssname S2 I))))) ;显示排序结果。
        (setq I (1+ I))
      )
    )  ;end progn
  )
  (princ)
)

问题是不知道排序成功了没有,显示排序结果老是X值,想看看Z坐标值排序结果。
(princ (cdddr (assoc 10 (entget (ssname S2 I))))) ;显示排序结果。这句是不是有问题

本帖子中包含更多资源

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

x
发表于 2013-5-27 15:40:12 | 显示全部楼层
学习学习!呵呵
发表于 2013-6-13 15:43:37 | 显示全部楼层
说似精确,实则一点也不精确啊.测剖面里,直接要求测量人员沿着你的线的方位进行测量.无需投影到剖面线上这一步.
发表于 2013-6-13 18:35:39 | 显示全部楼层
本帖最后由 yshf 于 2013-6-13 18:40 编辑

应将那些散点组成Delaunay三角网,再根据横断面上点位于哪个三角形内来内插出其高程值,再依据该点距路线的距离及内插出的高程画横断面线,这样做似乎准确一点点。
发表于 2013-6-14 00:28:34 来自手机 | 显示全部楼层
yshf 发表于 2013-6-13 18:35
应将那些散点组成Delaunay三角网,再根据横断面上点位于哪个三角形内来内插出其高程值,再依据该点距路线的 ...

赞同你的观点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-1 10:55 , Processed in 0.197044 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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