获取Xrecord数据(第2课)
这是我的代码[代码第一个似乎有效 ;我尝试了两个图形,一个有信息,没有错误消息提示,一个没有信息,并得到了错误消息 ;我的问题似乎是第二个代码 ;本人';我想看看是否可以在不指定大小的情况下获取xrecord数据,然后将其打印到消息框中(目前命令行也可以)提前感谢您的帮助
这是用于添加xrecord和dictionary(以防万一)的lisp代码
(defun MySetXRec (Obj CodeList DataList / )
; Sets XRecordData. Dxf numbers between 1-369, except 5, 100, 105.
; See help for types and numbers to use.
(vla-SetXRecordData Obj
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-vbInteger
(cons 0 (1- (length CodeList)))
)
CodeList
)
)
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-vbVariant
(cons 0 (1- (length Datalist)))
)
DataList
)
)
)
)
(MySetXrec
(vla-AddXRecord
(vla-Add
(vla-get-Dictionaries
(vla-get-ActiveDocument
(vlax-get-Acad-Object)
)
)
"LisptoVBA"
)
"LisptoVBA"
)
'(1 2)
'("Testing" "Again")
)
未经测试<;概念编码>;但为了灵活性,我可能会这样编写GetXRecLisp--Public Function GetXRecLisp(dictname As String, _
xrecname As String) _
As AcadXRecord
Dim dict As AcadDictionary, _
xrec As AcadXRecord
On Error GoTo GetXRecLispError
Set dict = ThisDrawing.Dictionaries.Item(dictname)
Set xrec = dict.Item(xrecname)
Set GetXRecLisp = xrec
Exit Function
GetXRecLispError:
Err.Clear
Set GetXRecLisp = Nothing
''caller tests for nothing result
End Function 另请注意变量/标签命名(病例/特异性等)
保留您的,MP 谢谢你,迈克尔 ;当我理解了我';我正在做 ;不过我还是一如既往地喜欢你的表演
你所说的应变量是什么意思;都是小写的吗 ;这是VBA喜欢的吗? 我尝试/倾向于编码--sub/functions:大写,然后是camel case,例如GetSomeValue,局部变量:小写,然后是驼形,例如dictMain,模块/(类)成员变量:前缀为my,然后与sub相同,例如myCollection,小部件:前缀为abbrev。小部件类型,然后作为子部件,例如frmMain
这是个大话题,但很抱歉,我要去参加一个午餐会,再见! 蒂姆,我或多或少遵循了议员的描述,但我认为这更像是一种个人品味,对你来说很好
至于你的错误,我认为是因为Dim#039;在GetXrecordData代码中,将数据类型设置为整数……当您得到某个数据时,Acad返回一个变量,我知道它';当你在放东西时,它会发出低沉的声音,但它';这就是他们决定使用的。所以试着把整数改成变量,我认为它会起作用……实际上在这里';这是我用来测试你的;SETX记录代码:
Public Sub getXRec(ByRef XrecName As String)
Dim DictCol As AcadDictionaries
Dim MyDict As AcadDictionary
Dim Xrec As AcadXRecord
Dim DataType As Variant
Dim Data As Variant
Dim I As Integer
Set DictCol = ThisDrawing.Dictionaries
Set MyDict = DictCol.Add("VBAtoLisp")
Set Xrec = MyDict.Item(XrecName)
Xrec.GetXRecordData DataType, Data
For I = 0 To UBound(Data)
Debug.Print DataType(I) & " - " & Data(I)
Next
End Sub
Public Sub ShowXrecData(ByRef Xrec As AcadXRecord)
Dim DataType As Variant
Dim Data As Variant
Dim Cnt As Integer
Set Xrec = GetXRecLisp
Xrec.GetXRecordData DataType, Data
For Cnt = 0 To UBound(Data)
Debug.Print Data(Cnt)
Next
End Sub
所以我把代码改成上面的样子 ;我如何让它运行,以便我可以测试它 ;我按了播放按钮,但它需要宏名称 ;这似乎是因为它是用一个论点定义的 ;当我试着把它放入一个没有参数的sub,并调用它时,它没有';t工作
谢谢杰夫。 您需要在调用此sub时将xrecord传递给它 ;另一种选择是去掉;ByRef Xrec As AcadXRecord“;并在该sub.中将其调暗;如果你这样做,你必须在字典集合中寻找字典,然后在字典中找到xrecord。 鲍勃说了什么,但既然你在代码中得到了它,你就不&35;039;我不需要把它作为论点来传递。这是从你的另一个线程#039;s代码:
Public Function GetXRecLisp() As AcadXRecord
Dim DictCol As AcadDictionaries
Dim MyDict As AcadDictionary
Dim XRec As AcadXRecord
Set DictCol = ThisDrawing.Dictionaries
On Error GoTo MyError
Set MyDict = DictCol.Item("VBAtoLisp")
Set XRec = MyDict.Item("VBAtoLisp")
Set GetXRecLisp = XRec
Exit Function
MyError:
MsgBox "Error " & Err.Number & " ( " & Err.Description & " )"
End Function
Public Sub ShowXrecData()
Dim DataType As Variant
Dim Data As Variant
Dim Cnt As Integer
Dim XRec As AcadXRecord
Set XRec = GetXRecLisp
XRec.GetXRecordData DataType, Data
For Cnt = 0 To UBound(Data)
MsgBox Data(Cnt)
Next
End Sub
Sub test2()
ShowXrecData
End Sub
谢谢你们三位 ;它现在正在工作 ;唐#039;我不知道我把它放在那里了 ;一定是在工作日早上很早就开始编码了。 你没有';我不知道我花了多长时间终于找到了如何做到这一点 ;在这里搜索,还有帮助文件,但我现在有了,所以它';都很好 ;午餐时间到了。
页:
[1]