Modification code macro PDF/DWG-STEP

Moi aussi je sèche! :crazy_face:
Peut tu éditer la macro, ajouter les fenêtres Execution et Variables locales(voir image), puis cliquer juste après Sub main() et appuyer sur F8 juste qu’à ce que cela bug?
image

En gros lacer la macro en pas par pas. Et vérifier dans la fenêtre variable local la valeur de sModelName quand cela plante:


Et aussi si swModel reste vide.

1 « J'aime »

J’ai effectuer le test et voici ce que j’ai

Et j’ai l’impression que après la ligne qui est en jaune il passe directement à
« Function GetFilename(strPath As String) As String »

Je viens de refaire des test en recopiant le code de base et ça ne marche pas a tout les coups…
J’ai fait 5 test et j’ai eu 2 fois ou ça marche bien, d’autre ou j’ai pas les PDF/DWG, ou sinon il ne se lance carrément pas!

Je ne comprends pas pourquoi ça ne fonctionne pas à tout les coups !

Sinon en théorie il ne me manque plus cas changer les chemin de fichier

Bonjour;
@Antoine_Ruelle ,
En regardant de plus près votre MEP, il semble que vous n’utilisez pas la propriété « Révision » (ni « Revision »). Ce qui expliquerai l’erreur ci-dessous:

L’indice « A » dans votre MEP semble n’être que du texte…

De plus, dans votre fichier SLDPRT, vos propriété sont sous la forme :
« Texte : » (je ne pense pas que l’utilisation des « : » soit adéquate dans ce contexte.

Seul votre SLDPRT sembla avoir une notion d’indice, utilisez-vous un PDM ?
Cordialement

Bonsoir,
Oui il passe à la fonction pour pouvoir récupérer l’information du nom de fichier en supprimant l’extension.
En l’état le code proposé par @sbadenis fonctionne sur SW2022.

1 « J'aime »

Bonjour @tous
Antoine regarde entre temps cette macros,
supprime les lignes 4 et 5 après « sub main ».
Et Assigne le nom exacte de la propriété revision a la place de « indice »

2 « J'aime »

Effectivement @Maclane pour la partie révision j’y ai pensé également d’où la modification que j’avais proposé avec retrait de cette propriété et ajout des dossiers.
Pour les propriété il est effectivement bizarre d’avoir inclue « : » dans le nom de la propriété et cela pourrait effectivement pose problème dans certaine cas (macro ou autre).
Exemple propriété sans les :

Pour @Antoine_Ruelle je te confirme que la macro fonctionne bien sur SW2023 (donc pas de raison sur 2022) comme le dit @Cyril.f également.
Tu peux également essayer la solution de @Lynkoa15 en espérant que le problème n’apparaisse pas cette fois.

1 « J'aime »

Bonjour, merci pour ce retour @Maclane .
Effectivement je n’utilise pas le propriété révision je m’en suis rendu compte après coups, car pour l’enregistrement en PDF/DWG je car le même nom de fichier que le plan SW. J’ai donc retirer cette partie. Et j’ai toujours le même soucis je n’ai pas les PDF/DWG

Pour l’indice il est rentré à la main en texte dans une propriété de la pièce qui est repris sur le plan.
Et non nous n’utilisons pas de PDM

sbadenis - Pour de qui est des " : " je ne sais pas si c’est vraiment ça qui pose problème car ça a bien marcher 2 fois de suite. Ce matin j’ai fait un test sans les " : " et j’ai encore eu le message comme quoi sur la ligne 118 j’ai un bloc qui n’est pas défini. Est ce que vous pouvez m’expliquer cette ligne svp ?
" Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors) "

Je viens de refaire un test avant de vous répondre et ça a marché

@Lynkoa15 Si j’ai bien compris pour le chemin des dossier il faut que je les détermine comme des variable
Const dxfSubFolder As String = « \dwg »
Const pdfSubFolder As String = « \pdf »
Const stepSubFolder As String = « \step »
Pour les appeler dans les chemin d’enregistrement ?

En tous cas merci à vous pour votre aide, je commence à comprendre un peu mieux le VBA

Bonjour,

Cette ligne permet d’activer un des documents ouverts en mode silencieux (transparent pour l’utilisateur).

Oui, ça permet de simplifier le code et d’appeler des variables plutôt que de saisir n fois le même texte.
Et si jamais un jour vous décidez de changer le chemin c’est plus simple de ne gérer qu’une variable que de vérifier tout le code.

1 « J'aime »

D’accord donc pourquoi dans certains cas la macro bloque dessus ? C’est peu être que le fichier est déjà ouvert ? ou qu’il ne le trouve pas ?

Et du coup c’est à quelle niveau du code que je doit spécifier la variable du chemin pour lui dire de prendre le chemin du fichier en question et d’ajoute « /pdf » pour avoir le bon dossier d’enregistrement ?
Ou quelle partie du code de l’autre macro je dois récupéré ?

Vu que j’ai pris le sujet en cours, pourriez vous partager la dernière version de votre code?

Je viens de refaire un test et la ça ne marche pas, je ne comprends plus rien ahah !!
Voici le code

Option Explicit

Public Enum swDocumentTypes_e
    swDocNONE = 0       ' Used to be TYPE_NONE

    swDocPART = 1       ' Used to be TYPE_PART

    swDocASSEMBLY = 2   ' Used to be TYPE_ASSEMBLY

    swDocDRAWING = 3    ' Used to be TYPE_DRAWING
End Enum
 
Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim swDraw                      As SldWorks.DrawingDoc
Dim swView                      As SldWorks.View
Dim swConfig                    As SldWorks.Configuration

Dim vSheetNameArr               As Variant
Dim vSheetName                  As Variant

Dim I                           As Long
Dim nDocType                    As Long
Dim op                          As Long
Dim suppr                       As Long
Dim lErrors                     As Long
Dim lWarnings                   As Long

Dim boolstatus                  As Boolean
Dim bRet                        As Boolean
Dim FileConnu                   As Boolean

Dim nbConnu                     As Integer

Dim sModelName                  As String
Dim sPathName                   As String
Dim TabConnu(10000)             As String
Dim sConfigName                 As String

Const dxfSubFolder As String = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepSubFolder As String = "\step"


Sub Main()

Set swApp = Application.SldWorks

boolstatus = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Force la version AP214
boolstatus = swApp.SetUserPreferenceIntegerValue(swStepExportPreference, swAcisOutputGeometryPreference_e.swAcisOutputAsSolidAndSurface) 'Force l'export en format Solid/Surface Geometry

Set swModel = swApp.ActiveDoc
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en PDF
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".dwg", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en DWG


Call ExportStep ' Appelle le programe d'export STEP


End Sub

Function GetFilename(strPath As String) As String
Dim strTemp As String
strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)


