找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2575|回复: 20

[求助] [求助]:关于实体显示方式的控制

[复制链接]
发表于 2002-9-27 22:51:44 | 显示全部楼层 |阅读模式

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

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

×
能否在AutoCAD实现这样的功能:
除了当前选择的实体以外,其它实体全部
以灰色显示并且锁定,在完成需要的操作
后,又能方便地回到以前的显示状态。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2002-9-27 22:56:38 | 显示全部楼层
补充一下,
按我的设想,这个操作是基于实体的控制,
而不仅仅控制层的显示。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-27 23:04:11 | 显示全部楼层
最初由 Qlin 发布
[B]补充一下,
按我的设想,这个操作是基于实体的控制,
而不仅仅控制层的显示。 [/B]


为什么非得变灰呢,隐藏不显示不可以吗?

如果变灰,那么把数据库除去选择实体构建选择集,遍历循环,修改实体颜色。处理完毕后,在遍历刚才选择集,颜色变换回去。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-9-27 23:12:14 | 显示全部楼层
这样就没什么意义,想想历遍实体得花多少时间,还得用各种方式记下
这个实体的原始状态,最后再历遍再改回去,非把人逼疯了不可。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2002-9-27 23:43:29 | 显示全部楼层
不知道你说是不是类似,命令 InPlace Reference Edit 的这种方式?

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

使用道具 举报

 楼主| 发表于 2002-9-28 00:49:13 | 显示全部楼层
是这样的,我建三维模型时,线条太多看着很费神,
但又不想隐藏其它物体不显示,因为还要靠它们参考
定位。参考MAX和VIZ的物体冻结方式,故而有这个设想。

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-28 01:40:52 | 显示全部楼层
最初由 Qlin 发布
[B]是这样的,我建三维模型时,线条太多看着很费神,
但又不想隐藏其它物体不显示,因为还要靠它们参考
定位。参考MAX和VIZ的物体冻结方式,故而有这个设想。

如果仅仅是隐藏物体,有一个叫做clearview的Freeware
... [/B]


只能遍历实体修改到一个“锁定层”上,这个层的颜色用9号色。遍历同时,增加扩展数据(原层名)到实体上。

你的操作完毕后,在遍历一次,修改那个“锁定层”的所有实体改到实体内保存的“扩展数据”的层上。如果实体数量不是非常多,那么速度应该还是很快的。

给你写了两个命令,你可以测试下效果(请在晓东工具箱环境下执行)


  1. [FONT=courier new]
  2. ;|
  3.    把选择实体外的其他所有实体变灰,加锁
  4. |;
  5. (defun c:test1 (/ ss ss1 lyr)
  6.   (if (setq ss (ssget))
  7.     (progn
  8.        (xdrx_begin)
  9.        (setq ss1 (xdrx_Pickset_Subtract (ssget "x") ss))
  10.        (setq lyr (xdrx_getlyrname "锁定"))
  11.        (xdrx_begin "锁定")
  12.        (xdrx_setenttodb (xdrx_object_get "layer" lyr))
  13.        (xdrx_modent 70 4 62 9)
  14.        (xdrx_setsstodb ss1 0)
  15.        (while (setq e (xdrx_getentdata 0))
  16.          (xdrx_setxdata e "XDTB_LYR_NAME" (xdrx_getentdxf 8))
  17.          (xdrx_modent 8 lyr)
  18.        )
  19.        (xdrx_end)
  20.     )
  21.   )
  22.   (princ)
  23. )
  24. ;|
  25.    恢复状态
  26. |;
  27. (defun c:test2 (/ ss e lyr)
  28.   (if (setq ss (ssget "x" (list (cons 8 (setq lyr(xdrx_getlyrname "锁定"))))))
  29.     (progn
  30.       (xdrx_setsstodb (xdrx_object_get "layer" lyr))
  31.       (xdrx_modent 70 0)
  32.       (xdrx_setsstodb ss 0)
  33.       (while (setq e (xdrx_getentdata 0))
  34.         (if (setq lyr (xdrx_getxdata e "XDTB_LYR_NAME"))
  35.           (progn
  36.             (xdrx_modent 8 (car lyr))
  37.             (xdrx_object_removexdata e "XDTB_LYR_NAME")
  38.           )
  39.         )
  40.       )
  41.     )
  42.   )
  43.   (princ)
  44. )
  45. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-28 02:19:08 | 显示全部楼层

