找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3118|回复: 13

[求助] 本人最近研究一键处理建筑底图程序,有问题请教各位

[复制链接]
发表于 2014-4-16 14:22:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. (defun c:ee()
  2.   (while (setq n (tblnext "layer" (null n)))
  3.     (setq layername (cdr(assoc 2 n)))
  4.     (command "layer" "c" "8" layername)
  5.     (command "")
  6.     )
  7.     (command "layer" "f" "*a-wind-iden" "")
  8.   (command "layer" "f" "*a-spac-iden" "")
  9.   (command "layer" "f" "*dim_iden" "")
  10.   (command "layer" "f" "*a-anno-levl"  "")
  11.   (command "layer" "f" "*a-anno-dims" "")
  12.   (command "layer" "f" "*a-grid" "")
  13.   (command "layer" "f" "*a-dim-iden" "")
  14.   (command "layer" "f" "*a-anno-note" "")
  15.   )
  16. (defun c:za()
  17.   (setq qq (nentsel "\n 请选择需要冻结的图层:" ))
  18.   (setq qqname (car qq))
  19.   (setq lay (cdr(assoc 8 (entget qqname))))
  20.   (command "layer" "f" lay "")
  21.   )
因为我们这边底图都是外部参照,每个图参照过来的话图层显示会加竖向号,使得每个图层只有后面的名字相同,图层名本来不同
本人思路就是冻结几种特定图层,有些没冻结的图层就用手动关闭,然后图层全部改成8号灰色。但是因为外部参照图层图层名不一样。
只能使用通配符搜索功能,这样如果图层一多造成程序运行太慢。
如何能提高程序运行速度,给个思路或改进方法
变成8号色其实也挺慢的,这个程序不知道有改进方法没?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-4-16 14:34:26 | 显示全部楼层
你都用COMMAND做,效率肯定低。你试试通过修改层数据的70祖玛的值,去冻结、关闭等。

点评

感谢回帖,因为是块参照,每张图的图层名都不一样。 如何能找到该图层是个问题啊。  详情 回复 发表于 2014-4-17 09:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-17 09:16:59 | 显示全部楼层
newer 发表于 2014-4-16 14:34
你都用COMMAND做,效率肯定低。你试试通过修改层数据的70祖玛的值,去冻结、关闭等。

感谢回帖,因为是块参照,每张图的图层名都不一样。
如何能找到该图层是个问题啊。

点评

你的代码里面都用到了ASSOC 8了,你可以直接修改祖玛70的值,不要用COMMAND了。  详情 回复 发表于 2014-4-17 09:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-4-17 09:33:30 | 显示全部楼层
124803430 发表于 2014-4-17 09:16
感谢回帖,因为是块参照,每张图的图层名都不一样。
如何能找到该图层是个问题啊。

你的代码里面都用到了ASSOC 8了,你可以直接修改祖玛70的值,不要用COMMAND了。

点评

但是我要关的是我搜索到的图层啊 那个只是遍历图层。把图层全部变灰。 如果直接改不就是把图层全部冻结了  详情 回复 发表于 2014-4-17 10:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-17 10:59:07 | 显示全部楼层
newer 发表于 2014-4-17 09:33
你的代码里面都用到了ASSOC 8了,你可以直接修改祖玛70的值,不要用COMMAND了。

但是我要关的是我搜索到的图层啊
那个只是遍历图层。把图层全部变灰。
如果直接改不就是把图层全部冻结了

点评

用COMMAND效率要低,你用COMMAND的地方,可以用函数替代。  详情 回复 发表于 2014-4-17 11:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-4-17 11:01:39 | 显示全部楼层
124803430 发表于 2014-4-17 10:59
但是我要关的是我搜索到的图层啊
那个只是遍历图层。把图层全部变灰。
如果直接改不就是把图层全部冻结 ...

用COMMAND效率要低,你用COMMAND的地方,可以用函数替代。

点评

不知道方法噻,所以求助各位  详情 回复 发表于 2014-4-17 11:05
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-17 11:05:18 | 显示全部楼层
newer 发表于 2014-4-17 11:01
用COMMAND效率要低,你用COMMAND的地方,可以用函数替代。

