跳到主要内容

在SOLIDWORKS API中使用持久引用ID跟踪对象

SOLIDWORKS API中提供的持久引用ID允许检索SOLIDWORKS中任何可选择对象的持久链接。持久引用的主要优点是其生命周期,因为引用在重建操作、SOLIDWORKS会话甚至SOLIDWORKS版本之间仍然有效。

持久引用ID是一个字节数组。对于相同的引用,该数组可能会发生变化,因此无法通过比较两个数组来确定引用是否相同。使用IModelDocExtension::IsSamePersistentID方法来确定两个持久引用是否相同。

在VBA编辑器的监视窗口中显示的持久引用的字节数组{ width=350 }

即使对于相同的实体,数组可能会发生变化,仍然可以通过SOLIDWORKS API方法IModelDocExtension::GetPersistReference3检索到实体的有效指针。

以下示例将任何选定实体的持久ID以base64字符串的格式输出到即时窗口中:

持久引用ID转换为base64字符串后在VBA编辑器的即时窗口中显示

使用此示例来读取实体的ID。

输出到即时窗口的ID可能包含换行符。应将其从ID中删除,并将其视为单行字符串。

Dim swApp As SldWorks.SldWorks

Sub main()

Set swApp = Application.SldWorks

Dim swModel As SldWorks.ModelDoc2

Set swModel = swApp.ActiveDoc

If Not swModel Is Nothing Then

Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager

Dim swObj As Object
Set swObj = swSelMgr.GetSelectedObject6(1, -1)

If Not swObj Is Nothing Then
Dim vId As Variant
vId = swModel.Extension.GetPersistReference3(swObj)
Debug.Print ConvertToBase64String(vId)
Else
MsgBox "请先选择要获取其持久ID的对象"
End If

Else
MsgBox "请先打开模型"
End If

End Sub

Function ConvertToBase64String(vArr As Variant) As String

Dim xmlDoc As Object
Dim xmlNode As Object

Set xmlDoc = CreateObject("MSXML2.DOMDocument")

Set xmlNode = xmlDoc.createElement("b64")

xmlNode.DataType = "bin.base64"
xmlNode.nodeTypedValue = vArr

ConvertToBase64String = xmlNode.Text

End Function

以下示例允许通过从持久ID中检索其指针来选择对象。

  • 复制前一个宏中的ID
  • 关闭示例模型
  • 重新打开模型并运行示例。
  • 将复制的ID输入到框中
  • 重新选择在前一个示例中选择的实体
Dim swApp As SldWorks.SldWorks

Sub main()

Set swApp = Application.SldWorks

Dim swModel As SldWorks.ModelDoc2

Set swModel = swApp.ActiveDoc

If Not swModel Is Nothing Then

Dim id As String
id = InputBox("请输入以base64格式编码的持久ID")

If id <> "" Then

Dim vId As Variant
vId = Base64ToArray(id)

Dim swObj As Object
Dim err As Long

Set swObj = swModel.Extension.GetObjectByPersistReference3(vId, err)

If Not swObj Is Nothing Then
Dim swSelObj(0) As Object
Set swSelObj(0) = swObj
swModel.Extension.MultiSelect2 swSelObj, False, Nothing
Else
MsgBox "无法通过持久引用获取对象。错误代码为 " & err & ",定义在swPersistReferencedObjectStates_e中"
End If

End If

Else
MsgBox "请先打开模型"
End If

End Sub

Private Function Base64ToArray(base64 As String) As Variant

Dim xmlDoc As Object
Dim xmlNode As Object

Set xmlDoc = CreateObject("MSXML2.DOMDocument")
Set xmlNode = xmlDoc.createElement("b64")

xmlNode.DataType = "bin.base64"
xmlNode.Text = base64

Base64ToArray = xmlNode.nodeTypedValue

End Function