Several months back, I created an iLogic routine that will delete all mates & joints in an assembly, and ground all of the components. I was asked if I could do something similar for a client. The requirement was to supress all mates and joints, then ground all of the components in the assembly. The second part of the request was the ability to un-ground and unsupress all of the constraints/joints.
Turns out that this was very easy to do, but the one consideration is that when un-grounding everything in the assembly, the first component in the assembly will be ungrounded. To fix this, I added a few lines of code at the end of the rule to find the first instance in the browser and to ground it.
Here’s a GIF showing the code in action
Here’s the code:
'Code by @ClintBrown3D originally posted here: --> https://clintbrown.co.uk/ilogic-supress-constraints-amp-ground-all-components 'Some code here was borrowed from Curtis, see http://inventortrenches.blogspot.com/2012/05/working-with-unconstrained-imported.html 'This version of the code is adapted from a sample first published here: https://clintbrown.co.uk/ilogic-delete-all-mates-joints-ground Dim oAssDoc As AssemblyDocument oAssDoc = ThisApplication.ActiveDocument Dim oConstraint As AssemblyConstraint Dim oJoint As AssemblyJoint qGround = True qGround = InputRadioBox("Prompt", "Suppress Constrains + Ground all", "Unsupress Constrains + Un-Ground all", booleanParam, Title := "Unofficial Inventor ") i = 0 For Each oConstraint In oAssDoc.ComponentDefinition.Constraints oConstraint.Suppressed = qGround i = i + 1 Next ii = 0 For Each oJoint In oAssDoc.ComponentDefinition.Joints oJoint.Suppressed = qGround ii = ii + 1 Next 'get the active assembly Dim oAsmCompDef As AssemblyComponentDefinition oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition 'set the Master LOD active Dim oLODRep As LevelOfDetailRepresentation oLODRep = oAsmCompDef.RepresentationsManager.LevelOfDetailRepresentations.Item("Master") oLODRep.Activate 'Iterate through all of the top level occurrences Dim oOccurrence As ComponentOccurrence For Each oOccurrence In oAsmCompDef.Occurrences If oOccurrence.DefinitionDocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then 'Iterate through all of the 2nd level occurrences Dim oSub1Occ As ComponentOccurrence For Each oSub1Occ In oOccurrence.SubOccurrences 'ground everything in the 2nd level oSub1Occ.Grounded = qGround If oSub1Occ.DefinitionDocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then 'Iterate through all of the 3nd level occurrences Dim oSub2Occ As ComponentOccurrence For Each oSub2Occ In oSub1Occ.SubOccurrences 'ground everything in the 3rd level oSub2Occ.Grounded = qGround Next Else End If Next Else End If 'ground everything in the top level oOccurrence.Grounded = qGround Next 'Ground the first node Dim doc = ThisDoc.Document Dim oDef As AssemblyComponentDefinition = doc.ComponentDefinition Dim oCompOcc As Inventor.ComponentOccurrence Dim oNames As New ArrayList For Each oCompOcc In oDef.Occurrences GetOccName = oCompOcc.Name oNames.Add(GetOccName) Next Dim bob As String = oNames(0) For Each oCompOcc In oDef.Occurrences If oCompOcc.Name = bob Then oCompOcc.Grounded = True End If Next MessageBox.Show("Successfully processed " & i & " constraints " & ii & " joints", "iLogic - @ClintBrown3D")
This version of the code was briefly tested in Inventor 2021.
As always, please test all iLogic code extensively on non-production files. Do not use any code in a production environment until YOU have thoroughly tested it and have verified that it works as expected. Always back up any data before running any experimental code. You are ultimately responsible for any iLogic code that you run, so make sure you test it thoroughly!