Makro-Bearbeitung

Hallo

Ich habe ein Makro, mit dem Sie ausgewählte Komponenten aus einer Baugruppe in einen Ordner verschieben können.

'**********************
'Copyright(C) 2019 www.codestack.net
'Reference: https://www.codestack.net/solidworks-api/document/assembly/components/move-to-folder/
'License: https://www.codestack.net/LICENSE.md
'**********************

#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 swModel As SldWorks.ModelDoc2
    
    Set swModel = swApp.ActiveDoc
    
    If Not swModel Is Nothing Then
        SelectComponentsFromCurrentSelection swModel
        AddSelectedComponentsToNewFolder ""
    Else
        MsgBox "Please open assembly"
    End If

End Sub

Sub SelectComponentsFromCurrentSelection(model As SldWorks.ModelDoc2)
    
    Dim swComps() As SldWorks.Component2
    Dim isArrInit As Boolean
    isArrInit = False
    
    Dim i As Integer
    
    Dim swSelMgr As SldWorks.SelectionMgr
    Set swSelMgr = model.SelectionManager
    
    For i = 1 To swSelMgr.GetSelectedObjectCount2(-1)
        
        Dim swComp As SldWorks.Component2
        Set swComp = swSelMgr.GetSelectedObjectsComponent4(i, -1)
        
        If Not swComp Is Nothing Then
        
            Dim unique As Boolean
            unique = False
            
            If False = isArrInit Then
                isArrInit = True
                ReDim swComps(0)
                unique = True
            Else
                unique = Not Contains(swComps, swComp)
                If True = unique Then
                    ReDim Preserve swComps(UBound(swComps) + 1)
                End If
            End If
                
            If True = unique Then
                Set swComps(UBound(swComps)) = swComp
            End If
        
        End If
        
    Next
    
    If True = isArrInit Then
        If UBound(swComps) + 1 <> model.Extension.MultiSelect2(swComps, False, Nothing) Then
            Err.Raise vbError, , "Failed to select components"
        End If
    End If
    
End Sub

Function Contains(vArr As Variant, item As Object) As Boolean
    
    Dim i As Integer
    
    For i = 0 To UBound(vArr)
        If vArr(i) Is item Then
            Contains = True
            Exit Function
        End If
    Next
    
    Contains = False
    
End Function

Sub AddSelectedComponentsToNewFolder(dummy)
    
    Const WM_COMMAND As Long = &H111
    Const CMD_ADD_TO_NEW_FOLDER As Long = 37922
    
    Dim swFrame As SldWorks.Frame
        
    Set swFrame = swApp.Frame
        
    SendMessage swFrame.GetHWnd(), WM_COMMAND, CMD_ADD_TO_NEW_FOLDER, 0
    
End Sub

Der Name des Ordners lautet "Ordner x"

Ich möchte es so ändern, dass der Name des Ordners "VISSERIE" lautet

Wie bearbeite ich mein Makro?

Vielen Dank


verschieben-nach-ordner.swp

Hallo

Sie sollten in der Lage sein, das hier angegebene Beispiel zu verwenden.

Herzliche Grüße

1 „Gefällt mir“

Vielen Dank, D.roger, für Ihren Beitrag.

Das Problem ist, dass ich nicht weiß, wie man VBA liest (oder irgendeine andere Sprache).

- Im API-Beispiel werden nur die Komponenten "valve<1> und valve_guide<1> " in einen "neuen Ordner" gelegt.

- In dem Makro, das ich wiederhergestellt habe, wird die Aktion für die ausgewählten Komponenten ausgeführt (schließlich beabsichtige ich, einen Auswahlfilter gemäß einer benutzerdefinierten Eigenschaft zu verwenden)

Ich müsste eine Chimäre machen, aber ich weiß nicht wirklich, wo ich das Biest schneiden soll.

Gibt es in der API ein Funktionswörterbuch, auf das ich zurückgreifen könnte, um besser zu verstehen, wie die Makros, die ich hier und da bekomme, funktionieren?

Auf diese Weise kann ich den Begriff finden, der den Namen des Ordners in dem von mir abgerufenen Makro verwaltet.

