I'm still working on the macro described in this post: GetVisibleEntities causes crash when type is swViewEntityType_SilhouetteEdge
I've implemented a sort of roundabout workaround that was described therein. Now the existence of silhouette edges has introduced a new problem.
Part of my macro's functionality is to update existing machine mark annotations so that they agree with the values saved into the face to which they are attached. Those values could change after the annotations are created so it is necessary to traverse all annotations and update their style (single,double, triple nabla).
This worked fine until I started inserting machine marks on silhouette edges. With marks attached to silhouette edges, I'm getting type mismatch errors.
In order to determine which face a machine mark corresponds to, I need to call Annotation::GetAttachedEntities3. This function returns an array of entities. The type of those entities is obtained by calling Entity::GetType on each entity in that array or by calling Annotation::GetAttachedEntityTypes. The latter returns an "Array of longs or integers (see Long vs. Integer) that indicate the attached entity types as defined in swSelectType_e".
The bold line in the following function is where "type mismatch" is being thrown. Clearly I am checking whether or not this is an edge before attempting to assign it to swEntity.
Public Function getExistingMark(swVisibleEdge As SldWorks.edge, existingMarks As Variant) As SldWorks.SFSymbol
Dim swAnnotation As SldWorks.Annotation
Dim swSFSymbol As SldWorks.SFSymbol
Dim swEntity As SldWorks.Entity
Dim swEdge As SldWorks.edge
Dim swAttachedEntityType As swSelectType_e
Dim vSFSymbol As Variant
Dim vAttachedEntityTypes As Variant
Dim vAttachedEntity As Variant
Dim vAttachedEntities As Variant
Dim i As Integer
Dim which_mark As Integer
Dim oldID As Integer
Dim newID As Integer
oldID = swVisibleEdge.GetID
newID = oldID + 11
Set getExistingMark = Nothing
which_mark = 0
If IsArrayAllocated(existingMarks) Then
For Each vSFSymbol In existingMarks
Set swSFSymbol = vSFSymbol
If Not swSFSymbol Is Nothing Then
Set swAnnotation = swSFSymbol.GetAnnotation
vAttachedEntityTypes = swAnnotation.GetAttachedEntityTypes
vAttachedEntities = swAnnotation.GetAttachedEntities3
If IsArrayAllocated(vAttachedEntityTypes) And IsArrayAllocated(vAttachedEntities) Then
For i = LBound(vAttachedEntityTypes) To UBound(vAttachedEntityTypes)
If vAttachedEntityTypes(i) = swSelectType_e.swSelEDGES Then
Set swEntity = vAttachedEntities(i)
Set swEdge = swEntity
If swEdge.GetID = swVisibleEdge.GetID Then
Set getExistingMark = swSFSymbol
Set existingMarks(which_mark) = Nothing
If Not getExistingMark Is Nothing Then
which_mark = which_mark + 1
Upon further investigation, I can see that there is no guarantee of correspondence between the types returned by GetAttachedEntityTypes and the type of the objects that are returned by GetAttachedEntities3.
a) I would expect this function to always return an array of entities. The fact that there are objects in that returned array that raise a type mismatch when I attempt to assign them to entities would indicate that the function was given the wrong name.
b) When the function manages to return actual entities, I would expect the order of entities returned to correspond to the order of types returned by the two aforementioned functions.