Page 1 of 1

How to make an duplicate array of the Selection Manager?

Posted: Thu Jun 02, 2022 7:11 am
by loeb
I need to make an array of everything that the user has selected in the feature tree of an assembly file. The selected items an be planes, sketches, mates, parts, assemblies, etc. I made a copy of the selection manager's array in the form of a variant array, but I can't figure out how to operate on the members of the variant array.

For example, I can't get the type of the elements in the array. In the following example, the last "Type" method doesn't work.

Code: Select all

    For i = 1 To swSelMgr.GetSelectedObjectCount2(-1)
        Debug.Print "i: " & i & "    Type:" & swSelMgr.GetSelectedObjectType3(i, -1)
        ReDim Preserve SelSetCopy(i)
        Set SelSetCopy(i) = swSelMgr.GetSelectedObject5(i)
    Next i
    
    For i = 1 To UBound(SelSetCopy)
       Debug.Print "i: " & i & "    Type:" & SelSetCopy(i).Type
    Next i
I think I'm heading down the wrong path. Do I instead need to make an array for each object type?

Re: How to make an duplicate array of the Selection Manager?

Posted: Thu Jun 02, 2022 8:21 am
by AlexB
Typically, you'll either want to do one of two things.

1. Keep all of the types of objects in an array the same type
2. Use 2 separate arrays of the same length and have array1 hold the objects and have array2 hold the object types. This way, if you know what type to treat your object as from array2, then you can just cast the object from array1 to that object type.

I hope that makes sense. Without more of an example to go off of, this is the best I can recommend.

Re: How to make an duplicate array of the Selection Manager?

Posted: Fri Jun 03, 2022 8:07 am
by loeb
AlexB wrote: Thu Jun 02, 2022 8:21 am Typically, you'll either want to do one of two things.

1. Keep all of the types of objects in an array the same type
2. Use 2 separate arrays of the same length and have array1 hold the objects and have array2 hold the object types. This way, if you know what type to treat your object as from array2, then you can just cast the object from array1 to that object type.

I hope that makes sense. Without more of an example to go off of, this is the best I can recommend.
Alex, that makes perfect sense. I have been wondering if type casting is possible in VBA. I cannot find reference to it the Microsoft VBA Reference and I don't see any examples of explicit casting in the VBA code I have read. I have seen plenty of "type mismatch" errors in my own immediate window, though.

Is all type casting implicit? Does it always require one of the elements to be a variant?

Re: How to make an duplicate array of the Selection Manager?

Posted: Fri Jun 03, 2022 8:33 am
by AlexB
Now that you mention it, I'd probably have to test it to see if it's possible but I feel like it should work. I would approach it similar to the below loop to check the type of the feature while iterating through the array. If it's what I expect, in this case a Sensor object (anything within the sensor folder is a sensor object. I just wanted the first one), I would then just use Set swSensor = arrayObject(i) that matches the type. If it doesn't work with a variant array, perhaps an array with type Object would work instead.

Best of luck!

Code: Select all

    Dim swApp               As SldWorks.SldWorks
    Dim swDoc               As SldWorks.ModelDoc2
    Dim swFeat              As SldWorks.Feature
    Dim swFeatureMgr        As SldWorks.FeatureManager
    Dim swSensorFeat        As SldWorks.Feature
    Dim swSensor            As SldWorks.Sensor
    Set swApp = Application.SldWorks
    Set swDoc = swApp.ActiveDoc
    Set swFeatureMgr = swDoc.FeatureManager
    Set swEquationMgr = swDoc.GetEquationMgr
    
    featVar = swFeatureMgr.GetFeatures(True)                    'get all features into featVar variant array
    
    For i = 0 To UBound(featVar)                                'loop though features
        Set swFeat = featVar(i)                                 'set swFeat object to current feature in loop
        If swFeat.GetTypeName2 = "SensorFolder" Then            'if that feature is a sensor folder continue into if

            Set swSensorFeat = swFeat.GetFirstSubFeature        'set swSensorFeat object to first subfeature in sensor folder
            Debug.Print swSensorFeat.Name                       'check it's the right feature
            Set swSensor = swSensorFeat.GetSpecificFeature2     'set swSensor object
            
        End If
        Set swFeat = Nothing                                    'clear swFeat object to free memory
    Next i