再提供一个“孤立图层”的两个命令,速度更快!


  1. [FONT=courier new]
  2. ;|
  3.    命令:XDTB_LayerIso
  4.    功能:选层保留(孤立),其他层锁定变灰色
  5. |;
  6. (defun c:XDTB_LayerIso (/ e lyr lyrl)
  7.   (if (setq e (xdrx_entsel "\n拾取要保留图层上的实体<退出>:"))
  8.     (progn
  9.       (setq lyr (xdrx_getentdxf 8))
  10.       (xdrx_object_get "layer")
  11.       (while (setq e (xdrx_object_next))
  12.         (if (/= (car e) lyr)
  13.           (progn
  14.             (if (not (xdrx_getxdata (last e) "XDTB_LYR_COLOR"))
  15.               (progn
  16.                 (xdrx_setxdata (last e) "XDTB_LYR_COLOR"
  17.                                (xdrx_getentdxf 62) (xdrx_getentdxf 70)
  18.                 )
  19.                 (xdrx_modent 62 251 70 4)
  20.               )
  21.             )
  22.           )
  23.           (progn
  24.             (if (setq clr (xdrx_getxdata (last e) "XDTB_LYR_COLOR"))
  25.               (progn
  26.                 (xdrx_modent 62 (car clr) 70 (cadr clr))
  27.                 (xdrx_object_removexdata (last e) "XDTB_LYR_COLOR")
  28.               )
  29.             )
  30.           )
  31.         )
  32.       )
  33.     )
  34.   )
  35.   (princ)
  36. )
  37. ;|
  38.    命令:XDTB_LayerRes
  39.    恢复选层保留到原来状态
  40. |;
  41. (defun c:XDTB_LayerRes (/ e clr)
  42.   (xdrx_object_get "layer")
  43.   (while (setq e (xdrx_object_next))
  44.     (setq e (cadr e))
  45.     (if (setq clr (xdrx_getxdata e "XDTB_LYR_COLOR"))
  46.       (progn
  47.         (xdrx_modent 62 (car clr) 70 (cadr clr))
  48.         (xdrx_object_removexdata e "XDTB_LYR_COLOR")
  49.       )
  50.     )
  51.   )
  52.   (princ)
  53. )
  54. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2002-9-28 02:20:27 | 显示全部楼层
这样作没意义,如果图很大,Regen一次需要多少时间?而且图中有Block的话,变灰再考虑块内实体,还有实用意义吗。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-28 03:37:10 | 显示全部楼层
实际应用中,第一种方案,不可行,测试了一张图,等了两分钟也没有完毕。

推荐使用第二种方案,“图层孤立”,速度不到0.0001秒。


下载地址:http://www.xdcad.net/tech/layerIso.swf

<embed src=http://www.xdcad.net/tech/layerIso.swf quality=high width=532 height=482 loop=true type="application/x-shockwave-flash">
</embed>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2002-9-28 11:14:35 | 显示全部楼层
很好!

