Ulepszenie makr PDF

Witam

Aby kontynuować temat makra PDF (http://www.lynkoa.com/forum/cao/macro-d-enregistrement-pdf-dans-dossier-actuel#answer-617678), chciałbym teraz poprawić "błąd", który nie blokuje korzystania z makra, ale na dłuższą metę jest nieco irytujący.

 Kiedy plan .PDF jest otwierany na warsztacie w celu konsultacji i muszę wprowadzić zmianę. na tej samej płaszczyźnie bezpośrednio w Solidworks, a ja używam tego makra PDF, Solidworks ulega awarii i zamyka się, ponieważ nie może nadpisać pliku PDF, ponieważ jest już otwarty.

Jednak gdy próbuję zapisać plan, .PDF za pomocą "Plik"-"Zapisz sous-.PDF", pojawia się komunikat "Ten plik jest tylko do odczytu", co pozwala Solidworks uniknąć awarii.

Czy byłoby możliwe pobranie linii kodu w moim makrze, która pozwoliłaby mi na wyświetlenie tego komunikatu, gdy plik jest już otwarty, i nie spowodowałoby awarii Solidworks?

Oto makro, które zaproponował mi .PL (jeszcze raz dziękuję!):

 

Sub main()

Ustaw swApp = Application.SldWorks

Ustaw część = swApp.ActiveDoc

Pobiera pełną ścieżkę bieżącego dokumentu, w tym nazwę pliku:
PathName = UCase(Part.GetPathName)


Przyciemnij myModelView jako obiekt
Ustaw myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Part.EditRebuild3()
Part.ViewZoomtofit2
Part.ViewZoomtofit2
Part.ViewZoomtofit2
longstatus = Part.SaveAs3(Replace(UCase(NazwaŚcieżki), "SLDDRW", "PDF"), 0, 0)
Koniec subwoofera

 

Z góry dziękuję za pomoc,

Pozdrowienia

Allan.

Witam

Musisz sprawdzić, czy plik jest otwarty, aby utworzyć ostrzeżenie msgbox.

Zobacz tę stronę :

https://support.microsoft.com/en-us/kb/153058

A oto kod:

Sub main()
Ustaw swApp = Application.SldWorks
Ustaw część = swApp.ActiveDoc
Pobiera pełną ścieżkę bieżącego dokumentu, w tym nazwę pliku:
PathName = UCase(Part.GetPathName)
Przyciemnij myModelView jako obiekt
Ustaw myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Part.EditRebuild3()
Part.ViewZoomtofit2
Part.ViewZoomtofit2
Part.ViewZoomtofit2
    Jeśli GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF") i vbReadOnly to
        MsgBox "Plik tylko do odczytu"
    Inaczej
        longstatus = Part.SaveAs3(Replace(UCase(NazwaŚcieżki), "SLDDRW", "PDF"), 0, 0)
    Zakończ jeżeli:
Koniec subwoofera

 

 

1 polubienie

Witam

Oto ten, którego używamy, zapisuje plik wraz ze swoją nazwą w folderze rysunku.


macro_pdf.swp

Bardzo dziękuję za odpowiedź .PL, jednak makro nie działa, najwyraźniej jest problem z tą linią: Jeśli GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF") I vbReadOnly Then

Patrząc na link, który mi również podałeś, zobaczyłem, że powinien być punkt przed ReadOnly, ale próbowałem go dodać i nic to nie zmieniło.

Z góry dziękuję i przepraszam za moją całkowitą ignorancję w kodyfikacji VBA...

Brakowało nawiasu między GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF") i AND,

Oto nowy kod:

 

Usuwanie kodu

Zmodyfikowałem kod na wypadek, gdyby plik PDF nie istniał, oto on:

Sub main()
Ustaw swApp = Application.SldWorks
Ustaw część = swApp.ActiveDoc
Pobiera pełną ścieżkę bieżącego dokumentu, w tym nazwę pliku:
PathName = UCase(Part.GetPathName)
Przyciemnij myModelView jako obiekt
Ustaw myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Part.EditRebuild3()
Part.ViewZoomtofit2
Part.ViewZoomtofit2
Part.ViewZoomtofit2

Jeśli Dir(Replace(UCase(PathName), "SLDDRW", "PDF")) <> "" to
    Jeśli GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF")) i vbReadOnly to
        MsgBox "Plik tylko do odczytu"
    Inaczej
        longstatus = Part.SaveAs3(Replace(UCase(NazwaŚcieżki), "SLDDRW", "PDF"), 0, 0)
    Zakończ jeżeli:

Zakończ się, jeśli
Koniec subwoofera

Dziękuję .PL robisz dla mnie wszystko, niestety makro nadal nie działa, w ogóle nic nie generuje.

Staram się robić wszystko, co w mojej mocy, aby nie marnować twojego czasu, więc wróciłem do nawiasów itp., ale nic nie widzę, przepraszam, kod wydaje mi się dobry...

Czy zaszła pomyłka lub nic się nie dzieje?

Przepraszam, mały błąd z mojej strony, nauczy mnie to nie testować wystarczająco!

Teraz powinno się udać!

Sub main()
Ustaw swApp = Application.SldWorks
Ustaw część = swApp.ActiveDoc
Pobiera pełną ścieżkę bieżącego dokumentu, w tym nazwę pliku:
PathName = UCase(Part.GetPathName)
Przyciemnij myModelView jako obiekt
Ustaw myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized
boolstatus = Part.EditRebuild3()
Part.ViewZoomtofit2
Part.ViewZoomtofit2
Part.ViewZoomtofit2

Jeśli Dir(Replace(UCase(PathName), "SLDDRW", "PDF")) <> "" to
    Jeśli GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF")) i vbReadOnly to
        MsgBox "Plik tylko do odczytu"
    Inaczej
        longstatus = Part.SaveAs3(Replace(UCase(NazwaŚcieżki), "SLDDRW", "PDF"), 0, 0)
    Zakończ jeżeli:

    Inaczej
        longstatus = Part.SaveAs3(Replace(UCase(NazwaŚcieżki), "SLDDRW", "PDF"), 0, 0)

Zakończ się, jeśli
Koniec subwoofera

Dziękuję za to nowe makro, rzeczywiście działa, ale pod pewnymi warunkami, i aby rozwiązać ten problem, nie wiem, czy to ja muszę coś naprawić, czy makro można poprawić.

 

Gdy otwieram rysunek i tworzę nowy plik PDF, nie ma żadnego pliku.

Z drugiej strony, gdy próbuję wygenerować plik PDF z rysunku, gdy jest on otwarty, powoduje to awarię Solidworks, tak jak wcześniej.

Ten problem został rozwiązany po otwarciu pliku PDF po zaznaczeniu pola wyboru "Atrybuty: tylko do odczytu" we właściwościach. W tym momencie makro działa i przy próbie wygenerowania pliku PDF pojawia się komunikat "Plik tylko do odczytu". Dopiero po zamknięciu pliku PDF, próbie wygenerowania ponownie, nadal pojawia się komunikat  "Plik tylko do odczytu", tak jakby plik pozostał otwarty, gdy tak nie jest. Udaje mi się przezwyciężyć problem, odznaczając "Atrybuty: Tylko do odczytu" we właściwościach, a następnie PDF chce się zregenerować.

 

Czy to ode mnie zależy, czy ustawię prawa do odczytu/zapisu, czy makro musi zostać zmodyfikowane?

Dziękuję za pomoc.

 

Czy udało Ci się przetestować mój?

Witaj Manu67, nie udało mi się przetestować Twojego makra, ponieważ kiedy klikam w link Twojej odpowiedzi, otwiera mi się nieopisany kod, mam ten sam problem ze wszystkimi linkami do załączników w wiadomości na forum.

Dobry wieczór

O ile się nie mylę, atrybutu tylko do odczytu nie można bezpośrednio wyodrębnić z plików pdf.

Powinniśmy przyjrzeć się funkcjom usuwania plików metody file (patrz: http://warin.developpez.com/access/fichiers/#LI-D-2) i zastosować pożądane traktowanie zgodnie z wynikiem (if error --> Read-only file).

Oto makro, którego używamy:

 

Dim swApp jako SldWorks.SldWorks
Dim swModel As ModelDoc2
Dim lErrors tak długo
Dim lOstrzeżenia tak długo

Sub main()

Ustaw swApp = Application.SldWorks
Ustaw swModel = swApp.ActiveDoc
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & " rev." & swModel.GetCustomInfoValue("", "Revision") & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings

Koniec subwoofera


Funkcja GetFilename(strPath As String) Jako ciąg
    Dim strTemp As String (Ciąg ścisłości)
    strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
    GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)
Zakończ funkcję

Witam

Oto ten, który działa i właśnie go przetestowałem:

Dim swApp jako SldWorks.SldWorks
Dim swModel As ModelDoc2
Dim lErrors tak długo
Dim lOstrzeżenia tak długo

Sub main()

Ustaw swApp = Application.SldWorks
Ustaw swModel = swApp.ActiveDoc
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & " rev." & swModel.GetCustomInfoValue("", "Revision") & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings

Koniec subwoofera

Funkcja GetFilename(strPath As String) Jako ciąg
Dim strTemp As String
strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)
Zakończ funkcję

Witam

 

Mam dokładnie ten sam problem, zamierzam przetestować twoje rozwiązanie, aby zobaczyć, czy działa i chciałbym jeszcze bardziej popchnąć imadło. Po otwarciu planu pdf w Eksploratorze Windows w okienku podglądu kopia zapasowa wygląda dobrze, ale plik pdf jest nieczytelny. Wyjaśnienie?

 

Chodź, przetestuję twoje kody!

Mała informacja zwrotna po testach. 

 

Ze swojej strony kod PL nie działa. 

manu67, nie próbowałem twojego kodu, ponieważ go nie rozumiem (a ponieważ lubię rozumieć, co robię...)

 

Zrobiłem więc rozeznanie i doszedłem do tego:

https://support.microsoft.com/en-us/kb/291295

Aby to uzupełnić (ponieważ błąd problem 75): http://stackoverflow.com/questions/12599322/check-if-a-file-is-already-open-vba

Działa dobrze, wykrywa, czy plik PDF jest otwarty na innym komputerze. Z drugiej strony właśnie zostawiłem otwarte pliki PDF na innej stacji roboczej i nadal informuje mnie, że są otwarte... aby sprawdzić, czy wróci samoistnie, czy jest to spowodowane serwerem....