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
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/)
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.
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
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.
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.