乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 152|回复: 8

请教一个问题,如下

[复制链接]

27

主题

105

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

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

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2003-4-26 18:47:00 | 显示全部楼层
你可以使用它对词典进行操作
回复

使用道具 举报

27

主题

105

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
213
发表于 2003-4-26 20:15:00 | 显示全部楼层
我看了一下帮助,vba里的词典是
    obj_dict.addobject(keyword,objectname)
这个objectname是个字符串类型的,
而vlisp里的词典是
(vlax-ldata-put dict_name keyword default-data)
这个default-data是没有数据类型限制的,
我当时在vlisp里是以表的形式存放(当然我可以改成安全数组,只要vba能读取都可以,但如果是改成字符串类型的,那么我觉得在vba里处理将很复杂,也失去了数据原有的一些意义),现在我该怎样提取他那default-data
如果不清楚,可以看看这个上传的文件
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:vxac4jncywa.lsp 
下载次数:0  文件大小:617 Bytes  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]

回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

27

主题

105

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
213
发表于 2003-4-26 21:43:00 | 显示全部楼层
真命苦啊
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2003-4-26 23:56:00 | 显示全部楼层

跟错了地方,见上贴。
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 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)
)
回复

使用道具 举报

27

主题

105

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
213
发表于 2003-4-27 22:51:00 | 显示全部楼层

能不能说一下,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编辑过]
回复

使用道具 举报

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

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

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 14:17 , Processed in 0.636848 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表