To whom it may concern,
I am attempting to control 3 parameters from my parent assembly, and once set, push them into non-defined part and assembly occurrences.
To be more specific, I have a parameter named finish. I would like to set a finish type (text parameter) to, for example, "PowderCoat-White". I can set this in my parent, and I can set this in my parts independently. So the data is there.
But how can I change the part's parameter without directly referencing the part's name? (Every build contains different components)
This is my current script:
'--------FINISH-------- Sub Main() ' Parent assembly rule Dim parentValueFinish As String = Finish ' Iterate through all components in the assembly For Each comp As ComponentOccurrence In ThisApplication.ActiveDocument.ComponentDefinition.Occurrences Try Dim childDoc As Document = comp.ReferencedDocumentDescriptor.ReferencedDocument Dim param As Parameter = childDoc.ComponentDefinition.Parameters.Item("Finish") param.Value = parentValueFinish Catch ex As Exception ' Handle any errors (e.g., parameter doesn't exist in the child) End Try Next End Sub
This actually seems to work for the most part..
The issue I'm having is that when I have a child sub-assembly with, lets say 2 instances, both having different model states activated (I use a configurable bracket), only the first instance will actually take the finish parameter.
I figured this was just a write issue with model states, so I modified the part's "pencil setting" to edit all model states... but that doesn't seem to change anything.
-
I guess what I'm asking is,
1) Is there an easier way to execute what I am trying to do here? I suppose I could use Try...Catch on every possible part name I have in my library and directly change the parameters that way. But A) that doesn't solve the model state issue, and B) that turns into a nightmare every time I want to add a new part into my library.
and
2) Could someone be willing to modify my code to actually work?
Hi
In my experience, its probably best to post this in the Inventor - programming - ilogic forum.
see below. The people in there are very helpful.
Failing that, I find ChatGPT is very helpful also with these kind of problems too.
https://forums.autodesk.com/t5/inventor-programming-ilogic/bd-p/120
This is what ChatGTP responded with....
Your current approach seems reasonable for the task you're trying to accomplish. However, the issue you're facing with model states might be due to the fact that you're not iterating through all occurrences of the sub-assemblies to set the parameter for each instance. Instead, you're just iterating through the top-level occurrences. To address this, you need to recursively iterate through all occurrences including sub-assemblies.
Here's how you can modify your script to achieve this:
Sub SetFinishParameter(ByVal parent As ComponentOccurrence, ByVal parentFinish As String)
' Set finish parameter for the given component occurrence and its children recursively
Try
Dim doc As Document = parent.ReferencedDocumentDescriptor.ReferencedDocument
Dim param As Parameter = doc.ComponentDefinition.Parameters.Item("Finish")
param.Value = parentFinish
Catch ex As Exception
' Handle any errors (e.g., parameter doesn't exist in the child)
End Try
' Recursively process child occurrences
For Each child As ComponentOccurrence In parent.SubOccurrences
SetFinishParameter(child, parentFinish)
Next
End Sub
Sub Main()
' Parent assembly rule
Dim parentValueFinish As String = Finish
' Start the recursive process from the top-level occurrences
For Each topLevelOccurrence As ComponentOccurrence In ThisApplication.ActiveDocument.ComponentDefinition.Occurrences
SetFinishParameter(topLevelOccurrence, parentValueFinish)
Next
End Sub
This modified script will traverse through all occurrences of the assembly, including sub-assemblies, and set the finish parameter accordingly.
Make sure that your assembly structure is correctly organized and that all parts and sub-assemblies have the "Finish" parameter defined. This script should set the parameter for all instances of parts and sub-assemblies, regardless of their model states. If there are any errors or exceptions, they will be caught and handled appropriately.
Can't find what you're looking for? Ask the community or share your knowledge.