LISP |如果条件|复制到
目标:使用图层名快捷方式将选定对象复制到现有图层的LISP。例子:
1、选择对象
2.“CX”(Lisp命令)要求将图层复制到
3.“1CC”(快捷方式)复制到实际图层名1\u COLS-CONT
或“2CC”复制到实际层名称2\u COLS-CONT等。
我有下面的LISP开始,我只需要添加所有的条件接受一个图层名快捷方式,并改变层到相应的一个。我有很多层,所以每个层使用一个lisp命令似乎太多了。
我知道我需要多个if条件,但我需要实际代码的帮助(对于lisp来说是相当新的)。
谢谢你抽出时间!
;FILENAME cx.LSP
;THIS LISP ROUTINE copies selected objects in place then prompts
;the user to change the layer of previus objects selected.
;BY Ryan 3/5/02
(defun c:cx()
(setq ss1 (ssget))
(setq laycx (getstring "Destination layer for copy: "))
(command "_copy" "P" "" "@" "@")
(command "_chprop" "P" "" "la" laycx "")
) 这是我的尝试。我没有添加任何错误处理程序、撤消点或控制echo。我还在命令行中做了一些更改。
*编辑*我也没有包括任何图层检查/创建功能。
(defun c:cx( / ss1 laycx Layer )
(setq ss1 (ssget))
(setq laycx (strcase (getstring "\nDestination layer for copy: ")))
(cond ;;add as many conditions as you like.
((= laycx "1CC")
(setq Layer "1_COLS-CONT"))
((= laycx "2CC")
(setq Layer "2_COLS-CONT"))
)
(command "_copy" ss1 "" "@" "@")
(command "_chprop" "P" "" "la" Layer "")
(princ)
) 我建议如下:
(defun c:cx ( / abr idx lay sel )
(setq abr
'(
("1CC" . "1_COLS-CONT")
("2CC" . "2_COLS-CONT")
)
)
(if (setq sel (ssget "_:L"))
(progn
(initget (LM:lst->str (mapcar 'car abr) " "))
(setq lay
(cond
( (cdr (assoc (getkword (strcat "\nLayer shortcut [" (LM:lst->str (mapcar 'car abr) "/") "] <" (caar abr) ">: ")) abr)))
( (cdar abr))
)
)
(if (not (tblsearch "layer" lay))
(entmake
(list
'(000 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
'(070 . 0)
(cons 2 lay)
)
)
)
(repeat (setq idx (sslength sel))
(vla-put-layer (vla-copy (vlax-ename->vla-object (ssname sel (setq idx (1- idx))))) lay)
)
)
)
(princ)
)
;; List to String-Lee Mac
;; Concatenates each string in a supplied list, separated by a given delimiter
;; lst - List of strings to concatenate
;; del - Delimiter string to separate each item
(defun LM:lst->str ( lst del )
(if (cdr lst)
(strcat (car lst) del (LM:lst->str (cdr lst) del))
(car lst)
)
)
(vl-load-com) (princ)
感谢您的回复guitarguy!
您的编辑效果很好,但如果输入不可用的快捷方式,它会将对象复制到0层。我知道你确实提到了没有“错误处理程序”,但避免不必要的重复将非常有用。
谢谢你抽出时间! 谢谢李的回复!
lisp确实满足了我的需要,但我还有另一个要求。我发现动态列表功能真的很酷,除了至少有200个快捷方式/层,所以列表太长。你能告诉我如何抑制列表的显示吗?其他我真正喜欢的东西,尤其是“无效选项”。
谢谢你抽出时间! 你可以制作一个包含两个项目“快捷方式,新图层名”的CSV文本文件,只需读取文件,它可以有你想要的任意多行,Lee有一个读取CSV,因此可以获取这两个项目,然后只要(if(=快捷方式fileshortcut)(setq layname newlay))发布,如果你需要示例。 再想想,我参与了一个商业产品,我们通过提供一个用户界面来解决层的问题,如果你画一个特定的物体,比如说一堵墙,软件知道把所有东西放在什么层上,所以没有层的问题。它在后端有一个用于层名称的文本文件。
这听起来像是你的随机绘图,然后修复,而不是试图控制你创建。也许使用相同的想法。我已经发布了一些反应堆代码,可以做你想做的事情,类型1CC 2CC等,它知道你想在第1层COLS-CONT上绘制。
http://www.cadtutor.net/forum/showthread.php?93661-Lisp表示圆角半径/第3页 谢谢你的回复!
在这一点上,我很乐意实现李-麦克的解决方案。除了动态列表之外,我不知道如何抑制/删除它,它满足了我们当前的需求。
然而,我将研究您对lisp未来发展的建议
谢谢你抽出时间 走这条线
( (cdr (assoc (getkword (strcat "\nLayer shortcut [" (LM:lst->str (mapcar 'car abr) "/") "] <" (caar abr) ">: ")) abr)))
换成这个。
( (cdr (assoc (getkword (strcat "\nLayer shortcut: <" (caar abr) ">: ")) abr)))
这将抑制所有图层名称。 看一看这篇文章,它可以根据你的需要更改为处理层,因此不需要多个快捷方式查看其他代码,我会使用“L”,然后你的快捷方式L1C“如果你愿意,你可以使用1或2或3等。
http://www.cadtutor.net/forum/showthread.php?100895-turn-macro-script-to-a-lisp-for-insert-block-from-another-drawing
页:
[1]