Macro Solidworks : mise en plan vers PDF et DXF

Bonjour,

Je souhaite réaliser une macro pour Solidworks qui transforme des feuilles de mise en plan vers des PDF ou DXF.
Les fichiers PDF seront nommés « nomdufichier+nomdelafeuille »
Les fichiers DXF seront nommés de la même manière.

La macro doit différencier les feuilles à enregistrer en PDF ou DXF suite à la présence ou non du mot DXF dans le nom de la feuille.

Ci dessous la macro créée. Malheureusement j’ai l’erreur « erreur de compilation : Type défini par l’utilisateur non défini ».
Avec « swExportDXFData As SldWorks.ExportDxfData » surligné en bleu.
Je pense saisir qu’il manque une donnée dans les références mais je suis perdu.

Je suis sous SolidWorks 2022.

Quelqu’un saurait m’aider ?

Option Explicit

Sub ExportPDFandDXF()
    
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swExportData As SldWorks.ExportPdfData
    Dim swExportDXFData As SldWorks.ExportDxfData
    Dim sheetName As String
    Dim fileName As String
    Dim filePath As String
    Dim numSheets As Integer
    Dim i As Integer
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    If swModel Is Nothing Then
        MsgBox "Aucun document ouvert dans SolidWorks."
        Exit Sub
    End If
    
    If Not swModel.GetType = swDocumentTypes_e.swDocDRAWING Then
        MsgBox "Ce n'est pas un document de mise en plan."
        Exit Sub
    End If
    
    Set swDraw = swModel
    
    numSheets = swDraw.GetSheetCount
    
    fileName = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".") - 1)
    filePath = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, "\"))

    For i = 1 To numSheets
        
        Set swSheet = swDraw.Sheet(i)
        
        sheetName = swSheet.GetName
        
        If InStr(sheetName, "DXF") > 0 Then
            
            Set swExportDXFData = swApp.GetExportFileData(1)
            
            swExportDXFData.fileName = fileName & sheetName & ".dxf"
            swExportDXFData.SetSheets swSheet.GetName
            
            swModel.Extension.ExportToDWGDXF swExportDXFData
            
        Else
            
            Set swExportData = swApp.GetExportFileData(swExportPdfData)
            
            swExportData.fileName = fileName & sheetName & ".pdf"
            swExportData.SetSheets swSheet.GetName
            
            swModel.Extension.SaveAs swExportData
            
        End If
        
    Next i
    
    MsgBox "Exportation terminée."
    
End Sub


Bonjour,
Sauf erreur de ma part, SldWorks.ExportDxfData n’existe pas d’où l’erreur de compilation.
Regarder ce sujet qui est identique

2 « J'aime »

Merci pour ta réponse mais je n’y arrive pas.
J’ai tenté une autre approche du coup et j’ai un autre problème.

Je souhaite « seulement » enregistrer les feuilles d’une mise en plan en .pdf ou .dxf selon si le mot « DXF » est présent dans le nom d’onglet (nom de la feuille) mais ça a l’air trop compliqué pour moi.

Dim swApp As Object
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim nomFeuille As String
Dim nomFichier As String
Dim dossier As String

Sub EnregistrerFeuilles()

    Set swApp = Application.SldWorks
    
    ' Vérifier si un document est ouvert
    Set swModel = swApp.ActiveDoc
    If swModel Is Nothing Then
        MsgBox "Ouvrir un document SolidWorks", vbExclamation, "Erreur"
        Exit Sub
    End If
    
    ' Vérifier si le document est une mise en plan
    If Not swModel.GetType = swDocDRAWING Then
        MsgBox "Le document actif n'est pas une mise en plan", vbExclamation, "Erreur"
        Exit Sub
    End If
    
    ' Récupérer le dossier et le nom du fichier
    dossier = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, "\"))
    
    If InStrRev(swModel.GetTitle, ".") > 0 Then
        nomFichier = Mid(swModel.GetTitle, 1, InStrRev(swModel.GetTitle, ".") - 1)
    Else
        nomFichier = swModel.GetTitle
    End If
    
    ' Enregistrer chaque feuille en tant que fichier séparé
    Set swDraw = swModel
    If swDraw Is Nothing Then
        MsgBox "Le document actif n'est pas une mise en plan", vbExclamation, "Erreur"
        Exit Sub
    End If
    
    For Each swSheet In swDraw.Sheets
        nomFeuille = swSheet.GetName
        
        If InStr(1, nomFeuille, "DXF", vbTextCompare) > 0 Then
            swSheet.SaveAs dossier & nomFichier & " " & nomFeuille & ".dxf"
        Else
            swSheet.SaveAs dossier & nomFichier & " " & nomFeuille & ".pdf"
        End If
    Next
    
    MsgBox "Les feuilles ont été enregistrées", vbInformation, "Terminé"
    
End Sub

Avec ce code j’ai une nouvelle erreur :
ligne : For Each swSheet In swDraw.GetSheets()

Code erreur : 438
Propriété ou méthode non gérée par cet objet

J’essaye de récupérer des exemples de macro pour m’aider mais je tourne en rond…

Bonjour,

Il y a beaucoup de déclarations qui n’existent pas dans votre code et qui nécessite une activation avant de pouvoir les utiliser. Je n’ai pas le temps de regarder ça maintenant, peut-être lundi si personne d’autre ne passe sur le sujet.

1 « J'aime »

Bonjour @stev7833 ,

L’erreur de compilation est due au fait que GetSheets n’est pas une méthode d’un document de mise en plan. La liste des feuilles doit être parcourue en utilisant leurs noms par GetSheetNames.

Par ailleurs, les exports feuille par feuille d’une mise en plan en pdf et en dxf ne suivent pas la même logique: structure de données pour le premier (ExportPdfData), paramétrage des options d’export pour le second (swDxfMultiSheetOption, swDxfActiveSheetOnly).

En principe, la macro jointe devrait faire le travail…

Cordialement.
ExportMEPtoPdfDxf.swp (59,5 Ko)

1 « J'aime »

Merci pour les infos et la macro,
ça fonctionne très bien !