Edycja kodu makra PDF/DWG-STEP

Ja też suszę! :crazy_face:
Czy możesz edytować makro, dodać okna Wykonywanie i Zmienne lokalne (patrz obrazek), a następnie kliknąć zaraz po Sub main() i nacisnąć F8 tylko po to, aby to spowodowało błędy?
image

Zasadniczo rozerwij makro krok po kroku. I sprawdź w oknie zmiennej lokalnej wartość sModelName, gdy się zawiesza:


A także jeśli swModel pozostaje pusty.

1 polubienie

Zrobiłem test i oto co dostałem

I mam wrażenie, że po linii, która jest w kolorze żółtym, idzie bezpośrednio do
" Funkcja GetFilename(strPath As String) As String "

Właśnie przerobiłem testy, kopiując kod podstawowy i nie działa to za każdym razem...
Zrobiłem 5 testów i miałem 2 razy, w których działa dobrze, inne, w których nie mam PDF/DWG, albo po prostu się nie uruchamia!

Nie rozumiem, dlaczego nie działa za każdym razem!

W przeciwnym razie teoretycznie nie muszę już zmieniać ścieżki do pliku

Witam;
@Antoine_Ruelle ,
Przyglądając się bliżej swojemu MEP, wygląda na to, że nie używasz właściwości " Revision  ". Co wyjaśni poniższy błąd:

Indeks " A " w Twoim eurodeputowanym wydaje się być tylko tekstem...

Ponadto w pliku SLDPRT Twoje właściwości mają postać:
" Tekst: " (Nie sądzę, aby użycie " : " było właściwe w tym kontekście.

Tylko twój SLDPRT wydawał się mieć pojęcie indeksu, czy używasz PDM?
Pozdrowienia

Dobry wieczór
Tak, przechodzi do funkcji, aby móc pobrać informacje o nazwie pliku, usuwając rozszerzenie.
W chwili obecnej kod oferowany przez @sbadenis działa na SW2022.

1 polubienie

Witam @tous
Antoine w międzyczasie przygląda się temu makro,
Usuwa wiersze 4 i 5 po " sub main ".
I Przypisuje dokładną nazwę właściwości wersji zamiast " hint "

2 polubienia

Rzeczywiście, @Maclane w części rewizyjnej, również o tym pomyślałem, stąd modyfikacja, którą zaproponowałem z usunięciem tej właściwości i dodaniem folderów.
W przypadku właściwości rzeczywiście dziwne jest dodanie " : " w nazwie właściwości i może to rzeczywiście stanowić problem w niektórych przypadkach (makro lub inne).
Przykładowa właściwość bez:

Na @Antoine_Ruelle potwierdzam, że makro działa dobrze na SW2023 (więc nie ma powodu na 2022 roku), jak @Cyril_f również mówi.
Możesz także wypróbować rozwiązanie @Lynkoa15, mając nadzieję, że tym razem problem się nie pojawi.

1 polubienie

Witam, dziękuję za tę opinię @Maclane .
Rzeczywiście, nie używam właściwości revision, zdałem sobie z tego sprawę po fakcie, ponieważ do zapisania w PDF/DWG mam taką samą nazwę pliku jak plan oprogramowania. Więc usunąłem tę część. I nadal mam ten sam problem, nie mam PDF/DWG

Jako wskazówkę wpisał ręcznie w tekście właściwość pokoju, która jest pokazana na planie.
I nie, nie używamy PDM

sbadenis - Dla kogo jest ": " Nie wiem, czy to naprawdę problem, ponieważ działało dobrze 2 razy z rzędu. Dziś rano zrobiłem test bez ":" i znowu dostałem komunikat, że na linii 118 mam blok, który nie jest zdefiniowany. Czy możesz mi wyjaśnić tę linię?
" Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors) "

Właśnie ponownie zrobiłem test, zanim ci odpowiedziałem i zadziałało

@Lynkoa15 Jeśli dobrze zrozumiałem ścieżkę do folderu, muszę określić je jako zmienne
Const dxfSubFolder jako ciąg = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepSubFolder As String = "\krok"
Wywołać je w ścieżkach nagrania?

W każdym razie dziękuję za pomoc, zaczynam trochę lepiej rozumieć VBA

Witam

Ta linia pozwala na aktywację jednego z otwartych dokumentów w trybie cichym (przezroczystym dla użytkownika).

Tak, upraszcza kod i wywołuje zmienne, zamiast wprowadzać ten sam tekst n razy.
A jeśli kiedykolwiek zdecydujesz się na zmianę ścieżki, łatwiej jest zarządzać tylko jedną zmienną niż sprawdzać cały kod.

1 polubienie

Okej, więc dlaczego w niektórych przypadkach makro się na nim zacina? Czy to możliwe, że plik jest już otwarty? Albo że go nie znajdzie?

A więc na jakim poziomie kodu powinienem określić zmienną ścieżki, aby powiedzieć mu, aby wziął ścieżkę do danego pliku i dodał "/pdf", aby mieć odpowiedni folder rekordów?
Albo jaką część kodu z innego makra muszę pobrać?

Skoro podjąłem temat w toku, czy mógłbyś podzielić się najnowszą wersją swojego kodu?

Właśnie ponownie zrobiłem test i to nie działa, już nic nie rozumiem haha!!
Oto kod

Option Explicit

Public Enum swDocumentTypes_e
    swDocNONE = 0       ' Used to be TYPE_NONE

    swDocPART = 1       ' Used to be TYPE_PART

    swDocASSEMBLY = 2   ' Used to be TYPE_ASSEMBLY

    swDocDRAWING = 3    ' Used to be TYPE_DRAWING
End Enum
 
Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim swDraw                      As SldWorks.DrawingDoc
Dim swView                      As SldWorks.View
Dim swConfig                    As SldWorks.Configuration

Dim vSheetNameArr               As Variant
Dim vSheetName                  As Variant

Dim I                           As Long
Dim nDocType                    As Long
Dim op                          As Long
Dim suppr                       As Long
Dim lErrors                     As Long
Dim lWarnings                   As Long

Dim boolstatus                  As Boolean
Dim bRet                        As Boolean
Dim FileConnu                   As Boolean

Dim nbConnu                     As Integer

Dim sModelName                  As String
Dim sPathName                   As String
Dim TabConnu(10000)             As String
Dim sConfigName                 As String

Const dxfSubFolder As String = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepSubFolder As String = "\step"


Sub Main()

Set swApp = Application.SldWorks

boolstatus = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Force la version AP214
boolstatus = swApp.SetUserPreferenceIntegerValue(swStepExportPreference, swAcisOutputGeometryPreference_e.swAcisOutputAsSolidAndSurface) 'Force l'export en format Solid/Surface Geometry

Set swModel = swApp.ActiveDoc
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en PDF
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".dwg", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en DWG


Call ExportStep ' Appelle le programe d'export STEP


End Sub

Function GetFilename(strPath As String) As String
Dim strTemp As String
strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)


