使用未知ex命名层
大家好。我制作这些代码是为了制作一个层,但如果层名称已经存在,我不知道如何通过编号给它起一个罕见的名称。
例如,我希望这些代码检查层名称“Layer1”是否存在,然后将一个添加到层名称中,成为“Layer2”,如果最后一个也存在,则为“Layer3”
等等
但是这些代码中有一些错误,我无法解决。
请帮帮我。
谢谢你 也许像。。
((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 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 "")
)
)
顺便提一下,这是我第一次尝试递归编程。
欢迎提出意见和建议
它也只适用于数字后缀
我的版本。辅助函数:
递归搜索:
迭代(如果愿意):
所以你可以这样称呼它:
(command "_.Layer" "_Make" (LayerUnique "Layer1") "")
编辑:上面的效率真的很低。。。我已经看到了两个需要改进的地方:
(1) 迭代不需要在每次迭代时调用LayerSplit。
(2) 获取LayerSplit内的预处理部分可以通过以下方法完成:
(setq pre (substr str 1 n))而不是while循环。 我遇到的问题是,如果层名称有一个数字后缀和层名称中间的一个数字,代码会使用一组特定的规则
(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,我还有很长的路要走 另一个:
8
9 太棒了,李!我可以稍微修改一下它以允许命名为Layer001,Layer002?
10
您必须创建一个函数来解析数字——我的方法假设在字符串的开始/结束处有一个连续的数字部分。
当然,这不是唯一的方法,但我认为最有效的方法——在处理字符串操作时,由于LISP在使用字符串函数时分配内存的方式,转换为列表并再次转换通常是最有效的方法。
谢谢Irne!当然可以,随意修改
例子:
11 或者只是稍微修改一下:
请注意,它只在名称中使用最后一个连续批次的数字。所以如果你有一个像“Layer03garble056moregarble”这样的名字,它将增加056,而不是03。
我想可以用正则表达式,但这个很简单。
页:
[1]