Export step et pdf de tous les fichiers ouverts

Bonjour tout le monde !

Via une macro Excel j'ouvre un certain nombre de pièces sous SolidWorks. J'aimerais faire une macro qui permettrais d'ouvrir le plan du premier document actif, de l'enregistrer en PDF, de fermer le plan, d'enregistrer la pièce en STEP puis de fermer la pièce et de passer à la pièce suivante.

Je commence tout juste dans le monde des macros donc je regarde tout ce qui se fait et j'ai pioché ça à droite à gauche.

Pour enregistrer un plan en STEP :

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
      
    Sub main()
      
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    swModel.Extension.SaveAs Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "STEP", 0, 0, Nothing, 0, 0
    
    swApp.CloseDoc Path
        
    End Sub

 

Pour enregistrer un plan en STEP :

Dim swApp As Object

Dim Part As Object

Dim boolstatus As Boolean

Dim longstatus As Long, longwarnings As Long

Dim FeatureData As Object

Dim Feature As Object

Dim Component As Object

 

Sub main()

Set swApp = Application.SldWorks

 

Set Part = swApp.ActiveDoc

Path = Part.GetPathName                                                     'chemin du fichier

Part.SaveAs2 Left(Path, (Len(Path) - 6)) & "PDF", 0, True, False            'Sauvegarde au format PDF

Set Part = Nothing

swApp.CloseDoc Path

End Sub

 

Les problèmes que j'ai sont les suivants :

- je n'arrive pas à trouver de ligne de code me permettant d'ouvrir le plan du document actif (qui est toujours une pièce). J'ai bien essayé de créer cette ligne avec l'enregistreur de macro de SoildWorks et an faisant un clic droit/ouvrir la mise sur la pièce blalba.SLDPRT en plan mais il m'enregistre comme ligne de code l'ouverture du plan blabla.SLDDRW et non l'ouverture du plan du document actif.

- Et mon deuxième problème est pour créer une boucle. J'ai bien trouvé la structure de ma boucle :

Sub boucle_while()


   While ?????????????? 'TANT QUE un document est actif
       


    Wend
       
End Sub

 

Mais je ne sais pas comment lui demander de vérifier qu'il y a bien un document actif !

Je pense que je ne suis pas très loin du truc il faut juste vérifier la condition, trouver comment ouvrir le plan...

Merci à ceux qui prendront le temps de jeter un oeil à mon problème =) !

Bonjour,

Pour la condition de boucle, c'est simple, il faut vérifier qu'il y a bien un document actif. Pour ça, utilisez :

While Not SwApp.ActiveDoc <> Nothing (ou Is Nothing, je ne me souviens plus de la syntaxe acceptée)

Pour ouvrir la MEP d'une pièce ou d'un assemblage, passez par les documents référencés de cette pièce ou assemblage.

2 « J'aime »

Bonjour,

En bricolant le truc à la "va vite" et si tes plans sont stockés dans le même dossier que tes pièces :

Dim swApp As Object
Sub main()
    Dim swModel As SldWorks.ModelDoc2
    Dim longstatus As Long, longwarnings As Long
    Set swApp = Application.SldWorks
    While Not swApp.ActiveDoc Is Nothing
        Set swModel = swApp.ActiveDoc
        Path = swModel.GetPathName
        Path = Left(Path, (Len(Path) - 6)) & "slddrw"
        Set swModel = swApp.OpenDoc6(Path, 3, swOpenDocOptions_Silent, "", longstatus, longwarnings)
        swModel.SaveAs2 Left(Path, (Len(Path) - 6)) & "PDF", 0, True, False
        swApp.CloseDoc Path
        Set swModel = swApp.ActiveDoc
        Path = swModel.GetPathName
        swModel.SaveAs2 Left(Path, (Len(Path) - 6)) & "step", 0, True, False
        swApp.CloseDoc Path
        Set swModel = swApp.ActiveDoc
    Wend
End Sub

 

Attention, il faut ajouter des vérifications du type :

- Si mon document est une pièce alors ... sinon ...

- Si je ne trouve pas de plan alors ....

- etc

Si tes plans ne sont pas stockés dans le même dossier que tes pièces alors il faut passer par les documents référencés comme l'a dit Yves T.

Cordialement,

2 « J'aime »

Bonjour D.Roger

Je sais que tu as fait cela rapidement mais dans les  conditions relatives au step il me semble qu'il faut distinguer les différents types de Step sinon cela risque d'exclure certains formats STEP et de provoquer peut être des faux négatifs.

Qu'en penses tu ?

Cordialement

1 « J'aime »

Bonjour Zozo_mp,

