je sais que ce sujet a déjà été discuté de nombreuse fois et qu'il existe sûrement des applications toutes faites .
Je souhaite créer une nomenclature Excel qui se mettrait à jour automatiquement à son ouverture dans laquelle sans que l'assemblage ne soit ouvert , afin de l'intégrer à un tableau de gestion de projet .
@Yannick: C'est possible de le faire avec Solidworks fermé à l'aide de "SolidWorks.Interop.swdocumentmgr.dll" (ou même avec Solidworks non installé à l'aide de "swdocumentmgr.dll") Utiliser la fonction GetComponents pour obtenir la nomenclature.
Par contre maintenant que document manager ne fonctionne qu'en x64, il faudrait faire un module externe a Excel. Et l'appeler depuis une macro Excel avec la commande "Call Shell()". Ou avoir une application qui écrit la nomenclature directement dans un fichier Excel.
Voici une ébauche qui écrira la nomenclature dans le même répertoire que l'assemblage: (Copier le code dans un nouvelle application console VB.NET, ou utiliser le fichier ci-joint)
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
- A la question "D'après vous il est possible d'extraire une nomenclature avec Solidworks fermé." : tout est dit par JeromeP avec en prime l'exemple qui va bien.
- A la question "Comment procéderiez vous ? En passant par une macro sur Excel ? " : par un programme indépendant qui irait chercher la nomenclature pour soit l'écrire dans un nouveau fichier Excel soit remplir un fichier Excel déjà existant.
Bonjour Jonathan, L'outil posté au-dessus n'utilise que SolidWorks. Vous pouvez l'utiliser dans Excel avec la fonction:
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