bluebravo 发表于 2022-7-5 16:17:59

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 "")
)

guitarguy1685 发表于 2022-7-5 16:25:57

这是我的尝试。我没有添加任何错误处理程序、撤消点或控制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)
)

Lee Mac 发表于 2022-7-5 16:35:28

我建议如下:

(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)

bluebravo 发表于 2022-7-5 16:43:10

感谢您的回复guitarguy!
 
您的编辑效果很好,但如果输入不可用的快捷方式,它会将对象复制到0层。我知道你确实提到了没有“错误处理程序”,但避免不必要的重复将非常有用。
 
谢谢你抽出时间!

bluebravo 发表于 2022-7-5 16:48:47

谢谢李的回复!
 
lisp确实满足了我的需要,但我还有另一个要求。我发现动态列表功能真的很酷,除了至少有200个快捷方式/层,所以列表太长。你能告诉我如何抑制列表的显示吗?其他我真正喜欢的东西,尤其是“无效选项”。
 
谢谢你抽出时间!

BIGAL 发表于 2022-7-5 16:57:14

你可以制作一个包含两个项目“快捷方式,新图层名”的CSV文本文件,只需读取文件,它可以有你想要的任意多行,Lee有一个读取CSV,因此可以获取这两个项目,然后只要(if(=快捷方式fileshortcut)(setq layname newlay))发布,如果你需要示例。

BIGAL 发表于 2022-7-5 17:02:17

再想想,我参与了一个商业产品,我们通过提供一个用户界面来解决层的问题,如果你画一个特定的物体,比如说一堵墙,软件知道把所有东西放在什么层上,所以没有层的问题。它在后端有一个用于层名称的文本文件。
 
这听起来像是你的随机绘图,然后修复,而不是试图控制你创建。也许使用相同的想法。我已经发布了一些反应堆代码,可以做你想做的事情,类型1CC 2CC等,它知道你想在第1层COLS-CONT上绘制。
 
http://www.cadtutor.net/forum/showthread.php?93661-Lisp表示圆角半径/第3页

bluebravo 发表于 2022-7-5 17:11:03

谢谢你的回复!
 
在这一点上,我很乐意实现李-麦克的解决方案。除了动态列表之外,我不知道如何抑制/删除它,它满足了我们当前的需求。
 
然而,我将研究您对lisp未来发展的建议
 
谢谢你抽出时间

guitarguy1685 发表于 2022-7-5 17:15:17

走这条线
(   (cdr (assoc (getkword (strcat "\nLayer shortcut [" (LM:lst->str (mapcar 'car abr) "/") "] <" (caar abr) ">: ")) abr)))
 
换成这个。
(   (cdr (assoc (getkword (strcat "\nLayer shortcut: <"   (caar abr) ">: ")) abr)))
 
这将抑制所有图层名称。

BIGAL 发表于 2022-7-5 17:23:28

看一看这篇文章,它可以根据你的需要更改为处理层,因此不需要多个快捷方式查看其他代码,我会使用“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]
查看完整版本: LISP |如果条件|复制到