Export différencié en pdf et dxf des onglets de mise en plan par une macro

Bonjour,

J'utilise avec succès la macro jointe pour exporter en fichiers séparés tous les onglets d'une mise en plan en pdf.

Je travaille sur des ensembles soudés multi-corps, dont certains sont en tôlerie.

Chaque onglet est nommé avec le numéro d'article de la liste de pièce soudée.

A la sauvegarde, la macro ajoute en préfixe le nom de fichier pièce, ce qui me convient tout à fait.

Par contre, les pièces de tôlerie destinées à la découpe laser sont représentées sur des onglets supplémentaires nommés "Découpe" + N° d'article.

Ce que je souhaite c'est que les onglets commençants par le mot "Découpe" ne soient pas sauvegardés en pdf, mais en dxf avec comme nom de fichier le N° d'article sans le préfixe.

N'étant pas expert en programmation, est-ce qu'un membre du forum peux m'aider ?

Avec mes remerciements

 

 


pdf_page_par_page.swp

Il est plus simple d'afficher directement le code plutôt que de joindre la macro:

Const INCLUDE_DRAWING_NAME As Boolean = True

Dim swApp As SldWorks.SldWorks

Sub main()

    Set swApp = Application.SldWorks
    
try_:
    
    On Error GoTo catch_
    
    Dim swDraw As SldWorks.DrawingDoc
    
    Set swDraw = swApp.ActiveDoc
    
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swDraw
        
    If swModel.GetPathName() = "" Then
        Err.Raise vbError, "", "Please save drawing"
    End If
        
    Dim vSheetNames As Variant
    
    Dim i As Integer
    
    Dim swSelMgr As SldWorks.SelectionMgr
    
    Set swSelMgr = swModel.SelectionManager
    
    Dim selSheetNames() As String
    
    For i = 1 To swSelMgr.GetSelectedObjectCount2(-1)
        
        If swSelMgr.GetSelectedObjectType3(i, -1) = swSelectType_e.swSelSHEETS Then
            
            If (Not selSheetNames) = -1 Then
                ReDim selSheetNames(0)
            Else
                ReDim Preserve selSheetNames(UBound(selSheetNames) + 1)
            End If
            Dim swSheet As SldWorks.Sheet
            Set swSheet = swSelMgr.GetSelectedObject6(i, -1)
            
            selSheetNames(UBound(selSheetNames)) = swSheet.GetName()
            
        End If
    Next
    
    If (Not selSheetNames) = -1 Then
        vSheetNames = swDraw.GetSheetNames
    Else
        vSheetNames = selSheetNames
    End If
    
    For i = 0 To UBound(vSheetNames)
        
        Dim sheetName As String
        sheetName = vSheetNames(i)
        
        Dim swExpPdfData As SldWorks.ExportPdfData
        Set swExpPdfData = swApp.GetExportFileData(swExportDataFileType_e.swExportPdfData)
        
        Dim errs As Long
        Dim warns As Long
        
        Dim expSheets(0) As String
        expSheets(0) = sheetName
        
        swExpPdfData.ExportAs3D = False
        swExpPdfData.ViewPdfAfterSaving = False
        swExpPdfData.SetSheets swExportDataSheetsToExport_e.swExportData_ExportSpecifiedSheets, expSheets
        
        Dim drawName As String
        drawName = swModel.GetPathName()
        drawName = Mid(drawName, InStrRev(drawName, "\") + 1, Len(drawName) - InStrRev(drawName, "\") - Len(".slddrw"))
        
        Dim outFile As String
        outFile = swModel.GetPathName()
        outFile = Left(outFile, InStrRev(outFile, "\"))
        Debug.Print outFile
        Debug.Print sheetName
        outFile = outFile & IIf(INCLUDE_DRAWING_NAME, drawName & "_", "") & sheetName & ".pdf"
        If False = swModel.Extension.SaveAs(outFile, swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, swExpPdfData, errs, warns) Then
            Err.Raise vbError, "", "Failed to export PDF to " & outFile
        End If
        
    Next
    
    
    GoTo finally_
    
catch_:
    
    swApp.SendMsgToUser2 Err.Description, swMessageBoxIcon_e.swMbStop, swMessageBoxBtn_e.swMbOk
    
finally_:
    
End Sub

Pour comprendre le code il suffit d'ajouter des debug.file et de regarder la fenêtre d'exécution

La partie qui te concerne:

outFile = Left(outFile, InStrRev(outFile, "\")) ' récupère le chemin de la mise en plan

Visible avec debug.file "outFile" & outFile 'affiche c:\temp\

Ensuite:

outFile = outFile & IIf(INCLUDE_DRAWING_NAME, drawName & "_", "") & sheetName & ".pdf"

Cette ligne définie le nom de ton fichier pdf drawName récupère le nom de ton fichier drawing et sheetName le nom de la feuille.

Ensuite         If False = swModel.Extension.SaveAs(outFile, swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, swExpPdfData, errs, warns) Then
            Err.Raise vbError, "", "Failed to export PDF to " & outFile
        End If

Exporte ton fichier en pdf ou affiche un message d'erreur.

Maintenant il faut ajouter une condition si ta feuille sheetName commence par découpe tu récupère ce qui reste du nom de ta feuille t tu exporte en dwg au lieu  de pdf.

Indice regarde la fonction vba If et aussi la fonctionSplit

2 « J'aime »

Merci Sbadenis pour cette réponse.

J'ai bien regardé les fonctions if et split mais je ne sais pas comment intégrer ça dans le code pour obtenir le résultat que je recherche...

Désolé d'y revenir, mais je ne m'en sord pas pour créer les dxf

Si vous pouvez me dépanner, merci d'avance

Avoir un code tout fait c'est bien mais le comprendre c'est mieux!

 

Ce code devrait être fonctionnel, même si je l'ai fait à la va vite.

J'ai ajouter le if (condition) pour tester si le nom de la feuille commence par découpe si c'est le cas j'exporte l'onglet avec le nom de l'article récupérer avec la fonction mid (au lieu de split).

Avec quelques essai et recherche internet je pense que tu aurait pu y arriver quie à afficher ton code au fur et à mesure et à te faire aidé.

Const INCLUDE_DRAWING_NAME As Boolean = True

Dim swApp As SldWorks.SldWorks

Sub main()

    Set swApp = Application.SldWorks
    
try_:
    
    On Error GoTo catch_
    
    Dim swDraw As SldWorks.DrawingDoc
    
    Set swDraw = swApp.ActiveDoc
    
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swDraw
        
    If swModel.GetPathName() = "" Then
        Err.Raise vbError, "", "Please save drawing"
    End If
        
    Dim vSheetNames As Variant
    
    Dim i As Integer
    
    Dim swSelMgr As SldWorks.SelectionMgr
    
    Set swSelMgr = swModel.SelectionManager
    
    Dim selSheetNames() As String
    
    For i = 1 To swSelMgr.GetSelectedObjectCount2(-1)
        
        If swSelMgr.GetSelectedObjectType3(i, -1) = swSelectType_e.swSelSHEETS Then
            
            If (Not selSheetNames) = -1 Then
                ReDim selSheetNames(0)
            Else
                ReDim Preserve selSheetNames(UBound(selSheetNames) + 1)
            End If
            Dim swSheet As SldWorks.Sheet
            Set swSheet = swSelMgr.GetSelectedObject6(i, -1)
            
            selSheetNames(UBound(selSheetNames)) = swSheet.GetName()
            
        End If
    Next
    
    If (Not selSheetNames) = -1 Then
        vSheetNames = swDraw.GetSheetNames
    Else
        vSheetNames = selSheetNames
    End If
    
    For i = 0 To UBound(vSheetNames)
        
        Dim sheetName As String
        sheetName = vSheetNames(i)
        
        Dim swExpPdfData As SldWorks.ExportPdfData
        Set swExpPdfData = swApp.GetExportFileData(swExportDataFileType_e.swExportPdfData)
        
        Dim errs As Long
        Dim warns As Long
        
        Dim expSheets(0) As String
        expSheets(0) = sheetName
        
        swExpPdfData.ExportAs3D = False
        swExpPdfData.ViewPdfAfterSaving = False
        swExpPdfData.SetSheets swExportDataSheetsToExport_e.swExportData_ExportSpecifiedSheets, expSheets
        
        Dim drawName As String
        drawName = swModel.GetPathName()
        drawName = Mid(drawName, InStrRev(drawName, "\") + 1, Len(drawName) - InStrRev(drawName, "\") - Len(".slddrw"))
        
        Dim outFile As String
        outFile = swModel.GetPathName()
        outFile = Left(outFile, InStrRev(outFile, "\"))
        Debug.Print outFile
        Debug.Print sheetName
        
        If sheetName Like "Découpe*" Then 'Si Le nom de la feuille commence par Découpe, suivit de aucun ou plusieurs caractères
                Debug.Print "Fichier dxf à traiter"
                'Export en dxf à ajouter ici
                Debug.Print Mid(sheetName, 8)
                outFile = outFile & Mid(sheetName, 8) & ".dxf"
                Debug.Print "outfile=" & outFile
                If False = swModel.Extension.SaveAs(outFile, swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, swExpPdfData, errs, warns) Then
                    Err.Raise vbError, "", "Failed to export dxf to " & outFile
                End If
        
        Else
            Debug.Print "Fichier pdf à traiter"
            outFile = outFile & IIf(INCLUDE_DRAWING_NAME, drawName & "_", "") & sheetName & ".pdf"
            If False = swModel.Extension.SaveAs(outFile, swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, swExpPdfData, errs, warns) Then
                Err.Raise vbError, "", "Failed to export PDF to " & outFile
            End If
        
        End If
        

 

Bonjour sbadenis

Désolé d'y revenir, j'ai cherché sur le net, j'ai essayé de trouver par moi m^meme, mais rien n'y fait :

La partie export en pdf marche super dans la macro de ton précédent post

La partie export en dxf exporte bien les fichiers avec le nom comme il faut, mais c'est la première feuille du fichier de mise en plan qui est exporté à chaque fois et non la page de découpe

Peux-tu m'aider à trouver la solution ?

Merci d'avance

 

Peut tu joindre un fichier exemple (pièce + MEP) afin de comprendre?

Ta page découpe est toujours en 2ème page ou c'est aléatoire?

Bojour Sbadenis et merci pour ton message

Ci joint un fichier pièce et sa mise en plan

Tous mes plans de détail de mes assemblages soudés sont fait sur le même principe

Le nombre d'onglets est aléatoire, que ce soit en découpe ou autre : ça dépend de la complexité de l'ensemble

J'ai déjà eu un plan avec 24 onglets...

Merci pour ton concours


a21-0616-d18.slddrw
a21-0616-d18.sldprt

Essaye ça, je viens d'ajouter une option d'export en dxf uniquement la feuille active et j'active les feuille de découpe une par une avant l'export:

Const INCLUDE_DRAWING_NAME As Boolean = True

Dim swApp As SldWorks.SldWorks

Sub main()

    Set swApp = Application.SldWorks
    
try_:
    
    On Error GoTo catch_
    
    Dim swDraw As SldWorks.DrawingDoc
    
    Set swDraw = swApp.ActiveDoc
    
    
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swDraw
        
    If swModel.GetPathName() = "" Then
        Err.Raise vbError, "", "Please save drawing"
    End If
        
    Dim vSheetNames As Variant
    
    Dim i As Integer
    
    Dim swSelMgr As SldWorks.SelectionMgr
    
    Set swSelMgr = swModel.SelectionManager
    
    Dim selSheetNames() As String
    
    For i = 1 To swSelMgr.GetSelectedObjectCount2(-1)
        
        If swSelMgr.GetSelectedObjectType3(i, -1) = swSelectType_e.swSelSHEETS Then
            
            If (Not selSheetNames) = -1 Then
                ReDim selSheetNames(0)
            Else
                ReDim Preserve selSheetNames(UBound(selSheetNames) + 1)
            End If
            Dim swSheet As SldWorks.Sheet
            Set swSheet = swSelMgr.GetSelectedObject6(i, -1)
            
            selSheetNames(UBound(selSheetNames)) = swSheet.GetName()
            
        End If
    Next
    
    If (Not selSheetNames) = -1 Then
        vSheetNames = swDraw.GetSheetNames
    Else
        vSheetNames = selSheetNames
    End If
    
    For i = 0 To UBound(vSheetNames)
        
        Dim sheetName As String
        sheetName = vSheetNames(i)
        
        Dim swExpPdfData As SldWorks.ExportPdfData
        Set swExpPdfData = swApp.GetExportFileData(swExportDataFileType_e.swExportPdfData)
        
        Dim errs As Long
        Dim warns As Long
        
        Dim expSheets(0) As String
        expSheets(0) = sheetName
        
        swExpPdfData.ExportAs3D = False
        swExpPdfData.ViewPdfAfterSaving = False
        swExpPdfData.SetSheets swExportDataSheetsToExport_e.swExportData_ExportSpecifiedSheets, expSheets
        
        Dim drawName As String
        drawName = swModel.GetPathName()
        drawName = Mid(drawName, InStrRev(drawName, "\") + 1, Len(drawName) - InStrRev(drawName, "\") - Len(".slddrw"))
        
        Dim outFile As String
        outFile = swModel.GetPathName()
        outFile = Left(outFile, InStrRev(outFile, "\"))
        Debug.Print outFile
        Debug.Print sheetName
        
        If sheetName Like "Découpe*" Then 'Si Le nom de la feuille commence par Découpe, suivit de aucun ou plusieurs caractères
                Debug.Print "Fichier dxf à traiter"
                'On active la feuille découpe
                Dim bRet As Boolean
                bRet = swDraw.ActivateSheet(sheetName)
                'Export en dxf à ajouter ici
                Debug.Print Mid(sheetName, 9)
                outFile = outFile & Mid(sheetName, 9) & ".dxf"
                Debug.Print "outfile=" & outFile
                
                'Option dxf
                intUserDWGSheetExport = swApp.GetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption)
                swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, swDxfMultisheet_e.swDxfActiveSheetOnly
                
                'swModel.Extension.SaveAs(outFile, swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, swExpPdfData, errs, warns)
                If False = swModel.Extension.SaveAs(outFile, SwConst.swSaveAsVersion_e.swSaveAsCurrentVersion, SwConst.swSaveAsOptions_e.swSaveAsOptions_Silent, Nothing, errs, warns) Then
                    Err.Raise vbError, "", "Failed to export dxf to " & outFile
                End If
                
                'on réinitialise les options.
                swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, intUserDWGSheetExport
                
        Else
            Debug.Print "Fichier pdf à traiter"
            outFile = outFile & IIf(INCLUDE_DRAWING_NAME, drawName & "_", "") & sheetName & ".pdf"
            If False = swModel.Extension.SaveAs(outFile, swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, swExpPdfData, errs, warns) Then
                Err.Raise vbError, "", "Failed to export PDF to " & outFile
            End If
        
        End If
 Next
    
    
    GoTo finally_
    
catch_:
    
    swApp.SendMsgToUser2 Err.Description, swMessageBoxIcon_e.swMbStop, swMessageBoxBtn_e.swMbOk
    
finally_:
    
End Sub

EDIT: et je supprime 9 caractères au lieu de 8 afin d'exclure aussi l'espace après Découpe qui empêchait l'export (un nom de fichier ne peux pas commencer par espace)