Issue:
You have a parts list that has a challenging sort criteria, due to needing to sort for values that might or might not exist in the same column.
In the example above we want to sort the description column based on all items with a mark number (MK) value, and then sort those without a mark number alphabetically.
Solution:
Although we can't accomplish this out of the box, here are 3 code examples to do this that use iLogic and some API calls.
--------------------------------------------------------------
V1: Version to handle single parts list on the active sheet
--------------------------------------------------------------
sSortColumnName = "KEYWORDS" ' Set a reference to the drawing document. ' This assumes a drawing document is active. Dim oDrawDoc As DrawingDocument oDrawDoc = ThisApplication.ActiveDocument ' Set a reference to the first parts list on the active sheet. Dim oPartsList As PartsList Try oPartsList = oDrawDoc.ActiveSheet.PartsLists.Item(1) Catch Return 'exit rule End Try Dim oADoc As AssemblyDocument oADoc = oPartsList.ReferencedDocumentDescriptor.ReferencedDocument Dim oPropSet As PropertySet oPropSet = oADoc.PropertySets.Item("Inventor Summary Information") 'add temporary column to the parts list oID = oPropSet.Item(sSortColumnName).PropId Try oPartsList.PartsListColumns.Add _ (PropertyTypeEnum.kFileProperty, oPropSet.InternalName, oID) Catch End Try ' Iterate through the contents of the parts list. Dim i As Long For i = 1 To oPartsList.PartsListRows.Count 'get the Description value oCell = oPartsList.PartsListRows.Item(i).Item("DESCRIPTION") 'split the string at the comma 'expecting a string like: ' Bracket, MK B-114 sArray = Split(oCell.Value, ",") sType = sArray(0) Try sMK = sArray(1) Catch 'error when no comma in string sMK = "" End Try 'get the temp column cell oTempColumnCell = oPartsList.PartsListRows.Item(i).Item(sSortColumnName) 'write to temp column If sMK.Contains("MK") Then 'strip off the MK sMK = Replace(sMK, "MK ", "") oTempColumnCell.Value = sMK Else oTempColumnCell.Value = sType End If Next 'sort and renumber oPartsList.Sort(sSortColumnName) oPartsList.Renumber 'remove temp column oPartsList.PartsListColumns(sSortColumnName).remove
--------------------------------------------------------------
V2: Version for multiple sheets
--------------------------------------------------------------
sSortColumnName = "KEYWORDS" ' Set a reference to the drawing document. ' This assumes a drawing document is active. Dim oDrawDoc As DrawingDocument oDrawDoc = ThisApplication.ActiveDocument Dim oCurrentSheet As Sheet oCurrentSheet = oDrawDoc.ActiveSheet Dim oSheet As Sheet For Each oSheet In oDrawDoc.Sheets oSheet.Activate ' Set a reference to the first parts list on the active sheet. Dim oPartsList As PartsList Try oPartsList = oDrawDoc.ActiveSheet.PartsLists.Item(1) Catch Return 'exit rule End Try Dim oADoc As AssemblyDocument oADoc = oPartsList.ReferencedDocumentDescriptor.ReferencedDocument Dim oPropSet As PropertySet oPropSet = oADoc.PropertySets.Item("Inventor Summary Information") 'add temporary column to the parts list oID = oPropSet.Item(sSortColumnName).PropId Try oPartsList.PartsListColumns.Add _ (PropertyTypeEnum.kFileProperty, oPropSet.InternalName, oID) Catch End Try ' Iterate through the contents of the parts list. Dim i As Long For i = 1 To oPartsList.PartsListRows.Count 'get the Description value oCell = oPartsList.PartsListRows.Item(i).Item("DESCRIPTION") 'split the string at the comma 'expecting a string like: ' Bracket, MK B-114 sArray = Split(oCell.Value, ",") sType = sArray(0) Try sMK = sArray(1) Catch 'error when no comma in string sMK = "" End Try 'get the temp column cell oTempColumnCell = oPartsList.PartsListRows.Item(i).Item(sSortColumnName) 'write to temp column If sMK.Contains("MK") Then 'strip off the MK sMK = Replace(sMK, "MK ", "") oTempColumnCell.Value = sMK Else oTempColumnCell.Value = sType End If Next 'sort and renumber oPartsList.Sort(sSortColumnName) oPartsList.Renumber 'remove temp column oPartsList.PartsListColumns(sSortColumnName).Remove Next oCurrentSheet.activate InventorVb.DocumentUpdate()
--------------------------------------------------------------
V3: Version for multiple parts list on the active sheet
--------------------------------------------------------------
sSortColumnName = "KEYWORDS" ' Set a reference to the drawing document. ' This assumes a drawing document is active. Dim oDrawDoc As DrawingDocument oDrawDoc = ThisApplication.ActiveDocumentDim oPartsList As PartsList = ThisApplication.CommandManager.Pick _ (SelectionFilterEnum.kDrawingPartsListFilter, "Select a Parts List to sort.") If oPartsList Is Nothing Then Return 'exit rule Dim oADoc As AssemblyDocument oADoc = oPartsList.ReferencedDocumentDescriptor.ReferencedDocument Dim oPropSet As PropertySet oPropSet = oADoc.PropertySets.Item("Inventor Summary Information") 'add temporary column to the parts list oID = oPropSet.Item(sSortColumnName).PropId Try oPartsList.PartsListColumns.Add _ (PropertyTypeEnum.kFileProperty, oPropSet.InternalName, oID) Catch End Try ' Iterate through the contents of the parts list. Dim i As Long For i = 1 To oPartsList.PartsListRows.Count 'get the Description value oCell = oPartsList.PartsListRows.Item(i).Item("DESCRIPTION") 'split the string at the comma 'expecting a string like: ' Bracket, MK B-114 sArray = Split(oCell.Value, ",") sType = sArray(0) Try sMK = sArray(1) Catch 'error when no comma in string sMK = "" End Try 'get the temp column cell oTempColumnCell = oPartsList.PartsListRows.Item(i).Item(sSortColumnName) 'write to temp column If sMK.Contains("MK") Then 'strip off the MK sMK = Replace(sMK, "MK ", "") oTempColumnCell.Value = sMK Else oTempColumnCell.Value = sType End If Next 'sort and renumber oPartsList.Sort(sSortColumnName) oPartsList.Renumber 'remove temp column oPartsList.PartsListColumns(sSortColumnName).Remove InventorVb.DocumentUpdate()