Création maccro STEp PDF STEP

Bonjour l’équipe,

J’ai décidé de me lancer dans la réalisation d’une maccro pour gagner du temps sur mon travail.

Etant novice, j’ai d’abord lu pas mal de topics sur ce forum mais je n’ai pas forcement trouvé mes réponses.

Je m’expliques : J’ai créer une maccro avec la fonction « Enregistrer » de celle-ci.

Le but de cette maccro serait dans l’ordre :

  • A partir d’une pièce.SLDPRT
  • L’enregistrer en .STEP
  • Ouvrir sa mise en plan
  • Enregistrer en .DxF
  • Enregistrer en PDF
  • Fermer la mise en plan
  • Fermer la pièce

Le code qui en ressort est celui-ci :

’ ******************************************************************************
’ C:\Users\bguyetand\AppData\Local\Temp\swx4952\Macro1.swb - macro recorded on 09/20/23 by BGuyetand
’ ******************************************************************************
Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc

’ Save As
longstatus = Part.SaveAs3(« C:\Users\bguyetand\Desktop\Pièce1.STEP », 0, 2)

’ Open
Set Part = swApp.OpenDoc6(« C:\Users\bguyetand\Desktop\Pièce1.SLDDRW », 3, 0, «  », longstatus, longwarnings)
Dim swDrawing As DrawingDoc
Set swDrawing = Part
Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 22
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
swApp.ActivateDoc2 « Pièce1 - Feuille1 », False, longstatus
Set Part = swApp.ActiveDoc
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized

’ Save As
longstatus = Part.SaveAs3(« C:\Users\bguyetand\Desktop\Pièce1.pdf », 0, 2)
Part.SheetPrevious

’ Redraw
Part.GraphicsRedraw2

’ Zoom to Area
Part.ViewZoomTo2 0, 0, 0, 0.1, 0.1, 0.1

’ Zoom to Area
Part.ViewZoomTo2 0, 0, 0, 0.1, 0.1, 0.1

’ Save As
longstatus = Part.SaveAs3(« C:\Users\bguyetand\Desktop\Pièce1.DXF », 0, 2)

’ Close Document
Set swDrawing = Nothing
Set Part = Nothing
swApp.CloseDoc « Pièce1 - Feuille1 »
Set Part = swApp.ActiveDoc
Set myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 0
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
swApp.ActivateDoc2 « Pièce1.SLDPRT », False, longstatus
Set Part = swApp.ActiveDoc
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized

’ Close Document
Set swPart = Nothing
Set Part = Nothing
swApp.CloseDoc « Pièce1.SLDPRT »
End Sub

Mon problème est qu’actuellement, quand je lance cette maccro, elle m’ouvre ma pièce test que j’avais créé (Un cube simple) pour dérouler les étapes.
De plus elle enregistre tous sur le bureau.

Est il possible de m’expliquer dans ma maccro :

  • Comment je peux remplacer ma pièce « test » par la pièce « active » sur mon écran ?
  • Comment faire pour enregistrer les fichiers dans le dossier de la pièce ouverte ?

J’espère avoir été assez clair dans mes explications :smiley:

merci d’avance pour le temps que vous m’accorderez !!! :stuck_out_tongue:

1 « J'aime »

Bonjour,
Regarde ce code pour enregistrer une pièce ou un assemblage en step.
Il est bien commenté cela devrait fortement t’aider:

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
      
    Sub main()
      
'1-) on vérifie qu'un document est ouvert
  Debug.Print "1-)On vérifie qu'un document est ouvert"
  Set swApp = CreateObject("SldWorks.Application")
  Set swModel = swApp.ActiveDoc        ' On récupère le document d'ouvert
  If swModel Is Nothing Then           ' On vérifie si un document est ouvert
    MsgBox "Pas de document d'ouvert." + Chr$(13) + _
           "Une pièce ou assemblage SolidWorks doit être ouverte, " + Chr$(13) + _
           "avant de relancer cette macro."
  Else
    FileTyp = swModel.GetType
    If ((FileTyp = swDocPART) Or (FileTyp = swDocASSEMBLY)) Then 'Si le document est une pièce ou un assemblage