改进建议:
合并这两个命令并提供多选对象图层隔离的选项:
[code]
(defun c:XDTB_LayerIso (/ e lyr lyrl)
  ...
  (while bLoop
      (setq e (xdrx_entsel "\n拾取要保留图层上的实体或[恢复图层状态(R)多选对象隔离(S)] <退出>: "))
.......
   

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

使用道具 举报

 楼主| 发表于 2002-9-28 20:47:11 | 显示全部楼层
“孤立图层”真的很方便,看来通过图层控制也是很有效率的方式,十分感谢!

要说这种方式有什么美中不足,当实体颜色不是bylayer设置时,便不受本
程序的控制,当然对于有良好绘图习惯的人来说,这并不会有什么大的影响。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-28 21:30:31 | 显示全部楼层
最初由 Qlin 发布
[B]“孤立图层”真的很方便,看来通过图层控制也是很有效率的方式,十分感谢!

要说这种方式有什么美中不足,当实体颜色不是bylayer设置时,便不受本
程序的控制,当然对于有良好绘图习惯的人来说,这并不会有什么?.. [/B]


我想这个问题关键的还是“锁定”,颜色不重要,大多变灰色就可以了。锁定的你选不上,不会有不需要的实体误选的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-28 21:32:22 | 显示全部楼层
最初由 e2002 发布
[B]很好!

改进建议:
合并这两个命令并提供多选对象图层隔离的选项:
[/B]


已经修改为可以多选了,见下面的程序:


  1. [FONT=courier new]
  2. ;|
  3.    命令:XDTB_LayerIso
  4.    功能:选层保留(孤立),其他层锁定变灰色,支持多选
  5. |;
  6. (defun c:XDTB_LayerIso (/ e lyr lyrl clr)
  7.   (while (setq e (xdrx_entsel "\n拾取要保留图层上的实体<结束>:"))
  8.     (setq lyr (xdrx_getentdxf 8))
  9.     (if (not (member lyr lyrl))
  10.       (progn
  11.         (setq lyrl (cons lyr lyrl))
  12.         ($XDLSP_Pickset_Redraw (ssget "x" (list (cons 8 lyr))) 3)
  13.         (prompt (strcat "\n选中了"" (setq sLyrl (xdrx_String_Join
  14.                                                                    (reverse lyrl)
  15.                                                                    ","
  16.                                                  )
  17.                                      )
  18.                         ""层!"
  19.                 )
  20.         )
  21.       )
  22.     )
  23.   )
  24.   (if lyrl
  25.     (progn
  26.       (xdrx_object_get "layer")
  27.       (while (setq e (xdrx_object_next))
  28.         (if (not (wcmatch (car e) sLyrl))
  29.           (progn
  30.             (if (not (xdrx_getxdata (last e) "XDTB_LYR_COLOR"))
  31.               (progn
  32.                 (xdrx_setxdata (last e) "XDTB_LYR_COLOR"
  33.                                (xdrx_getentdxf 62) (xdrx_getentdxf 70)
  34.                 )
  35.                 (xdrx_modent 62 251 70 4)
  36.               )
  37.             )
  38.           )
  39.           (progn
  40.             (if (setq clr (xdrx_getxdata (last e) "XDTB_LYR_COLOR"))
  41.               (progn
  42.                 (xdrx_modent 62 (car clr) 70 (cadr clr))
  43.                 (xdrx_object_removexdata (last e) "XDTB_LYR_COLOR")
  44.               )
  45.             )
  46.           )
  47.         )
  48.       )
  49.               ($XDLSP_Pickset_Redraw (ssget "x" (list (cons 8 sLyrl))) 4)

  50.     )
  51.   )
  52.   (princ)
  53. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-9 00:46:57 | 显示全部楼层
晓东的程序(特别是开发库)真的很好!
假期有点空,受到各位的鼓励,我也重新拣起放了几年的autolisp,
试着在用户界面上作了些修改:
1、合并锁定与恢复命令
2、可以多选(这个晓东已经做好了,这几天联不上论坛,没看见)
3、加了个对话框界面,可以直接选层名

源程序如下:

  1. [FONT=courier new]
  2. ;|
  3.    命令:XLAY
  4.    功能:选层保留(孤立),其他层锁定变灰色
  5. |;
  6. (defun c:XLAY (/ e lyr lyrl ly_lst ent_lst)
  7.   (initget "Restore Dialog")
  8.   (setq e (xdrx_entsel "\n拾取要保留图层上的实体或[对话框选层(D)/恢复图层状态(R)] <退出>: "))
  9.   (cond
  10.     ;执行恢复操作
  11.   ((= e "Restore")(setq e nil)(XDTB_LayerRes))
  12.     ;执行对话框选层
  13.   ((= e "Dialog")
  14.      (setq e nil)
  15.      (setq ly_lst (XLAY_MSELECT_LST "选择要保留的图层" (XLAY_TB_LIST "LAYER")))
  16.     )
  17.     ;构造多选物体层名表
  18.   (T
  19.       (while e
  20.         (redraw (car e) 3)
  21.         (setq ent_lst (cons (car e) ent_lst))
  22.         (setq lyr (xdrx_getentdxf 8))
  23.         (if (not (member lyr ly_lst))
  24.           (setq ly_lst (cons lyr ly_lst))
  25.         )
  26.         (setq e (xdrx_entsel "\n拾取要保留图层上的实体: "))
  27.       );while
  28.       (mapcar '(lambda (x)(redraw x 4)) ent_lst)
  29.     );T
  30.   );cond
  31.   
  32.   (if ly_lst
  33.     (progn
  34.       (xdrx_object_get "layer")
  35.       (while (setq e (xdrx_object_next))
  36.       (if (member (car e) ly_lst)
  37.         (progn
  38.           (if (setq clr (xdrx_getxdata (last e) "XDTB_LYR_COLOR"))
  39.             (progn
  40.             (xdrx_modent 62 (car clr) 70 (cadr clr))
  41.             (xdrx_object_removexdata (last e) "XDTB_LYR_COLOR")
  42.             )
  43.           );if
  44.         );progn
  45.         (progn
  46.           (if (not (xdrx_getxdata (last e) "XDTB_LYR_COLOR"))
  47.             (progn
  48.             (xdrx_setxdata (last e) "XDTB_LYR_COLOR"
  49.             (xdrx_getentdxf 62) (xdrx_getentdxf 70)
  50.             )
  51.             (xdrx_modent 62 251 70 4)
  52.             )
  53.           )
  54.         )
  55.       )
  56.       )
  57.     )
  58.   )
  59.   (princ)
  60. )

  61. ;|
  62.    函数:XDTB_LayerRes
  63.    恢复选层保留到原来状态
  64. |;
  65. (defun XDTB_LayerRes (/ e clr)
  66.   (xdrx_object_get "layer")
  67.   (while (setq e (xdrx_object_next))
  68.     (setq e (cadr e))
  69.     (if (setq clr (xdrx_getxdata e "XDTB_LYR_COLOR"))
  70.       (progn
  71.   (xdrx_modent 62 (car clr) 70 (cadr clr))
  72.   (xdrx_object_removexdata e "XDTB_LYR_COLOR")
  73.       )
  74.     )
  75.   )
  76. )


  77. ;----------------- XLAY_MSELECT_LST -------------------
  78. ;Select multi lines at string list with dialog
  79. ;  {var}    str_t -- title text string
  80. ;  {var}    lst1 -- list to be selected in list box
  81. ;  {Return} selected string list
  82. ;  {DCL}    [qaec_mselelist] dialog need.
  83. ;-----------------------------------------------------
  84. (defun XLAY_MSELECT_LST (str_t lst1 / count item out_str n rt num d_id lst_out)
  85.   (setq d_id (load_dialog "xl"))
  86.   (if (not d_id)(alert "无法加载对话框文件"))
  87.   
  88.   (if d_id
  89.   (if (new_dialog "qaec_mselelist" d_id)
  90.     (progn
  91.       (mode_tile "bk2_ok" 1)
  92.       (set_tile "bk2_txt1" str_t)
  93.       ;;;fill the list
  94.       (start_list "bk2_list1")
  95.       (foreach n lst1
  96.          (add_list n)
  97.       )
  98.       (end_list)

  99.       (action_tile "bk2_list1" "(setq num $value)(mode_tile "bk2_ok" 0)")
  100.       (action_tile "bk2_ok" "(done_dialog 1)")

  101.       (setq rt (start_dialog))
  102.       
  103.       (if (= rt 1) (progn
  104.         (while (setq item (read num))
  105.           (setq count (strlen (itoa item))
  106.                 count (1+ count)
  107.                 lst_out (cons (nth item lst1) lst_out)
  108.           );setq
  109.           (while (and (= " " (substr num count 1))
  110.                       (substr num count 1))
  111.             (setq count (1+ count))
  112.           );while
  113.           (setq num (substr num count))
  114.         );while
  115.       ));if
  116.     );progn
  117.     (alert "找不到对话框定义")
  118.   ));if
  119.   (return lst_out)
  120. )

  121. (defun XLAY_TB_LIST (typ / count b_nam lst_out)
  122.   (setq count 1)
  123.   (if (member typ '( "LAYER" "BLOCK" "VIEW" "STYLE"
  124.                      "APPID" "DIMSTYLE" "UCS" "VPORT"))
  125.     (while (setq b_nam (tblnext typ count))
  126.       (setq count nil)
  127.       (setq lst_out (cons (cdr (assoc 2 b_nam)) lst_out))
  128.     )
  129.   );if
  130.   (if lst_out
  131.     (setq lst_out (reverse lst_out))
  132.     (setq lst_out nil)
  133.   )
  134. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 09:34 , Processed in 0.478099 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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