Nomenclature assemblage excel

Bonjour ,

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 .

Merci d'avance de vos réponses

Bonjour , 

Si vous avez accès aux outils mycad, vous pouvez utiliser Smartbom.

Si vous avez EPDM,vous pouvez également  extraire une nomenclature. 

Cordialement 

3 « J'aime »

Bonjour,

Sinon si vous vous y connaissez en "macros / programmation" c'est possible de se faire du sur mesure en s'appuyant sur les API Solidworks ...

Cordialement,

Bonjour D.Roger

D'après vous il est possible d'extraire une nomenclature avec Solidworks fermé.

Comment procéderiez vous?

En passant par une macro sur Excel?

Avez vous déjà un bout de macro pour exemple? Merci

Yannick.

Bonjour D.Roger,

je n'ai aucune ébauche et une connaissance limitée en macro

C'est plus de la macro sur excel .

je suis en train d'essayer de rassemble différente macro récupéré ici et là .

Cordialement

@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)

Note: Un numéro de licence Document manager est nécessaire. Voir ce lien pour l'obtenir

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 « J'aime »

Bonjour,

@yannick.petit :

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

Cordialement,

tour d'abord, je vous remercie de vos réponse .

notre société ne possède que pack office 2019 et solidworks 2020.

Nous ne possédons pas Smartbom , ni EPDM et se n'est pas prévu en investissement .

Je souhaiterais ne pourvoir utiliser que excel et solidworks .

merci .

 

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

 

 

1 « J'aime »