API: Korrigieren einer Komponente "nur in dieser Konfiguration"

Hallo, ich nehme eine Diskussion über ein Problem wieder auf, das bereits in diesem unten erwähnt wurde, aber in meinem letzten Beitrag unbeantwortet blieb:

Da dieser Beitrag alt ist und als gelöst markiert ist, erregt er keine Aufmerksamkeit.

Das Problem besteht darin, alle Komponenten nur in der aktiven Konfiguration zu reparieren.

Laut Codestack scheint die API in diesem Punkt eine Lücke zu haben, und sie bietet eine Alternative, um den Befehl direkt über Windows aufzurufen.

Für die allgemeine Idee wird es HIER behandelt

Für die spezielle Anwendung auf den Fall, der mich interessiert, hier ein BEISPIEL

Ich vermute

" Sub Main " kann die Aktion " fixcomponent " für die Reihe von Komponenten ausführen, die wörtlich bezeichnet werden (Teil 1-1 bis Teil 1-4), je nachdem, ob die Aktion auf Wahr oder Falsch gesetzt ist

" Sub fixcomponent " beschreibt die Prozedur, die in " Sub main " für jede Komponente aufgerufen wird.

Zunächst einmal: Liege ich falsch?

Wenn nicht, möchte ich in der Lage sein, die Literalliste der Komponenten durch eine Schleife zu ersetzen, die jede Komponente der obersten Ebene in meiner Assembly aufruft.

Weiß jemand, wie man das schreibt?

Vielen Dank im Voraus.

PS: Mein Ziel ist es, vereinfachte Konfigurationen meiner Assemblies zu erstellen. Das Beste vom Besten wäre, von der Kopfbaugruppe aus eine " vereinfachte " Konfiguration für jede Unterbaugruppe zu erstellen, die nicht sehr wichtigen Komponenten zu entfernen (typischerweise die Schrauben, die Sortierung kann auf der Grundlage des Volumens erfolgen, mit einem in mm3 zu definierenden Schwellenwert) und die Komponenten zu fixieren. Und um ein Update vorzunehmen, wenn die Konfiguration bereits vorhanden ist, um die Komponenten in dieser Konfiguration freizugeben und sie dann erneut zu reparieren.

Vielen Dank im Voraus

Hallo
Im Beispielcode wird der Parameter True oder False verwendet, um fixcomponent auf die aktuelle conf oder auf alle confs anzuwenden.

'**********************
"Urheberrecht(C) 2022 Xarial Pty Limited
'Referenz: Fixieren oder Verschieben von Komponenten in aktiven oder allen Konfigurationen mit der SOLIDWORKS API
'Lizenz: Lizenz
'**********************

Wenn thisConf dann
cmd = CMD_FixCompInThisConf
Oder
cmd = CMD_FixCompInAllConf
Ende, wenn

Um den Baum in einer Schleife zu durchlaufen, müssen Sie die Analysefunktionen des typischen Baums verwenden: Beispiel für eine Traversenbaugruppe auf Komponentenebene (VBA) - 2021 - SOLIDWORKS API Help

2 „Gefällt mir“

Vielen Dank, Cyril, für deine Nachricht. In dem Beispiel, das Sie zitieren, sehe ich die vom Makro ausgeführte "Aktion" nicht, die ich durch meinen Befehl "fix in this config" ersetzen könnte

Ist es, in 1st, "Sub Main" öffnet das Dokument "C:\Users[...] \stepped_shaft.sldasm", dann aktivieren wir das Modul "Traverse components"? Aber was passiert als Aktion für jede Komponente?..
Wenn das stimmt, müsste ich in Sub Main darum bitten, die "Vereinfachte" Konfiguration des aktuellen Dokuments zu aktivieren. Wenn keine "vereinfachte" Konfiguration, dann tun wir nichts, Ende des Makros.

Hallo
Das API-Beispiel zeigt nur, wie Komponenten aus dem Feature-Manager aufgelistet werden.
Es wird keine andere Verarbeitung durchgeführt, es wird nur der Pfad zur Datei und ihr Datensatzname mit debug.print angezeigt

1 „Gefällt mir“

Anstelle von debug print füge ich also ein, was ich als einen Befehl identifiziert habe, der mir passt:
' Windows FloatCompInThisConf-Befehl:
SendMessage swApp.Frame() verwenden. GetHWnd(), &H111, 51609, 0
' Windows FloatCompInAllConf-Befehl:
SendMessage swApp.Frame() verwenden. GetHWnd(), &H111, 51608, 0
' Windows FixCompInThisConf-Befehl:
SendMessage swApp.Frame() verwenden. GetHWnd(), &H111, 51605, 0
' Windows-Befehl: FixCompInAllConf:
SendMessage swApp.Frame() verwenden. GetHWnd(), &H111, 51611, 0