'2-)On vérifie si une config sym existe
        'On vérifie si la configuration active est une configuration dérivée (Si Symétrique retour config defaut)
        Set swCompModelConfig = swModel.GetActiveConfiguration
        Dim vConfigName As Variant
        Dim swParentConfig As SldWorks.Configuration
        Dim swConfMgr As SldWorks.ConfigurationManager
        Dim partTitle As String
        partTitle = swModel.GetTitle
        Debug.Print "partTitle:" & partTitle
                        
        If swCompModelConfig.IsDerived Then
        Debug.Print "Configuration dérivée:" & swCompModelConfig.IsDerived
        Debug.Print "Pause"
                Dim swConfig As SldWorks.Configuration
                    Set swConfig = swModel.GetConfigurationByName(vConfigName)
                    ' Process parent
                    Set swParentConfig = swCompModelConfig.GetParent
                    If Not swParentConfig Is Nothing Then
                        Debug.Print "      Parent = " & swParentConfig.Name
                        swModel.ShowConfiguration2 (swParentConfig.Name)
                    End If
        End If
        
'2-)On enregistre en step
        Debug.Print "2-)On enregistre en step"
        swModel.Extension.SaveAs Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "STEP", 0, 0, Nothing, 0, 0
        MsgBox (Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "step sauvegardé")
                  
        
    




'4-)On enregistre en step la config sym si existante
         'Pour toutes les configurations du modèle 3D
            configNames = swModel.GetConfigurationNames
            For Each ConfigName In configNames
            Debug.Print "4-Nom de config:" & ConfigName
            Set swConfig = swModel.GetConfigurationByName(ConfigName)
            Set swCustPropMgr = swConfig.CustomPropertyManager
                If ConfigName Like "*Sym*" Then
                        If ConfigName Like "*Sym*Sym*" Then
                            MsgBox "Attention Symétrie de Symétrie merci de corriger votre assemblage et supprimer cette configuration: " & ConfigName
                        End If
                        'Mis en commentaire jusqu'au passage en pièce SYM sur 2 MEP
                        'If swModel.GetCustomInfoValue(ConfigName, "Symetrie") <> "" Then
                            'On active la config Sym
                            swModel.ShowConfiguration2 (ConfigName)
                            Debug.Print "4)On enregistre en step le Sym"
                            Debug.Print Left(swModel.GetPathName, Len(swModel.GetPathName) - 7) & "-SYM.STEP"
                            swModel.Extension.SaveAs Left(swModel.GetPathName, Len(swModel.GetPathName) - 7) & "-SYM.STEP", 0, 0, Nothing, 0, 0
                            MsgBox (Left(swModel.GetPathName, Len(swModel.GetPathName) - 7) & "-SYM" & ".step sauvegardé")
                        'End If
                    End If
                Next
        
        
    Else
      MsgBox "Pas de pièce ou assemblage d'ouvert." + Chr$(13) + _
           "Une pièce ou assemblage SolidWorks doit être ouvert, " + Chr$(13) + _
           "avant de relancer cette macro."
    End If          ' Fin vérification si un plan est ouvert
    End
  End If            ' Fin vérification si un document est ouvert

End Sub


1 « J'aime »

Merci pour ta réponse,

Je me penche dessus dès que j’ai du temps.

Bonjour;

Pour compléter la réponse de @sbadenis :

Les informations important de sa proposition sont:

=>…Set swModel = swApp.ActiveDoc (pour travailler sur le document actif de Solidworks)
=> …swModel.GetPathName (pour récupérer le chemin (complet) du document ouvert dans Solidworks)

pour vous faire doucement la main sur les macro, je vous conseil (outre l’aide API de Solidworks):

et

(Des video très intéressantes sur CadSharp)

et de façon plus génerale (principalement Excel mais le VBA c’est le VBA):

Et pensez toujours à commenter vos créations (parce que, dans dix ans, vous ne comprendrez pas forcément ce que aviez fait à l’époque…)

Cordialement.

2 « J'aime »

Bonjour,

si sa peut vous interressez , ici j’ai la macro pour faire en PDF, comme ca vous aurez un code pour le pdf :slight_smile:
Pour Impression PDF.swp (23 Ko)

Et ici pour le dxf sortie a l’echelle 1:1
Enregistre_DXF_echel_1-1.swp (34 Ko)

Sa pourrai peut etre vous etre utile

1 « J'aime »

Merci à tous pour vos réponses,

Je pense déjà pouvoir un peu plus me sortir de ma galère.

C’est super :slight_smile:

Et pas que dans 10ans … défois, dans les 15jours suivant !

