Erstellung maccro STEp PDF STEP

Hallo Team,

Ich beschloss, mit der Herstellung eines Maccro zu beginnen, um Zeit bei meiner Arbeit zu sparen.

Als Anfänger habe ich zum ersten Mal viele Themen in diesem Forum gelesen, aber ich habe nicht unbedingt meine Antworten gefunden.

Lassen Sie mich das erklären: Ich habe einen Maccro mit der Funktion "Speichern" erstellt.

Der Zweck dieses Maccro wäre in Ordnung:

  • Aus einem Raum. SLDPRT
  • Speichern Sie es in . SCHRITT
  • Öffnen Sie Ihre Zeichnung
  • Speichern unter . DxF
  • Als PDF speichern
  • Zeichnung schließen
  • Schließen Sie den Raum

Der Code, der daraus hervorgeht, lautet wie folgt:

’ ******************************************************************************
' C:\Users\bguyetand\AppData\Local\Temp\swx4952\Macro1.swb - Makro aufgezeichnet am 20.09.23 von BGuyetand
’ ******************************************************************************
Dimmen swApp als Objekt

Teil als Objekt dimmen
Dim boolstatus als boolescher Wert
Dim longstatus As Long, longwarnings As Long

Sub main()

Legen Sie swApp = Application.SldWorks fest

Set Part = swApp.ActiveDoc

' Speichern unter
longstatus = Part.SaveAs3("C:\Benutzer\bguyetand\Desktop\Part1.STEP", 0, 2)

' Öffnen
Set Part = swApp.OpenDoc6("C:\Users\bguyetand\Desktop\Part1.SLDDRW", 3, 0, "", longstatus, longwarnings)
Dim swZeichnung als ZeichnungDoc
Set swDrawing = Teil
Set Part = swApp.ActiveDoc
myModelView als Objekt dimmen
Festlegen von myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 22
Festlegen von myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
swApp.ActivateDoc2 "Teil1 - Tabelle1", Falsch, longstatus
Set Part = swApp.ActiveDoc
Festlegen von myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized

' Speichern unter
longstatus = Part.SaveAs3("C:\Benutzer\bguyetand\Desktop\Pièce1.pdf", 0, 2)
Part.SheetPrevious

' Neu zeichnen
Part.GraphicsRedraw2

' Auf Bereich zoomen
Part.ViewZoomTo2 0, 0, 0, 0.1, 0.1, 0.1

' Auf Bereich zoomen
Part.ViewZoomTo2 0, 0, 0, 0.1, 0.1, 0.1

' Speichern unter
longstatus = Part.SaveAs3("C:\Benutzer\bguyetand\Desktop\Part1.DXF", 0, 2)

' Dokument schließen
Set swDrawing = Nichts
Set Part = Nichts
swApp.CloseDoc "Teil1 - Tabelle1"
Set Part = swApp.ActiveDoc
Festlegen von myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 0
Festlegen von myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
swApp.ActivateDoc2 "Teil1.SLDPRT", Falsch, longstatus
Set Part = swApp.ActiveDoc
Festlegen von myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized

' Dokument schließen
Set swPart = Nichts
Set Part = Nichts
swApp.CloseDoc "Teil1.SLDPRT"
Ende Sub

Mein Problem ist, dass derzeit, wenn ich diesen Maccro starte, er meinen Testraum öffnet, den ich erstellt hatte (ein einfacher Würfel), um die Schritte zu entfalten.
Darüber hinaus zeichnet es alles auf dem Desktop auf.

Ist es möglich, mir in meinem maccro zu erklären:

  • Wie kann ich mein "Test"-Teil durch das "aktive" Teil auf meinem Bildschirm ersetzen?
  • Wie speichere ich die Dateien im geöffneten Raumordner?

Ich hoffe, ich bin in meinen Erklärungen klar genug gewesen :smiley:

Vielen Dank im Voraus für die Zeit, die Sie mir schenken werden!! :stuck_out_tongue:

1 „Gefällt mir“

Hallo
Sehen Sie sich diesen Code an, um ein Teil oder eine Baugruppe als Schritt zu speichern.
Es ist gut kommentiert, es sollte Ihnen sehr helfen:

    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 „Gefällt mir“

Vielen Dank für Ihre Antwort,

Ich schaue mir das an, sobald ich Zeit habe.

Hallo;

Um die Antwort von @sbadenis zu vervollständigen:

Die wichtige Information seines Vorschlags ist:

=>… Set swModel = swApp.ActiveDoc (um am aktiven Solidworks Dokument zu arbeiten)
=> … swModel.GetPathName (um den (vollständigen) Pfad des in Solidworks geöffneten Dokuments abzurufen)

Um sanft an Makros heranzukommen, rate ich Ihnen (zusätzlich zur Solidworks API-Hilfe):

und

(Sehr interessante Videos auf CadSharp)

und allgemeiner (hauptsächlich Excel, aber VBA ist VBA):

Und denken Sie immer daran, Ihre Kreationen zu kommentieren (denn in zehn Jahren werden Sie nicht unbedingt verstehen, was Sie damals getan haben...)

Herzliche Grüße.

2 „Gefällt mir“

Hallo

Wenn es Sie interessieren könnte, habe ich hier das Makro in PDF, damit Sie einen Code für das PDF haben :slight_smile:
Für PDF.swp-Druck (23 KB)

Und hier geht es zur dxf-Ausgabe im Maßstab 1:1
Enregistre_DXF_echel_1-1.swp (34 KB)

Es könnte für Sie nützlich sein

1 „Gefällt mir“

Vielen Dank an alle für eure Antworten,

Ich glaube schon, dass ich ein bisschen mehr aus meinem Schlamassel herauskommen kann.

Das ist geil :slight_smile:

Und das nicht nur in 10 Jahren... Manchmal innerhalb von 15 Tagen!

Ansonsten denke ich, dass es bereits viele Links für die Hilfe gab, aber zögern Sie nicht, zurückzukommen, um Ihr letztes Makro mit uns zu teilen :slight_smile:

Hallo

Um ehrlich zu sein, habe ich mir das gestern angeschaut, aber es funktioniert immer noch nicht :smiley:

Tatsächlich habe ich den Eindruck, dass die Codes, die aus dem "Speichern"-Modus der Maccros kommen, nicht die gleichen sind wie die, die Sie scheinbar von Hand eingeben.
Also kratze ich mich ein wenig am Kopf, bevor ich hierher komme, um um Hilfe zu rufen :smiley:

Der vom Rekorder generierte Code ist voller Fehler und wird nur verwendet, um einige mögliche Funktionen zu identifizieren.
Alles, was mit MyModelView zu tun hat, ist z. B. völlig nutzlos.
Hier ist der saubere Code und scheint alles funktionaler zu sein, mit den Kommentaren, die gut passen.
Um part1 durch das aktive Teil zu ersetzen, rufen Sie den Namen des aktiven Teils wie folgt ab: swModel.GetPathName
Dann entfernen wir per VBA-Manip die Erweiterung für die verschiedenen Aufnahmen.
Der 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 „Gefällt mir“

Sbadenis,

Ein riesiges Dankeschön für Ihre Hilfe,

Alleine in so kurzer Zeit hätte ich niemals die Lösung gefunden,
Die Kommentare sind großartig und werden es mir ermöglichen, mich bei meinem nächsten Maccros zu orientieren.

Ich werde meine Kreationen, die funktionieren, posten, wenn ich welche habe :slight_smile:

Nochmals vielen Dank an das Team für Ihre Zeit!

Wenn Sie das wollten, vergessen Sie nicht, das Thema zu schließen, indem Sie die Antwort auswählen, die Ihr Problem gelöst hat. Vielen Dank

2 „Gefällt mir“

Es ist geschafft :ok_hand: