设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5816|回复: 21

玩转 XData

[复制链接]

签到天数: 369 天

连续签到: 2 天

[LV.9]以坛为家II

发表于 2014-10-24 13:43:44 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Free-Lancer 于 2014-10-26 20:14 编辑

最近系统看来看 XDATA 的Help和一些函数,总结一下,XData 是可以附着在多种类型 Object 上的,看ActiveX help,以下类型 Object 均可以设置 xdata
All Drawing Objects , AttributeReference, Block, Dictionary, DimStyle, Group, Layer, Linetype, PlotConfigurations, RegisteredApplication, TextStyle, UCS, View, Viewport; XRecord

xdata 可以建立自己数据而不和其它数据冲突,建立自己的数据首先要建立一个索引以指向自己的数据,在 DXF 中这个索引是 1001 组码,首先看看如何查看附着在 Object 上的 Xdata

  1. (defun OBJ:GetXdataName        (e / el lst)
  2.   (if (= (type e) 'VLA-OBJECT)
  3.     (setq e (vlax-vla-object->ename e))
  4.   )
  5.   (if (and (setq el (entget e '("*")))
  6.            (setq lst (assoc -3 el))
  7.       )
  8.     (mapcar 'car (cdr lst))
  9.   )
  10. )


每个 XDATA 必须要有一个自己名字,在 DXF 中用 1001 组码,一个 Object 可以注册多个 1001 索引的  xdata,上面函数就是获取附着在 Object 上的所有 APPID

(待续)


评分

参与人数 3威望 +1 D豆 +18 贡献 +1 收起 理由
xshrimp + 10 技术引导讨论和指点奖!
/db_自贡黄明儒_ + 5 很给力!经验;技术要点;资料分享奖!
Highflybird + 1 + 3 + 1

查看全部评分

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

签到天数: 20 天

连续签到: 1 天

[LV.4]偶尔看看III

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

使用道具 举报

签到天数: 1329 天

连续签到: 2 天

[LV.10]以坛为家III

已领礼包: 604个

财富等级: 财运亨通

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

使用道具 举报

签到天数: 369 天

连续签到: 2 天

[LV.9]以坛为家II

 楼主| 发表于 2014-10-25 09:19:00 | 显示全部楼层
2 获取指定名称扩展数据

这里用 entget 比较简单,DXF 提供了所有 XDATA 组码,获取表后可以使用 assoc 检索,当然用 (vla-getxdata obj appname 'xt 'xd) 也可以, xt xd 是输出参数,和 vla-intersectwith 中的参数用法相同,获取后用 (safearray-value xt) 取得的是 组码,(mapcar 'variant-value (safearray-value xd))就是各个值了,注意 vla-getxdata 必须提供 appname 参数才可以获取 xdata
  1. ;|
  2. 获取实体指定名称的 xdata, name 为 "*" 或 t 列出所有
  3. obj --- object or entity
  4. name -- AppID name string
  5. |;
  6. (defun obj:GetXdata (obj Name / el lst)
  7.   (if (= (type e) 'VLA-OBJECT)
  8.     (setq e (vlax-vla-object->ename e))
  9.   )
  10.   (if (setq el (cdr (assoc -3
  11.                            (entget (if (= (type obj) 'ENAME)
  12.                                      obj
  13.                                      (vlax-vla-object->ename obj)
  14.                                    )
  15.                                    '("*")
  16.                            )
  17.                     )
  18.                )
  19.       )
  20.     (if        (or (= name "*") (= name T))
  21.       el
  22.       (if (setq        lst (assoc (strcase name)
  23.                            (mapcar '(lambda (x)
  24.                                       (cons (strcase (car x)) (cdr x))
  25.                                     )
  26.                                    el
  27.                            )
  28.                     )
  29.           )
  30.         lst
  31.       )
  32.     )
  33.   )
  34. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

签到天数: 369 天

连续签到: 2 天

[LV.9]以坛为家II

 楼主| 发表于 2014-10-25 11:02:09 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-10-25 11:07 编辑

3 设置 XDATA

设置之前先看看 XDATA  组码说明
20141025110319.jpg
这里面需要注意的是  1010 1011 1012 1013 组码,说明中是指 dxf 文件中的存储方式,不是实体的存储方式,在实体XDATA中该四个组码存储的是3D点,并不使用 1020 1030 1021 1031 1022 1032 1023 1033 几个组码

以上组码记忆起来很麻烦,写了一个用索引方法
  1. (defun OBJ:XdataHelp ()
  2.   (foreach x
  3.            '(("String" 1000 "字符串")
  4.              ("CTRL" 1002 "编组控制符{}")
  5.              ("Layer" 1003 "图层名")
  6.              ("DADA" 1004 "二进制数据")
  7.              ("Handle" 1005 "图元句柄, 16进制ASCII")
  8.              ("Position" 1010  "点")
  9.              ("Location" 1011  "点,空间位置,随图元变化")
  10.              ("Displacement" 1012  "点,空间位移,随图元变化")
  11.              ("Direction" 1013  "矢量, 世界方向, 随图元变化")
  12.              ("Real" 1040 "实数")
  13.              ("Distance" 1041 "实数,距离, 随图元变化的实数")
  14.              ("Scale" 1042 "实数,比例因子,随图元变化")
  15.              ("Integer" 1070 "16位整数")
  16.              ("Long" 1071 "32位整数")
  17.             )
  18.     (princ "\n")
  19.     (princ x)
  20.   )
  21.   (princ)
  22. )




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

使用道具 举报

签到天数: 369 天

连续签到: 2 天

[LV.9]以坛为家II

 楼主| 发表于 2014-10-25 11:17:34 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-10-25 11:19 编辑

接上篇

知道组码意思后就可使用 XDATA 根据需要保存自己数据了,下面设置 XData 采用 Vla 方式,entmod 方法可以在网上搜索相关代码

ActiveX 提供了 setXdata  Method

先看看说明

object.SetXData XDataType, XData

Object     All Drawing Objects , AttributeReference, Block, Dictionary, DimStyle, Group, Layer, Linetype, PlotConfigurations, RegisteredApplication, TextStyle, UCS, View, Viewport; XRecord
The object or objects this method applies to.

XDataType    Variant (array of short); input-only  组码(1001 1000 1010 等)safearray 类型

XData             Array of Variant; input-only  与组码对应的值,必须和 XDataType 一样对应 ,也是 safearray 类型,内部是 variant

该方法只有两个参数,使用中必须包含 1001 确定名称才可以使用,不包含 1001 的设置将会失败,

两个参数均为 Array

下面是一个通用函数,可以将 Lisp 的表转换为需要的 Array
  1. (defun list->vbArray (lst varType / _makearray)
  2.   (defun _makearray (lst)
  3.     (vlax-safearray-fill
  4.       (vlax-make-safearray
  5.         (if (apply '= (mapcar 'type lst))
  6.           (cond        ((= (type (car x)) 'REAL) vlax-vbDouble)
  7.                 ((= (type (car x)) 'INT) vlax-vbInteger)
  8.                 ((= (type (car x)) 'STR) vlax-vbString)
  9.           )
  10.           vlax-vbVariant
  11.         )
  12.         (cons 0 (1- (length lst)))
  13.       )
  14.       lst
  15.     )
  16.   )
  17.   (vlax-safearray-fill
  18.     (vlax-make-safearray varType (cons 0 (1- (length lst))))
  19.     (mapcar
  20.       '(lambda (x)
  21.          (cond ((= (type x) 'list) (_makearray x))
  22.                ((= (type x) 'ename) (vlax-ename->vla-object x))
  23.                (t x)
  24.          )
  25.        )
  26.       lst
  27.     )
  28.   )
  29. )


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

使用道具 举报

签到天数: 369 天

连续签到: 2 天

[LV.9]以坛为家II

 楼主| 发表于 2014-10-25 11:27:26 | 显示全部楼层
接上篇

设置 XData 就必须要提供符合 DXF 标准的列表,为了记忆方便,前面提出了用字符作关键字索引方法,这样不必记忆组码,为了兼容 组码和关键字索引方式,可以使用下面的函数来处理 Lisp 表,以供 vla-setxdata 使用
  1. (defun _prossList (lst / klst nlst)
  2.   (setq        klst '(("STRING" 1000)
  3.                ("CTRL" 1002)
  4.                ("LAYER" 1003)
  5.                ("DADA" 1004)
  6.                ("HANDLE" 1005)
  7.                ("POSITION" 1010)
  8.                ("LOCATION" 1011)
  9.                ("DISPLACEMENT" 1012)
  10.                ("DIRECTION" 1013)
  11.                ("REAL" 1040)
  12.                ("DISTANCE" 1041)
  13.                ("SCALE" 1042)
  14.                ("INTEGER" 1070)
  15.                ("LONG" 1071)
  16.               )
  17.   )
  18.   (mapcar
  19.     '(lambda (x / key tf code)
  20.        (setq key (car x)
  21.              tf         (= (type key) 'STR)
  22.        )
  23.        (cond
  24.          ((or (member key
  25.                       '(1000 1002 1003 1004 1040 1041 1070 1071)
  26.               )
  27.               (and tf
  28.                    (member (strcase key)
  29.                            '("STRING"         "CTRL"             "LAYER"
  30.                              "DATA"         "HANDLE"    "REAL"
  31.                              "DISTANCE"         "SCALE"     "INTEGER"
  32.                              "LONG"
  33.                             )
  34.                    )
  35.               )
  36.           )
  37.           (if tf
  38.             (progn
  39.               (setq code (cadr (assoc (strcase key) klst)))
  40.               (mapcar '(lambda (x)
  41.                          (setq nlst (cons (cons code x) nlst))
  42.                        )
  43.                       (if (listp (cdr x))
  44.                         (cdr x)
  45.                         (list (cdr x))
  46.                       )
  47.               )
  48.             )
  49.             (mapcar '(lambda (a)
  50.                        (setq nlst (cons (cons key a) nlst))
  51.                      )
  52.                     (if        (listp (cdr x))
  53.                       (cdr x)
  54.                       (list (cdr x))
  55.                     )
  56.             ) ;_  string   Int real 必须区分, 符合组码
  57.           )
  58.          )
  59.          ((or (member key
  60.                       '(1010   1020   1030   1011   1021   1031
  61.                         1012   1022   1032   1013   1023   1033
  62.                        )
  63.               )
  64.               (and tf
  65.                    (member (strcase key)
  66.                            '("POSITION"
  67.                              "LOCATION"
  68.                              "DISPLACEMENT"
  69.                              "DIRECTION"
  70.                             )
  71.                    )
  72.               )
  73.           )
  74.           (if tf
  75.             (cond
  76.               ((= (strcase key) "POSITION")
  77.                (mapcar '(lambda        (a)
  78.                           (setq nlst (cons (cons 1010 a) nlst))
  79.                         )
  80.                        (cdr x)
  81.                )
  82.               )
  83.               ((= (strcase key) "LOCATION")
  84.                (mapcar
  85.                  '(lambda (a)
  86.                     (setq nlst (cons (cons 1011 a) nlst))
  87.                   )
  88.                  (cdr x)
  89.                )
  90.               )
  91.               ((= (strcase key) "DISPLACEMENT")
  92.                (mapcar
  93.                  '(lambda (a)
  94.                     (setq nlst (cons (cons 1012 a) nlst))
  95.                   )
  96.                  (cdr x)
  97.                )
  98.               )
  99.               (t
  100.                (mapcar
  101.                  '(lambda (a)
  102.                     (setq nlst (cons (cons 1013 a) nlst))
  103.                   )
  104.                  (cdr x)
  105.                )
  106.               )
  107.             )
  108.             (mapcar '(lambda (a)
  109.                        (setq nlst (cons (cons key a) nlst))
  110.                      )
  111.                     (if        (listp (cdr x))
  112.                       (cdr x)
  113.                       (list (cdr x))
  114.                     )
  115.             )
  116.           )
  117.          )
  118.          (t)
  119.        )
  120.      )
  121.     lst
  122.   )
  123.   nlst
  124. )

下面是 vla-setxdata 设置函数
  1. (defun _setXdata (obj lst /)
  2.     (vla-setxdata
  3.       obj
  4.       (list->array (mapcar 'car lst) vlax-vbinteger)
  5.       (list->array (mapcar 'cdr lst) vlax-vbvariant)
  6.     )
  7.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

签到天数: 369 天

连续签到: 2 天

[LV.9]以坛为家II

 楼主| 发表于 2014-10-25 11:29:04 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-10-25 11:32 编辑

接上篇,完整设置函数如下
  1. ;|
  2. 设置 xdata 追加
  3. obj  --- entity or vla-object
  4. name --- xdata name
  5. lst  --- 嵌套表
  6.          a. 点对表, 符合 xdata 组码格式 '((1000 . "a") (1003 . "layer") ...)
  7.          b. 表, 符合xdata组码格式
  8.             i. '((1000 "a") (1000 "b") ....)
  9.             ii. 批量格式 ((1000 "a" "b" "c") (1040 1.0 2.0) ...), 点不可以批量
  10.          c. 关键字格式,支持批量,关键字可以用 (obj:xdatahelp) 查看
  11.             如(("string" "a" "b" "c") ("position" (1.0 2.0 2.0) (1.2 1.2 0.0)) ....)
  12.          d. 以上形式的混合形式
  13. |;
  14. (defun Obj:SetXdata (obj name lst / _prossList _setxdata nlst oldlst)
  15.   (defun _prossList (lst / klst nlst)
  16.     (setq klst '(("STRING" 1000)
  17.                  ("CTRL" 1002)
  18.                  ("LAYER" 1003)
  19.                  ("DADA" 1004)
  20.                  ("HANDLE" 1005)
  21.                  ("POSITION" 1010)
  22.                  ("LOCATION" 1011)
  23.                  ("DISPLACEMENT" 1012)
  24.                  ("DIRECTION" 1013)
  25.                  ("REAL" 1040)
  26.                  ("DISTANCE" 1041)
  27.                  ("SCALE" 1042)
  28.                  ("INTEGER" 1070)
  29.                  ("LONG" 1071)
  30.                 )
  31.     )
  32.     (mapcar
  33.       '(lambda (x / key tf code)
  34.          (setq key (car x)
  35.                tf  (= (type key) 'STR)
  36.          )
  37.          (cond
  38.            ((or        (member        key
  39.                         '(1000 1002 1003 1004 1040 1041 1070 1071)
  40.                 )
  41.                 (and tf
  42.                      (member (strcase key)
  43.                              '("STRING"           "CTRL"      "LAYER"
  44.                                "DATA"           "HANDLE"    "REAL"
  45.                                "DISTANCE"  "SCALE"     "INTEGER"
  46.                                "LONG"
  47.                               )
  48.                      )
  49.                 )
  50.             )
  51.             (if        tf
  52.               (progn
  53.                 (setq code (cadr (assoc (strcase key) klst)))
  54.                 (mapcar        '(lambda (x)
  55.                            (setq nlst (cons (cons code x) nlst))
  56.                          )
  57.                         (if (listp (cdr x))
  58.                           (cdr x)
  59.                           (list (cdr x))
  60.                         )
  61.                 )
  62.               )
  63.               (mapcar '(lambda (a)
  64.                          (setq nlst (cons (cons key a) nlst))
  65.                        )
  66.                       (if (listp (cdr x))
  67.                         (cdr x)
  68.                         (list (cdr x))
  69.                       )
  70.               ) ;_  string   Int real 必须区分, 符合组码
  71.             )
  72.            )
  73.            ((or        (member        key
  74.                         '(1010         1020        1030   1011   1021   1031
  75.                           1012         1022        1032   1013   1023   1033
  76.                          )
  77.                 )
  78.                 (and tf
  79.                      (member (strcase key)
  80.                              '("POSITION"
  81.                                "LOCATION"
  82.                                "DISPLACEMENT"
  83.                                "DIRECTION"
  84.                               )
  85.                      )
  86.                 )
  87.             )
  88.             (if        tf
  89.               (cond
  90.                 ((= (strcase key) "POSITION")
  91.                  (mapcar '(lambda (a)
  92.                             (setq nlst (cons (cons 1010 a) nlst))
  93.                           )
  94.                          (cdr x)
  95.                  )
  96.                 )
  97.                 ((= (strcase key) "LOCATION")
  98.                  (mapcar
  99.                    '(lambda (a)
  100.                       (setq nlst (cons (cons 1011 a) nlst))
  101.                     )
  102.                    (cdr x)
  103.                  )
  104.                 )
  105.                 ((= (strcase key) "DISPLACEMENT")
  106.                  (mapcar
  107.                    '(lambda (a)
  108.                       (setq nlst (cons (cons 1012 a) nlst))
  109.                     )
  110.                    (cdr x)
  111.                  )
  112.                 )
  113.                 (t
  114.                  (mapcar
  115.                    '(lambda (a)
  116.                       (setq nlst (cons (cons 1013 a) nlst))
  117.                     )
  118.                    (cdr x)
  119.                  )
  120.                 )
  121.               )
  122.               (mapcar '(lambda (a)
  123.                          (setq nlst (cons (cons key a) nlst))
  124.                        )
  125.                       (if (listp (cdr x))
  126.                         (cdr x)
  127.                         (list (cdr x))
  128.                       )
  129.               )
  130.             )
  131.            )
  132.            (t)
  133.          )
  134.        )
  135.       lst
  136.     )
  137.     nlst
  138.   )
  139.   (defun _setXdata (obj lst /)
  140.     (vla-setxdata
  141.       obj
  142.       (list->vbarray (mapcar 'car lst) vlax-vbinteger)
  143.       (list->vbarray (mapcar 'cdr lst) vlax-vbvariant)
  144.     )
  145.   )
  146.   ;;main
  147.   (setq nlst (_prossList lst))
  148.   (if (member (strcase name)
  149.               (mapcar 'strcase (obj:getxdataname obj))
  150.       )
  151.     (setq oldlst (obj:GetXdata obj name)
  152.           nlst         (append oldlst nlst)
  153.     )
  154.   )
  155.   (if (= (type obj) 'ENAME)
  156.     (setq obj (vlax-ename->vla-object obj))
  157.   )
  158.   (_setXdata obj (cons (cons 1001 name) nlst))
  159.   t
  160. )


评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

签到天数: 369 天

连续签到: 2 天

[LV.9]以坛为家II

 楼主| 发表于 2014-10-25 19:03:12 | 显示全部楼层

4 移除 XData
  1. ;|
  2. 移除指定名称 xdata 的特定数据
  3. obj    ----  vla-object
  4. name   ----  string
  5. values ----  list or t or nil 只需要值表
  6.              t or nil 移除整个 name xdata
  7. |;
  8. (defun Obj:RemoveXdata (obj        name        values        /        _setXdata
  9.                         xlst        xt        xd        xdlst        xtlst        nxtlst
  10.                         nxlst        var
  11.                        )
  12.   (defun _setXdata (obj lst /)
  13.     (vla-setxdata
  14.       obj
  15.       (list->vbarray (mapcar 'car lst) vlax-vbinteger)
  16.       (list->vbarray (mapcar 'cdr lst) vlax-vbvariant)
  17.     )
  18.   )
  19.   (if (= (type obj) 'ENAME)
  20.     (setq obj (vlax-ename->vla-object obj))
  21.   )
  22.   (if (member (strcase name)
  23.               (mapcar 'strcase (obj:getxdataname obj))
  24.       )
  25.     (progn
  26.       (if (or (null values) (= values T))
  27.         (_setXdata obj (list (cons 1001 name)))
  28.         (progn
  29.           (vla-getxdata obj name 'xt 'xd)
  30.           (setq        xlst  (mapcar 'variant-value (safearray-value xd))
  31.                 xtlst (safearray-value xt)
  32.           )
  33.           (if (apply 'or (mapcar '(lambda (x) (member x xlst)) values))
  34.             (progn
  35.               (while xlst
  36.                 (if (not (vl-member-if
  37.                            '(lambda (x)
  38.                               (equal (car xlst) x 1e-3)
  39.                             )
  40.                            values
  41.                          )
  42.                     )
  43.                   (setq        nxlst  (cons (car xlst) nxlst)
  44.                         values (vl-remove (car xlst) values)
  45.                         nxtlst (cons (car xtlst) nxtlst)
  46.                   )
  47.                 )
  48.                 (setq xlst  (cdr xlst)
  49.                       xtlst (cdr xtlst)
  50.                 )
  51.               )
  52.               (if nxlst
  53.                 (_setXdata obj
  54.                            (mapcar '(lambda (x y) (cons x y))
  55.                                    (reverse nxlst)
  56.                                    (reverse nxtlst)
  57.                            )
  58.                 )
  59.               )
  60.             )
  61.           )
  62.         )
  63.       )
  64.       t
  65.     )
  66.   )
  67. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

签到天数: 369 天

连续签到: 2 天

[LV.9]以坛为家II

 楼主| 发表于 2014-10-25 19:31:36 | 显示全部楼层
替换 XData
  1. ;|
  2. 替换指定 xdata
  3. |;
  4. (defun obj:ReplaceXdata        (obj           name             oldvars   newvars
  5.                          /           _replace  _setxdata nl
  6.                         )
  7.   (defun _setXdata (obj lst /)
  8.     (vla-setxdata
  9.       obj
  10.       (list->vbarray (mapcar 'car lst) vlax-vbinteger)
  11.       (list->vbarray (mapcar 'cdr lst) vlax-vbvariant)
  12.     )
  13.   )
  14.   (defun _replace (obj name old new / xd xt xtlst xdlst nlst tf)
  15.     (vla-getxdata obj name 'xt 'xd)
  16.     (setq xtlst        (safearray-value xt)
  17.           xdlst        (mapcar 'variant-value (safearray-value xd))
  18.     )
  19.     (while xdlst
  20.       (if (member (car xdlst) old)
  21.         (setq
  22.           nlst (cons (nth (vl-position (car xdlst) old)
  23.                           new
  24.                      )
  25.                      nlst
  26.                )
  27.           tf   t
  28.         )
  29.         (setq nlst (cons (car xdlst) nlst))
  30.       )
  31.       (setq xdlst (cdr xdlst))
  32.     )
  33.     (if        tf
  34.       (_setxdata
  35.         obj
  36.         (mapcar '(lambda (x y) (cons x y)) xtlst (reverse nxdlst))
  37.       )
  38.     )
  39.   )
  40.   (if (setq nl (obj:getxdataname obj))
  41.     (if        (or (= name "*") (= name T))
  42.       (foreach x nl
  43.         (_replace obj x oldvars newvars)
  44.       )
  45.       (if (member (strcase name) (mapcar 'strcase nl))
  46.         (_replace obj name oldvars newvars)
  47.       )
  48.     )
  49.   )

点评

赞  发表于 2016-11-28 01:54

评分

参与人数 1D豆 +5 收起 理由
lucas3 + 5 技术引导讨论和指点奖!

查看全部评分

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

使用道具 举报

签到天数: 1332 天

连续签到: 1 天

[LV.10]以坛为家III

已领礼包: 3197个

财富等级: 富可敌国

发表于 2014-10-25 22:32:00 | 显示全部楼层
谢谢大师的贡献!感觉好深奥,这个能做些什么吗?大师何不写个相关的实用程序出来?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

签到天数: 926 天

连续签到: 1 天

[LV.10]以坛为家III

已领礼包: 1784个

财富等级: 堆金积玉

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

使用道具 举报

签到天数: 606 天

连续签到: 2 天

[LV.9]以坛为家II

已领礼包: 264个

财富等级: 日进斗金

发表于 2014-10-26 20:40:49 来自手机 | 显示全部楼层
本帖最后由 iLisp 于 2014-10-26 20:42 编辑

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

使用道具 举报

签到天数: 62 天

连续签到: 1 天

[LV.6]常住居民II

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

使用道具 举报

签到天数: 18 天

连续签到: 1 天

[LV.4]偶尔看看III

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

使用道具 举报

签到天数: 89 天

连续签到: 1 天

[LV.6]常住居民II

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-8-15 06:02 , Processed in 0.287315 second(s), 75 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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