Iterate through whole assembly - trying to build mark numbers
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
OK, what I'm trying to do is iterate through an entire assembly and generate mark numbers for parts that are library and/or content center parts. Parts that are read only.
For example - a whole shipping unit with have, say, 4 assemblies (ZR1-300, ZR1-330, ZR5-800, and ZR6-900). In our case, the mark number for each of those is:
ZR1-300-1
ZR1-330-1
ZR5-800-1
ZR6-900-1
Those are no problem. The custom iproperty MARK_NO exists in them and is editable on a per project basis.
Now, there are assorted nuts/bolts associated with each of the 4 sub assemblies. These, being content center part can't have different MARK_NO's per use. Therefore, presently we've been just manually assigned them MARK_NO's but manually editing the part's list. If the bolt is on line 5, for the ZR-300, it's MARK_NO is ZR1-300-5. In the nut was on line 8, ZR1-300-8. Basically, the line of the parts list/BOM equals the mark number.
I used the sample code from the help file below to make the original code:
Public Sub BOMQuery() ' Set a reference to the assembly document. ' This assumes an assembly document is active. Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument Dim FirstLevelOnly As Boolean If MsgBox("First level only?", vbYesNo) = vbYes Then FirstLevelOnly = True Else FirstLevelOnly = False End If ' Set a reference to the BOM Dim oBOM As BOM Set oBOM = oDoc.ComponentDefinition.BOM ' Set whether first level only or all levels. If FirstLevelOnly Then oBOM.StructuredViewFirstLevelOnly = True Else oBOM.StructuredViewFirstLevelOnly = False End If ' Make sure that the structured view is enabled. oBOM.StructuredViewEnabled = True 'Set a reference to the "Structured" BOMView Dim oBOMView As BOMView Set oBOMView = oBOM.BOMViews.Item("Structured") Debug.Print "Item"; Tab(15); "Quantity"; Tab(30); "Part Number"; Tab(70); "Description" Debug.Print "----------------------------------------------------------------------------------" 'Initialize the tab for ItemNumber Dim ItemTab As Long ItemTab = -3 Call QueryBOMRowProperties(oBOMView.BOMRows, ItemTab) End Sub Private Sub QueryBOMRowProperties(oBOMRows As BOMRowsEnumerator, ItemTab As Long) ItemTab = ItemTab + 3 ' Iterate through the contents of the BOM Rows. Dim i As Long For i = 1 To oBOMRows.Count ' Get the current row. Dim oRow As BOMRow Set oRow = oBOMRows.Item(i) 'Set a reference to the primary ComponentDefinition of the row Dim oCompDef As ComponentDefinition Set oCompDef = oRow.ComponentDefinitions.Item(1) Dim oPartNumProperty As Property Dim oDescripProperty As Property If Typeof oCompDef Is VirtualComponentDefinition Then 'Get the file property that contains the "Part Number" 'The file property is obtained from the virtual component definition Set oPartNumProperty = oCompDef.PropertySets _ .Item("Design Tracking Properties").Item("Part Number") 'Get the file property that contains the "Description" Set oDescripProperty = oCompDef.PropertySets _ .Item("Design Tracking Properties").Item("Description") Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _ oPartNumProperty.Value; Tab(70); oDescripProperty.Value Else 'Get the file property that contains the "Part Number" 'The file property is obtained from the parent 'document of the associated ComponentDefinition. Set oPartNumProperty = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Part Number") 'Get the file property that contains the "Description" Set oDescripProperty = oCompDef.Document.PropertySets _ .Item("Design Tracking Properties").Item("Description") Debug.Print Tab(ItemTab); oRow.ItemNumber; Tab(17); oRow.ItemQuantity; Tab(30); _ oPartNumProperty.Value; Tab(70); oDescripProperty.Value 'Recursively iterate child rows if present. If Not oRow.ChildRows Is Nothing Then Call QueryBOMRowProperties(oRow.ChildRows, ItemTab) End If End If Next ItemTab = ItemTab - 3 End Sub
My theoretical solution to being able to add our mark numbers directly to exports was to see if the object had a tag number. If it did, use it. Otherwise it was going to be get the first 8 digits of the parents MARK_NO (ZR1-300-) and then append the BOM's line number to it (ZR1-300-5).
Problem is, i cannot figure out how get the parent from within this code properly. Best I can figure is at the "
Recursively iterate child rows if present
line at the end, pull the mark number from the assembly, but this isn't tracking the assembly, just the BOM rows, so that's where I get lost.
Thanks for reading, hope it makes sense and is an easy fix 🙂