找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 921|回复: 3

[精彩文萃] LDATA 替代方法

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-3-23 07:43:13 | 显示全部楼层 |阅读模式

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

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

×
  1. ;; /* Replaces vlax-ldata-* commands
  2. ;; /* NEW_LDATA
  3. ;;Warren Ledford WarrenWare ACADv2007 2/21/2007

  4. ;; /*************** USAGE ***************/
  5. ;; /* (new_ldata-put ) - Replaces vlax-ldata-put
  6. ;; /* (new_ldata-get ) - Replaces vlax-ldata-get
  7. ;; /* (new_ldata-list ) - Replaces vlax-ldata-list
  8. ;; /* (new_ldata-delete ) - Replaces vlax-ldata-delete
  9. ;; /* (new_ldata-listkeys ) - NEW COMMAND, Returns a list of keys in dictionary
  10. ;; /* (new_ldata-deldict ) - NEW COMMAND, Removes Dictionary Container
  11. ;; /* (new_ldata-convert ) - NEW COMMAND, Converts vlax-ldata to new_ldata: Must be performed in version Autocad that can use vlax-ldata-* commansds

  12. (defun addrecord (dictName key dataList / xname)
  13.   (setq        dataList (append (list '(0 . "XRECORD") '(100 . "AcDbXrecord"))
  14.                          dataList
  15.                  )
  16.         xname         (entmakex dataList)
  17.   ) ;_end setq
  18.   (dictadd (getdictname dictName) key xname)
  19. ) ;_end defun addrecord


  20. (defun changerecord (dictName key dataList)
  21.   (if (getrecord dictName key)
  22.     (progn
  23.       (delrecord dictName key)
  24.       (addrecord dictName key dataList)
  25.     ) ;_end progn
  26.   ) ;_endif
  27. ) ;_end defun changerecord


  28. (defun createdict (dictName / dictionary xname newdict)
  29.   (if (not (dictsearch (namedobjdict) dictName))
  30.     (progn
  31.       (setq dictionary '((0 . "DICTIONARY") (100 . "AcDbDictionary"))
  32.             xname      (entmakex dictionary)
  33.             newdict    (dictadd (namedobjdict) dictName xname)
  34.       ) ;_end setq
  35.     ) ;_end progn
  36.   ) ;_endif
  37. ) ;_end defun createdict


  38. (defun new_ldata-deldict (dictName)
  39.   (dictremove (namedobjdict) dictName)
  40. ) ;_end defun new_ldata-deldict


  41. (defun delrecord (dictName key)
  42.   (dictremove (getdictname dictName) key)
  43. ) ;_end defun delrecord


  44. (defun getdict (dictName)
  45.   (dictsearch (namedobjdict) dictName)
  46. ) ;_end defun getdict


  47. (defun getdictname (dictName / tmp)
  48.   (if (setq tmp (dictsearch (namedobjdict) dictName))
  49.     (cdr (assoc -1 tmp))
  50.   ) ;_endif
  51. ) ;_end defun getdictname


  52. (defun getkeys (dictName / tmp)
  53.   (if (setq tmp (getdict dictname))
  54.     (new_ldata-massoc 3 tmp)
  55.   ) ;_endif
  56. ) ;_end defun getkeys


  57. (defun new_ldata-list (dictName)
  58.   (mapcar '(lambda (x) (cons x (cdar (getrecord dictName x))))
  59.           (getkeys dictName)
  60.   ) ;_end mapcar
  61. ) ;_end defun new_ldata-list


  62. (defun getrecord (dictName key /)
  63.   (cdr
  64.     (cddddr (cddddr (dictsearch (getdictname dictName) key)))
  65.   )
  66. ) ;_end defun getrecord


  67. (defun listdictionaries        ()
  68.   (new_ldata-massoc 3 (entget (namedobjdict)))
  69. ) ;_end defun listdictionaries


  70. (defun new_ldata-massoc        (key alist / x nlist)
  71.   (foreach x alist
  72.     (if        (eq key (car x))
  73.       (setq nlist (cons (cdr x) nlist))
  74.     ) ;_endif
  75.   ) ;_end foreach

  76.   (reverse nlist)
  77. ) ;_end defun new_ldata-massoc


  78. (defun new_ldata-put (dictName key data / fmtdata)
  79.   (setq fmtdata (list (cons 300 data)))

  80.   (if (not (createdict dictName))
  81.     ;;/* Here check to see if key exists
  82.     (if        (member key (getkeys dictName))
  83.       (changerecord dictName key fmtdata) ;_ /* Record exists
  84.     ) ;_endif
  85.   ) ;_endif

  86.   (addrecord dictName key fmtdata) ;_ /* Record doesn't exist
  87. ) ;_end defun new_ldata-put


  88. (defun new_ldata-get (dictName key)
  89.   (cdar (getrecord dictName key))
  90. ) ;_end defun new_ldata-get


  91. (defun new_ldata-listkeys (dictName)
  92.   (getkeys dictName)
  93. ) ;_end defun new_ldata-listkeys


  94. (defun new_ldata-delete        (dictName key)
  95.   (delrecord dictName key)
  96. ) ;_end defun new_ldata-delete


  97. (defun new_ldata-convert (dictName)
  98.   (foreach x (mapcar 'car (vlax-ldata-list dictName))
  99.     (new_ldata-put
  100.       "ww_ldata-convert_dict"
  101.       x
  102.       (vlax-ldata-get dictName x)
  103.     )
  104.   ) ;_end foreach

  105.   (new_ldata-deldict dictName)

  106.   (foreach x (mapcar 'car (new_ldata-list "ww_ldata-convert_dict"))
  107.     (new_ldata-put
  108.       dictName
  109.       x
  110.       (new_ldata-get "ww_ldata-convert_dict" x)
  111.     )
  112.   ) ;_end foreach

  113.   (new_ldata-deldict "ww_ldata-convert_dict")
  114. ) ;_end defun new_ldata-convert


Ldata 是 Autodesk 专为 Autolisp 定制的一个词典,由 vlax-ldata-* 函数操作,这个词典的 Object 类型为 VLO-VL , Lisp 操作方便了,其它语言 (ARX 、Net、Com)操作就麻烦,上面函数用 XRecord 代替了 VLO-VL,XRecord 几个语言操作都没有问题,其实上面函数只需要 new_ldata-put 一个函数,生成的词典就可以交互了。vlax-ldata-list vlax-ldata-get vlax-ldata-delete 还可以继续使用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2015-3-23 07:46:31 | 显示全部楼层
本帖最后由 csharp 于 2015-3-23 08:12 编辑

补充一句,Ldata 中任何数据都是用 300 组码以 string 形式保存,get 时执行 read

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

使用道具 举报

已领礼包: 104个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 12:12 , Processed in 0.374788 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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