Und wenn ich in Main die Konfiguration namens "Simplified" aktivieren möchte, reichen diese paar Zeilen aus?

Dim instance As IModelDoc2
Dim ConfigurationName As String
Dim value As Boolean
 
value = instance.ShowConfiguration2(Simplifié)

Es kommt mir ein bisschen kurz vor...

Wenn ich diese Frage stelle, liegt das daran, dass ich bei der mycad-Integration immer eine Fehlermeldung erhalte, wenn ich nach dieser Aktion frage. Ich verstehe nicht, warum... und da man etwas von diesem "Sub Main" reinpacken muss, dachte ich mir das wäre eine Lösung

Auf den ersten Blick würde ich ja sagen. Auf der anderen Seite listet die Traverse-Komponente aus dem Speicher auch die Dateien auf, die in Wiederholungen vorhanden sind, und auch andere Elemente (je nach Dateityp), so dass Sie mit diesem Baumscanverfahren spielen müssen, um die verschiedenen Fälle zu verwalten und zu wissen, wann Sie die Verarbeitung stoppen oder je nach Bedarf etwas anderes anwenden müssen.

Beispiel für alle Konfigurationen (VBA) - 2021 - SOLIDWORKS API-Hilfe

Ich dachte, ich hätte mich auf der Makroebene weiterentwickelt, aber ich habe noch einen langen Weg vor mir. Die Aktivierung der "vereinfachten" Konfiguration der aktuellen Baugruppe kann nicht codiert werden... Es verdient ein anderes Thema, oder kann mir jemand ein Stück Code geben, das hier funktioniert?

Ich kann ein funktionales Stück Code bereitstellen, um eine Conf zu aktivieren, wenn niemand vorher geht, aber hier bin ich auf etwas anderem.

:+1:

Hier ist der Codeausschnitt, nur um eine bestimmte Konfiguration des aktuellen Dokuments zu ermöglichen

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim sConfigName As String
Dim bShowConfig As Boolean

Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
sConfigName = "Simplifié"
bShowConfig = swModel.ShowConfiguration2(sConfigName)

End Sub

Supezr, das werde ich testen.
Aber meine IT-Abteilung hat mir gerade den Zugriff auf Codestack verwehrt.
Könnte jemand den Code für mich an diese Adresse kleben?
Danke noch einmal

'**********************
'Copyright(C) 2022 Xarial Pty Limited
'Reference: https://www.codestack.net/solidworks-api/document/assembly/components/fix-float/
'License: https://www.codestack.net/license/
'**********************

#If VBA7 Then
     Private Declare PtrSafe Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#Else
     Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#End If

Dim swApp As SldWorks.SldWorks

Sub main()

    Set swApp = Application.SldWorks
    
    Dim swAssy As SldWorks.AssemblyDoc
    
    Set swAssy = swApp.ActiveDoc
    
    FixComponent swAssy.GetComponentByName("Part1-1"), True
    FixComponent swAssy.GetComponentByName("Part1-2"), False
    FloatComponent swAssy.GetComponentByName("Part1-3"), True
    FloatComponent swAssy.GetComponentByName("Part1-4"), False
    
End Sub

Sub FixComponent(comp As SldWorks.Component2, thisConf As Boolean)

    Const CMD_FixCompInThisConf As Long = 51605
    Const CMD_FixCompInAllConf As Long = 51611
    
    If False <> comp.Select4(False, Nothing, False) Then
        
        Const WM_COMMAND As Long = &H111
        Dim cmd As Long
        
        If thisConf Then
            cmd = CMD_FixCompInThisConf
        Else
            cmd = CMD_FixCompInAllConf
        End If
        
        SendMessage swApp.Frame().GetHWnd(), WM_COMMAND, cmd, 0
    Else
        Err.Raise vbError, "", "Failed to select component"
    End If
    
End Sub

Sub FloatComponent(comp As SldWorks.Component2, thisConf As Boolean)
    
    Const CMD_FloatCompInThisConf As Long = 51609
    Const CMD_FloatCompInAllConf As Long = 51608
    
    If False <> comp.Select4(False, Nothing, False) Then
        
        Const WM_COMMAND As Long = &H111
        Dim cmd As Long
        
        If thisConf Then
            cmd = CMD_FloatCompInThisConf
        Else
            cmd = CMD_FloatCompInAllConf
        End If
        
        SendMessage swApp.Frame().GetHWnd(), WM_COMMAND, cmd, 0
    Else
        Err.Raise vbError, "", "Failed to select component"
    End If
    
End Sub

Andernfalls geht der Tipp durch Google Translate (Google wird nie von Unternehmen blockiert...), um eine blockierte Website zu sehen, wenn die Website nicht zu viel Java enthält, sehen Sie das Ganze. (Sie müssen nicht übersetzen, Sie können Englisch in der Übersetzung lassen...)

1 „Gefällt mir“