Witam
Wiem, że ten temat był już wielokrotnie poruszany i że na pewno istnieją gotowe aplikacje.
Chcę utworzyć zestawienie komponentów programu Excel , które będzie aktualizowane automatycznie po otwarciu, w którym nie zostanie otwarty zestaw, w celu zintegrowania go z tabelą zarządzania projektami.
Z góry dziękuję za odpowiedzi
Witam
Jeśli masz dostęp do narzędzi mycad, możesz skorzystać ze Smartbom.
Jeśli masz EPDM, możesz również wyodrębnić BOM.
Pozdrowienia
3 polubienia
Witam
W przeciwnym razie, jeśli wiesz o "makrach / programowaniu", możliwe jest dostosowanie go do potrzeb, polegając na interfejsach API Solidworks ...
Pozdrowienia
Witaj D.Roger
Twoim zdaniem możliwe jest wyodrębnienie zestawienia komponentów przy zamkniętym Solidworks.
Jak byś postąpił?
Przechodząc przez makro w programie Excel?
Czy masz już na przykład trochę makro? Dziękuję
Yannicka.
Witaj D.Roger,
Nie mam szkicu i ograniczoną wiedzę na temat makro
To bardziej makro w programie Excel .
Próbuję zebrać różne makra pobrane tu i tam.
Pozdrowienia
@Yannick:
Jest to możliwe do zrobienia z Solidworks zamkniętym za pomocą "SolidWorks.Interop.swdocumentmgr.dll" (lub nawet z Solidworks, który nie jest zainstalowany za pomocą "swdocumentmgr.dll")
Użyj funkcji GetComponents , aby uzyskać BOM.
Z drugiej strony, teraz, gdy menedżer dokumentów działa tylko w x64, musielibyśmy zrobić zewnętrzny moduł do Excela. I wywołaj go z makra programu Excel za pomocą polecenia "Wywołaj Shell()". Możesz też mieć aplikację, która zapisuje zestawienie materiałów bezpośrednio do pliku Excel.
Oto wersja robocza, która zapisze BOM w tym samym katalogu co zestaw: (Skopiuj kod do nowej aplikacji konsolowej VB.NET lub użyj załączonego pliku)
Uwaga: Wymagany jest numer licencji menedżera dokumentów. Zobacz ten link, aby go pobrać
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
bomtoxls.zip
1 polubienie
Witam
@yannick.petit :
- Na pytanie "Twoim zdaniem możliwe jest wyodrębnienie zestawienia komponentów przy zamkniętym Solidworks.": wszystko jest powiedziane przez JeromeP z bonusem w postaci przykładu, który idzie dobrze.
- Na pytanie "Jak byś postąpił? Używając makra w Excelu? ": przez niezależny program, który pobrałby nomenklaturę, aby zapisać ją w nowym pliku Excela lub wypełnić istniejący plik Excel.
Pozdrowienia
Przede wszystkim dziękuję za odpowiedzi.
Nasza firma posiada tylko pakiet Office 2019 i SolidWorks 2020.
Nie jesteśmy właścicielami Smartbom ani EPDM i nie oczekujemy, że będziemy inwestować.
Chciałbym móc korzystać tylko z Excela i Solidworks .
Dziękuję.
Witaj Jonathanie,
Powyższe narzędzie korzysta tylko z SolidWorks.
Możesz go użyć w Excelu z funkcją:
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
1 polubienie