End Function
Sub ExportStep()                ' Vérification si c'est une piece ou un assemblage
Set swDraw = swModel
vSheetName = swDraw.GetSheetNames
vSheetNameArr = swDraw.GetSheetNames

For Each vSheetName In vSheetNameArr
        
    bRet = swDraw.ActivateSheet(vSheetName): Debug.Assert bRet
    Set swView = swDraw.GetFirstView 'Sélectionne le fond de plan
    Set swView = swView.GetNextView  'Passe à la vue suivante pour exclure le fond de plan
                
    While Not swView Is Nothing
           
        ' Determine si la vue est une pieces ou un assemblage

        sModelName = swView.GetReferencedModelName

        sModelName = LCase(sModelName)
                        
        sConfigName = swView.ReferencedConfiguration
        
        FileConnu = False
        
        If InStr(sModelName, "sldprt") > 0 Then
            nDocType = swDocPART
        ElseIf InStr(sModelName, "slasm") > 0 Then
            nDocType = swDocASSEMBLY
        Else
            nDocType = swDocNONE
            Exit Sub
        End If
                       
        If nDocType = 1 Then
            For I = 1 To nbConnu
                If UCase(sModelName) & " - " & UCase(sConfigName) = TabConnu(I) Then
                    FileConnu = True
                End If
            Next
            If Not FileConnu Then
                nbConnu = nbConnu + 1
                TabConnu(nbConnu) = UCase(sModelName) & " - " & UCase(sConfigName)
                Call Export
            End If
        End If
        
        Set swView = swView.GetNextView
    Wend

Next vSheetName

End Sub
Sub Export()

Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors)
Set swModel = swApp.ActiveDoc
boolstatus = swModel.ShowConfiguration2(sConfigName)
Set swConfig = swModel.GetActiveConfiguration
sPathName = swModel.GetPathName & ".step"
If Dir(sPathName, vbHidden) <> "" Then                                                                'Test l'existence du fichier
    suppr = MsgBox("Le fichier " & sPathName & " existe déjà, voulez vous le supprimer?", vbYesNo)    'Message utilisateur confirmation de suppression oui/non
        If suppr = vbYes Then                                                                         'Réponse Oui
            Kill (sPathName)                                                                          'Suppression du fichier existant
            swModel.SaveAs2 sPathName, 0, True, False                                                 'Enregistrement du fichier
            op = MsgBox("Le fichier a été enregistré sous " & sPathName & vbNewLine)
            Else                                                                                      'Réponse NON
        MsgBox ("Fichier conservé")                                                                   'Message utilisateur
        End If
        Else
        swModel.SaveAs2 sPathName, 0, True, False                                                     'Enregistrement du fichier
        op = MsgBox("Le fichier a été enregistré sous " & sPathName)                                  'Message utilisateur
    End If
