jlumugua 发表于 2013-6-21 17:25:51

求解:程序的执行过程是什么样的。

请哪位给说明下,下面这个程序的运行过程。另外遍历图元有什么作用。



(defun c:tq(/ en enl pts)
   (setq en (car (entsel "选择3dpolyline")))
   (while (= (cdr (assoc 0 (setq enl (entget (setq en (entnext en)))))) "VERTEX")
          (setq pts (cons (cdr (assoc 10 enl)) pts))
   )
   (mapcar '(lambda(pt)(princ (strcat "\nx=" (rtos (carpt) 2 6)
                                        "y=" (rtos (cadr pt) 2 6)
                                        "z=" (rtos (last pt) 2 6)
                              )
                         )
            )
            (setq pts (reverse pts))
   )
   (princ)
)

wowan1314 发表于 2013-6-21 17:25:52

说下我的理解!
程序分两大部分,
第一个部分由while组成,循环找到图元的顶点并组成点表pts。
第二部分由mapcar完成,循环输出pts中的xyz值。
遍历图元主要是对图元内的东西一个个的进行查找处理!
所有的循环类函数都能用来做遍历,比如while.repeat.foreach等!如果是表形式常用mapcar函数做遍历,因为他方便快捷!
vl类函数有很多个函数均能做遍历,对vl我也不熟,所以就不举例了。

自贡黄明儒 发表于 2013-6-21 17:46:16

好象有一种polyline线,叫什么轻多义线吧(如果是重多义线,就转成轻多义线),用entnext可以找到其顶点,我知道的就这么一点点,而且未必准确,等高手回答你吧

286168051 发表于 2013-6-21 18:39:33

提取三维多段线的顶点坐标,三维多段线有子实体需要用遍历的方式获取VERTEX

jlumugua 发表于 2013-6-21 21:07:09

我主要是从while到mapcar搞不懂,while结束后,pts被赋给了什么值,怎么就能一个一个读出来。遍历方式到底是怎么回事,还有其他什么方式?谢谢了

ZZXXQQ 发表于 2013-6-21 23:03:24


(defun c:tq(/ en enl pts)
(setq en (car (entsel "\n选择3dpolyline"))) ;提示选择3维复线
(while (= (cdr (assoc 0 (setq enl (entget (setq en (entnext en)))))) "VERTEX")
;如果下一个子实体是VERTEX
(setq pts (cons (cdr (assoc 10 enl)) pts)) ;将子实体结点读出,加到坐标表pts中
)
(mapcar ;对坐标表pts每项进行循环打印坐标表pts
'(lambda(pt)(princ (strcat "\nx=" (rtos (car pt) 2 6)
                           "y=" (rtos (cadr pt) 2 6)
                           "z=" (rtos (last pt) 2 6)
                  )
             )
)
(setq pts (reverse pts)) ;坐标表反向
)
(princ)
)

jlumugua 发表于 2013-6-22 21:17:58

感谢各位的回复,我主要是对mapcar的理解还是有问题,再次看过程序后发现mapcar后面是list1.。。listn,而不是1.。。n。明白了。谢谢各位。
页: [1]
查看完整版本: 求解:程序的执行过程是什么样的。