AnsweredAssumed Answered

GetVisibleEntities causes crash when type is swViewEntityType_SilhouetteEdge

Question asked by John Alexander on Jun 5, 2017
Latest reply on Jun 6, 2017 by John Alexander

Good morning,


I'm working on a SW2012 VBA macro for inserting machine marks on prints automatically. In our current workflow, the designers color machined surfaces white in the Parts. I modified our face colorizing macro so that an attribute is added to the Face. When the active document is a drawing, the macro traverses all views, deduces which visible edges are bounding a face that has been marked for machining, and excludes faces that aren't perpendicular to the view's "camera axis", and inserts the appropriate nabla symbol.


Thus far, it works fine for simple planar faces but curved faces are causing trouble.


I believe I've narrowed it down to the following call.

vVisibleEntities = swView.GetVisibleEntities(vVisibleComponents(0), swViewEntityType_e.swViewEntityType_SilhouetteEdge)

When the macro executes, I observe the silhouette edges being selected in rapid succession and then it crashes.



There are no explicit calls to select any silhouette edges in this macro. When the above line is commented out, the macro performs as usual but does not consider the silhouette edges of that cylindrical surface depicted above.


Has anyone encountered this before with silhouette edges on drawings? This is an annoying thing to troubleshoot as my VBA editor has to close every time I get it wrong.


For context, the following function is where the troublesome call is made.

Private Function getVisibleSilhouetteEdge(swFace As SldWorks.Face2, swView As SldWorks.View) As SldWorks.SilhouetteEdge

    Dim newFace                 As SldWorks.Face2

    Dim swVisibleEntity         As SldWorks.Entity

    Dim swVisibleSilhouetteEdge As SldWorks.SilhouetteEdge

    Dim vVisibleEntities        As Variant

    Dim vVisibleEntity          As Variant

    Dim vVisibleComponents      As Variant

    Dim oldID As Integer

    Dim newID As Integer



    vVisibleComponents = swView.GetVisibleComponents()

    If Not (vVisibleComponents(0) Is Nothing) Then

        vVisibleEntities = swView.GetVisibleEntities(vVisibleComponents(0), swViewEntityType_e.swViewEntityType_SilhouetteEdge)

        If IsArrayAllocated(vVisibleEntities) Then

            For Each vVisibleEntity In vVisibleEntities

                Set swVisibleEntity = vVisibleEntity


                Set newFace = swVisibleSilhouetteEdge.GetFace

                If swFace Is newFace Then

                    Set getVisibleSilhouetteEdge = swVisibleSilhouetteEdge

                    Exit For

                End If

            Next vVisibleEntity

        End If

    End If

End Function