调试帮助
大家好,我试着用lisp从起点pstart到最近的点,等等。。。。直到最后一点选择-但不起作用。也许有人会帮我调试代码?谢谢
(defun c:pol (/ Pdata Pordata)
(setq pstart (getpoint "\nPunct start:"))
(setq ss (ssget '((0 . "point"))))
(repeat (- (sslength ss) 1)
(repeat (setq i (sslength ss))
(setq e (entget (ssname ss (setq i (1- i))))
Pdata
(cons
(list
(setq p (cdr (assoc 10 e)))
(setq dist
(distance pstart
(cdr (assoc 10 e))
)
)
)
Pdata
)
)
)
(setq Pordata (cdr
(vl-sort
Pdata
(function
(lambda (e1 e2)
(< (cadr e1) (cadr e2))
)
)
)
)
)
(command "_.line" pstart (car (car pordata)) "")
(setq Pordata (cdr Pordata))
(setq pstart (car (car pordata)))
(ssdel (ssname ss 0) ss)
)
)
如果我知道某个点的坐标,如何从选择集中删除该点? 您可以创建点列表并在该列表上工作,而不是每次都在选择集中工作。
这是我的尝试:
(defun C:TEST ( / ss_first ss_rest e1 i lst p1)
(if
(and
(princ "\nSelect first point")
(setq ss_first (ssget ":E:S" '((0 . "POINT"))))
(princ "\nSelect the others points")
(setq ss_rest (ssget'((0 . "POINT"))))
)
(progn
(ssdel (setq e1 (ssname ss_first 0)) ss_rest)
(setq p1 (cdr (assoc 10 (entget e1))))
(repeat (setq i (sslength ss_rest))
(setq lst (cons (cdr (assoc 10 (entget (ssname ss_rest (setq i (1- i)))))) lst))
)
(while lst
(entmake (list '(0 . "LINE")
(cons 10 p1)
(cons 11 (setq p1 (car (setq lst (vl-sort lst '(lambda (x y) (< (distance x p1) (distance y p1))))))))
)
)
(setq lst (cdr lst))
)
)
)
(princ)
) 谢谢Stefan,你是我的天使! 以下是我的尝试:
(defun pointsarray ( ptst ptl / dptpt dptptlst mindptpt pten ptl )
(foreach pt ptl
(setq dptpt (distance ptst pt))
(setq dptptlst (cons dptpt dptptlst))
)
(setq dptptlst (vl-remove 0.0 dptptlst))
(setq mindptpt (eval (cons 'min dptptlst)))
(mapcar '(lambda (pt) (if (= (distance ptst pt) mindptpt) (setq pten pt))) ptl)
(setq ptlst (cons ptst ptlst))
(setq ptl (vl-remove ptst ptl))
(if (not (null ptl)) (pointsarray pten ptl) )
ptlst
)
(defun c:pts2lines ( / ss ssn pt ptl ptst ptlst )
(prompt "\nSelect points that you want to connect them with lines")
(setq ss (ssget '((0 . "POINT") (210 0.0 0.0 1.0)) ))
(setq ssn (sslength ss) i ssn)
(repeat ssn
(setq pt (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))))
(setq ptl (cons pt ptl))
)
(setq ptl (reverse ptl))
(vl-cmdf "_.OSNAP" "node")
(setq ptst (getpoint "\nPick start point from witch to create continous array of lines obtained from rest of selected points"))
(setq ptlst (pointsarray ptst ptl))
(vl-cmdf "_.LINE")
(foreach pt ptlst
(vl-cmdf pt)
)
(vl-cmdf "")
(princ)
)
M、 R。
P、 S.Stefan的代码更好,我的代码限制在256点上。。。 我如何定义这些点p1,p2。。。pn,以这种方式:
(setq p1(极性(第n个0 Pdata)(第n个0 Udata)(第n个0 Ddata)))
(setq p2(极性p1(第n个1 Udata)(第n个1 Ddata)))
(setq p3(极轴p2(第2个Udata)(第2个Ddata)))
...
...
(setq pn(极性p(n-1)(第n(-n 1)个Udata)(第n(-n 1)个Ddata)))
Pdata、Udata、Ddata-列表 所以你有一个可变的点数。。
最好将您的点存储在列表中,如下所示:
(mapcar '(lambda (u d) (setq p (polar (if p p (car Pdata)) u d))) Udata Ddata) 注意p变量。如果在调用(mapcar…之前不是nil,则可能会出错。
也许 吧:
(defun test (Pdata Udata Ddata / p)
(setq p (car Pdata))
(mapcar '(lambda (u d) (setq p (polar p u d))) Udata Ddata)
)
(setq lst (test Pdata Udata Ddata)) 或者这个
((lambda (p u d) (mapcar '(lambda (u d) (setq p (polar p u d))) u d)) (car Pdata) Udata Ddata) 谢谢你,斯特凡!
页:
[1]