MACRO qui s'exécute trop vite

Bonjour,

J'ai réalisé une Macro qui nous permet d'exporter vers PDF3D et STEP
Pour gérer le STEP, nous avons besoin de passer par un PART en face exterieur.

Parfois, le PART ne s'ouvre pas, le STEP est généré avec le document actif, donc l'assemblage si le part n'est pas ouvert.
Si je relance la Macro une deuxième fois (besoin de + parfois), le PART s'ouvre et tout se passe comme il faut.

Cela peut il venir de la vitesse d'exécution de la Macro ?
Peut on contrôler que le PART soit bien ouvert avec de sauvegarder en STEP ?
Ou bien ajouter un temps d'attente ?

Bonne journée,

Tu peux récupérer le nom de la pièce avant pour être sûr que la pièce est ouverte, et si le nom ne correspond pas à ta demande tu reboucle pour redemander le nom encore et tant que c'est pas bon tu n'exporte pas.

Poste le code complet se sera plus facile pour voir.

C'est peu être aussi la méthode pour ouvrir ta pièce qui n'est pas la bonne.

Je n'arrive pas à mettre en pièce jointe...
Message bloquant de Check Point Infinity Next

Et fenetre où ce message apparait :
Une erreur HTTP 0 s'est produite. <br />/filefield/ahah/answer/field_attachement/0

EDIT :
Finalement c'est bon... J'ai bataillé à mettre la PJ


macro.txt

Pour info pour mettre le code tu as l'icône ici:

Et dans langue tu met VBscript

1 « J'aime »

Bonjour @SebJo ,

Le problème serait-il lié à un malentendu sur le chemin d'accès pour l'enregistrement des fichiers ?
La valeur de la variable NomDossierDestination n'est pas utilisée lors de la sauvegarde des fichiers. C'est le répertoire par défaut qui est la destination.

Lors de mon premier test, le fichier le fichier Essai.SLDASM_1.SLDPRT a été enregistré dans un sous-répertoire d'installation de SW et non dans le dossier du modèle de base. Curieusement, cela fonctionne bien si on relance la macro.

Il suffit de concaténer le chemin et le nom de fichier dans les trois sauvegardes : NomDossierDestination & FileName*** en fin de macro.

Cordialement

2 « J'aime »

 

Je viens de regarder et même erreur que @m.blt  la ligne pour créer NomDossierDestination est trop basse et la valeur est demandé avant l'attribution  de la variable.

De plus le nom de fichier quand tu exporte contient déjà une extension du coup tu exporte quelque chose comme ça:

pièce.sldprtA.sldprt et l'enregistrement ne fonctionne donc pas:

Le code corrigé en espérant que ton erreur venait bien de là:

' ******************************************************************************
' macro du 19/04/22 by sj
' ******************************************************************************

Sub main()

Dim swApp                   As SldWorks.SldWorks
Dim swModel                 As SldWorks.ModelDoc2
Dim swModelDocExt           As SldWorks.ModelDocExtension
Dim swCustProp              As CustomPropertyManager
Dim val                     As String
Dim valout                  As String
Dim bool                    As Boolean
Dim INDICE                  As Boolean
Dim swExportData            As SldWorks.ExportPdfData
Dim boolstatus              As Boolean
Dim filename                As String
Dim FileNamePDF             As String
Dim FileNamePART            As String
Dim FileNameSTEP            As String
Dim lErrors                 As Long
Dim lWarnings               As Long
Dim ActiveConfig            As String
Dim sModelFullPath          As String
Dim sFilePath               As String
Dim NomDossierDestination   As String
Dim Ext_PART                As String
Dim Ext_STEP                As String
Dim errors                  As Long
Dim warnings                As Long
Dim Nomfichier              As String
Dim TestStr                 As String

Ext_PART = ".SLDPRT"
Ext_STEP = ".STEP"

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
'Controle si un PART ou un ASM est ouvert
    If swModel Is Nothing Then
        MsgBox "Aucun assemblage ou pièce en cours", vbCritical
        End
    End If
    
    If swModel.GetType <> swDocASSEMBLY And swModel.GetType <> swDocPART Then
        MsgBox "Cette Macro ne fonctionne que sur les assemblages ou les pièces", vbCritical
        End
    End If
    Set swModelDocExt = swModel.Extension
    Set swExportData = swApp.GetExportFileData(1)
    
    swExportData.ExportAs3D = True
    
'Controle si le fichier ouvert a déjà été sauvegardé
    filename = swModel.GetPathName
    If filename = "" Then
        MsgBox "Sauvegarder d'abord le fichier et réessayez", vbCritical
        End
    End If

    ActiveConfig = swApp.GetActiveConfigurationName(filename)
    
' Recuperation de propriete (changer la valeur entre "" apres Get4 pour changer de propriete à  récupérer)
    Set swCustProp = swModelDocExt.CustomPropertyManager("")
    bool = swCustProp.Get4("DESIGNATION", False, val, valout)
    PropDESIGNATION = valout
    
