Delta-Sword 发表于 2022-7-6 14:16:34

复杂循环

我有一个问题,循环一个函数到前一个点。
 
我写了一个小程序
1、选择图层名称
2、检查是否存在层all ready
如果有
3a。告诉用户它存在
3b。询问他们是否要添加到现有层。
3c。如果要添加,请将其设置为当前。
-如果他们不想添加到它,则返回到选择层名称
 
4.如果该层不存在,则创建它。
 
(DEFUN C:SETLAYER ()

(SETQ PREVLAYER(GETVAR "CLAYER"))
**********
(SETQ LAYERNAME(GETSTRING "\n ENTER NAME FOR NEW LAYER : "))
(SETQ CHECKLAYER (TBLSEARCH "LAYER" LAYERNAME ))

( IF CHECKLAYER
   (PROGN
       (PROMPT "\n LAYER ALREADY EXISTS : ")
       (SETQ CONTINUE (GETSTRING "\n ADD TO CURRENT LAYER? : "))

         (IF ( = CONTINUE Y )
               (COMMAND "-LAYER" "M" LAYERNAME "")
               (-------)
         )
   )
   (COMMAND "-LAYER" "M" LAYERNAME "")
)

(PRINC)
)
(PRINC)
 
在代码中,我想从(------)循环
仅当他们选择N时,才备份到*****。
 
我希望有人能帮忙。因为我在拔头发。剩下的是什么:x:x:x:x:x

The Buzzard 发表于 2022-7-6 14:33:10

 
 
 
试试这个:您可以根据自己的选择更改函数名。
 
(DEFUN C:SETLAYER ()
(SETQ PREVLAYER(GETVAR "CLAYER"))
(INPUT)
)
(DEFUN INPUT ()
(SETQ LAYERNAME(GETSTRING "\n ENTER NAME FOR NEW LAYER : "))
(SETQ CHECKLAYER (TBLSEARCH "LAYER" LAYERNAME ))
( IF CHECKLAYER
   (PROGN
       (PROMPT "\n LAYER ALREADY EXISTS : ")
       (SETQ CONTINUE (GETSTRING "\n ADD TO CURRENT LAYER? : "))
         (IF ( = CONTINUE Y )
               (COMMAND "-LAYER" "M" LAYERNAME "")
               (INPUT)
         )
   )
   (COMMAND "-LAYER" "M" LAYERNAME "")
)
(PRINC)
)
(PRINC)

Delta-Sword 发表于 2022-7-6 14:38:45

非常感谢你
 
一直在寻找各种各样的地方,寻找一种特殊的循环功能。
 
:\没有找到一个tho
 
再次感谢

Lee Mac 发表于 2022-7-6 14:48:45

这可能会为您提供对循环行为的最大控制:
 

(defun c:setlayer (/ lay)
(while
   (progn
   (setq lay (getstring t "\nSpecify Layer Name: "))
   (cond ((eq "" lay) nil) ; Exit loop
         ((not (snvalid lay))
            (princ "\n** Invalid Layer Name **"))
         ((tblsearch "LAYER" lay)
            (princ "\n** Layer Already Exists **")
            (initget "Yes No")
            (if (eq "No" (getkword "\nAdd to Current Layer? <Yes> : "))
            nil ; Exit loop
            (not (setvar "CLAYER" lay)))) ; Exit loop
         (t (command "_.-layer" "_M" lay "") nil)))) ; Exit Loop
(princ))

The Buzzard 发表于 2022-7-6 14:56:26

 
走的路,李!

Delta-Sword 发表于 2022-7-6 15:00:17

hrmmm有趣
 
我知道它的基本功能,但你能解释一下
((非(snvalid lay))
 

 
((eq“”lay)无)
以及每个部分的工作原理。
 
我在过去几周才开始使用lisps。
 
非常感谢

The Buzzard 发表于 2022-7-6 15:14:00

 
snvalid检查符号表名称中的有效字符
 
((eq“”lay)nil)表示如果提供了输入或空白信息,则退出循环。
 
所有这些都是更好的错误捕捉。

Lee Mac 发表于 2022-7-6 15:21:47

 
很像Buzzard说的,
 
snvalid将检查不可靠的字符,例如层名称中的*。
 
如果用户在图层名提示中点击enter,则返回一个空字符串(“”),因此循环将退出。Tbh,它只是一个长包装的测试表达式,没有函数在主“循环”中执行。
 
我倾向于使用vla add或entmake创建层,因为它更快、更可靠,但如果您刚刚开始,(命令“_.-layer”。)快速简单
页: [1]
查看完整版本: 复杂循环