End Function
Sub ExportStep()                ' Vérification si c'est une piece ou un assemblage
Set swDraw = swModel
vSheetName = swDraw.GetSheetNames
vSheetNameArr = swDraw.GetSheetNames

For Each vSheetName In vSheetNameArr
        
    bRet = swDraw.ActivateSheet(vSheetName): Debug.Assert bRet
    Set swView = swDraw.GetFirstView 'Sélectionne le fond de plan
    Set swView = swView.GetNextView  'Passe à la vue suivante pour exclure le fond de plan
                
    While Not swView Is Nothing
           
        ' Determine si la vue est une pieces ou un assemblage

        sModelName = swView.GetReferencedModelName

        sModelName = LCase(sModelName)
                        
        sConfigName = swView.ReferencedConfiguration
        
        FileConnu = False
        
        If InStr(sModelName, "sldprt") > 0 Then
            nDocType = swDocPART
        ElseIf InStr(sModelName, "slasm") > 0 Then
            nDocType = swDocASSEMBLY
        Else
            nDocType = swDocNONE
            Exit Sub
        End If
                       
        If nDocType = 1 Then
            For I = 1 To nbConnu
                If UCase(sModelName) & " - " & UCase(sConfigName) = TabConnu(I) Then
                    FileConnu = True
                End If
            Next
            If Not FileConnu Then
                nbConnu = nbConnu + 1
                TabConnu(nbConnu) = UCase(sModelName) & " - " & UCase(sConfigName)
                Call Export
            End If
        End If
        
        Set swView = swView.GetNextView
    Wend

Next vSheetName

