明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2130|回复: 9

请教一个问题,如下

[复制链接]
发表于 2003-4-26 12:11:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2003-4-26 12:11:57 编辑

这个问题好像有人问过,就是如何用vba读取由vlisp产生的表进行操作
大致如下:
  比如说,我用vlisp写了一个程学,里面有一些信息我要保存下来,我是用词典保存的,但后面的开发需要有界面及commondialogcontrol,我便用了vba来接着开发,所以就有了这个问题。最后我打算做一个总的lisp文件,里面也有加载和运行vba的语句,所以我可以把我保存的信息处理成安全数组,但我任不知道该怎样调用这些(用vba)
  还有你可以说说你们经常是怎么处理这些问题的,vba里有处理词典的函数吗,我看了一下帮助,但感觉和vlisp里的参数不一样,vba里是什么对象名,必须是string类型的,我用监视器看了一下,其中item选项为空,难道还必须在lisp下将表转换成string给词典(我得表是变量,这样转换过于复杂了把),然后又在vba里经过处理(这个处理我不会)变成数组,有没有好的办法,请明示,如果没办法,只有写出在文件中,然后在用vba读取了,可我真的不想这样啊  谢谢
发表于 2003-4-26 18:47:00 | 显示全部楼层

模型对象中有Dictionaries集合和Dictionary对象就是词典了

你可以使用它对词典进行操作
 楼主| 发表于 2003-4-26 20:15:00 | 显示全部楼层

但是vba里的词典对象里的参数类型和vlisp里的参数不一样啊,

我看了一下帮助,vba里的词典是
    obj_dict.addobject(keyword,objectname)
这个objectname是个字符串类型的,
而vlisp里的词典是
(vlax-ldata-put dict_name keyword default-data)
这个default-data是没有数据类型限制的,

我当时在vlisp里是以表的形式存放(当然我可以改成安全数组,只要vba能读取都可以,但如果是改成字符串类型的,那么我觉得在vba里处理将很复杂,也失去了数据原有的一些意义),现在我该怎样提取他那default-data
如果不清楚,可以看看这个上传的文件

本帖子中包含更多资源

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

x
发表于 2003-4-26 21:10:00 | 显示全部楼层

对于LDATA(LISP私有数据)来说,它只能在LISP中使用,不能在VBA中使用

这一点AutoCAD系统开发人员不知是怎么想的。
 楼主| 发表于 2003-4-26 21:43:00 | 显示全部楼层

苦笑一声,完了,从头再来

真命苦啊
发表于 2003-4-26 23:56:00 | 显示全部楼层

参考

本帖最后由 作者 于 2003-4-26 23:56:20 编辑

跟错了地方,见上贴。
发表于 2003-4-26 23:55:00 | 显示全部楼层

参考一下,示例代码尚有可推敲之处。

LDATA,顾名思义是AutoDesk窝藏私心,专门给lisp留用的数据。当vlax-ldata-put第一个参数为指定全局词典的字符串时,VBA可以通过命名词典“看到”数据,当第一个参数为图元对象时,VBA只能判断出实体具有扩展词典,但“看不到”数据,所以目前还只能用vlax-ldata-**族函数处理LDATA,VBA存取不行。你是想要在Vlisp和VBA之间传递数据吧?可以找点别的办法,在DWG内部,Vlisp、VBA、ARX之间可以传递多达2GB数据。
    LDATA保存在DWG中是无疑的,只是地点没有“暴露”给VBA,所以VBA无法存取,这和其他一些第三方程序自定对象数据不能存取是一个道理,类似的东西还有一些,这个LDATA对于使用VL和VBA混合编程并需要在两者之间传递数据的人有些误导作用。
    应该让Vlisp和VBA各做其擅长的事情而无需论其长短,二者需要传递数据时用Dictionary和Xrecord更为舒畅自然。Xrecord是一个任意数据的容器,它提供了比xdata更灵活的附加数据的办法,Xrecord能包含2GB的任意数据,特别适合不同开发语言之间传递数据,有用的保留在DWG,临时的完事就删除。有时VBA和Excel交互大量数据,完成计算,生成图形时Vlisp又方便一些,VBa把数据传递过去,用Vlisp干干净净地写,反之亦然。

