broncos15 发表于 2022-7-5 17:21:17

找到s上的高点和低点

我正在尝试编写一个例程,可以找到AutoCAD曲面上的高点和低点。写这篇文章时,我注意到了一些问题。
1) 当我在地面上倾倒垃圾时,我会得到如下结果
只有每三分之一的值是高程,其他值是x和y值。我该如何对这些值进行排序,以便制作一个如下所示的点列表
(10112.9 19945.1 6431.32) (10103.5 19945.2 6431.72) ?
2) 当我尝试使用vlax get属性实际获取点时,它会作为变体返回,与vla转储中的返回方式不同。如何将此变体转换为转储中返回的变体?
我的代码如下:
(defun c:findhighlowpoints (/ *error* prd)
(defun *error* (msg)
   (if oldecho
   (setvar 'cmdecho oldecho)
   )
   (if (not
         (member msg '("Function cancelled" "quit / exit abort"))
       )
   (princ (strcat "\nError: " msg))
   )
   (princ)
)
(setq prd
      '(lambda (x)
         (wcmatch
             (cdr (assoc 0 (entget x)))
             "AECC_TIN_SURFACE"
         )
         )
)
(if (setq ent (selectif "\nSelect surface to find high and low points: " prd))
   (progn
   (setq obj (vlax-ename->vla-object ent)
         pts (vlax-get-property obj 'Points)
         pt(getvar 'viewctr)
   )
   )
)
(princ)
)
;;;Select if written by Lee Mac
(defun selectif (msg prd / ent)
(while
   (progn (setq ent (car (entsel msg)))
          (cond
            ((= 7 (getvar 'errno))
             (princ "\nMissed, try again.")
            )
            ((not ent) nil)
            ((not (apply prd (list ent)))
             (princ "\nInvalid object selected.")
            )
          )
   )
)
ent
)

Tharwat 发表于 2022-7-5 17:26:27

 

(defun _pair:coordinates (l)
;; Tharwat - 07.Jan.2014 ;;
(if l
   (cons (list (car l) (cadr l) (caddr l))
         (_pair:coordinates (cdddr l))
   )
)
)
 
 
这样地:
(vlax-get obj 'points)

Lee Mac 发表于 2022-7-5 17:29:56

或者:
(defun group3 ( l / r )
   (repeat (/ (length l) 3)
       (setq r (cons (list (car l) (cadr l) (caddr l)) r)
             l (cdddr l)
       )
   )
   (reverse r)
)
@Tharwat,注意递归调用中的多余参数。

Tharwat 发表于 2022-7-5 17:33:45

 
谢谢。
实际上,我在原始子函数2或3的坐标列表中有两个选项作为结果,但当我修改函数时,错误地忽略了“n”参数。

broncos15 发表于 2022-7-5 17:35:11

Tharwat和Lee,非常感谢你们!多亏了你的帮助,我把代码安装好并运行起来了。我有一个简单的问题,我应该在什么时候使用vlax get和vlax get属性?

Tharwat 发表于 2022-7-5 17:39:04

不客气。
 
当您处于本线程中遇到的情况,并且希望避免将变体转换为实际值时。

BIGAL 发表于 2022-7-5 17:42:58

这只是另一个想法,为什么要对列表进行排序,只需使用foreach pts并获得Z值,如果保存得更大,则将其与上一个进行比较,等等,第二行是最小的。需要一个虚拟值来启动0.0和100000
 
 
最后一条评论:为什么不以真正愚蠢的方式使用属性呢。

broncos15 发表于 2022-7-5 17:44:02

谢谢BigAL,我没有想过使用foreach函数。我通过LISP这样做的原因是,我有函数绘制到最小或最大点的线,这样用户可以快速找到它们(当曲面上的点意外设置为0’并且很难找到时很有用)。

David Bethel 发表于 2022-7-5 17:47:20

一旦有了三维点的pl列表:
(setq maxz (apply 'max (mapcar 'caddr pl)))
并不总是最有效的,但它很简单-大卫

broncos15 发表于 2022-7-5 17:51:07

谢谢大卫!现在,我用这个来根据z坐标对点进行排序。然后,我试图根据用户先前的输入绘制一条到低点或高点的线;然而,这并不能正常工作。我试图通过以下方式实现这一点:
(if (= *findhighlowpointsans* "Low")
       (progn
         (setq cnt 0)
         (while (>= (caddr (nth cnt pts)) (caddr (nth (+ cnt 1) pts)))
         (command "._pline" "_non" pt "_non" (nth cnt pts) "")
         (setq cnt (+ cnt 1))
         )
       )
       (progn
         (setq cnt (length pts))
         (while (<= (caddr (nth cnt pts)) (caddr (nth (- cnt 1) pts)))
         (command "._pline" "_non" pt "_non" (nth cnt pts) "")
         (setq cnt (- cnt 1))
         )
       )
   )
页: [1] 2
查看完整版本: 找到s上的高点和低点