T.Willey 发表于 2006-7-18 13:24:20

获取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")
)

T.Willey 发表于 2006-7-18 13:37:24

未经测试<概念编码>但为了灵活性,我可能会这样编写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

Jeff_M 发表于 2006-7-18 13:46:43

谢谢你,迈克尔 当我理解了我'我正在做 不过我还是一如既往地喜欢你的表演
你所说的应变量是什么意思;都是小写的吗 这是VBA喜欢的吗?

T.Willey 发表于 2006-7-18 13:51:39

我尝试/倾向于编码--sub/functions:大写,然后是camel case,例如GetSomeValue,局部变量:小写,然后是驼形,例如dictMain,模块/(类)成员变量:前缀为my,然后与sub相同,例如myCollection,小部件:前缀为abbrev。小部件类型,然后作为子部件,例如frmMain
这是个大话题,但很抱歉,我要去参加一个午餐会,再见!

Jeff_M 发表于 2006-7-18 14:08:08

蒂姆,我或多或少遵循了议员的描述,但我认为这更像是一种个人品味,对你来说很好
至于你的错误,我认为是因为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

T.Willey 发表于 2006-7-18 14:24:01


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工作
谢谢杰夫。

T.Willey 发表于 2006-7-18 14:31:55

您需要在调用此sub时将xrecord传递给它 另一种选择是去掉;ByRef Xrec As AcadXRecord“;并在该sub.中将其调暗;如果你这样做,你必须在字典集合中寻找字典,然后在字典中找到xrecord。

T.Willey 发表于 2006-7-18 14:33:35

鲍勃说了什么,但既然你在代码中得到了它,你就不&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

Jeff_M 发表于 2006-7-18 14:39:58

谢谢你们三位 它现在正在工作 唐#039;我不知道我把它放在那里了 一定是在工作日早上很早就开始编码了。

T.Willey 发表于 2006-7-18 16:05:27

你没有'我不知道我花了多长时间终于找到了如何做到这一点 在这里搜索,还有帮助文件,但我现在有了,所以它'都很好 午餐时间到了。
页: [1]
查看完整版本: 获取Xrecord数据(第2课)