请教一个问题,如下
本帖最后由 作者 于 2003-4-26 12:11:57 编辑这个问题好像有人问过,就是如何用vba读取由vlisp产生的表进行操作
大致如下:
比如说,我用vlisp写了一个程学,里面有一些信息我要保存下来,我是用词典保存的,但后面的开发需要有界面及commondialogcontrol,我便用了vba来接着开发,所以就有了这个问题。最后我打算做一个总的lisp文件,里面也有加载和运行vba的语句,所以我可以把我保存的信息处理成安全数组,但我任不知道该怎样调用这些(用vba)
还有你可以说说你们经常是怎么处理这些问题的,vba里有处理词典的函数吗,我看了一下帮助,但感觉和vlisp里的参数不一样,vba里是什么对象名,必须是string类型的,我用监视器看了一下,其中item选项为空,难道还必须在lisp下将表转换成string给词典(我得表是变量,这样转换过于复杂了把),然后又在vba里经过处理(这个处理我不会)变成数组,有没有好的办法,请明示,如果没办法,只有写出在文件中,然后在用vba读取了,可我真的不想这样啊谢谢
模型对象中有Dictionaries集合和Dictionary对象就是词典了
你可以使用它对词典进行操作但是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
如果不清楚,可以看看这个上传的文件
对于LDATA(LISP私有数据)来说,它只能在LISP中使用,不能在VBA中使用
这一点AutoCAD系统开发人员不知是怎么想的。苦笑一声,完了,从头再来
真命苦啊参考
本帖最后由 作者 于 2003-4-26 23:56:20 编辑跟错了地方,见上贴。
参考一下,示例代码尚有可推敲之处。
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: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编辑过]
Dictionary是词典对象,而XRecord是扩展记录对象,保存在词典对象中。
它们的关系应该是Dictionary(词典对象)包含XRecord(扩展记录对象),而XRecord又包含了若干数据。在VBA中,判断一个对象有没有扩展记录数据,使用HasExtensionDictionary,而用GetExtensionDictionary获取包含扩展记录数据的词典对象,然后使用GetXRecordData和SetXRecordData分别获取和设置扩展记录数据。常用的数据无非整数、浮点、字符三种,示例中有了。其它问题efan已讲清楚。
页:
[1]