找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2457|回复: 7

[求助] [求助]:关于扩展数据的困惑

[复制链接]
发表于 2002-12-5 09:40:36 | 显示全部楼层 |阅读模式

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

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

×
(1002 . {)   (1002 . })  这个扩展数据的使用是不是没什么编程(包括LISP和arx)操作上的方便? 它只是逻辑上看起来可以区分不同类的数据一点?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6530个

财富等级: 富甲天下

发表于 2002-12-5 14:38:13 | 显示全部楼层

Re: [求助]:关于扩展数据的困惑

最初由 fylinwater 发布
(1002 . {)   (1002 . })  这个扩展数据的使用是不是没什么编程(包括LISP和arx)操作上的方便? 它只是逻辑上看起来可以区分不同类的数据一点?


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

使用道具 举报

 楼主| 发表于 2002-12-7 00:42:52 | 显示全部楼层
只是通知Acad。??
也就是所ACAD可以理解它?
我本来认为ACAD无法理解它
对他和 (1000 . XXXXXX) 是一样的  而本身并不用它来在它的数据库里特殊处理数据。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-12-7 00:47:09 | 显示全部楼层
最初由 fylinwater 发布
[B]只是通知Acad。??
也就是所ACAD可以理解它?
我本来认为ACAD无法理解它
对他和 (1000 . XXXXXX) 是一样的  而本身并不用它来在它的数据库里特殊处理数据。 [/B]


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

使用道具 举报

 楼主| 发表于 2002-12-7 13:14:04 | 显示全部楼层
