SELFCAD 发表于 2022-7-6 08:19:13

调试帮助

大家好,
我试着用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)
)
)

SELFCAD 发表于 2022-7-6 08:26:52

如果我知道某个点的坐标,如何从选择集中删除该点?

Stefan BMR 发表于 2022-7-6 08:37:15

您可以创建点列表并在该列表上工作,而不是每次都在选择集中工作。
这是我的尝试:

(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)
)

SELFCAD 发表于 2022-7-6 08:39:33

谢谢Stefan,你是我的天使!

marko_ribar 发表于 2022-7-6 08:49:56

以下是我的尝试:
 

(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点上。。。

SELFCAD 发表于 2022-7-6 08:58:30

我如何定义这些点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-列表

Stefan BMR 发表于 2022-7-6 09:04:43

所以你有一个可变的点数。。
最好将您的点存储在列表中,如下所示:
(mapcar '(lambda (u d) (setq p (polar (if p p (car Pdata)) u d))) Udata Ddata)

Stefan BMR 发表于 2022-7-6 09:07:48

注意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))

Stefan BMR 发表于 2022-7-6 09:16:20

或者这个
((lambda (p u d) (mapcar '(lambda (u d) (setq p (polar p u d))) u d)) (car Pdata) Udata Ddata)

SELFCAD 发表于 2022-7-6 09:23:00

谢谢你,斯特凡!
页: [1]
查看完整版本: 调试帮助