Ich weiß, dass dieses Thema schon viele Male diskutiert wurde und dass es sicherlich fertige Anwendungen gibt.
Ich möchte eine Excel-Stückliste erstellen, die sich automatisch aktualisiert, wenn sie geöffnet wird, ohne dass die Baugruppe geöffnet wird, um sie in eine Projektmanagement-Tabelle zu integrieren.
Andernfalls, wenn Sie sich mit "Makros / Programmierung" auskennen, ist es möglich, es maßgeschneidert zu machen, indem Sie sich auf die Solidworks APIs verlassen ...
@Yannick: Es ist möglich, dies zu tun, wenn Solidworks mit "SolidWorks.Interop.swdocumentmgr.dll" geschlossen ist (oder sogar mit Solidworks, das nicht mit "swdocumentmgr.dll" installiert ist) Verwenden Sie die GetComponents-Funktion , um die Stückliste abzurufen.
Auf der anderen Seite, da der Dokumentenmanager nur noch in x64 funktioniert, müssten wir ein externes Modul für Excel erstellen. Und rufen Sie es aus einem Excel-Makro mit dem Befehl "Call Shell()" auf. Oder Sie verfügen über eine Anwendung, die die Stückliste direkt in eine Excel-Datei schreibt.
Hier ist ein Entwurf, der die Stückliste in dasselbe Verzeichnis wie die Assembly schreibt: (Kopieren Sie den Code in eine neue VB.NET Konsolenanwendung , oder verwenden Sie die angefügte Datei.)
Imports System.IO
Imports SwDocumentMgr
'Imports SolidWorks.Interop.swdocumentmgr'
Module Module1
Private swDocMgr As SwDMApplication
Private Bom As New Dictionary(Of String, Integer)
Private TsvPath As String
Sub Main()
Dim LicenseFile As String = Path.Combine(My.Application.Info.DirectoryPath, "LicenseKey.txt")
Dim Lines As List(Of String) = File.ReadAllLines(LicenseFile).ToList
Dim LicenseKey As String = Lines(0)
If LicenseKey.Length < 50 Then
Console.Write("Entrer le numéro de license document manager dans ce fichier TXT")
Process.Start(LicenseFile)
Console.ReadLine()
System.Environment.Exit(-1)
End If
Dim Args As List(Of String) = System.Environment.GetCommandLineArgs.ToList
Dim AssyPath As String
If Args.Count = 2 Then
AssyPath = Args(1)
Else
Console.Write("Entrer le chemin de l'assemblage: ")
AssyPath = Console.ReadLine()
End If
Dim swCf As New SwDMClassFactory()
swDocMgr = swCf.GetApplication(Lines(0))
GetComps(AssyPath)
TsvPath = AssyPath.Replace(".SLDASM", ".TSV")
If File.Exists(TsvPath) Then File.Delete(TsvPath)
WriteLine("PN" & vbTab & "QT.")
For Each item In Bom.Keys
WriteLine(item & vbTab & Bom(item))
Next
End Sub
Private Sub GetComps(ByVal FilePath As String)
Dim DocType As SwDmDocumentType = SwDmDocumentType.swDmDocumentAssembly
Select Case Path.GetExtension(FilePath).ToLower
Case ".sldprt"
DocType = SwDmDocumentType.swDmDocumentPart
Case ".sldasm"
DocType = SwDmDocumentType.swDmDocumentAssembly
Case ".slddrw"
DocType = SwDmDocumentType.swDmDocumentDrawing
End Select
Dim res As Long
Dim swDoc As SwDMDocument13
swDoc = swDocMgr.GetDocument(FilePath, DocType, True, res)
Dim swConfig As SwDMConfiguration12
Dim swConfigMgr As SwDMConfigurationMgr = swDoc.ConfigurationManager
swConfig = swConfigMgr.GetConfigurationByName(swConfigMgr.GetActiveConfigurationName())
Dim comps As Object = swConfig.GetComponents()
Dim arrComps As Array = comps
If arrComps IsNot Nothing AndAlso arrComps.Length > 0 Then
For Each swComp As SwDMComponent9 In arrComps
If swComp.ExcludeFromBOM = swDmExcludeFromBOMResult.swDmExcludeFromBOM_TRUE _
OrElse swComp.IsSuppressed Then
Continue For
End If
If swComp.DocumentType = SwDmDocumentType.swDmDocumentAssembly Then
GetComps(swComp.PathName)
Else
Dim FileName As String = Path.GetFileNameWithoutExtension(swComp.PathName)
If Not Bom.ContainsKey(FileName) Then
Bom.Add(FileName, 1)
Else
Bom(FileName) += 1
End If
End If
Next
End If
swDoc.CloseDoc()
End Sub
Private Sub WriteLine(ByVal line As String)
Dim swt As StreamWriter
If Not File.Exists(TsvPath) Then
swt = File.CreateText(TsvPath)
Else
swt = File.AppendText(TsvPath)
End If
swt.WriteLine(line)
swt.Flush()
swt.Close()
End Sub
End Module
- Auf die Frage "Ihrer Meinung nach ist es möglich, eine Stückliste mit geschlossenem Solidworks zu extrahieren.": Alles wird von JeromeP gesagt, mit dem Bonus des Beispiels, das gut läuft.
- Auf die Frage "Wie würden Sie vorgehen? Verwenden Sie ein Makro in Excel? ": von einem unabhängigen Programm, das die Nomenklatur abruft, um sie entweder in eine neue Excel-Datei zu schreiben oder eine vorhandene Excel-Datei auszufüllen.
Hallo Jonathan, Das obige Werkzeug verwendet nur SolidWorks. Sie können es in Excel mit der Funktion verwenden:
Private Sub CommandButton1_Click()
Dim strProgramName As String
Dim strArgument As String
strProgramName = "C:\MesProgrammes\BomToXls.exe"
strArgument = "C:\MesFichiers\Assem1.SLDASM"
Call Shell("""" & strProgramName & """ """ & strArgument & """", vbNormalFocus)
End Sub