乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 51|回复: 18

[编程交流] 冻融层

[复制链接]

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 17:13:38 | 显示全部楼层 |阅读模式
我有一个快速的问题,关于如何最有效地编写我正在开发的层冻结程序。该例程的重点是冻结所有不是结构的实用程序层。我要做的就是
例如,然后用-STRC或类似的东西解冻任何东西。我这样做是因为通配符方法似乎总是比在所有层上迭代快得多。我唯一的问题是,我不想解冻一个已经冻结的层,例如,如果C-STRM-STRC被冻结。编写这部分代码的最快方法是什么?我不想做一个单独的检查,因为我们的模板文件中有数千层。我需要在开始时用wcmatch做些什么,并存储所有符合特定标准的冻结层吗?
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:20:16 | 显示全部楼层
我发现:http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/trying-to-freeze-layers-by-using-wildcard-layer-name/td-p/4941568
 
 
  1. (defun c:fREV ();; to freeze
  2. (vl-load-com)
  3. (vlax-for layer(vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
  4.    (if (and (wcmatch (strcase (vla-get-name layer)) "*REV*")
  5.      (not (wcmatch (vla-get-name layer) "*|*"))
  6.      (not (wcmatch (strcase (vla-get-name layer)) (strcase (getvar 'CLAYER))))
  7.       )
  8.       (vla-put-freeze layer :vlax-true)
  9.    )
  10. )
  11. (princ)
  12. )
  13. (defun c:tREV ();; to thaw
  14. (vl-load-com)
  15. (vlax-for layer(vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
  16.    (if (and (wcmatch (strcase (vla-get-name layer)) "*REV*")
  17.      (not (wcmatch (vla-get-name layer) "*|*"))
  18.       )
  19.       (vla-put-freeze layer :vlax-false)
  20.    )
  21. )
  22. (princ)
  23. )

 
 
 
 
gr.Rlx
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:20:44 | 显示全部楼层
你好
这是一项有趣的任务。。。我的尝试是:
  1. (while (setq LayEnx (tblnext "LAYER" (null LayEnx)))
  2. (if (= 1 (logand 1 (cdr (assoc 70 LayEnx)))) ; layer is frozen
  3.         (setq LstFrozenLayers (cons LayEnx LstFrozenLayers))
  4.         (setq LstThawedLayers (cons LayEnx LstThawedLayers))
  5. )
  6. )
  7. (setq match "*|C-CATV*")
  8. (mapcar 'entupd
  9. (mapcar
  10.         (function
  11.                 (lambda (x)
  12.                         (if (wcmatch (cdr (assoc 2 x)) match)
  13.                                 (cond ; I don't know how to subst the layer's elist with (logand)
  14.                                         ((member x LstFrozenLayers)
  15.                                                 (subst (assoc 70 x) (cons 70 0) x)
  16.                                         )
  17.                                         ((member x LstThawedLayers)
  18.                                                 (subst (assoc 70 x) (cons 70 1) x)
  19.                                         )
  20.                                 )
  21.                         )
  22.                 )
  23.         )
  24.         (list LstFrozenLayers LstThawedLayers)
  25. )
  26. )

上述片段将是任务的理想情况(仅使用Vanilla LISP)。。尽管只有一个问题:
我不知道如何将层的elist与(logand)函数组合起来。
如果您不理解代码中发生了什么,让我解释一下:
1.它通过图层表进行迭代,并将图层分为两组(列表):冻结和解冻
2.然后使用lambda,我们检查每个层的匹配名称,以及它所属的组/列表(冻结或解冻)。。通过替换x层的elist,我们可以切换其冻结/解冻状态。
 
下面是我的替代建议(使用VLAX):
  1. (while (setq ld (tblnext "LAYER" (null ld)))
  2. (setq LayersEnxs (cons ld LayersEnxs))
  3. )
  4. (setq match "*|C-CATV*")
  5. (mapcar
  6. (function
  7.         (lambda (x / o )
  8.                 (if (wcmatch (cdr (assoc 2 x)) match)
  9.                         (progn ; I use VLA, because I don't know how to subst a layer's elist with (logand)
  10.                                 (vlax-put (setq o (vlax-ename->vla-object (tblobjname "LAYER" (cdr (assoc 2 x))))) 'Freeze :vlax-false)
  11.                                 (vla-update o)
  12.                         )
  13.                 )
  14.         )
  15. )
  16. (vl-remove-if-not (function (lambda (x) (= 1 (logand 1 (cdr (assoc 70 x)))))) LayersEnxs); frozen layers's elists
  17. )
  18. (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport)

它用这个名字解冻冷冻层(但这种VLA方法应该比香草冰淇淋慢)。
HTH公司
顺便说一句,我喜欢在回答的同时问问题
 
编辑:这是另一个。。。
  1. (setq match "*|C-CATV*")
  2. (vlax-map-collection (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object)))
  3. (function
  4.         (lambda (x)
  5.                 (if
  6.                         (and
  7.                                 (wcmatch (vla-get-name x) match)
  8.                                 (eq (vla-get-Freeze x) :vlax-true)
  9.                         )
  10.                         (vla-update (vlax-put x 'Freeze :vlax-false))
  11.                 )
  12.         )
  13. )
  14. )

我想你明白了。。。但我真的认为,如果不迭代所有层,就无法实现它。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:25:20 | 显示全部楼层
我不知道当你谈论数千层时,迭代所有层需要多少时间,但是如果你在几秒钟内谈论呢。。。
 
认为c:tRev只需要额外检查一次层状态
 
但是你真的做了功课
 
gr.Rlx
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:27:05 | 显示全部楼层
谢谢,但像broncos15一样,我也很好奇。。。如果有人能提出基准测试,哪种迭代方法最快,因为有很多方法可以通过使用(mapcar+lambda)/(foreach)/(vlax map collection)/(vlax for)来实现。
直接访问LAYERS表/集合并在那里执行更改会更快吗,还是先创建一个包含层的列表,然后迭代该列表以执行这些更改。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:31:42 | 显示全部楼层
这可能会帮助您实现以下目标:http://www.cadtutor.net/forum/showthread.php?59993-帮助-操作-测试-功能速度
 
即使是我的耐心也有局限性,但如果成功了,它也会成功,而且。。。下一次,你的老板认为你能以超快的速度做任何事情,所以速度并不总是一件好事;-)
 
gr.Rlx
 
下面是另一个讨论:https://www.theswamp.org/index.php?topic=45954.0
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:34:53 | 显示全部楼层
检查速度的简单方法可以通过vl-times完成
 
参见此示例http://www.cadtutor.net/forum/showthread.php?95337-使用来自块attribute的信息批量重命名(&highlight=RlxReadTitleBlock)
 
在函数开始时,输入以下内容:
  1. (defun bladiebla ()
  2. (setq start (car(_vl-times)))
  3. ;do your stuff
  4. ;;;for testing
  5. (princ (strcat "\n\nProcessed  " (itoa (length filelist)) " drawings in "
  6.          (rtos (/ (- (car (_VL-TIMES)) start) 1000.) 2 4) " secs."))

 
Gr.Rlx
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:38:43 | 显示全部楼层
如果你在看秒,然后你在看错误的任务来提高,我做了一些事情,其他人花了大约10分钟来画,Lisp程序替换2秒,可惜我从来没有得到它的付款。
 
Rlx我同意“如果可行,就可行”。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:42:18 | 显示全部楼层
@broncos15:
在某些情况下,一个聪明的wcmatch字符串可以做到这一点。
这将解冻名称以“NewLayer”开头的所有层,但以“NewLayer2”开头的层除外(匹配不区分大小写)。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:46:30 | 显示全部楼层
FWIW,这里有另一种使用香草的方法:
  1. (defun c:myfreeze ( / cla dxf enx lay )
  2.    (setq cla (getvar 'clayer))
  3.    (while (setq lay (tblnext "layer" (not lay)))
  4.        (setq lay (cdr (assoc 2 lay)))
  5.        (and (wcmatch lay "*|C-CATV*")
  6.             (wcmatch lay "~*-STRC")
  7.             (/= cla lay)
  8.             (setq enx (entget (tblobjname "layer" lay))
  9.                   dxf (assoc 70 enx)
  10.             )
  11.             (entmod (subst (cons 70 (boole 7 1 (cdr dxf))) dxf enx))
  12.        )
  13.    )
  14.    (princ)
  15. )
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-23 10:06 , Processed in 1.110341 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表