就是说ACAD可以识别开始和结束? 还是要我们自己编程来识别?而如果我自己定义(1000 . ]) (1000 . [)不是也一样吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-7 23:49:31 | 显示全部楼层
数据格式如果是你定的,你可以按你的意思做。
象得赛等专业软件,就用了很多1002标志符。
不过就那几个数据,好像意义不大。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2002-12-8 09:32:15 | 显示全部楼层
我的理解:扩展数据组码是“-3”,但在一些情况下,附件一段扩展数据,并不一定设置-3组码,但1002的标志符是一定要的,至于在数据段中的位置关系并不大,所以我理解成对出现的1002组码只是用于识别,这是Acad定义的,就像Lisp使用“;”、C使用“//”定义注释一样,程序就是这样理解。我们自己可以定义任一(组)字符为我们程序所能理解的字段格式,通用Acad扩展数据认并且只认它自己定义的符号。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-8 10:07:34 | 显示全部楼层
5.9.2 扩展的对象数据库
DWG数据库功能,允许用户在任何一条图线的数据结构中,再加入一部分其它信息,这就是扩展的对象数据库结构。使用扩展的对象数据库,必须用AutoLISP等程序设计,实施对对象数据库的访问和修改,先自行定义扩展的对象数据库信息表,再加入到指定的对象中。
这是一种相当实用的非图形数据库建立和使用方法。扩展的对象数据库内容是在对象数据库中以 -3码为前导的一个项。在一个对象中,可以加入扩展的对象数据大小为:16383字节。以下面的使用扩展的对象数据库的模拟程序为例(参见Tools.LSP),讨论扩展的对象数据库的用法:

;; XDATA   .LSP  扩展的实体数据库使用
(Defun XD-D (del / dn)
       (SetQ dn 0)
       (While (SetQ dal (Nth dn del))
              (PrinC "\n应用名: ")(PrinC (Car dal)) (PrinC "\n")
              (PrinC (Cdr dal))
              (SetQ dn (1+ dn))
       )
)
(Defun XD-L ()
       (While (Not (SetQ len (EntSel "指定一个实体: ")))
              (Alert "没选中任何实体...")
       )
       (TextPage)
       (SetQ lun (GetString "\n应用名<*>: "))
       (If (Or (= "*" lun)(= "" lun))
           (SetQ lun "*")
           (If (XD-C (Car len) lun)
               ()
               (Progn (Alert (StrCat "没有所输入的应用名 " lun)) (Exit))
           )
       )
       (SetQ lel (Cdr (Assoc -3 (EntGet (Car len) (List lun)))))
       (If lel (XD-D lel) (Alert "没有附加扩展的实体数据..."))
)
(Defun XD-C (cen cun)
       (SetQ cel (EntGet cen '("*"))
             cxl (Cdr (Assoc -3 cel))
              ck nil
       )
       (If cxl (Progn (SetQ cn 0)
                      (While (SetQ cal (Nth cn cxl))
                             (PrinC "\n应用名[") (PrinC (1+ cn))
                             (PrinC "]: ") (PrinC (Car cal))
                             (If (= cun (Car cal))
                                 (Progn (PrinC " *")(SetQ ck T))
                             )
                             (PrinC "\n")
                             (SetQ cn (1+ cn))
                      )
               )
       )
       (= T ck)
)
(Defun XD-M ()
       (While (Not (SetQ en (EntSel "\n选择一个实体: ")))
              (Alert "没选中任何实体...")
       )
       (PrinC "\n(现有 ") (PrinC (XDRoom (Car en)))
       (PrinC " 字节的扩展实体数据空间.)\n")
       (SetQ en (Car en)
             un (GetString "\n应用名: ")
       )
       (If (XD-C en un)
           (Progn (TextScr)
                  (PrinC "\n这个应用名已经存在了,要覆盖它吗?")
                  (InitGet 7 "Yes No  ")
                  (If (= "Yes" (GetKWord "Yes/<No>: "))
                      ()
                      (Abcdefg)
                  )
           )
       )
       (SetQ ll (List (Cons 1002 "}")))
       (InitGet 7 "Real Integer String")
       (SetQ tp (GetKWord "Real(实数)/Integer(整数)/String(字串): "))
       (While (Not (Or (= tp "End")(= tp "")))
              (Cond ((= tp "Real")
                     (SetQ v (GetReal "\n实型数: ") l (Cons 1040 v))
                    )
                    ((= tp "String")
                     (SetQ v (GetString "\n字符串: ") l (Cons 1000 v))
                    )
                    ((= tp "Integer")
                     (SetQ v (GetInt "\n整型数: ") l (Cons 1071 v))
                    )
               )
               (SetQ ll (Cons l ll))
               (InitGet 7 "Real Integer String End  ")
               (SetQ tp (GetKWord "Real(实数)/Integer(整数)/String(字串)/<End>: "))
       )
       (SetQ ll (Cons (Cons 1002 "{") ll)
             ll (List -3 (Cons un ll))
             el (EntGet en)
            nel (Cons ll el)
      )
      (RegApp un) (EntMod nel)
)
(Defun XD-E (/ uen uel uxd unn new)
       (While (Not (SetQ uen (EntSel "\n选择一个实体: ")))
              (Alert "没选中任何实体...")
       )
       (SetQ uel (EntGet (Car uen) '("*")))
       (If (Not (SetQ uxd (Cdr (Assoc -3 uel))))
           (Progn (Alert "这个对象没有扩展的数据,程序将结束...")
                  (Exit)
           )
       )
       (SetQ unn 0
             new '()
       )
       (While (SetQ uda (Nth unn uxd))
              (SetQ new (Cons (List (Car uda)) new) ;将XData数据表达替换成仅有应用名的结构
                    unn (1+ unn)
              )
       )
       (SetQ new (SubSt (Cons -3 new) (Assoc -3 uel) uel))
       (EntMod new)
       (PrinC)
)
(Defun C:XD ()
       (SetIErr)
       (While (Progn (InitGet 7 "Add List Delete Exit  ")
                     (SetQ k (GetKWord "\nList(取出)/Add(加入)/Delete(删除)<Exit(结束)>: "))
                     (Not (Or (= k "Exit")(= k "")))
              )
              (Cond ((= k "List")   (XD-L))
                    ((= k "Add")    (XD-M))
                    ((= k "Delete") (XD-E))
              )
       )
       (ReErr) (PrinC)
)
在指定对象中建立或加入扩展的对象数据库的主要操作步骤一般如下:
1)找到指定的目标对象名。
    (While (Not (SetQ en
                           (EntSel "\n指定一个要加入扩展数据的对象: ")
                     )
               )
               (Alert "没有指定任何对象,请再试...")
      )
    (SetQ en (Car en))
   2)指定应用名(这是搜寻扩展对象数据库的的主要索引项)。
    (SetQ un (GetString "\n注册应用名<*>: "))
    3)定义扩展对象数据库表的结束项。
     (SetQ ll (List (Cons 1002 "}")))
   4)组建扩展数据库内容(程序设置是键盘输入,仅用实数、整数和字符串)。
      (InitGet 7 "Real Integer String")
      (SetQ tp (GetKWord "Real(实数)/Integer(整数)/String(字符串): "))
      (While (Not (Or (= tp "End")(= tp "")))
               (Cond ((= tp "Real")
                        (SetQ v (GetReal "\n实数值: ") l (Cons 1040 v))
                       )
                       ((= tp "String")
                         (SetQ v (GetString "\n字符串: ") l (Cons 1000 v))
                       )
                       ((= tp "Integer")
                        (SetQ v (GetInt "\n整数值: ") l (Cons 1071 v))
                       )
                 )
                 (SetQ ll (Cons l ll))
                 (InitGet 7 "Real Integer String End  ")
                 (SetQ tp (GetKWord
                        "Real(实数)/Integer(整数)/String(字符串)/<End(结束)>: "
                            )
                 )
         )
  5)加入扩展数据库的开头项,建立完整的扩展数据表。
      (SetQ ll (Cons (Cons 1002 "{") ll)
            ll (List -3 (Cons un ll))
       )
  6)提取目标对象表,加入扩展的数据描述,登记应用名,重建对象数据库。
      (SetQ el (EntGet en)
           nel (Cons ll el)
      )
      (RegApp un) (EntMod nel)
