AQucsaiJr 发表于 2022-7-6 10:17:30

层太多!!!需要mer

这就是交易,
我有一个虚假图层的列表,存在于一堆需要合并到正确图层的图形中。我试着为此编写一个脚本,但并不是所有的图形都有虚假的层,所以每次脚本到达不在图形中的层时都会被卡住。每次暂停后都必须恢复脚本并不节省时间。有谁知道lisp或其他类型的程序可以做到这一点?我已经附上了我写的脚本,如果可能的话,我可以做一些修改,让它工作。
PurgeAll。可控硅

AQucsaiJr 发表于 2022-7-6 10:23:06

我编写的脚本调用了内置的层合并命令。我的问题是,有太多的绘图需要此修复,因此我想将其作为一个批处理文件,但是我编写的脚本经常会被卡住,并且不能节省时间。

alanjt 发表于 2022-7-6 10:25:54

你可以试试这样:
 
(defun MergeLayers (#OldLayers #NewLayers / #Layers)
(setq #Layers (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
(mapcar
   '(lambda (o n)
      (and (tblsearch "layer" o)
         (or (tblsearch "layer" n) (vla-add #Layers n))
         (vl-cmdf "_.-laymrg" "_n" o "" "_n" n "_y")
      ) ;_ and
    ) ;_ lambda
   #OldLayers
   #NewLayers
) ;_ mapcar
) ;_ defun
 
 
例子:
(MergeLayers '("A" "B" "C" "D") '("1" "2" "3" "4"))

Lee Mac 发表于 2022-7-6 10:28:51

触摸更快:
 

(defun MergeLayers (#OldLayers #NewLayers)
(setq #Layers (cond (#Layers) ((vla-get-layers
                                  (vla-get-activedocument (vlax-get-acad-object))))))
(mapcar
   (function
   (lambda (o n)
      (and (tblsearch "layer" o)
             (or (tblsearch "layer" n) (vla-add #Layers n))
             (vl-cmdf "_.-laymrg" "_n" o "" "_n" n "_y")))) #OldLayers #NewLayers))

 

alanjt 发表于 2022-7-6 10:31:31

(函数优于')有什么好处吗?
 
我曾想过让vla获得全局层,但它似乎没有意义,因为它将只运行一次,每个绘图。
 

alanjt 发表于 2022-7-6 10:34:45

只是因为我好奇:
 
Command: (benchmark '( (tl) (ta) ))
Elapsed milliseconds / relative speed for 32768 iteration(s):

   (TL).....1578 / 1.01 <fastest>
   (TA).....1593 / 1 <slowest>

Command: (benchmark '( (tl) (ta) ))
Elapsed milliseconds / relative speed for 32768 iteration(s):

   (TL).....1594 / 1 <fastest>
   (TA).....1594 / 1 <slowest>

Command: (benchmark '( (tl) (ta) ))
Elapsed milliseconds / relative speed for 32768 iteration(s):

   (TL).....1593 / 1 <fastest>
   (TA).....1594 / 1 <slowest>
 
 
(defun tl ()
(setq #Layers (cond (#Layers) ((vla-get-layers
                                  (vla-get-activedocument (vlax-get-acad-object)))))))

(defun ta ()
(or #Layers (setq #Layers (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))))

wizman 发表于 2022-7-6 10:38:23

尝试对其进行基准测试,alan。我认为是vovka在theswamp上指出的
它使它更快。

alanjt 发表于 2022-7-6 10:41:10

 
 
Command: (benchmark '( (test1) (test2) ))
Elapsed milliseconds / relative speed for 4096 iteration(s):

   (TEST1).....1625 / 1 <fastest>
   (TEST2).....1625 / 1 <slowest>

Command: (benchmark '( (test1) (test2) ))
Elapsed milliseconds / relative speed for 4096 iteration(s):

   (TEST1).....1625 / 1 <fastest>
   (TEST2).....1625 / 1 <slowest>

Command: (benchmark '( (test1) (test2) ))
Elapsed milliseconds / relative speed for 4096 iteration(s):

   (TEST1).....1609 / 1.02 <fastest>
   (TEST2).....1640 / 1 <slowest>

Command: (benchmark '( (test1) (test2) ))
Elapsed milliseconds / relative speed for 4096 iteration(s):

   (TEST1).....1609 / 1.01 <fastest>
   (TEST2).....1625 / 1 <slowest>
(defun test1 (/)
(repeat 10 (mapcar '(lambda (a b) (strcat a " " b))
         '("A" "B" "C")
         '("1" "2" "3"))))
(defun test2 (/)
(repeat 10 (mapcar (function (lambda (a b) (strcat a " " b)))
         '("A" "B" "C")
         '("1" "2" "3"))))
 
 
我需要在更复杂的东西上运行它。

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

艾伦,
 
通过mapcar语句运行函数时,全局#层将更快
 
你的
 
(defun tl ()
(setq #Layers (cond (#Layers) ((vla-get-layers
                                  (vla-get-activedocument (vlax-get-acad-object)))))))

(defun ta ()
(or #Layers (setq #Layers (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))))
 
不是有效的比较,因为两者都有#层全局。

Lee Mac 发表于 2022-7-6 10:47:06


Elapsed milliseconds / relative speed for 65536 iteration(s):

   (TL).....1872 / 3.23 <fastest>
   (TA).....6053 / 1.00 <slowest>


 
(defun ta (/ #Layers)
(setq #Layers (vla-get-Layers
               (vla-get-ActiveDocument
                   (vlax-get-acad-object)))))

(defun tl ( )
(setq #Layers (cond (#Layers) ((vla-get-Layers
                                  (vla-get-ActiveDocument
                                    (vlax-get-acad-object)))))))
页: [1] 2
查看完整版本: 层太多!!!需要mer