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