EricDevault 发表于 2022-7-5 15:33:14

列表总和问题

我有一个“while”循环,每次循环时将在命令行中输入的内容添加到列表中。然后我想得到列表中所有数字的总和。我很有信心这会奏效:
 

(setq CLength1 (apply '+ (list lst)))

 
但我在命令行上发现了这个错误:
 

; error: bad argument type: numberp: (36 36 36 36)

 
完整的“while”代码:
 

(while

(progn

(initget "U")
(setq d (getdist (strcat "\Distance to next Vert Strap (Enter when done; U to Undo)"))))
(setq lst (cons (fix d) lst))
(cond
((= d "U") (command "._undo" "._back"))
((/= d 0)

(progn
   (command "._offset"
            (/ d 12.)
            s
            "_non"
            (polar (cdr (assoc 10 (entget s))) 0. 1.)
            ""
   )
   (if (not (eq s (setq s (entlast))))
       (progn
         (setq p1 (cdr (assoc 10 (entget s)))
               p2 (cdr (assoc 11 (entget s)))
               pt (if (< (cadr p1) (cadr p2))
                  p1
                  p2
                  )
         )
          (setq dx1 (car p1)   ;ent x value
                        dx2 (cadr p1);ent y value
                        dx3 (caddr p1) ;ent z value
                        dd1 (+ dx1 (/ d 12)) ;dimension distance
                        sdx (- dx1 (/ d 12));start point x
                        dmx (/ (+ dd1 dx1) 2) ;middle
          )
          (if (>= d 18)       
        (setq doff -1.6)
        (setq doff -3.2)
        )
         (entmake (list (cons 0 "DIMENSION")
          (cons 100"AcDbEntity")
          (cons 67 0)       
      (cons 8"DIMBAD")
      (cons 100"AcDbDimension")
          (cons 10 (trans (list dd1 doff 0.) 1 0))
          (cons 11 (trans (list dmx doff 0.) 1 0))
          (cons 12 (list 0. 0. 0.))
          (cons 7033)
      (cons 1"")
      (cons 715)
      (cons 721)
      (cons 411.0)
          (cons 52 0)
      (cons 53 0)
      (cons 540)
          (cons 3"TEMPLATE_DRAWING")
          (cons 100"AcDbAlignedDimension")
          (cons 13 (trans (list sdx 0. 0.) 1 0))
          (cons 14 (trans (list dx1 0. 0.) 1 0))
          (cons 15 (list 0. 0. 0.))
      (cons 16 (list 0. 0. 0.))
          ))
       )
   )
   )
)))
(setq CLength1 (apply '+ (list lst)))
(princ CLength1)

satishrajdev 发表于 2022-7-5 15:50:35

试试看
(setq CLength1 (apply '+ lst))
 
完整代码:

(while
(progn
   (initget "U")
   (setq d
   (getdist
   (strcat
       "\Distance to next Vert Strap (Enter when done; U to Undo)"
   )
   )
   )
)
(setq lst (cons (fix d) lst))
(cond
    ((= d "U") (command "._undo" "._back"))
    ((/= d 0)

   (progn
(command "._offset"
       (/ d 12.)
       s
       "_non"
       (polar (cdr (assoc 10 (entget s))) 0. 1.)
       ""
)
(if (not (eq s (setq s (entlast))))
(progn
    (setq p1 (cdr (assoc 10 (entget s)))
          p2 (cdr (assoc 11 (entget s)))
          pt (if (< (cadr p1) (cadr p2))
             p1
             p2
             )
    )
    (setq dx1 (car p1)                ;ent x value
          dx2 (cadr p1)                ;ent y value
          dx3 (caddr p1)        ;ent z value
          dd1 (+ dx1 (/ d 12))        ;dimension distance
          sdx (- dx1 (/ d 12))        ;start point x
          dmx (/ (+ dd1 dx1) 2)        ;middle
    )
    (if        (>= d 18)
      (setq doff -1.6)
      (setq doff -3.2)
    )
    (entmake (list (cons 0 "DIMENSION")
                   (cons 100 "AcDbEntity")
                   (cons 67 0)
                   (cons 8 "DIMBAD")
                   (cons 100 "AcDbDimension")
                   (cons 10 (trans (list dd1 doff 0.) 1 0))
                   (cons 11 (trans (list dmx doff 0.) 1 0))
                   (cons 12 (list 0. 0. 0.))
                   (cons 70 33)
                   (cons 1 "")
                   (cons 71 5)
                   (cons 72 1)
                   (cons 41 1.0)
                   (cons 52 0)
                   (cons 53 0)
                   (cons 54 0)
                   (cons 3 "TEMPLATE_DRAWING")
                   (cons 100 "AcDbAlignedDimension")
                   (cons 13 (trans (list sdx 0. 0.) 1 0))
                   (cons 14 (trans (list dx1 0. 0.) 1 0))
                   (cons 15 (list 0. 0. 0.))
                   (cons 16 (list 0. 0. 0.))
             )
    )
)
)
   )
    )
)
)
(setq CLength1 (apply '+ lst))
(princ (rtos lst 2 0)) ; Add precision here

EricDevault 发表于 2022-7-5 15:59:15

 
是的,就是这样!每个例子都说把列表称为(list lst),不知道为什么。但无论如何谢谢你

satishrajdev 发表于 2022-7-5 16:14:45

当您在此时添加(setq lst(cons(fix d)lst))时,您已经将lst变量定义为list,然后无需再次添加(list lst)。

Lee Mac 发表于 2022-7-5 16:31:59

您可以直接执行求和,而不是构建列表,例如替换:
(setq lst (cons (fix d) lst))
使用:
(setq CLength1 (+ (cond (CLength1) (0)) (fix d)))

pBe 发表于 2022-7-5 16:36:20

 
我的想法完全正确。
页: [1]
查看完整版本: 列表总和问题