Blend Reference Cleaner

remove missing parents from edge blend features

I don't think this will come as news to anyone, but edge blend features depend on edges in the model. This sounds really obvious (which it is), but given how even minor edits can create or remove dozens of edges, it is surprising how stable the edge blend features really are. When a parent edge is modeled away, the edge blend feature will 'remember' where it used to be and display a warning icon in the feature tree. Occasionally, these warnings are very useful to track down unintentional changes; but more often than not, you are well aware of the changes and simply want to remove the old blend parents and get rid of the warning.

The Code

The journal below will search through the feature tree and remove any missing parents from the edge blends.

The code below should run on NX 7.5 or above.

Option Strict Off  
Imports System  
Imports System.Collections.Generic  
Imports NXOpen  
Module BlendCleaner_75  
    Sub Main()  
        Dim theSession As Session = Session.GetSession()  
        Dim workPart As Part = theSession.Parts.Work  
        Dim lw As ListingWindow = theSession.ListingWindow  
        Const undoName As String = "Blend Cleaner"  
        Dim markId1 As Session.UndoMarkId  
        markId1 = theSession.SetUndoMark(Session.MarkVisibility.Invisible, undoName)  
        Dim numCleaned As Integer = 0  
        Dim nullFeature As Features.Feature = Nothing  
        Dim currentFeat As Features.Feature = workPart.CurrentFeature  
        Dim prevFeat As Features.Feature = Nothing  
        For Each tempFeat As Features.Feature In workPart.Features  
            If tempFeat.FeatureType = "BLEND" Then  
                Dim myBlend As Features.EdgeBlend = tempFeat  
                Dim blendWarnings() As String = myBlend.GetFeatureWarningMessages()  
                Dim needsCleaning As Boolean = False  
                For Each myLine As String In blendWarnings  
                    If myLine.ToLower.Contains("consumed") Then  
                        needsCleaning = True  
                    End If  
                If needsCleaning Then  
                   'make previous feature the current feature
                   'edit blend feature with rollback
                    Dim blendBuilder As Features.EdgeBlendBuilder = workPart.Features.CreateEdgeBlendBuilder(myBlend)  
                    Dim validEdges As New List(Of Edge)  
                    Dim myCollector As ScCollector  
                    Dim myExp As Expression  
                    Dim valid As Boolean  
                    For i As Integer = 0 To blendBuilder.GetNumberOfValidChainsets - 1  
                        blendBuilder.GetChainsetAndStatus(i, myCollector, myExp, valid)  
                        Dim myObjects() As TaggedObject = myCollector.GetObjects  
                        For Each temp As Edge In myObjects  
                            Catch ex As NXException  
                               'lw.WriteLine("  error: " & ex.Message)
                               'edge has been consumed or suppressed
                            End Try  
                        Dim edgeMultipleSeedTangentRule1 As EdgeMultipleSeedTangentRule  
                        edgeMultipleSeedTangentRule1 = workPart.ScRuleFactory.CreateRuleEdgeMultipleSeedTangent(validEdges.ToArray, 0.5, True)  
                        Dim rules1(0) As SelectionIntentRule  
                        rules1(0) = edgeMultipleSeedTangentRule1  
                        myCollector.ReplaceRules(rules1, False)  
                        Dim csIndex1 As Integer  
                        csIndex1 = blendBuilder.AddChainset(myCollector, myExp.Value.ToString)  
                    numCleaned += 1  
                End If  
            End If  
            prevFeat = tempFeat  
        If numCleaned > 0 Then  
            theSession.SetUndoMarkVisibility(markId1, undoName, Session.MarkVisibility.Visible)  
        End If  
    End Sub  
End Module


The code above will remove any missing edge parents and will set the selection intent rule to 'tangent edges'. If this selection intent rule is not what you desire, modify the code accordingly. Also, the journal was not thoroughly tested with variable radius edge blends. If you find any bugs or encounter unexpected results, leave a comment or email me at