Tworzenie maccro STEp PDF KROK

Witaj drużynie,

Postanowiłem zacząć robić maccro, aby zaoszczędzić czas na mojej pracy.

Będąc nowicjuszem, najpierw przeczytałem wiele tematów na tym forum, ale niekoniecznie znalazłem swoje odpowiedzi.

Pozwólcie, że wyjaśnię: stworzyłem maccro z funkcją "Zapisz".

Cel tego maccro byłby następujący:

  • Z pokoju. SLDPRT (Biblioteka SLDPRT)
  • Zapisz go w . KROK
  • Otwieranie rysunku
  • Zapisz jako . DxF
  • Zapisz jako PDF
  • Zamknij rysunek
  • Zamknij pokój

Kod, który się z niego wyłania, jest następujący:

’ ******************************************************************************
' C:\Users\bguyetand\AppData\Local\Temp\swx4952\Macro1.swb - makro nagrane 20.09.23 przez BGuyetand
’ ******************************************************************************
Dim swApp As Object

Przyciemnij część jako obiekt
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Ustaw swApp = Application.SldWorks

Ustaw część = swApp.ActiveDoc

' Zapisz jako
longstatus = Part.SaveAs3("C:\Użytkownicy\bguyetand\Pulpit\Część1.KROK", 0, 2)

' Otwórz
Ustaw część = swApp.OpenDoc6("C:\Users\bguyetand\Desktop\Part1.SLDDRW", 3, 0, "", longstatus, longwarnings)
Dim swDrawing As DrawingDoc
Ustaw swDrawing = Część
Ustaw część = swApp.ActiveDoc
Przyciemnij myModelView jako obiekt
Ustaw myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 22
Ustaw myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
swApp.ActivateDoc2 "Część 1 - Arkusz1", Fałsz, długi stan
Ustaw część = swApp.ActiveDoc
Ustaw myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized

' Zapisz jako
longstatus = Part.SaveAs3("C:\Użytkownicy\bguyetand\Pulpit\Pièce1.pdf", 0, 2)
Part.SheetPoprzedni

' Przerysuj
Part.GraphicsRedraw2

' Powiększ obszar
Part.ViewZoomTo2 0, 0, 0, 0,1, 0,1, 0,1

' Powiększ obszar
Part.ViewZoomTo2 0, 0, 0, 0,1, 0,1, 0,1

' Zapisz jako
longstatus = Part.SaveAs3("C:\Użytkownicy\bguyetand\Pulpit\Część1.DXF", 0, 2)

' Zamknij dokument
Ustaw swDrawing = Nic
Ustaw część = Nic
swApp.CloseDoc "Część 1 - Arkusz1"
Ustaw część = swApp.ActiveDoc
Ustaw myModelView = Part.ActiveView
myModelView.FrameLeft = 0
myModelView.FrameTop = 0
Ustaw myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
swApp.ActivateDoc2 "Part1.SLDPRT", False, longstatus
Ustaw część = swApp.ActiveDoc
Ustaw myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized

' Zamknij dokument
Ustaw swPart = Nic
Ustaw część = Nic
swApp.CloseDoc "Część1.SLDPRT"
Koniec subwoofera

Mój problem polega na tym, że obecnie, kiedy uruchamiam tego maccro, otwiera się mój pokój testowy, który stworzyłem (prosta kostka), aby rozłożyć kroki.
Ponadto nagrywa wszystko na pulpicie.

Czy jest to możliwe aby mi wytłumaczyć w moim maccro:

  • Jak mogę zastąpić moją "testową" część "aktywną" na moim ekranie?
  • Jak zapisać pliki w folderze otwartego pokoju?

Mam nadzieję, że moje wyjaśnienia są wystarczająco jasne :smiley:

Z góry dziękuję za czas, który mi poświęcisz!! :stuck_out_tongue:

1 polubienie

Witam
Spójrz na ten kod, aby zapisać część lub zespół jako krok.
Jest dobrze skomentowany, powinien ci bardzo pomóc:

    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 polubienie

Dziękuję za odpowiedź,

Zaglądam do niego, gdy tylko mam czas.

Witam;

Aby uzupełnić odpowiedź @sbadenis :

Ważną informacją zawartą w jego propozycji jest:

=>… Ustaw swModel = swApp.ActiveDoc (do pracy na aktywnym dokumencie Solidworks)
=> … swModel.GetPathName (w celu pobrania (pełnej) ścieżki do dokumentu otwartego w Solidworks)

aby delikatnie dostać w swoje ręce makra, radzę (oprócz pomocy Solidworks API):

i

(Bardzo ciekawe filmy na temat CadSharp)

i bardziej ogólnie (głównie Excel, ale VBA to VBA):

I zawsze pamiętaj, aby komentować swoje dzieła (bo za dziesięć lat niekoniecznie zrozumiesz, co wtedy zrobiłeś...)

Pozdrowienia.

2 polubienia

Witam

jeśli może Cię to zainteresować, oto mam makro do zrobienia w PDF, więc będziesz miał kod do pliku PDF :slight_smile:
Drukowanie w formacie PDF.swp (23 KB)

A tutaj dla wyjścia dxf w skali 1:1
Enregistre_DXF_echel_1-1.swp (34 KB)

Może Ci się przydać

1 polubienie

Dziękuję wszystkim za odpowiedzi,

Już myślę, że mogę trochę wyjść z mojego bałaganu.

To świetnie :slight_smile:

I to nie tylko za 10 lat... Czasami w ciągu 15 dni!

W przeciwnym razie myślę, że było już wiele linków do pomocy, ale nie wahaj się wrócić, aby podzielić się z nami swoim ostatnim makro :slight_smile:

Witam

Szczerze mówiąc, przyjrzałem się temu wczoraj, ale nadal nie działa :smiley:

W rzeczywistości mam wrażenie, że kody, które wychodzą z trybu "Zapisz" maccros, nie są takie same, jak te, które wydajesz się wpisywać ręcznie.
Więc drapię się trochę w głowę, zanim tu przyjdę, żeby wołać o pomoc :smiley:

Kod generowany przez rejestrator jest pełen błędów i służy jedynie do identyfikacji kilku możliwych funkcji.
Na przykład wszystko, co jest związane z MyModelView, jest całkowicie bezużyteczne.
Oto czysty kod i wydaje się być bardziej funkcjonalny, z komentarzami, które dobrze pasują.
Aby zastąpić część 1 częścią aktywną, należy pobrać nazwę części aktywnej za pomocą: swModel.GetPathName
Następnie za pomocą manipu VBA usuwamy rozszerzenie dla różnych nagrań.
Kod:

'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 polubienie

Sbadenis,

Ogromne podziękowania za pomoc,

Nigdy nie znalazłbym rozwiązania sam w tak krótkim czasie,
Komentarze są świetne i pozwolą mi poprowadzić mnie po moich następnych maccrosach.

Opublikuję moje dzieła, które działają, gdy będę miał jakieś :slight_smile:

Jeszcze raz dziękujemy zespołowi za poświęcony czas!

Jeśli tego właśnie chciałeś, nie zapomnij zamknąć tematu, wybierając odpowiedź, która rozwiązała Twój problem. Dziękuję

2 polubienia

Zrobione :ok_hand: