feargt 发表于 2022-7-6 09:14:53

交换图层名和的值

你好
我在一家国际公司工作,我们有一个层次结构,其中层名称是当地语言,层描述是英文层名称。
 
有人知道一个允许用户交换这些值的例程吗?
 
即。
 
图层名称图层描述
Schraffur舱口
 
运行代码
 
后果
 
图层名称图层描述
Hatch Schraffur公司
 
我知道层转换器存在,但这可能会更好地满足我们的需要。
 
谢谢

Lee Mac 发表于 2022-7-6 09:23:29

正如在AUGI上发布的,为了CADTutor的读者:
 

(defun c:test nil (vl-load-com)
(vlax-for layer (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
   (vl-catch-all-apply
   (function
       (lambda ( / ln ld )
         (setq ln (vla-get-name layer)
               ld (vla-get-description layer)
         )
         (vla-put-description layer ln)
         (vla-put-name layer ld)
       )
   )
   )
)
(princ)
)

BlackBox 发表于 2022-7-6 09:27:44

这些应该给你一个跳跃的开始。。。
 
一次一层:

(defun c:LAYSWAP (/ layerName activeDoc layerItem oldDescription)
(princ "\rLAYER SWAP ")
(vl-load-com)
(if (and (setq layerName (getstring T "\nEnter layer name to swap: "))
          (setq layerName (cdr (assoc 2 (tblsearch "layer" layerName)))))
   (progn
   (vla-startundomark
       (setq activeDoc (vla-get-activedocument (vlax-get-acad-object))))
   (setq layerItem (vla-item (vla-get-layers activeDoc) layerName))
   (setq oldDescription (vla-get-description layerItem))
   (vla-put-description layerItem layerName)
   (vla-put-name layerItem oldDescription)      
   (vla-endundomark activeDoc))
   (prompt "\n** Layer does not exist ** "))
(princ))

 
这将一次处理所有层:

(defun c:LAYSWAP (/ *error* _layswap activeDoc layerName)
(princ "\rLAYER SWAP ")
(vl-load-com)

(defun *error*(msg)
   (vla-endundomark activeDoc)
   (cond ((not msg))                                                   ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** "))))               ; Fatal error, display it
   (princ))

(defun _layswap(layerName / oLayers layerDesc)
   (if
   (and
       (setq
         layerItem (vla-item
                     (setq oLayers (vla-get-layers activeDoc))
                     layerName))
       (setq layerDesc (vla-get-description layerItem))
       (setq layerName (vla-get-name layerItem)))
      (progn
      (vla-put-name layerItem layerDesc)
      (vla-put-description layerItem layerName))))

(vla-startundomark
       (setq activeDoc (vla-get-activedocument (vlax-get-acad-object))))
(vlax-for x (vla-get-layers activeDoc)
   (if (not (vl-position (strcase (setq layerName (vla-get-name x))) '("0" "DEFPOINTS")))
   (_layswap layerName)))
(vla-endundomark activeDoc)
(princ))

 
请注意,如果层名称中已经存在重复的层描述,则此功能将失败。试着自己修复一下,我会在必要时帮助缓解。
 
希望这有帮助!

BlackBox 发表于 2022-7-6 09:29:55

看来李(又)揍了我一拳叹气:

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

 
但你的答案更完整

MarcoW 发表于 2022-7-6 09:40:11

 
伙计们,很高兴你们两个都不是在一个“出类拔萃的牛仔游戏”。
有人可能会受伤。。。
 

Tharwat 发表于 2022-7-6 09:43:00

 
很酷,马可。

BlackBox 发表于 2022-7-6 09:49:15

 
谢谢李,你这么说真是太好了。
 
我想问问你对此的看法;包括开始和结束撤消标记等,我是否过火了。?简洁是智慧的灵魂,好吧,与你的代码相比,我自己的代码当然不那么聪明。英雄联盟
 
当你看到它们(你的代码和我的代码)并排出现时,你会觉得开销很大。

BlackBox 发表于 2022-7-6 09:52:43

 
这是我的步枪,这是我的迭代LayersCollection,因此已经有了VLA层对象(绑定到变量“x”)。然后,获得每个层对象的名称,将其传递给sub,sub继续获取Layers集合(再次),并检索在遍历vlax for循环时首先已经拥有的层对象(再次)。
 
 
 
谢谢feargt
 
请注意,我刚刚纠正了上述代码中的一个拼写错误(遗漏了一个“layer”变量)。

feargt 发表于 2022-7-6 09:57:43

等等,还有一条这样的线?!?!
页: [1] 2
查看完整版本: 交换图层名和的值