找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 667|回复: 0

[密技]:VBA与VL的数据传输

[复制链接]
发表于 2003-4-29 11:59:05 | 显示全部楼层 |阅读模式

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

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

×
VBA与VL的数据传输是双向的,这几个函数可以很方便地实现。
1、VL读取:(get_xrdata dicname xrname)
功能:读取XR数据
变量:DICNAME   字典名,为字符串
      XRNAME   XRECODER名,为字符串
返回值:读取成功,返回一个列表,如((1 . "asdhf") (10 23.4 432.5 34.0) (40 . 45.2));读取失败,返回NIL。
2、VL传出:(set_xrdata dicname xrname xrdata YES_or_no)
功能:传出XR数据
变量:DICNAME   字典名,为字符串
      XRNAME   XRECODER名,为字符串
      XRDATA   传输的数据,为列表,格式入下
     (数据1   数据2    数据3  ...   数据n)
      有效的数据有如下几种:
       整数
       实数
       字符串
       列表(此时,列表中的元素只能为整数或实数)
      YES_or_no   追加开关,如果为T,则将新数据放在原有数据的前面;如果为NIL,则用新数据覆盖原有数据。
返回值:传出成功,返回T;传出失败,返回NIL。
3、VBA读入:Get_Xrdata
功能:读取XR数据
变量:DICNAME   字典名,为字符串
      XRNAME   XRECODER名,为字符串
返回值:读取成功,返回XR数据,为变体;读取失败,返回FALSE。
4、VBA传出:set_XRDATA
功能:传出XR数据
变量:DICNAME   字典名,为字符串
      XRNAME   XRECODER名,为字符串
      XRDATA   传输的数据,为数组,数组中的有效数据有如下几种:
       整数和长整型数
       单精度数和双精度数
       字符串
       数组(此时,数组中的元素只能为整数、长整型数、单精度数和双精度数)
      YN   追加开关,如果为TRUE,则将新数据放在原有数据的前面;如果为FALSE,则用新数据覆盖原有数据。
