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