明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1192|回复: 13

[源码] 根据南方cass高程点 内插高程点

  [复制链接]
发表于 2025-9-27 03:01:47 | 显示全部楼层 |阅读模式
预祝大家双节快乐

一段东拼西凑的代码搞到半夜3点还没完善好,那就先放个动图吧.  缺的函数见本论坛。
  1. (defun c:tt (/ *error*)
  2.   (vl-load-com)  ; 确保加载VLCOM支持
  3.   (defun *error*(msg)
  4.     (if en(entdel en))
  5.     (if sq-en(entdel sq-en))
  6.     (sssetfirst nil nil)
  7.     (setvar 'PICKBOX old-PICKBOX)
  8.    (princ)
  9.     )
  10.   (setq old-PICKBOX(getvar 'PICKBOX ))
  11.   (setvar 'PICKBOX 0)
  12.   (setq en (mktext "测试" '(0 0 0) 2 0 "hz" "ZJ" "ML"))
  13.   (setq sq-en (EntmakeSquare '(0 0 0) 10))  ; 创建初始正方形并保存图元名
  14.   (setq done nil)
  15.   (setq gr 0 gr-model 0 gr-value 0)
  16.   (while (not done)
  17.     (setq gr (grread T 8 3)   ; 启用追踪
  18.           gr-model (car gr)   
  19.           gr-value (cadr gr))
  20.     (cond
  21.     ((= gr-model 5)
  22.      
  23.         ; 更新文字位置和内容

  24.         ; 移动正方形到新位置
  25.         
  26.   (sssetfirst nil(setq ss(ssget "c" (list(nth 6 new-pts)(nth 7 new-pts)) (list(nth 2 new-pts)(nth 3 new-pts)) '((2 . "GC200")))))
  27. ;;;  (princ"\n")
  28. ;;;  (princ(setq sjw-lst(sjwlst ss)))
  29.         (setq sjw-lst(sjwlst ss))
  30.         (移动正方形 sq-en gr-value 100)
  31.         (vla-put-textalignmentpoint (vlax-ename->vla-object en) (vlax-3d-point(mapcar '+ '(2 2 0) gr-value)))
  32.      (if(setq nnn(addgcptinpm gr-value sjw-lst))
  33.        (progn
  34.        (setq nnn (zInsert nnn))
  35.         (vla-put-textstring (vlax-ename->vla-object en) (vl-princ-to-string (caddr nnn)))
  36.        )
  37.       (vla-put-textstring (vlax-ename->vla-object en) "nil")
  38.        )
  39.        );
  40.     ((= gr-model 3)
  41.        ;; 实时显示坐标,\r 使光标回到行首实现原地更新
  42. ;;;       (princ gr-value)
  43. ;;;       (setq done T)
  44.        ;; 这里可以添加实时更新的图形逻辑,例如拖拽对象、动态绘制等
  45.      (princ"\n")
  46.        (setq ptlst(addgcptinpm gr-value sjw-lst))
  47.      (if ptlst ;如果点在三角形线上或三角形内
  48.                       (progn
  49.                         ;;双线性内插计算内插点的高程值 返回内插点(x y z)
  50.                         (setq zpt (zInsert ptlst))
  51.       (print zpt)
  52.                         ;(Entmakegcd 插入点 高程 图块比例 属性 文字字符 文字插入点 小数位数)
  53.                         ;(Entmakegcd zpt (caddr zpt) Scale inserD Tag txt ist1 txth ist2 xsws)
  54.       
  55. (gxl-cs:gcd zpt (caddr zpt) 1 2 );展高程点


  56.       
  57.                       )
  58.                     )
  59.      
  60.       )
  61.       
  62.       ;; 代码 11:辅助设备按键(通常对应鼠标右键)
  63.       ((= gr-model 11)
  64.        (princ "\n检测到鼠标右键事件,退出程序。")
  65.        (setq done T)
  66.       )
  67.       
  68.   )
  69. )
  70.   (princ)
  71.   )



本帖子中包含更多资源

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

x

评分

参与人数 3明经币 +3 收起 理由
yjycad + 1
tryhi + 1
Bao_lai + 1 就这个冲劲,就很顶。

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

 楼主| 发表于 2025-9-29 15:33:09 | 显示全部楼层
luzhmu 发表于 2025-9-29 08:29
三角网内插么?

根据greed鼠标位置创建矩形高程点选择集、得到三角网点表、判断在哪个三角形内、重心坐标插值法求点在面的投影高程
大概这几个步骤
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2025-9-29 15:36:46 | 显示全部楼层
测试过程中发现被广泛引用的zInsert函数有个bug,就是当三角形有一边在竖直方向上的时候,会出现除数为0的错误。需要先判断除数为0的时候 直接给ZL赋值

或者用下面这个deep seek代码代替这个功能,我简单测试这个函数是没有问题的,不知道到底对不对。
  1. ;重心坐标插值法   代替双线性内插  避免垂足三角网发生除数为0的错误
  2. (defun 重心坐标插值法求点在面的投影高程 (lst / p a b c denom lambda1 lambda2 lambda3 h)
  3.   (setq p(car lst)
  4.         a(car(cadr lst))
  5.         b(cadr(cadr lst))
  6.         c(caddr(cadr lst)))
  7.   (setq denom (+ (* (- (cadr B) (cadr C)) (- (car A) (car C)))
  8.                  (* (- (car C) (car B)) (- (cadr A) (cadr C)))))
  9.   
  10.   (setq lambda1 (/ (+ (* (- (cadr B) (cadr C)) (- (car P) (car C)))
  11.                       (* (- (car C) (car B)) (- (cadr P) (cadr C))))
  12.                  denom))
  13.   
  14.   (setq lambda2 (/ (+ (* (- (cadr C) (cadr A)) (- (car P) (car C)))
  15.                       (* (- (car A) (car C)) (- (cadr P) (cadr C))))
  16.                  denom))
  17.   
  18.   (setq lambda3 (- 1 lambda1 lambda2))
  19.   
  20.   ; 计算点P的高程
  21.   (setq h(+ (* lambda1 (caddr A))
  22.      (* lambda2 (caddr B))
  23.      (* lambda3 (caddr C))))
  24.   (list(car(car lst))(cadr(car lst))h)
  25. )
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-10-10 01:17:54 | 显示全部楼层
根据高程点内插高程点 最终效果

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-9-27 03:15:02 | 显示全部楼层
框选范围选中+动态拖框?
有什么意义吗?
回复 支持 反对

使用道具 举报

发表于 2025-9-27 06:43:47 | 显示全部楼层
你有种再说一遍 发表于 2025-9-27 03:15
框选范围选中+动态拖框?
有什么意义吗?

我惊Σ( ° △ °|||)︴也值夜班么
回复 支持 反对

使用道具 举报

发表于 2025-9-27 07:23:54 | 显示全部楼层
用不到,顶下,头像很别致
回复 支持 反对

使用道具 举报

发表于 2025-9-27 08:38:27 | 显示全部楼层
半夜写代码???
回复 支持 反对

使用道具 举报

发表于 2025-9-27 10:55:41 | 显示全部楼层
高程点不应该是现场实测出来的吗?内插疑是偷工,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-27 12:00:26 来自手机 | 显示全部楼层
你有种再说一遍 发表于 2025-9-27 03:15
框选范围选中+动态拖框?
有什么意义吗?

大佬也睡的晚啊

动态只是方便看看内插的高程点是怎么计算得来的

花里胡哨的,同事看了会觉得很吊
回复 支持 反对

使用道具 举报

发表于 2025-9-27 13:27:35 | 显示全部楼层
OKOK
非常感谢分享
回复 支持 反对

使用道具 举报

发表于 2025-9-27 14:48:37 | 显示全部楼层
感谢分享。  
回复 支持 反对

使用道具 举报

发表于 2025-9-29 08:29:30 | 显示全部楼层
三角网内插么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-10 04:05 , Processed in 0.185220 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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