Sweety 发表于 2022-7-6 09:54:46

使用未知ex命名层

大家好。
 
我制作这些代码是为了制作一个层,但如果层名称已经存在,我不知道如何通过编号给它起一个罕见的名称。
 
例如,我希望这些代码检查层名称“Layer1”是否存在,然后将一个添加到层名称中,成为“Layer2”,如果最后一个也存在,则为“Layer3”
等等
 
但是这些代码中有一些错误,我无法解决。
 
请帮帮我。
 
谢谢你

Lt Dan's l 发表于 2022-7-6 10:01:25

也许像。。
((lambda (layName n)
(while (tblsearch "LAYER" layname)
   (setq layName (strcat "LAYER" (itoa (setq n (1+ n)))))
)
(command "_.-layer" "New" layName nil)
(setvar 'cmdecho 1)
)
"LAYER"
(setvar 'cmdecho 0)
)

pBe 发表于 2022-7-6 10:08:29

试试这个:
 

;;;   pBe Jan 2011;;;
;;;   ;;;

(defun laysearch (ln)
(setq nmpst 0 ln_lnt (strlen ln))
(if (setq eln
   (tblsearch "LAYER" ln))
(progn
   (while (and
         (= (atoi ln) 0)
             (< nmpst ln_lnt))
            
      (setq ln (substr ln 2)
       nmpst (1+ nmpst))
         )
(setq ln (strcat (substr (cdr (assoc 2 eln)) 1 nmpst)
   (itoa (+ 1 (atoi ln)))))
   (laysearch ln)
    )
(command "_.layer" "M" ln "")
   )
)

 
顺便提一下,这是我第一次尝试递归编程。
欢迎提出意见和建议
 
它也只适用于数字后缀
 

irneb 发表于 2022-7-6 10:18:10

我的版本。辅助函数:
递归搜索:
迭代(如果愿意):
所以你可以这样称呼它:
(command "_.Layer" "_Make" (LayerUnique "Layer1") "")
编辑:上面的效率真的很低。。。我已经看到了两个需要改进的地方:
(1) 迭代不需要在每次迭代时调用LayerSplit。
(2) 获取LayerSplit内的预处理部分可以通过以下方法完成:
(setq pre (substr str 1 n))而不是while循环。

pBe 发表于 2022-7-6 10:23:22

我遇到的问题是,如果层名称有一个数字后缀和层名称中间的一个数字,代码会使用一组特定的规则
 
(laysearch“Spark1”)
层“Spark1”层已创建
(laysearch“Spark1”)
层“Spark2”层已创建
(laysearch“1_Spark”)
层“1_Spark”层已创建
(laysearch“1_Spark”)
已创建层“2”
(laysearch“Spark2\u lite”)
层“Spark2\u lite”层已创建
(laysearch“Spark2\u lite”)
层“Spark3”层已创建
 
真倒霉
 
我想稍加调整就能解决这个问题
 
代码很好Irneb,我还有很长的路要走

Lee Mac 发表于 2022-7-6 10:29:34

另一个:
 
8
9

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

太棒了,李!我可以稍微修改一下它以允许命名为Layer001,Layer002?
10

Lee Mac 发表于 2022-7-6 10:45:59

 
您必须创建一个函数来解析数字——我的方法假设在字符串的开始/结束处有一个连续的数字部分。
 
 
 
当然,这不是唯一的方法,但我认为最有效的方法——在处理字符串操作时,由于LISP在使用字符串函数时分配内存的方式,转换为列表并再次转换通常是最有效的方法。
 
 
谢谢Irne!当然可以,随意修改

Lee Mac 发表于 2022-7-6 10:50:48

 
例子:
 
11

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

或者只是稍微修改一下:
请注意,它只在名称中使用最后一个连续批次的数字。所以如果你有一个像“Layer03garble056moregarble”这样的名字,它将增加056,而不是03。
 
我想可以用正则表达式,但这个很简单。
页: [1]
查看完整版本: 使用未知ex命名层