Bhanson 发表于 2022-7-6 09:57:30

有没有办法设置+o

我有一组代码,需要根据while循环中的条件在加号(+)和减号(-)之间交替。这比重新键入所有(setq sel\n代码)要容易得多(参见示例代码)
 
(while (< count 4)
(setq count (+ count 1))

           (setq sel_3 (list (+ ptBx 1.4) (- ptBy 1.2)) )
        (setq sel_4 (list (+ ptBx 1.41) (- ptBy 1.55)) )
        (setq sel_7 (list (+ ptBx 1.7) (- ptBy 1.0)) )
        (setq sel_8 (list (+ ptBx 2.0) (- ptBy 1.2)) )
        (setq sel_9 (list (- ptBx 0.2) (- ptBy 2.0)) )
        (setq sel_10 (list (+ ptBx 0.75) (- ptBy 2.25)) )
        (setq sel_11 (list (+ ptBx 1.0) (- ptBy 2.5)) )
(setq sel_12 (list (+ ptBx 1.25) (- ptBy 3.0)) )
        (setq sel_14 (list (- ptBx 0.6) (- ptBy 0.) )
           (setq sel_15 (list (- ptBx 0.3) (- ptBy 0.9)) )

           (THEN DO SOME PROCESS USING THE sel_N POINTS FROM ABOVE)

); END WHILE LOOP
 
谢谢

Lee Mac 发表于 2022-7-6 10:14:10

我不太清楚您试图用代码实现什么,但在回答您的线程标题时:
 
(setq plus +)
(plus 2 3)

=> 7

Bhanson 发表于 2022-7-6 10:23:03

谢谢李,我认为这不管用,但我想有时候答案就在你面前。
 
顺便问一下,你是怎么对LISP了解这么多的?你会推荐一些可以学习的阅读材料吗?
 
再次感谢!!

Lee Mac 发表于 2022-7-6 10:27:10

非常欢迎你BHanson
 
 
我没有读过任何关于LISP的书,只有真正的参考文献(主要是VLIDE中的帮助文档)。我的大部分知识都来自论坛

Bhanson 发表于 2022-7-6 10:39:34

好吧,到目前为止,这很有帮助,所以我会继续这样做。谢谢

irneb 发表于 2022-7-6 10:42:15

这是lisp的“优点”之一。由于其“所谓的函数方法”和非类型变量,变量实际上也可以包含函数。。。因此,可以直接使用这种重新分配。其他语言有类似的概念,但很少像C++的宏那样易于使用。
 
顺便说一句,这个特定的问题并不真正需要这种方法——尽管它是“最简单”(可能也是最有效)的方法。如果你使用VB,你会遵循一种更数学的方法:
;; To subtract
(setq Sign -1)
(setq Answer (+ Variable (* Sign Value)))

;; To add
(setq Sign 1)
(setq Answer (+ Variable (* Sign Value)))但显然这将仅限于+/-。在*和/之间做同样的事情需要像Lee所示的函数赋值(或者可能是expt函数的一些奇怪用法)-否则一些wangling使用条件(这将使代码更大)。

Bhanson 发表于 2022-7-6 10:51:56

李的代码运行得很好,但感谢您澄清了关于变量存储函数的那一小部分。
 
这是代码的完成部分。
(这些变量ptAx、ptAy等是代码实体选择部分的细分点(xyz)。使用+和-函数的变量根据如下所示的计数进行交替,以避免重复键入“选择点”的交替+和-函数。
 
(setq count 1)
(while (<= count 4.0)
    (print)(princ "Count is: ")(princ count)(print)

(cond ((= count 1); point A
(setq calca -)(setq calcb +)(setq calcc -)
(setq ptNx ptAx)(setq ptNy ptAy)
(setq scale_ammt 0.97)
); end of first condition

((= count 2); point B
(setq calca +)(setq calcb -)(setq calcc -)
(setq ptNx ptBx)(setq ptNy ptBy)
(setq scale_ammt 0.935)
); end of second condition

((= count 3); point C
(setq calca -)(setq calcb +)(setq calcc +)
(setq ptNx ptCx)(setq ptNy ptCy)
(setq scale_ammt 0.97)
); end of third condition

((= count 4); point D
(setq calca +)(setq calcb -)(setq calcc +)
(setq ptNx ptDx)(setq ptNy ptDy)
(setq scale_ammt 0.935)
); end of fourth condition
   )

        ; Set Selection points for Top Right
(setq sel_1 (list (calca ptNx 1.2) (calcc ptNy 0.9)) )
        (setq sel_2 (list (calca ptNx 1.4) (calcc ptNy 1.25)) )
           (setq sel_3 (list (calca ptNx 1.4) (calcc ptNy 1.3)) )
        (setq sel_4 (list (calca ptNx 1.41) (calcc ptNy 1.65)) )
        (setq sel_9 (list (calcb ptNx 0.2) (calcc ptNy 2.0)) )
        (setq sel_10 (list (calca ptNx 0.75) (calcc ptNy 2.25)) )
        (setq sel_11 (list (calca ptNx 0.5) (calcc ptNy 2.5)) )
(setq sel_12 (list (calca ptNx 1.25) (calcc ptNy 3.0)) )
        (setq sel_14 (list (calcb ptNx 0.6) (calcc ptNy 0.) )
           (setq sel_15 (list (calcb ptNx 0.3) (calcc ptNy 0.9)) )




; Edit Drawing lines on cover to New Style
;*****************************************
          
; Edit Drawing lines

        (command "zoom" "e")
(command ".explode" (ssget "_C" sel_1 sel_2)); Explode Dart in corner
(command ".offset" 0.375 (ssget "_C" sel_1 sel_2) sel_12 ""); Offset Dart
(command "zoom" "e")          
        (setq selection (ssget "_C" sel_3 sel_4)); Modify Newline Entities
(setq ent_name (ssname selection 0))
(setq ent_temp (entget ent_name))
(setq ptM (cdr (assoc 10 ent_temp)))
        (setq ptN (cdr (assoc 11 ent_temp)))
        ; Find Center of Newline
        (setq center (list (+ (/(-(car ptM) (car ptN))2.0) (car ptN)); Find Center X Value
                   (+(/(-(cadr ptM) (cadr ptN))2.0)(cadr ptN)) ) ); Find Center Y Value
        (command "scale" (ssget "_C" sel_3 sel_4) "" center scale_ammt ""); Scale Down Newline Entities
        (command "explode" (ssget "_C" sel_11 sel_12) ); Explode L shape pline close to center
(command "zoom" "e")
        (command ".extend" (ssget "_C" sel_9 sel_10) "" (ssget "_C" sel_3 sel_4) ""); EXtend Newline to Left side of L
        (command ".trim" (ssget "_C" sel_3 sel_4) "" (ssget "_C" sel_9 sel_10) "")
        (Command ".explode" (ssget "_C" sel_14 sel_15))
(command "erase" (ssget "_C" sel_11 sel_12) ""); Erase Bottom of L (this one ^)
        (setq selection (ssget "_C" sel_14 sel_15))
        (setq ent_name (ssname selection 0))
(setq ent_temp (entget ent_name))
(setq ptM (cdr (assoc 10 ent_temp)))
(setq ptN (cdr (assoc 11 ent_temp)))
        (setq **** (list (car ptN)(calcc (cadr ptN) 0.7)(caddr ptN) ) )
        (setq ent_temp (subst (cons 11 ****)(assoc 11 ent_temp) ent_temp))
(entmod ent_temp)
   (setq count (+ count 1))
); END WHILE LOOP
[*]您可以将计数增量合并到while标头中,因此:
[/列表]
(setq计数0)(而(

irneb 发表于 2022-7-6 11:00:06

页: [1]
查看完整版本: 有没有办法设置+o