Hallo @hmelmer,
leider hat es einen Moment gedauert. 
Also natürlich ist dies der Teil, der etwas Zeit kostet. Aber ich habe mich mal drangesetzt und ein kleines System ausprobiert, wie man das Regeln könnte und mit Deiner Baugruppe etwas getestet.
Grundlage wären drei Regeln:
- iLogic-Regel: Reihenfolge der Ausführung regeln
- iLogic-Regel: Unterdrückung steuern
- iLogic-Regel: Baugruppen-Struktur setzen
Vorüberlegung war, dass man die Baugruppenstruktur immer nur dann anpassen kann, wenn die Teile selbst nicht unterdrückt sind.
Also habe ich eine kleine Regel geschrieben, die die Ausführungsreihenfolge der beiden anderen Regeln steuert.
Will man die Anordnung unterdrücken, müssen erst die Teile auf "Referenz" gesetzt werden und dann wird unterdrückt.
Will man die Unterdrückung aufheben, muss erst die Unterdrückung der Teile entfernt werden und dann kann man die Stücklistenstruktur wieder anfassen.
Bei mir dauert die Ausführung auf diese Art und Weise ca 6-7 Sekunden. Wenn man das mit "IsActive" regelt, dauert es bei mir 25-30 Sekunden. (siehe Screencast)
Wenn Du also dieses System so anwendest, könntest Du einiges an Zeit sparen 
Hier das Video dazu:
Bei mir wird übrigens keine der Regeln automatisch angestoßen! Der Parameter wird geändert und dann die Regel manuell angestoßen.
Hier die Regeln:
Regel 1: Diese wird angestoßen
[TriggerRule]
Dim bIsActive As Boolean = PatternWanted
If bIsActive Then
iLogicVb.RunRule("ChangeSuppressState")
iLogicVb.RunRule("ChangeBomStructure")
Else
iLogicVb.RunRule("ChangeBomStructure")
iLogicVb.RunRule("ChangeSuppressState")
End If
MessageBox.Show("Done.", "Test")
Regel 2: Unterdrückung steuern (Das ist im Prinzip die schon bekannte Regel von weiter oben)
[ChangeSuppressState]
Dim patternName = "Schraubverbindung Oben, Mitte, Unten:1"
Dim nameOfComponentInPattern = "Schraubenverbindung:295"
Dim isActiveNow = Component.IsActive(nameOfComponentInPattern)
' PatternWanted is the name of a Boolean parameter in the assembly
If isActiveNow <> PatternWanted Then
' Use the command to toggle the suppression state
Dim assemDoc As AssemblyDocument = ThisDoc.Document
assemDoc.SelectSet.Clear
assemDoc.SelectSet.Select(assemDoc.ComponentDefinition.OccurrencePatterns(patternName))
oCommandMgr = ThisApplication.CommandManager
Dim controlDefs = ThisApplication.CommandManager.ControlDefinitions
controlDefs("AssemblyCompSuppressionCtxCmd").Execute2(True)
End If
Regel 3: Baugruppen-Struktur setzen
[ChangeBomStructure]
Dim bIsActive As Boolean
bIsActive = PatternWanted
Dim sPatternName As String
sPatternName = "Schraubverbindung Oben, Mitte, Unten:1"
Dim odoc As AssemblyDocument = ThisApplication.ActiveDocument
Dim oPattern As OccurrencePattern
For Each oPattern In odoc.ComponentDefinition.OccurrencePatterns
If oPattern.Name = sPatternName Then
Dim oElement As OccurrencePatternElement
For Each oElement In oPattern.OccurrencePatternElements
Dim oOccurence As ComponentOccurrence
For Each oOccurence In oElement.Occurrences
If bIsActive Then
oOccurence.BOMStructure = BOMStructureEnum.kDefaultBOMStructure
Else
oOccurence.BOMStructure = BOMStructureEnum.kReferenceBOMStructure
End If
Next
Next
End If
Next
An der ein oder anderen Stelle kann man das bestimmt besser oder anders handhaben, aber es soll ja zunächst auch nur das Prinzip zeigen.
Kannst du das mal testen?
Bitte nutzt den "Als Lösung akzeptieren"-Button, wenn ein Beitrag euer Problem oder eure Frage löst. Für hilfreiche Posts könnt ihr auch gerne Kudos vergeben.
Dennis Ossadnik
Senior Technical Support Specialist