Oui j'ai fait ça rapidement sans m'inquiéter ni des vérifications à faire pour gérer les différentes erreurs possibles ni des options d'export pour les fichiers step. , celui-ci se mettant sur "AP203" par défaut il me semble. Pour choisir "AP214" il suffit de mettre la ligne "boolstatus = swApp.SetUserPreferenceIntegerValue(swStepAP, 214)" après la ligne "Set swApp = Application.SldWorks", il est aussi possible de gérer d'autres options d'export dans le code de la macro, voir http://help.solidworks.com/2017/english/api/swconst/filesaveasstepoptions.htm.

Il est possible d'en faire de même avec l'export en pdf pour gérer certaines options, voir http://help.solidworks.com/2017/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IExportPdfData.html.

Tout cela dépend de l'utilité de la macro dans un contexte donné ...

Cordialement,

2 « J'aime »

Salut le fil !

Merci beaucoup pour vos réponses je comprends maintenant (enfin je pense) comment faire pour pouvoir ouvrir le plan/la pièce d'une pièce/d'un plan s'ils ont le même nom et le même chemin et ça c'est top ça me servira beaucoup pour la suite =) !

En bref via une macro Excel j'ouvre toutes les pièces d'une même famille dans un tableau type nomenclature (pièces usinées, pièces mécano-soudées, pièces de tôlerie...). Ensuite il y a la macro SolidWorks pour pouvoir créer tous les fichiers neutres pour simplifier les envois chez les sous-traitants car aujourd'hui on enregistre tout à la main et c'est source d'oublis, d'erreurs et une énoooorme perte de temps ^^ ! Voilà un peu pour le contexte ☺ !

Pour ce qui est du code que d.roger a poster je l'ai mis un peu plus structuré et détaillé pour moi que je puisse m'y retrouver plus facilement :

Dim swApp As Object

Sub main()

'Déclaration des variables :

    Dim swModel As SldWorks.ModelDoc2
    Dim longstatus As Long, longwarnings As Long

'Initialisation de certaines variables :
    
    Set swApp = Application.SldWorks
    boolstatus = swApp.SetUserPreferenceIntegerValue(swStepAP, 214)
    
'Mise en place de la boucle :
    
    While Not swApp.ActiveDoc Is Nothing 'Tant qu'il y a un document actif alors
    
        Set swModel = swApp.ActiveDoc                                                                 'Document sur lequel se passe les actions à venir
        Path = swModel.GetPathName                                                                    'Extraction du chemin d'enregistrement de la pièce
        Path = Left(Path, (Len(Path) - 6)) & "slddrw"                                                 'Concatène le nom et l'extension .SLDDrW pour avoir le nom complet du plan (C/..../plan.SLDDRW)
        Set swModel = swApp.OpenDoc6(Path, 3, swOpenDocOptions_Silent, "", longstatus, longwarnings)  'Ouverture du plan
        swModel.SaveAs2 Left(Path, (Len(Path) - 6)) & "PDF", 0, True, False                           'Enregistrement en PDF
        swApp.CloseDoc Path                                                                           'Fermeture du plan
        
        Set swModel = swApp.ActiveDoc                                                                 'Document sur lequel se passe les actions à venir
        Path = swModel.GetPathName                                                                    'Extraction du chemin d'enregistrement de la pièce
        swModel.SaveAs2 Left(Path, (Len(Path) - 6)) & "step", 0, True, False                          'Enregistrement en STEP
        swApp.CloseDoc Path                                                                           'Fermeture du plan
        
        Set swModel = swApp.ActiveDoc                                                                 'Je ne comprends pas trop à quoi il sert ? Pour activer le document suivant pour que la boucle puisse se répéter ?
        
    Wend
    
End Sub

J'ai lancé la lecture en pas à pas, sur la ligne

Set swModel = swApp.OpenDoc6(Path, 3, swOpenDocOptions_Silent, "", longstatus, longwarnings) 

le plan ne s'ouvre pas. Donc forcément sur la ligne il me dit qu'il y a une erreur car il n'arrive pas à enregistrer la pièce en PDF. J'ai aussi rajouté la ligne pour spécifier l'enregistrement en STEP 214 mais c'est bien une variable à laquelle je donne une valeur non ? Il faut que je déclare la variable plus haut avec un truc du genre Dim boolstatus As "je ne sais pas quoi" ?

 

Merci encore du coup de main =)

Bonjour,

Je vois sur ton profil que tu as Epdm, si le plan est stocké dedans alors il faut le rapatrier dans ton cache local avant de lancer la macro ou, mieux, le faire par l'intermédiaire de ta macro ce qui va nécessité de lire aussi les API EPDM !!!

Dim boolstatus As boolean

Cordialement,

1 « J'aime »