乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 68|回复: 19

[编程交流] 找到s上的高点和低点

[复制链接]

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 17:21:17 | 显示全部楼层 |阅读模式
我正在尝试编写一个例程,可以找到AutoCAD曲面上的高点和低点。写这篇文章时,我注意到了一些问题。
1) 当我在地面上倾倒垃圾时,我会得到如下结果
只有每三分之一的值是高程,其他值是x和y值。我该如何对这些值进行排序,以便制作一个如下所示的点列表
  1. (10112.9 19945.1 6431.32) (10103.5 19945.2 6431.72)

2) 当我尝试使用vlax get属性实际获取点时,它会作为变体返回,与vla转储中的返回方式不同。如何将此变体转换为转储中返回的变体?
我的代码如下:
  1. (defun c:findhighlowpoints (/ *error* prd)
  2. (defun *error* (msg)
  3.    (if oldecho
  4.      (setvar 'cmdecho oldecho)
  5.    )
  6.    (if (not
  7.          (member msg '("Function cancelled" "quit / exit abort"))
  8.        )
  9.      (princ (strcat "\nError: " msg))
  10.    )
  11.    (princ)
  12. )
  13. (setq prd
  14.         '(lambda (x)
  15.            (wcmatch
  16.              (cdr (assoc 0 (entget x)))
  17.              "AECC_TIN_SURFACE"
  18.            )
  19.          )
  20. )
  21. (if (setq ent (selectif "\nSelect surface to find high and low points: " prd))
  22.    (progn
  23.      (setq obj (vlax-ename->vla-object ent)
  24.            pts (vlax-get-property obj 'Points)
  25.            pt  (getvar 'viewctr)
  26.      )
  27.    )
  28. )
  29. (princ)
  30. )
  31. ;;;Select if written by Lee Mac
  32. (defun selectif (msg prd / ent)
  33. (while
  34.    (progn (setq ent (car (entsel msg)))
  35.           (cond
  36.             ((= 7 (getvar 'errno))
  37.              (princ "\nMissed, try again.")
  38.             )
  39.             ((not ent) nil)
  40.             ((not (apply prd (list ent)))
  41.              (princ "\nInvalid object selected.")
  42.             )
  43.           )
  44.    )
  45. )
  46. ent
  47. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:26:27 | 显示全部楼层
 
  1. (defun _pair:coordinates (l)
  2. ;; Tharwat - 07.Jan.2014 ;;
  3. (if l
  4.    (cons (list (car l) (cadr l) (caddr l))
  5.          (_pair:coordinates (cdddr l))
  6.    )
  7. )
  8. )

 
 
这样地:
  1. (vlax-get obj 'points)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:29:56 | 显示全部楼层
或者:
  1. (defun group3 ( l / r )
  2.    (repeat (/ (length l) 3)
  3.        (setq r (cons (list (car l) (cadr l) (caddr l)) r)
  4.              l (cdddr l)
  5.        )
  6.    )
  7.    (reverse r)
  8. )

@Tharwat,注意递归调用中的多余参数。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:33:45 | 显示全部楼层
 
谢谢。
实际上,我在原始子函数2或3的坐标列表中有两个选项作为结果,但当我修改函数时,错误地忽略了“n”参数。
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 17:35:11 | 显示全部楼层
Tharwat和Lee,非常感谢你们!多亏了你的帮助,我把代码安装好并运行起来了。我有一个简单的问题,我应该在什么时候使用vlax get和vlax get属性?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:39:04 | 显示全部楼层
不客气。
 
当您处于本线程中遇到的情况,并且希望避免将变体转换为实际值时。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:42:58 | 显示全部楼层
这只是另一个想法,为什么要对列表进行排序,只需使用foreach pts并获得Z值,如果保存得更大,则将其与上一个进行比较,等等,第二行是最小的。需要一个虚拟值来启动0.0和100000
 
 
最后一条评论:为什么不以真正愚蠢的方式使用属性呢。
182121mrr80580e60g685r.png
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 17:44:02 | 显示全部楼层
谢谢BigAL,我没有想过使用foreach函数。我通过LISP这样做的原因是,我有函数绘制到最小或最大点的线,这样用户可以快速找到它们(当曲面上的点意外设置为0’并且很难找到时很有用)。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 17:47:20 | 显示全部楼层
一旦有了三维点的pl列表:
  1. (setq maxz (apply 'max (mapcar 'caddr pl)))

并不总是最有效的,但它很简单-大卫
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 17:51:07 | 显示全部楼层
谢谢大卫!现在,我用这个来根据z坐标对点进行排序。然后,我试图根据用户先前的输入绘制一条到低点或高点的线;然而,这并不能正常工作。我试图通过以下方式实现这一点:
  1. (if (= *findhighlowpointsans* "Low")
  2.        (progn
  3.          (setq cnt 0)
  4.          (while (>= (caddr (nth cnt pts)) (caddr (nth (+ cnt 1) pts)))
  5.            (command "._pline" "_non" pt "_non" (nth cnt pts) "")
  6.            (setq cnt (+ cnt 1))
  7.          )
  8.        )
  9.        (progn
  10.          (setq cnt (length pts))
  11.          (while (<= (caddr (nth cnt pts)) (caddr (nth (- cnt 1) pts)))
  12.            (command "._pline" "_non" pt "_non" (nth cnt pts) "")
  13.            (setq cnt (- cnt 1))
  14.          )
  15.        )
  16.      )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 08:46 , Processed in 0.451278 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表