** 1-VBA传出

'
'设置指定词典扩展记录
'
Public Function Dhvb_SetXrecord(objDict As AcadDictionary, _
                                XRecordName As String, _
                                XRecordData As Variant) _
       As AcadXRecord

    Dim objXRecord As AcadXRecord
    Dim XRecordType As Variant
    Dim i As Long

    '检察对象词典是否有该名扩展记录,如果已经存在则删除
    On Error Resume Next
    Set objXRecord = objDict.GetObject(XRecordName)
    If Not objXRecord Is Nothing Then
        objDict.Remove XRecordName
    End If
    On Error GoTo 0

    '建立扩展记录数据
    ReDim XRecordType(0 To UBound(XRecordData)) As Integer
    For i = 0 To UBound(XRecordData)

        Select Case VarType(XRecordData(i))

            Case vbInteger, vbLong
                XRecordType(i) = 90    '整数组码=90

            Case vbSingle, vbDouble
                XRecordType(i) = 40    '实数组码=40

            Case vbString
                XRecordType(i) = 2    '字符组码=2

        End Select

    Next

    '添加扩展记录到对象词典
    Set objXRecord = objDict.AddXRecord(XRecordName)
    objXRecord.SetXRecordData XRecordType, XRecordData

    '返回扩展记录对象
    Set Dhvb_SetXrecord = objXRecord

End Function


** 2-Vlisp读取


;;;
;;;读取指定词典扩展记录,返回数据表                                       ;
;;;
(defun Dhvl_GetXrecord (objDict           XRedName   /                 objXRed
                        XRedType   XRedData   TypeList         DataList
                        x
                       )
  (setq objXRed (vla-GetObject objDict XRedName))
  (vla-GetXRecordData objXRed 'XRedType 'XRedData)
  (setq        XRedType (vlax-safearray->list XRedType)
        XRedData (vlax-safearray->list XRedData)
  )
  (foreach x XRedType
    (setq TypeList (append TypeList (list x)))
  )
  (foreach x XRedData
    (setq DataList (append DataList (list (vlax-variant-value x))))
  )
  (list TypeList DataList)
)
 楼主| 发表于 2003-4-27 22:51:00 | 显示全部楼层

写得真的很好,谢谢,还想问一下,如下

本帖最后由 作者 于 2003-4-27 22:51:45 编辑

能不能说一下,dictionary和xrecord有什么区别
最大的区别是不是xrecord对组码的限制要求比较小,而dictionary对组码的
限制多了。现在我将dictionary又不得不改成xrecord,真是几经辛苦啊,但好像xrecord图元的信息表里还是有限制,比如组码1必须是字符串,这样的话,难道我还要仔细看看那个dxf分布,天啊,你的东西我要好好研究一下,我想明天拿到单位打印一下在看,
有问题在向你讨教,谢谢

;;;lisp代码

(defun c:buildxrecord()
   (setq datalist '((0 . "XRECORD") (100 . "AcDbXrecord") (1 . 4)))
   (setq datamaked (entmakex datalist))
   (dictadd (namedobjdict) "testxrecord" datamaked)
)

运行时,它就会说‘(1 。 4)组码有问题,
有没有什么好的解决办法,就是不要限制组码数据类型就可以创建非实体图元的好办法


[此贴子已经被作者于2003-4-27 22:24:40编辑过]
发表于 2003-4-27 22:58:00 | 显示全部楼层

Dictionary是词典对象,而XRecord是扩展记录对象,保存在词典对象中。

它们的关系应该是Dictionary(词典对象)包含XRecord(扩展记录对象),而XRecord又包含了若干数据。在VBA中,判断一个对象有没有扩展记录数据,使用HasExtensionDictionary,而用GetExtensionDictionary获取包含扩展记录数据的词典对象,然后使用GetXRecordData和SetXRecordData分别获取和设置扩展记录数据。
发表于 2003-4-27 23:10:00 | 显示全部楼层

常用的数据无非整数、浮点、字符三种,示例中有了。其它问题efan已讲清楚。

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-28 16:28 , Processed in 0.203468 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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