·  在指定对象中搜寻和显示扩展的对象数据库的主要操作步骤:
1)指定要搜寻的对象:
2)指定扩展的对象数据库的用户登记名:
   3)找出扩展的对象数据库表,再设法找到指定应用名下的内容表:
   (SetQ cel (EntGet cen '("*"))
            cxl (Cdr (Assoc -3 cel))
       )
      较好的方法是直接找到指定应用名的对象数据库表:
     (SetQ lel (Cdr (Assoc -3 (EntGet (Car len) (List lun)))))
    4)显示这些内容。
   扩展对象数据库的主要组码:
                    1000         ASCII 码字符串,长度不大于255字符位。
1001                登记的应用名,长度不大于31字符位。
        1007         控制字,{ 或者 }
        1003                层名
                    1004         长字节,长度不大于127字节。
                    1005                对象索引名 
                    1010                点位
                    1040                浮点数
                    1041                距离值
                    1042                比例系数
                    1070                16位整数
1071        32位整数

其它更祥细的说明请参考AutoCAD用户手册。
与用属性建立非图形信息相比,用扩展对象数据库不需要有“块”充当容器,而且有更快的速度、更多的灵活性、更小的数据体积;一般说来,16K的数据容量,对于一个对象要携带的非图形数据足够用。同时,这些非图形信息仍旧是以图形为索引之一的数据,但不必将图形做成块。
这种扩展对象数据结构的特色的性能是:始终跟随所属对象,即使将来对这个对象做了Copy、Explode、Block、Group等等可能引起数据库重新组建的操作,也会保持或继承这些扩展的数据纪录,除非删掉这个对象。这一点使得扩展的对象数据结构,与类似的其它方法相比,具有特殊的使用价值。
另外,在许多“直译”的参考书中,将一个专用词句:Registers an application name… 译成“注册一个应用程序名…”,这显然是错误的。Application并不是仅能译成“应用程序”,正确的理解应当象 AutoCAD支持文档中的说法:“为当前 AutoCAD 图形注册一个应用名,为使用扩展对象数据作准备”。
在指定对象中去掉扩展的对象数据的方法有些古怪。基本的过程是:将扩展数据部分数据结构中的“数据”去掉,只剩下应用名,之后更新对象数据,具体过程参见上述程序中的(XD-E)函数:
        (SetQ unn 0    ;准备检索序号
               new '()  ;准备新的扩展数据表
    )
    (While (SetQ uda (Nth unn uxd)) ;取出一个扩展数据
                (SetQ new (Cons (List (Car uda)) new)
;将数据表达替换成仅有应用名的结构,加入到新表中
                           unn (1+ unn)
                    ;检索序号加一
                 )
    ) ;搜索和数据组织结束
(SetQ new (SubSt (Cons -3 new) (Assoc -3 uel) uel))
        ;完整形成新的扩展数据表
    (EntMod new) ;更新

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 05:02 , Processed in 0.382670 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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