Beginnen Sie mit VBA Excel, es ist einfacher, die Sprache zu verstehen (https://www.excel-pratique.com/fr/vba.php), dann haben Sie auf der Codestack-Site, auf der Sie den 1. Code genommen haben, eine Vielzahl von Tutorials (https://www.codestack.net/solidworks-api/document/)

1 „Gefällt mir“

Hallo

Die Person, die das Makro geschrieben hat, das Sie erhalten haben, ist der Ansicht, dass der Befehl zum Erstellen eines Ordners in den Solidworks APIs nicht existiert und daher die Windows-APIs durchlaufen hat, um einen Befehl an Solidworks zu senden, und wie er auf seiner Erklärungsseite einfügt, die Sie HIER finden können, "Die Herausforderung besteht darin, die ID des erforderlichen Befehls zu ermitteln ". In der Solidworks API lautet die Funktion "InsertFeatureTreeFolder2".

Im Beispiel aus der API müssen Sie an Ihrer in Solidworks geöffneten Baugruppe festhalten und dann eine Schleife erstellen, um die ausgewählten Elemente abzurufen. Alle Funktionen, die für die Verwendung der Solidworks API erforderlich sind, stammen von ICI.

Herzliche Grüße

1 „Gefällt mir“

Hallo

Das Makro sollte in einer Kurzversion (ohne Verifizierung und Fehlerbehandlung) und durch die Solidworks APIs wie folgt aussehen können:

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim modelDoc2 As SldWorks.modelDoc2
Dim assemblyDoc As SldWorks.assemblyDoc
Dim featureMgr As SldWorks.FeatureManager
Dim modelDocExt As SldWorks.ModelDocExtension
Dim selectionMgr As SldWorks.selectionMgr
Dim feature As SldWorks.feature
Dim selObj As Object
Dim count As Long
Dim componentToMove As SldWorks.Component2
Dim componentsToMove() As Object
Dim i As Long
Dim retVal As Boolean

Sub Main()

    Set swApp = Application.SldWorks
    Set modelDoc2 = swApp.ActiveDoc
    Set assemblyDoc = modelDoc2

    'Récupération des élements sélectionnés dans Solidworks
    Set modelDocExt = modelDoc2.Extension
    Set selectionMgr = modelDoc2.SelectionManager
    Set selObj = selectionMgr.GetSelectedObject6(1, -1)
    count = selectionMgr.GetSelectedObjectCount2(0)
    ReDim componentsToMove(count - 1)
    For i = 0 To count - 1
        Set componentToMove = selectionMgr.GetSelectedObjectsComponent4(i + 1, -1)
        Set componentsToMove(i) = componentToMove
    Next

    'Création d'un nouveau dossier
    Set featureMgr = modelDoc2.FeatureManager
    Set feature = featureMgr.InsertFeatureTreeFolder2(swFeatureTreeFolder_EmptyBefore)
    Set feature = assemblyDoc.FeatureByName(feature.Name)

    'Déplacement des élements sélectionnés dans le nouveau dossier
    retVal = assemblyDoc.ReorderComponents(componentsToMove, feature, swReorderComponents_LastInFolder)

    'Changement de nom du dossier
    feature.Name = "Visserie"

End Sub

Herzliche Grüße

2 „Gefällt mir“

Super! Es funktioniert perfekt.

Ich werde in der Lage sein, den Teil "Auswahl der Komponenten gemäß der benutzerdefinierten Eigenschaft" zu integrieren. Es scheint mir auf meinem Niveau zu sein.

Vielen Dank für Ihre Hilfe.

Wenn es möglich ist, die endgültige Version von yve zu posten, könnte es schön sein, dass ich das gleiche Bedürfnis habe, es danach anzupassen.

Kein Problem, würde ich sogar gerne sagen.

Ich habe gerade etwas an einer Baugruppe mit Unterbaugruppen getestet, und es hat einen festsitzenden Bereich. Ich muss in der Lage sein, nur auf der ersten Ebene eine Auswahl zu treffen. Ich glaube nicht, dass ich heute Zeit habe, mich damit zu beschäftigen.

Am Ende, wenn ich meinen Willen bekomme, wird es mir ein leistungsfähigeres Makro geben als der TreeManager von MycadTool, der es mir nicht erlaubt, mehrere Sortieraktionen durchzuführen oder diese Aktionen zu speichern.