英文:
VBA - Is it possible to declare a Variant array whose elements have the data types of different classes
问题
I would like to declare a variant array that contains different data types such as objects.
Dim faceObj As SldWorks.Face2
Dim selObject() As Variant
ReDim Preserve selObject(4)
' code that initializes faceObj is not included here
Now, selObject has 5 elements, that are of Empty data type.
I would like to change a first element datatype to be of a Face2 class.
Set selObject(0) = faceObj
While this works, array elements still have the Object datatype and therefore members of the objects are not offered by lint.
Apologies if I used wrong nomenclature as I don't understand properly OOP terminology.
I tried ReDim selObject(i - 1) As SldWorks.Face2
but it says that can't change the datatype of array elements. I think I saw that in Variant it's possible to have the different datatypes but maybe my syntax is wrong.
Edit: Would it be better to rather use a structure array for this case?
英文:
I would like to declare a variant array that contains different data types such as objects.
Dim faceObj As SldWorks.Face2
Dim selObject() As Variant
ReDim Preserve selObject(4)
' code that initializes faceObj is not included here
Now, selObject has 5 elements, that are of Empty data type.
I would like to change a first element datatype to be of a Face2 class.
Set selObject(0) = faceObj
While this works, array elements still have the Object datatype and therefore members of the objects are not offered by lint.
Apologies if I used wrong nomenclature as I don't understand properly OOP terminology.
I tried ReDim selObject(i - 1) As SldWorks.Face2
but it says that can't change the datatype of array elements. I think I saw that in Variant it's possible to have the different datatypes but maybe my syntax is wrong.
Edit: Would it be better to rather use a structure array for this case?
答案1
得分: 0
根据评论部分,不可能重新声明元素为不同的对象类。它仍然是相同的对象数据类型。
英文:
Based on the comment section, it is not possible to redeclare elements to be of the different object class. It will still be the same Object data type.
答案2
得分: 0
以下是翻译好的部分:
这已经在Solidworks API中实现。
ISelectionManager
接口将您当前的选择存储为对象数组。您可以使用内置的 GetSelectedObjectType(index)
来确定可以将对象强制转换为什么类型。
使用 ISelectionManager.GetSelectedObject6(index, mark)
返回给定索引处的选定对象。
这个示例检查选择是否为面,并成功将其强制转换为 Face2 对象。
Option Explicit
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As ModelDoc2
Dim swSelectionManager As SelectionMgr
Dim swFace As Face2
Dim swBody As Body2
Dim selectionType As Integer
Dim selection As Variant
Dim selCount As Integer
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swSelectionManager = swModel.SelectionManager
selCount = swSelectionManager.GetSelectedObjectCount2(-1)
If selCount > 0 Then
selectionType = swSelectionManager.GetSelectedObjectType(1)
If selectionType = swSelectType_e.swSelFACES Then
Set swFace = swSelectionManager.GetSelectedObject6(1, -1)
'现在可以按照Face2对象处理所选内容
End If
End If
End Sub
然而,如果您想使用自己的数组,您可以将项目存储为类似下面示例中的 Entity
对象。请注意,这不适用于与上述方法一样多的对象类型,因此它的行为可能不会像上述方法那样好。
Dim myArray(0) As Variant
Set myArray(0) = swSelectionManager.GetSelectedObject6(1, -1) '我只是用这个来填充我的数组
Dim swEntity As Entity
Set swEntity = myArray(0)
selectionType = swEntity.GetType '在此之后进行必要的强制转换
英文:
This is already implemented in the Solidworks API.
The ISelectionManager
interface stores your current selections as an array of objects. You can use the built-in GetSelectedObjectType(index)
to determine what you can cast the object as.
Using the ISelectionManager.GetSelectedObject6(index, mark)
returns the selected object at the given index.
This example checks if the selection is a face and then casts it as the Face2 object successfully.
Option Explicit
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As ModelDoc2
Dim swSelectionManager As SelectionMgr
Dim swFace As Face2
Dim swBody As Body2
Dim selectionType As Integer
Dim selection As Variant
Dim selCount As Integer
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swSelectionManager = swModel.SelectionManager
selCount = swSelectionManager.GetSelectedObjectCount2(-1)
If selCount > 0 Then
selectionType = swSelectionManager.GetSelectedObjectType(1)
If selectionType = swSelectType_e.swSelFACES Then
Set swFace = swSelectionManager.GetSelectedObject6(1, -1)
'Now do what you want with the selection as Face2 object
End If
End If
End Sub
However, if you're focused on using your own array, you can store items as Entity
objects similar to the below example. Please note that this doesn't work with as many object types so it won't behave as nicely as the above method.
Dim myArray(0) As Variant
Set myArray(0) = swSelectionManager.GetSelectedObject6(1, -1) ' I'm just using this to fill my array
Dim swEntity As Entity
Set swEntity = myArray(0)
selectionType = swEntity.GetType ' cast as necessary after this
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论