AnsweredAssumed Answered

Collect HoleWizardFeature(s) on a Face

Question asked by John Alexander on Sep 14, 2017
Latest reply on Sep 14, 2017 by John Alexander

I'm trying to build a list of all HoleWizardFeature(s) on a face in the context of an assembly. This needs to include features that start on the face as well as any thru holes that break through the face. The purpose is to build a selection list for another macro that copies holes from one component to another.

 

The following function getHolesInFace takes a Face2 and should return an array of Features of type HoleWzd that intersect that face. It fails to get all intersecting holes.

 

Private Function getHolesInFace(swParentFace As SldWorks.Face2) As Variant

    Dim swFeature   As SldWorks.Feature

    Dim swEdge      As SldWorks.Edge

    Dim swFace      As SldWorks.Face2

    Dim vFaces      As Variant

    Dim vEdge       As Variant

    Dim swHoleWizardFeatures() As SldWorks.Feature

   

    Dim found   As Boolean

    Dim i       As Integer

   

   

    ReDim swHoleWizardFeatures(0)

    Set swHoleWizardFeatures(0) = Nothing

    For Each vEdge In swParentFace.GetEdges

        Set swEdge = vEdge

        vFaces = swEdge.GetTwoAdjacentFaces2

       

        'check the first face from getTwoAdjacentFaces

        Set swFeature = Nothing

        If Not vFaces(0) Is Nothing Then

            Set swFace = vFaces(0)

            Set swFeature = swFace.GetFeature

            Debug.Print swFeature.GetTypeName2

            Debug.Print swFeature.Name

            If Not swFeature.GetTypeName2 = "HoleWzd" Then

                'set Feature to Nothing if it isn't a HoleWizardFeature

                Set swFeature = Nothing

            End If

        End If

       

        'check the second face from getTwoAdjacentFaces

        If swFeature Is Nothing Then

            If Not vFaces(1) Is Nothing Then

                Set swFace = vFaces(0)

                Set swFeature = swFace.GetFeature

                Debug.Print swFeature.GetTypeName2

                Debug.Print swFeature.Name

                If Not swFeature.GetTypeName2 = "HoleWzd" Then

                    'set Feature to Nothing if it isn't a HoleWizardFeature

                    Set swFeature = Nothing

                End If

            End If

        End If

       

        If Not swFeature Is Nothing Then

           'insert the feature into the array if it is unique

            found = False

            For i = 0 To UBound(swHoleWizardFeatures)

                If Not swHoleWizardFeatures(i) Is Nothing Then

                    If swHoleWizardFeatures(i).Name = swFeature.Name Then

                        found = True

                        Exit For

                    End If

                End If

            Next i

            If Not found Then

                If Not swHoleWizardFeatures(0) Is Nothing Then

                    ReDim Preserve swHoleWizardFeatures(UBound(swHoleWizardFeatures) + 1)

                End If

                Set swHoleWizardFeatures(UBound(swHoleWizardFeatures)) = swFeature

            End If

        End If

    Next vEdge

   

    Debug.Print "hole Count:"; (UBound(swHoleWizardFeatures) + 1)

    getHolesInFace = swHoleWizardFeatures

End Function

 

The Face2 that I pass as an argument is selected in the image below. You can see that the 11.0 dia holes and the 8H7 holes(green) interesect said Face.

 

 

Immediate Window:

ICE

Boss-Extrude5

ICE

Boss-Extrude5

ICE

Cut-Extrude1

ICE

Cut-Extrude1

ICE

Cut-Extrude1

ICE

Cut-Extrude1

ICE

Cut-Extrude1

ICE

Cut-Extrude1

HoleWzd

Ø11.0 (11) Diameter Hole1

HoleWzd

Ø11.0 (11) Diameter Hole1

HoleWzd

Ø11.0 (11) Diameter Hole1

HoleWzd

Ø11.0 (11) Diameter Hole1

ICE

Cut-Extrude1

ICE

Cut-Extrude1

ICE

Cut-Extrude1

ICE

Cut-Extrude1

hole Count: 1

It seems to be finding edges associated with the "11.0 Dia" clearance holes but not the 8H7 reamed holes. Both of these are hole wizard features that appear to intersect the face in question.

 

I believe I've narrowed the problem down to Face2::GetEdges. It is not returning the edges at the intersection of the 8H7 hole features and the face (selected below).

 

Looking further, it appears that the CutExtrude feature that generated the Face was created after the 8H7 holes. The 11.0 Dia holes were created after the CutExtrude. I can imagine why that would make a difference but don't know how to use that information to proceed. My function needs to return the H7 hole regardless of its order in the feature tree. There should be a way of accessing those edges.

 

 

Does anyone have experience with this? Any suggestions are appreciated.

 

Thanks,

 

John Alexander

Outcomes