不知道方法噻,所以求助各位{:soso__3669389859068460655_4:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-4-18 12:29:36 | 显示全部楼层
抱歉我就不详细说明了,请参阅代码中的注释,凭楼主的水平,应该很好理解

第一个修改如下
  1. (defun c:ee( / layerlst layerlstF layernext changelayercolor freezelayer)
  2. ;获取所有图层名称,并组合成列表
  3. (setq layerlst (list (cdr (assoc 2 (tblnext "layer" T)))))
  4. (while (setq layernext (tblnext "layer"))
  5. (setq layerlst (append layerlst (list (cdr (assoc 2 layernext)))))
  6. )
  7. ;保留带有|符号的图层,也就是获取外部参照的图层名称
  8. (setq layerlst (vl-remove-if-not '(LAMBDA (e) (vl-string-position (ascii "|") e)) layerlst))
  9. ;定义修改图层颜色为8的函数
  10. (defun changelayercolor(layername / layer_data)
  11. (setq layer_data (entget (tblobjname "LAYER" layername)))
  12. (setq layer_data (subst (cons 62 8) (assoc 62 layer_data) layer_data))
  13. (entmod layer_data)
  14. )

  15. ;为观察效率,用对话框确认粗略估计执行时间
  16. (alert "修改外部参照图层颜色为8号色,开始.")
  17. (foreach n layerlst (changelayercolor n))
  18. (alert "修改外部参照图层颜色为8号色,结束.")

  19. ;文本栏输出执行信息
  20. (princ "\n已将如下图层修改颜色修改为8号色:\n")
  21. (foreach n layerlst (princ (strcat n "\n")))

  22. ;此处同上,但需要冻结的图层判断条件不全,请自行补充
  23. (setq layerlstF (vl-remove-if-not '(LAMBDA (e)
  24. (wcmatch e
  25. "*a-wind-iden,*a-spac-iden" ;请自行补充
  26. )) layerlst))

  27. (defun freezelayer(layername / layer_data)
  28. (setq layer_data (entget (tblobjname "LAYER" layername)))
  29. (setq layer_data (subst (cons 70 1) (assoc 70 layer_data) layer_data))
  30. (entmod layer_data)
  31. )

  32. (alert "冻结指定层,开始.")
  33. (foreach n layerlstF (changelayercolor n))
  34. (alert "冻结指定层,结束.")

  35. (princ "\n已将如下图层冻结:\n")
  36. (foreach n layerlstF (princ (strcat n "\n")))

  37. (princ)
  38. )
第二个改写如下
  1. (defun c:za()
  2. (command "-layer" "F")
  3. )
希望楼主以后写代码之前多考虑一下所采用的方法,而不是事后发现效率低再想办法补救.

祝开心

点评

感谢回帖 有一个地方不理解上面这段代码中(tblobjname "LAYER" layername)[/backcolor] layername个函数,只是在defun定义了一下,为什么[/backcolor]tblobjname函数能够执行????[/backcolor]  详情 回复 发表于 2014-4-21 11:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-21 11:36:31 | 显示全部楼层
win_gf 发表于 2014-4-18 12:29
抱歉我就不详细说明了,请参阅代码中的注释,凭楼主的水平,应该很好理解

第一个修改如下第二个改写如下希 ...

感谢回帖
有一个地方不理解
  1.   (defun changelayercolor(layername / layer_data)
  2.     (setq layer_data (entget (tblobjname "LAYER" layername)))
  3.     (setq layer_data (subst (cons 62 8) (assoc 62 layer_data) layer_data))
  4.     (entmod layer_data)
  5.     )
上面这段代码中(tblobjname "LAYER" layername)
layername个函数,只是在defun定义了一下,为什么tblobjname函数能够执行????
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-5-5 10:48:22 | 显示全部楼层
tblobjname 是系统自带函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-5-14 20:53:46 | 显示全部楼层
学习了谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9839个

财富等级: 富甲天下

发表于 2014-5-15 09:00:05 | 显示全部楼层

  1. ;在程序开头加上(setvar "CMDECHO" 0)可以提高运行速度。如:
  2. (defun c:ee()
  3.   (setvar "CMDECHO" 0)
  4.   (while (setq n (tblnext "layer" (null n)))
  5.     (setq layername (cdr(assoc 2 n)))
  6.     (command "layer" "c" "8" layername "")
  7.   )
  8.   (command "layer" "f" "*a-wind-iden,*a-spac-iden,*dim_iden,*a-anno-levl,*a-anno-dims,*a-grid,*a-dim-iden,*a-anno-note" "")
  9.   (setvar "CMDECHO" 1)
  10.   (princ)
  11. )
  12. (defun c:za()
  13.   (setvar "CMDECHO" 0)
  14.   (setq qq (nentsel "\n 请选择需要冻结的图层:" ))
  15.   (setq qqname (car qq))
  16.   (setq lay (cdr(assoc 8 (entget qqname))))
  17.   (command "layer" "f" lay "")
  18.   (setvar "CMDECHO" 1)
  19.   (princ)
  20. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

发表于 2020-2-29 21:43:45 | 显示全部楼层
谢了,这段代码我收下了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-7-19 15:41:04 | 显示全部楼层
如果图元和图层颜色不一样呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-6 06:16 , Processed in 0.499412 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表