Oh you're gonna love this one. You were correct, you had patterns of patterns. Problem has been fixed, and OPTIMIZED. Guaranteed correct numbering, and it runs much faster. It does however have a 1 in 1,000,000+ chance of failing, part of the fun!
Sub Main
Dim oDoc As PartDocument = ThisDoc.Document
Dim oDocDef As PartComponentDefinition = oDoc.ComponentDefinition
Dim BrowserPane As BrowserPane = oDoc.BrowserPanes.Item("Model")
Dim oParent As String
Dim SUFFIX As String = "_COPY_"
Dim oSolidNode As BrowserNode
Dim oSolids As New Dictionary(Of SurfaceBody, String)
'[ FIND SOLID BODY NODE
For Each oTopNode As BrowserNode In BrowserPane.TopNode.BrowserNodes
For Each oSubNode As BrowserNode In oTopNode.BrowserNodes
If oSubNode.BrowserNodeDefinition.Label.Contains("Solid Bodies")
oSolidNode = oSubNode : GoTo FoundNode
End If
Next
Next
']
FoundNode :
'[ GO THROUGH EACH SOLID IN THE SOLIDBODIES NODES BROWSER TO CHECK IF COMPONENT IS A PATTERN OF ANOTHER SOLID
For Each oNodeA As BrowserNode In oSolidNode.BrowserNodes
For Each oNodeB As BrowserNode In oNodeA.BrowserNodes
If oNodeB.BrowserNodeDefinition.Label.Contains("Pattern of")
Try
oParent = Replace(Split(Split(oNodeB.BrowserNodeDefinition.Label, ":")(0), "_COPY")(0), "Pattern of ", "")
oSolids.Add(oNodeA.NativeObject, oParent) :
Catch : End Try
End If
Next
Next
']
'[ RENAME ALL PATTERNED PARTS WITH A 5-6 DIGIT LONG RANDOM NUMBER, AND THEN RENUMBER ALL SOLIDS CORRECTLY
Dim oMainSolids As New Dictionary(Of String, Integer), oMainName As String
For i = 1 To 2
For Each oSolid As SurfaceBody In oSolids.Keys
oMainName = oSolids(oSolid)
If i = 1
If Not oMainSolids.ContainsKey(oMainName) Then oMainSolids.Add(oMainName, 1)
oSolid.Name = oMainName & SUFFIX & Int(Rnd * 1000000)
ElseIf i = 2
oSolid.Name = oMainName & SUFFIX & oMainSolids(oMainName)
oMainSolids(oMainName) += 1
End If
Next
Next
']
End Sub