返回值:传出成功,返回T;传出失败,返回NIL。

  1.   [FONT=courier new]
  2. Public Sub set_XRDATA(DicName As String, XrName As String, Xrdata As Variant, YN As Boolean)
  3. Dim cs_i As Long
  4. Dim XrType As Variant
  5. Dim MyXr As AcadXRecord
  6. Dim cs_J As Long


  7.    If VarType(Xrdata) And vbArray = vbArray Then
  8.       ReDim XrType(LBound(Xrdata) To UBound(Xrdata)) As Integer
  9.       For cs_i = LBound(Xrdata) To UBound(Xrdata)
  10.       If VarType(Xrdata(cs_i)) > 8000 Then
  11.          For cs_J = LBound(Xrdata(cs_i)) To UBound(Xrdata(cs_i))
  12.             Select Case VarType(Xrdata(cs_i)(cs_J))
  13.                Case vbInteger, vbLong, vbSingle, vbDouble
  14.                Case Else
  15.                   Exit Sub
  16.             End Select
  17.          Next cs_J
  18.          XrType(cs_i) = 10
  19.       Else
  20.          Select Case VarType(Xrdata(cs_i))
  21.          Case vbInteger, vbLong
  22.             XrType(cs_i) = 90
  23.          Case vbSingle, vbDouble
  24.             XrType(cs_i) = 40
  25.          Case vbString
  26.          Case Else
  27.             Exit Sub
  28.          End Select
  29.       End If
  30.       Next cs_i
  31.       Dim XrData1 As Variant
  32.       XrData1 = Xrdata
  33.       Set MyXr = GetXr(DicName, XrName)
  34.       If YN = True Then
  35.          Dim OldType As Variant
  36.          Dim OldData As Variant
  37.          On Error Resume Next
  38.          
  39.          MyXr.GetXRecordData OldType, OldData
  40.          If VarType(OldType) <> vbEmpty Then
  41.             For cs_i = 0 To UBound(OldType)
  42.                ReDim Preserve XrType(UBound(XrType) + 1)
  43.                ReDim Preserve XrData1(UBound(XrData1) + 1)
  44.                XrType(UBound(XrType)) = OldType(cs_i)
  45.                XrData1(UBound(XrData1)) = OldData(cs_i)
  46.             Next cs_i
  47.          End If
  48.       End If
  49.       MyXr.SetXRecordData XrType, XrData1
  50.     End If
  51. End Sub


  52. Public Function GetDic(DicName As String) As AcadDictionary
  53.    Dim MyDic As AcadDictionary
  54.    On Error Resume Next
  55.    Set MyDic = ThisDrawing.Dictionaries.Item(DicName)
  56.    If Err <> 0 Then
  57.       Err.Clear
  58.       Set MyDic = ThisDrawing.Dictionaries.Add(DicName)
  59.    End If
  60.    Set GetDic = MyDic
  61. End Function
  62. Public Function GetXr(DicName As String, XrName As String) As AcadXRecord
  63.    Dim MyDic As AcadDictionary
  64.    Set MyDic = GetDic(DicName)
  65.    Dim MyXr As AcadXRecord
  66.    On Error Resume Next
  67.    Set MyXr = MyDic.GetObject(XrName)
  68.    If Err <> 0 Then
  69.       Err.Clear
  70.       Set MyXr = MyDic.AddXRecord(XrName)
  71.    End If
  72.    Set GetXr = MyXr
  73. End Function


  74. Public Function Get_Xrdata(DicName As String, XrName As String) As Variant
  75.    Dim MyXr As AcadXRecord
  76.    Dim XrType As Variant
  77.    Dim Xrdata As Variant
  78.    Set MyXr = GetXr(DicName, XrName)
  79.    MyXr.GetXRecordData XrType, Xrdata
  80.    Get_Xrdata = Xrdata
  81. End Function


  82. (defun CADAPP ( / )  (vlax-get-acad-object))
  83. (defun caddoc ( / ) (vla-get-ActiveDocument (cadapp)))


  84. (defun list_to_dxf (lst / biaoji mytype mydata element subelement)
  85.   (if (= (type lst) 'list)
  86.     (progn
  87.       (setq biaoji t
  88.             mytype '()
  89.             mydata '()
  90.       )
  91.       (foreach element lst
  92.         (cond
  93.           ((= (type element) 'INT)
  94.            (setq mytype (cons 90 mytype))
  95.           )
  96.           ((= (type element) 'real)
  97.            (setq mytype (cons 40 mytype))
  98.           )
  99.           ((= (type element) 'STR)
  100.            (setq mytype (cons 1 mytype))
  101.           )
  102.           ((= (type element) 'list)
  103.            (setq mytype (cons 10 mytype))
  104.            (foreach subelement element
  105.              (if (and (/= (type subelement) 'int)
  106.                       (/= (type subelement) 'real)
  107.                  )
  108.                (setq biaoji nil)
  109.              )
  110.            )
  111.            (if biaoji
  112.              (setq element (vlax-safearray-fill
  113.                              (vlax-make-safearray
  114.                                vlax-vbDouble
  115.                                (cons 0 (- (length element) 1))
  116.                              )
  117.                              element
  118.                            )
  119.              )
  120.            )
  121.           )
  122.           (t (setq biaoji nil))
  123.         )
  124.         (if biaoji
  125.           (setq mydata (cons (vlax-make-variant element) mydata))
  126.         )
  127.       )
  128.       (if biaoji
  129.         (setq lst (list (reverse mytype) (reverse mydata)))
  130.       )
  131.     )
  132.   )
  133. )

  134. (defun get_dic (dicname / )
  135.   (if (not  (caddic dicname))
  136.      (vla-add (vla-get-Dictionaries (caddoc)) dicname)
  137.     (caddic dicname)
  138.     )
  139.   )
  140. (defun get_xr (dicname xrname / mydic myxr)
  141.   (setq mydic (get_dic dicname))
  142.   (if (vl-catch-all-error-p (setq myxr (vl-catch-all-apply 'vla-GetObject (list mydic xrname))))
  143.     (setq myxr (vla-AddXRecord mydic xrname))
  144.     )
  145.   (eval myxr)
  146.   )
  147. (defun set_xrdata (dicname xrname xrdata YES_or_no / mytype olddata x)
  148.   (if (setq xrdata (list_to_dxf xrdata))
  149.     (progn
  150.       (setq mytype (car xrdata) xrdata (cadr xrdata))
  151.       (if (and (setq olddata (get_xrdata dicname xrname)) yes_or_no)
  152.         (progn
  153.           (setq olddata (list_to_dxf (mapcar '(lambda (x) (cdr x)) olddata)))
  154.           (setq oldtype (reverse (car olddata)) olddata (reverse (cadr olddata)))
  155.           (foreach x  oldtype (setq mytype (cons x mytype)))
  156.           (foreach x  olddata (setq xrdata (cons x xrdata)))
  157.           )
  158.         )
  159.       (setq mytype (vlax-safearray-fill (vlax-make-safearray vlax-vbInteger  (cons 0 (- (length mytype) 1)))  mytype)
  160.             xrdata (vlax-safearray-fill (vlax-make-safearray vlax-vbVariant   (cons 0 (- (length xrdata) 1)))  xrdata)
  161.             )
  162.       (vla-SetXRecordData (get_xr dicname xrname) mytype xrdata)
  163.       (eval t)
  164.       )
  165.     )
  166.   )
  167. (defun get_xrdata (dicname xrname / mytype mydata mydatatemp element x y)
  168.   (vla-GetXRecordData (get_xr dicname xrname) 'mytype 'mydata)
  169.   (if mytype
  170.     (progn
  171.       (setq mytype (vlax-safearray->list mytype)
  172.             mydata (vlax-safearray->list mydata)
  173.       )
  174.       (setq mydatatemp '())
  175.       (foreach element mydata
  176.         (setq mydatatemp (cons (vlax-variant-value element) mydatatemp))
  177.       )
  178.       (setq mydata     mydatatemp
  179.             mydatatemp '()
  180.       )
  181.       (foreach element mydata
  182.         (if (= (type element) 'safearray)
  183.           (setq        mydatatemp
  184.                  (cons (vlax-safearray->list element) mydatatemp)
  185.           )
  186.           (setq mydatatemp (cons element mydatatemp))
  187.         )
  188.       )
  189.       (setq mydata mydatatemp)
  190.       (mapcar '(lambda (x y) (cons x y)) mytype mydata)
  191.     )
  192.   )
  193. )


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

本版积分规则

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

GMT+8, 2025-9-26 08:14 , Processed in 0.158940 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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