End Sub
Sub Export()

Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors)
Set swModel = swApp.ActiveDoc
boolstatus = swModel.ShowConfiguration2(sConfigName)
Set swConfig = swModel.GetActiveConfiguration
sPathName = swModel.GetPathName & ".step"
If Dir(sPathName, vbHidden) <> "" Then                                                                'Test l'existence du fichier
    suppr = MsgBox("Le fichier " & sPathName & " existe déjà, voulez vous le supprimer?", vbYesNo)    'Message utilisateur confirmation de suppression oui/non
        If suppr = vbYes Then                                                                         'Réponse Oui
            Kill (sPathName)                                                                          'Suppression du fichier existant
            swModel.SaveAs2 sPathName, 0, True, False                                                 'Enregistrement du fichier
            op = MsgBox("Le fichier a été enregistré sous " & sPathName & vbNewLine)
            Else                                                                                      'Réponse NON
        MsgBox ("Fichier conservé")                                                                   'Message utilisateur
        End If
        Else
        swModel.SaveAs2 sPathName, 0, True, False                                                     'Enregistrement du fichier
        op = MsgBox("Le fichier a été enregistré sous " & sPathName)                                  'Message utilisateur
    End If
swApp.CloseDoc (sModelName)
Set swModel = swApp.ActiveDoc
End Sub

@Antoine_Ruelle ;

Essaye d’identifier les fichiers surs lesquels la macro ne fonctionne pas(surtout si ce sont toujours les mêmes ):

plusieurs piste :
Le 3D et la mise ne plan ne sont pas dans le même repertoire.
Le 3D et la mise ne plan n’ont pas exactement le même nom.
Une des propriété recherché par la macro n’existe pas.
Les fichiers de destinations (pdf/dwg et/ou STEP) sont déjà ouverts ou en lecture seules…
Les Noms des fichiers et/ou de répertoires ont des caractères spéciaux ( accents,points,…)

Attention aussi les macro sont sensibles aux CASSES … c’est à dire (pour résumer) qu’elles font la différences entre les minuscules et les MAJUSCULES) c’est valable pour les noms de fichiers mais aussi pour les extensions.

l’idéal est de parcourir tes macro en modes pas-a-pas (F8), avec la fenêtres des variables locales visible,
et éventuellement de survoler les variables dans les lignes de codes avec la souris pour vérifier si elles récupèrent bien les données qui leur sont demandées.
(surtout en node « debug » sur les points d’arrêts…

Question subsidiaire, comment lancez-vous l’exécution de la macro ? un bouton sous solidworks ou par la touche lecture directement dans l’éditeur VBA? Lancez-vous toujours la macro avec la routine « Main » ?

Cordialement.

2 « J'aime »

Bon, j’ai regardé mais manque plein de choses pour créer les sous-dossier entre autres.
@Antoine_Ruelle , vous aviez testé le code proposé par @sbadenis (4ème réponse) qui à mon sens était parfaitement fonctionnel?

1 « J'aime »

@Cyril.f

Sous Solidworks 2022, la macro de @sbadenis fonctionne parfaitement…chez moi.

Cordialement.

2 « J'aime »

Oui et j’avais sauté un message mais quand je te demande si elle fonctionne tu me répond avec la macro précédente avec les révisions.
Prends la dernière version comme indiquée par @Cyril.f et @Maclane et cela devrait fonctioner.
Par contre pas sûr que le code soit optimisé, il est fait à la va vite à partir de celui de @Cyril.f .

J’ai toujours tester sur le même fichier. la mise en plan d’une casquette.
La mise en plan est dans un dossier différents des pièces, mais les fichier ont le même nom.

J’ai déjà regarder le code en le faisant pas-a-pas, et comme je ne m’y connais pas trop je ne sui spas certains de pouvoir identifier correctement les soucis.

Pour lancer la macro je me suis fait un bouton et j’ai aussi essayer avec la touche lecture.

Oui pour les sous-dossier pour le moment je n’ai rien fait pas part collé les 3 variable à définir.
Car j’essaye de faire fonctionne le code à chaque fois. J’ai repris le code bases sans faire de modification à part enlever la Révision dans le nom du fichier.

ça a fonctionner une fois, j’ai supprimer les fichier généré et recommencer et la j’avais l’erreur ci dessous
image

Et non je n’ai pas encore tester le code de la 4e réponse @Cyril.f

Je viens de trouver mon erreur mon bouton pour exécuter la macro était mal configuré, la ça marche correctement

Bonne nouvelle.
Ne reste donc plus qu’à valider la « Meilleur réponse » pour clôturer cette discussion.
image

Et à bientôt pour de nouvelles macro…
entre-temps, je te conseil de consulter différents sites (pas toujours en français -Visual Basic- oblige) mais souvent didactiques pour se lancer dans la programmation:


Cordialement.

2 « J'aime »

Et aussi de lancer les macro depuis l’éditeur afin de lancer la bonne! :crazy_face:
Et une fois que cela fonctionne tu peux créer un bouton.