swApp.CloseDoc (sModelName)
Set swModel = swApp.ActiveDoc
End Sub

@Antoine_Ruelle ;

Spróbuj zidentyfikować pliki, na których makro nie działa (zwłaszcza jeśli są zawsze takie same):

Kilka dróg:
Obraz 3D i układ nie znajdują się w tym samym katalogu.
3D i blueprint nie mają dokładnie tej samej nazwy.
Jedna z właściwości, których szuka makro, nie istnieje.
Pliki docelowe (pdf/dwg i/lub STEP) są już otwarte lub tylko do odczytu...
Nazwy plików i/lub katalogów zawierają znaki specjalne (akcenty, kropki,...)

Uważaj również, makra są wrażliwe na PRZERWY... tj. (podsumowując) rozróżniają małe i wielkie litery), dotyczy to nazw plików, ale także rozszerzeń.

idealnym rozwiązaniem jest przeglądanie makra w trybach krok po kroku (F8), z widocznym oknem zmiennych lokalnych,
i ewentualnie najedź myszką na zmienne w wierszach kodu, aby sprawdzić, czy pobierają żądane od nich dane.
(szczególnie w węźle "debug" na punktach przerwania...

Pytanie pomocnicze, jak rozpocząć realizację makro? przycisk w solidworks lub za pomocą odtwarzania bezpośrednio w edytorze VBA? Czy zawsze zaczynasz makro od rutyny "Głównej"?

Pozdrowienia.

2 polubienia

Cóż, szukałem, ale brakowało mi wielu rzeczy, między innymi do tworzenia podfolderów.
@Antoine_Ruelle , przetestowałeś kod zaproponowany przez @sbadenis (4. odpowiedź), który moim zdaniem był całkowicie funkcjonalny?

1 polubienie

@Cyril_f

W Solidworks 2022 makro @sbadenis działa doskonale... Dom.

Pozdrowienia.

2 polubienia

Tak i pominąłem wiadomość, ale kiedy pytam, czy to działa, odpowiadasz mi poprzednim makrem z poprawkami.
Weź najnowszą wersję, jak wskazano w @Cyril_f i @Maclane i powinna działać.
Z drugiej strony, nie masz pewności, czy kod jest zoptymalizowany, robi się to w pośpiechu od tego z @Cyril_f .

Zawsze testowałem na tym samym pliku. rysunek czapki.
Rysunek znajduje się w innym folderze niż części, ale pliki mają tę samą nazwę.

Przyjrzałem się już kodowi, robiąc to krok po kroku, a ponieważ nie znam się na nim zbyt wiele, nie wiem, jak poprawnie zidentyfikować problemy.

Aby uruchomić makro, zrobiłem przycisk i próbowałem również z odtwarzania.

Tak dla podfolderów, na razie nic nie zrobiłem, tylko wkleiłem 3 zmienne do zdefiniowania.
Ponieważ staram się, aby kod działał za każdym razem. Wziąłem podstawowy kod bez wprowadzania żadnych zmian, z wyjątkiem usunięcia poprawki w nazwie pliku.

Raz zadziałało, usunąłem wygenerowane pliki i uruchomiłem od nowa i tam pojawił się błąd poniżej
image

I nie, nie testowałem jeszcze kodu 4. odpowiedzi @Cyril_f

Właśnie znalazłem błąd, mój przycisk do uruchamiania makra był źle skonfigurowany, działa dobrze

Dobra wiadomość.
Wszystko, co pozostaje, to zatwierdzić " Najlepszą odpowiedź ", aby zamknąć tę dyskusję.
image

I do zobaczenia wkrótce, aby zobaczyć nowe makra...
W międzyczasie radzę zajrzeć na różne strony (nie zawsze po francusku -Visual Basic- zobowiązuje), ale często dydaktyczne, aby rozpocząć naukę programowania:


Pozdrowienia.

2 polubienia

A także uruchomić makra z edytora, aby uruchomić właściwy! :crazy_face:
A kiedy to zadziała, możesz utworzyć przycisk.