'Controle si le fichier ouvert a déjà  été approuvé
   PropINDICE = InputBox("A quel indice souhaitez vous générer les fichiers ?")

   If PropINDICE = "" Then
       MsgBox "Merci de ne pas laisser le champs vide", vbCritical
       Exit Sub
    End If
        
                    
'Controle si le fichier ouvert a déjà  été smarté
    If PropDESIGNATION = "" Then
        MsgBox "SMARTER votre fichier avant d'exécuter la MACRO", vbCritical
        End
    End If

    sModelFullPath = swModel.GetPathName
    sFilePath = Left(sModelFullPath, InStrRev(sModelFullPath, "\"))

'variable remonté car déclaré en dessous la 1ère utilisation de la variable dans ta version
NomDossierDestination = sFilePath
 
    
'Vérifie que le fichier PDF n'existe pas à cet indice avant enregistrement
    FileNamePDF = NomDossierDestination & PropDESIGNATION & "_" & PropINDICE & ".PDF"
    TestStr = ""
    On Error Resume Next
    TestStr = Dir(FileNamePDF)
    On Error GoTo 0
    If TestStr = "" Then
    Else
        MsgBox "Le fichier PDF existe déjà  à  cet indice " & vbCrLf & "dans le dossier de l'assemblage : " & vbCrLf & vbCrLf & sFilePath, vbCritical
        Exit Sub
    End If
    
    
'Vérifie que le fichier PART n'existe pas à cet indice avant enregistrement
    FileNamePART = NomDossierDestination & (Left(swModel.GetTitle, Len(swModel.GetTitle) - 7)) & "_" & PropINDICE & Ext_PART
    TestStr = ""
    On Error Resume Next
    TestStr = Dir(FileNamePART)
    On Error GoTo 0
    If TestStr = "" Then
    Else
        MsgBox "Le fichier PART existe déjà à cet indice" & vbCrLf & "dans le dossier de l'assemblage : " & vbCrLf & vbCrLf & sFilePath, vbCritical
        Exit Sub
    End If
    
    
'Vérifie que le fichier STEP n'existe pas à cet indice avant enregistrement
    FileNameSTEP = NomDossierDestination & PropDESIGNATION & "_" & PropINDICE & Ext_STEP
    TestStr = ""
    On Error Resume Next
    TestStr = Dir(FileNameSTEP)
    On Error GoTo 0
    If TestStr = "" Then
    Else
        MsgBox "Le fichier STEP existe déjà  à  cet indice" & vbCrLf & "dans le dossier de l'assemblage : " & vbCrLf & vbCrLf & sFilePath, vbCritical
        Exit Sub
    End If
    
    
'Enregistrer le doc actif en PDF
    swModel.ForceRebuild3 True
    swModel.ShowNamedView2 "*Isometric", -1
    swModel.ViewZoomtofit2
    boolstatus = swModelDocExt.SaveAs(FileNamePDF, 0, 0, swExportData, lErrors, lWarnings)

'Enregistrer le doc actif en PART
    Set Part = swApp.ActiveDoc
    longstatus = Part.SaveAs3(FileNamePART, 0, 0)
    
'Ouvrir le doc précédent / Enregistrer le doc actif en STEP
    Set swPart = swApp.OpenDoc6(FileNamePART, 1, 0, "", errors, warnings)
    Set Part = swApp.ActiveDoc
    longstatus = Part.SaveAs3(FileNameSTEP, 0, 0)
           
'Message d'avertissement d'execution de la macro
    MsgBox "MACRO TERMINEE :" & vbCrLf & "Contrôler les fichiers PDF3D, PART, STEP", vbInformation

End Sub

 

1 « J'aime »

Le chemin d'enregistrement est le dossier du document actif 
Et pas le répertoire par défaut à moins que je me trompe

__

C'est étonnant car chez moi, le swModel.GetTitle ne récupère pas l'extension
Du coup, pour les PART, la macro donne ca

 

Je suppose que c'est parce que l'extension des fichier est caché dans windows, ce qui n'est pas mon cas.

Pour le chemin du dossier moi je l'ai remonté de quelques lignes (voir code et commentaire ci-dessus) sinon le

NomDossierDestination = sFilePath

se retrouvait en dessous: de :
FileNamePDF = NomDossierDestination & PropDESIGNATION & "_" & PropINDICE & ".PDF"
et de :
FileNamePART = NomDossierDestination & (Left(swModel.GetTitle, Len(swModel.GetTitle) - 7)) & "_" & PropINDICE & Ext_PART

Donc au 1er lancement de la macro le chemin est = a "" soit rien.

Par contre tout les lancement suivant il reprends la valeur qu'il récupère quelque ligne suivante.

Il suffit de fermé SW et relancé ta macro en pas à pas et de regardé les valeur de ta variable dans la fenêtre et tu verras le problème.

Merci de votre aide !
Tout à l'air de bien se dérouler