Sinon, je crois qu’il y a eu pas mal de lien pour l’aide déjà mais n’hésites pas à revenir nous faire part de ta macro finale :slight_smile:

Bonjour,

Pour être tout à fait franc, je me suis penché dessus hier, mais elle ne fonctionne toujours pas :smiley:

En fait j’ai l’impression que les codes qui ressortent du mode « Enregistrer » des maccros n’est pas le même que ceux que vous semblez taper à la main.
Alors je me gratte un peu la tête avant de venir crier au secours ici :smiley:

Le code généré par l’enregistreur est rempli d’erreurs et sert juste à repérer quelques éventuelles fonctions.
Tout ce qui est lié à MyModelView est totalement inutile par exemple.
Voici le code propre et semble toute plus fonctionnel, avec les commentaires qui vont bien.
Pour remplacer la pièce1 par la pièce active tu récupère le nom de la pièce active avec: swModel.GetPathName
puis via manip vba on enlève l’extension pour les différent enregistrement.
Le code:

'Déclarations
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()
Set swApp = Application.SldWorks


'1-) on vérifie qu'un document est ouvert
  Set swModel = swApp.ActiveDoc        ' On récupère le document d'ouvert
  If swModel Is Nothing Then           ' On vérifie si un document est ouvert
    MsgBox "Pas de document d'ouvert." + Chr$(13) + _
           "Une pièce ou assemblage SolidWorks doit être ouverte, " + Chr$(13) + "avant de relancer cette macro."
  Else
    FileTyp = swModel.GetType
    If ((FileTyp = swDocPART) Or (FileTyp = swDocASSEMBLY)) Then 'Si le document est une pièce ou un assemblage


        
'2-)On enregistre en step
        swModel.Extension.SaveAs Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "STEP", 0, 0, Nothing, 0, 0 'on sauvegarde l'assemblage ou pièce active en step en récupérant le nom sans l'extension
        MsgBox (Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "step sauvegardé") 'On affiche dans une box le chemin du step. Au besoin ajouter le symbol' au début de la ligne pour la passer en commentaire
        
'3-)On ouvre la MEP du modèle actif
        Set swDraw = swApp.OpenDoc6(Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "slddrw", 3, 0, "", longstatus, longwarnings) 'Ouverture de la MEP
        longstatus = swDraw.SaveAs3(Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "pdf", 0, 2) 'On l'enregistre en pdf avec le même nom .pdf
        MsgBox (Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "pdf sauvegardé") 'On affiche dans une box le chemin du pdf. Au besoin ajouter le symbol' au début de la ligne pour la passer en commentaire

'4-)On enregistre la MEP en dxf
        longstatus = swDraw.SaveAs3(Left(swDraw.GetPathName, InStrRev(swModel.GetPathName, ".")) & "dxf", 0, 2) 'On l'enregistre en pdf avec le même nom .dxf
        MsgBox (Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "dxf sauvegardé") 'On affiche dans une box le chemin du pdf. Au besoin ajouter le symbol' au début de la ligne pour la passer en commentaire

'5-)On ferme les documents
        swApp.CloseDoc Left(swModel.GetPathName, InStrRev(swModel.GetPathName, ".")) & "slddrw" 'On ferme la MEP
        swApp.CloseDoc swModel.GetPathName 'On ferme le model actif au besoin ajouter ' pour mettre la ligne en commentaire et ne pas fermer le modèle actif

        Set swDrawing = Nothing 'On vide la variable
        Set swModel = Nothing 'On vide la variable
        
    Else
      MsgBox "Pas de pièce ou assemblage d'ouvert." + Chr$(13) + _
           "Une pièce ou assemblage SolidWorks doit être ouvert, " + Chr$(13) + _
           "avant de relancer cette macro."
    End If          ' Fin vérification si un plan est ouvert
    End
  End If            ' Fin vérification si un document est ouvert

End Sub
1 « J'aime »

Sbadenis,

Un énorme merci pour ton aide,

je n’aurais jamais trouvé la solution seul en si peu de temps,
Les commentaires sont top et me permettront de m’aiguiller sur mes prochaines maccros.

Je posterai mes créations qui fonctionnent quand j’en aurai :slight_smile:

Encore merci à l’équipe pour votre temps !

Si c’est bien ce que tu voulais, n’oublie pas de clôturer le sujet en sélectionnant la réponse qui à résolu ton problème. Merci

2 « J'aime »

C’est fait :ok_hand: