找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4282|回复: 21

[讨论]:关于“图元句柄”的讨论。

[复制链接]

已领礼包: 3337个

财富等级: 富可敌国

发表于 2002-3-10 03:56:44 | 显示全部楼层 |阅读模式

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

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

×
请高手谈谈“图元句柄”的意义及相关应用......和图元名称的关系......
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-3-10 22:00:04 | 显示全部楼层
摘自《Visual LISP for AutoCAD2000程序设计...》第五章

5.5  永久型选择集和 (HandEnt) 函数
在AutoCAD对象数据库中,每个像素都有自己的数据纪录索引。AutoCAD的对像索引有好几种,常用的是“临时对象名”(AutoCAD 翻译成“图元名”)。例:<图元名:60000084>
说“临时”,意思是在同一个图形文件中,这些名不会重复,可以用有关的函数,得到指定对象的这种名,再用它去组织选择集或提取对象参数,实施对对象的编辑处理。但是,随着图形存盘,再次打开的操作,同一个对象的临时像素名可能会有变动,虽然这个像素名仍保持它的唯一性,但却不是原来的名了。这对于程序设计是不方便的。因此严格地说,这种记忆对象的方法是临时性的。而 SSAdd 之类的选择集建立方法就是基于临时像素名,因此也是临时组建、临时使用。如果重新打开这张图,就需要重新组建选择集。有时这是不太方便的。
在图形中,各个图元还有另外一种“名”,这就是它的“柄”(Handle)。其作用就是给每个对象加上一个唯一的,终身不变的,即使删除了它也不会再给别人用的“图元检索名”(AutoCAD翻译成“句柄”)。 这就大大方便了对象操作程序的设计:使用对象检索名,就可不必顾虑将来对象像素名改变的问题。
检索名在对象数据库中以 5码为前导,用十六进制数转成的字符串表达,写在相关的对象数据库表之中。例:(5 . "A") 或 (5 . "3")。如果我们设法记住了有关对象的检索名,可利用 (HANDENT)函数找到对应的像素名,进而组织我们需要的对象选择集。据检索名的特点,这种记忆对象的方法是永久性的。下面的模拟程序参见Tools.LSP:
  (Defun C:Handle-O(/ ha fn ft aa n en)
         (SetQ fn (GetString "\n索引名文件: ")
              ft (StrCat fn ".han") fn (Open ft "w")
         )
         (PrinC "\n选择要输出索引名的对象...")
         (SetQ ss (SsGet) n 0)
         (While (SetQ en (SsName ss n))
               (Write-Line (Cdr (Assoc 5 (EntGet en))) fn)
               (SetQ n (1+ n))
         )
         (Close fn)
         (PrinC "文件已经存好了。\n请指定索引名文件标记字符串的书写位置...")
         (Command "text" Pause 3 0 ft)
  )
  
  (Defun C:Handle-I(/ ha fn n)
         (SetQ fn (Car (EntSel "\n索引名文件标记: "))
                fn (Cdr (Assoc 1 (EntGet fn)))
                fn (Open (StrCat fn) "r")
                ss (SsAdd)
         )
         (While (SetQ n (Read-Line fn))
                 (SetQ ss (SsAdd (Handent n) ss))
         )
         (Close fn)
         (SetQ n 0)
         (While (SetQ en (SsName ss n))
                 (Redraw en 3) (SetQ n (1+ n))
         )
         (PrinC "\n醒目显示者就是要找的那些对象...") (PrinC)
  )
  
其中的C:HANDLE-O是把你选定的若干对象的检索名写到指定名的*.HAN文件中;再在图形中写上该文件名字的标记字符串,帮你记忆。
而C:HANDLE-I 是在图形中指定了一个*.HAN文件名字的标记字符串后,自动按该文件的记录找到相关对象,组成名叫SS的选择集,并将这些对象置成醒目显示。
用这样的方法组织选择集,可以在图形被修改、编辑、重新存盘之后再打开等条件下,仍然能够准确找到相关的对象。实际上,用 VLAX-LData-xxx 函数进行对象检索名的存取,可以更加方便。

t  点评
·  这样,就能生成一个“永久型”的对象选择集。
·  也可以用“组(Group)”的功能,将这些对象编组保存在图形文件中,随时取用。
·  还可以用 VLAX-LData-Put 函数建立图形词典,将这些对象索引名保存在图形文件之中,随时取用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3337个

财富等级: 富可敌国

 楼主| 发表于 2002-3-11 21:25:08 | 显示全部楼层
如果一个实体被BREAK,句柄会如何变化?例如,一条LINE被BREAK两段。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-3-11 21:53:07 | 显示全部楼层
原线保留,新线重建。
带有起点的线是:“原线”。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-3-11 22:07:33 | 显示全部楼层

关于句柄

最初由 ww822 发布
[B]如果一个实体被BREAK,句柄会如何变化?例如,一条LINE被BREAK两段。 [/B]


曾经把句柄作为编程的重要线索,但是后来发现,在insert图形与图快,break实体后,变了,现在,我就很少用它了,仅仅用于对当前图形的搜索处理.至于是如何变化的,我不清楚,好像是按16进制编号,新产生的接在最后一个实体后.
比如:最后一个实体的句柄叫"4A33",要打断的直线叫"2044",则打断后,一段叫2044,另一段叫 4A34.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3337个

财富等级: 富可敌国

 楼主| 发表于 2002-3-12 00:19:35 | 显示全部楼层

Re: 关于句柄

最初由 长清 发布
[B]

曾经把句柄作为编程的重要线索,但是后来发现,在insert图形与图快,break实体后,变了,现在,... [/B]


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

使用道具 举报

发表于 2002-3-12 01:07:11 | 显示全部楼层
句柄在autocad的一张图中,和实体是一一对应的,一张图中的句柄是唯一的,用数字和字母表示。autovad这样做是为了精确记载图中的实体。以利于对它们进行管理。象cad 中的undo redo ...等命令没有这样的记载是不可能实现的。我们在cad 的二次开发中当需要对实体操作是,大部分时候也必须使用‘句柄’。粗浅之云。切勿见笑。
                                    众智软件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-26 11:00:59 | 显示全部楼层
我需要对句柄进行遍历,那应该怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-26 12:03:04 | 显示全部楼层
最初由 gzlwq 发布
[B]句柄在autocad的一张图中,和实体是一一对应的,一张图中的句柄是唯一的,用数字和字母表示。autovad这样做是为了精确记载图中的实体。以利于对它们进行管理。象cad 中的undo redo ...等命令没有这样的记载是不可能?.. [/B]


不知道是不是真的这样。印象中得赛lt和abd5.0用到了句柄,天正3.0之类的似乎没用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-26 13:08:23 | 显示全部楼层
句柄在CAD图中是必须的,我想AutoCAD本身就会用到。至于基于它开发的产品,可能会用到,也可能不会用到。我不知道AutoCAD的底层是怎么处理的,但可以做一些推测:经过多次实验,像块、多行文本等这些能够被炸开的实体,炸开后各个新的实体会由系统分配新的句柄,而原来的实体的句柄则不会再有新的实体对象,也不会将其分配给新的实体(句柄的分配总是从最后一个句柄向后递增的)。句柄也可以看成是十六进制的整数,在AutoCAD中是与实体唯一对应的。我想请问陈老师:如何对这些递增的句柄进行遍历操作,如果我知道了句柄的上下限的话?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-26 13:54:27 | 显示全部楼层
句柄进行遍历操作是没有实际意义的,比如有些实体在绘图过程中曾经存在,又被删除,该句柄就缺失了,对于这些缺失的句柄历遍有什么意义呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-26 16:05:17 | 显示全部楼层
最初由 lzh741206 发布
[B]句柄进行遍历操作是没有实际意义的,比如有些实体在绘图过程中曾经存在,又被删除,该句柄就缺失了,对于这些缺失的句柄历遍有什么意义呢? [/B]

是的,正如楼上的所说,当实体被删除或者被炸开,该句柄就没什么用了。但该句柄仍然存在图形中,并没有缺失,缺失的是实体,对这些空句柄(没有映射到实体的句柄,姑且这么叫)进行操作确实没什么用,我们可以完全将它过滤掉。AutoCAD为新的实体映射句柄是有规律所循的,就是从最后一个实体(这样说也许不对,也就是我们通过(entlast)获得的对象)的句柄递增的,而不是再去使用那些已经存在的空句柄。如果我们知道了在生成大量新实体前的最后一个句柄,又知道了生成新实体后的最后一个句柄,不就可以获得所有新生成的对象了吗?假如要对这些新生成的对象进行批处理,或者进行相同的处理,不就可以了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-26 16:45:16 | 显示全部楼层
ActiveX的办法是取得上次操作时的实体数m,和当前的实体数n
在模型空间历遍第m+1到第n个实体,进行同一操作,这样简单些
如果用句柄的话就太复杂了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-7-5 12:57:51 | 显示全部楼层
“图元句柄”是图里唯一不变的,图元名称是各种图形的代吗,同一类的图元名称是相同的....
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 23:22 , Processed in 0.474390 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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