Witam
Dla mnie działa to bardzo dobrze, pod warunkiem, że zmienię ścieżkę do pliku do otwarcia ("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\samples\tutorial\advdrawings\handle.sldasm"), który nie istnieje na moim komputerze i zastąpię go prawidłową ścieżką.
Pozdrowienia
Tak, zmieniłem ścieżkę
ale wyświetla mi błąd "błąd wykonania '91': Zmienna obiektu lub Z zmienną blokową nie jest zdefiniowany", gdy wykonuję debugowanie tego, ale na "Ustaw swModelDocExt = swModelDoc.Extension" na początku programu
Z drugiej strony skopiowałem kod do pliku . SWP i ja uruchamiamy makro z solidworks, nie widzę dlaczego to nie działa.
Czy nie będę miał brakującego odniesienia do biblioteki?
Witam
Nie. Jeśli brakuje odwołania, wystąpi błąd innego typu.
Wydaje mi się, że masz błąd ścieżki, prawej lub tylko do odczytu. A twój obiekt swModelDoc powinien pozostać pusty. Spróbuj krok po kroku sprawdzić wartość swojego przedmiotu.
Dokładnie tak zrobiłem i mam te same referencje co Ty (do wersji SW gotowej).
Czy masz pewność, że wprowadzone ścieżki i nazwy zestawów są prawidłowe?
Aby sprawdzić, czy pochodzi stamtąd, zastąp wiersze:
openFile = "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\samples\tutorial\advdrawings\handle.sldasm"
Ustaw swModelDoc = swApp.OpenDoc6(openFile, swDocASSEMBLY, swOpenDocOptions_Silent, "", błędy, ostrzeżenia)
przez:
Ustaw swModelDoc = swApp.ActiveDoc
, a następnie otwiera zespół przed uruchomieniem makra.
Małe pytanie też, czy jest to zestaw, który umieszczasz jako plik w ścieżce?
Jeszcze jedno pytanie, czy umieściłeś rozszerzenie swojego zestawu w nazwie pliku, nawet jeśli nie jest ono wyświetlane w Eksploratorze Windows (.sldasm)?
to działa, musiałem popełnić błąd w kopii ścieżki.
Chciałbym dodać funkcję do "PackAndGo", zmienić nazwy wszystkich plików, które zawierają "XXXXX" i zmienić ich nazwy na numer 44444 (precyzja, że XXXXX nie jest w sufiksie ani prefiksie)
tak, jest to zestaw w pliku ścieżki z nazwą rozszerzenia
Spróbuj czegoś takiego:
' Verify document paths and filenames after adding prefix and suffix
ReDim pgGetFileNames(namesCount - 1)
ReDim pgDocumentStatus(namesCount - 1)
status = swPackAndGo.GetDocumentSaveToNames(pgGetFileNames, pgDocumentStatus)
For i = 0 To (namesCount - 1)
If Instr(pgGetFileNames(i), "XXXXXX") <> 0 Then
pgGetFileNames(i) = Replace(pgGetFileNames(i), "XXXXX", "444444")
End If
Next i
Czy to nie działa?
Muszę to umieścić czy w kodzie? Umieściłem to na końcu w ten sposób
'[.....]
' Add a prefix and suffix to the new Pack and Go filenames-------------------- (Aplatissez la structure de dossiers Pack and Go; enregistrer tous les fichiers dans le répertoire racine)
swPackAndGo.AddPrefix = "SW_"
swPackAndGo.AddSuffix = "_PackAndGo"
' Verify document paths and filenames after adding prefix and suffix----------------- (Aplatissez la structure de dossiers Pack and Go; enregistrer tous les fichiers dans le répertoire racine)
ReDim pgGetFileNames(namesCount - 1)
ReDim pgDocumentStatus(namesCount - 1)
status = swPackAndGo.GetDocumentSaveToNames(pgGetFileNames, pgDocumentStatus)
For i = 0 To (namesCount - 1)
If InStr(pgGetFileNames(i), "xxxxx") <> 0 Then
pgGetFileNames(i) = Replace(pgGetFileNames(i), "xxxxx", "yyyyy")
End If
Next i
' Verify document paths and filenames after adding prefix and suffix------------------ (Vérifier les chemins d'accès aux documents et les noms de fichiers après avoir ajouté un préfixe et un suffixe)
ReDim pgGetFileNames(namesCount - 1)
ReDim pgDocumentStatus(namesCount - 1)
status = swPackAndGo.GetDocumentSaveToNames(pgGetFileNames, pgDocumentStatus)
Debug.Print ""
Debug.Print " My Pack and Go path and filenames after adding prefix and suffix: "
For i = 0 To (namesCount - 1)
Debug.Print " My path and filename is: " & pgGetFileNames(i)
Next i
' Pack and Go
statuses = swModelDocExt.SavePackAndGo(swPackAndGo)
End Sub
Nie wystarczy wklejać jeden fragment kodu po drugim. Musisz spróbować trochę zrozumieć...
swPackAndGo.AddPrefix = "SW_"
swPackAndGo.AddSuffix = "_PackAndGo"
Dodaje prefiks i sufiks. Ponieważ nie zmieniłeś wartości, wątpię, że tego potrzebujesz. Możesz go usunąć.
ReDim pgGetFileNames(namesCount - 1)
ReDim pgDocumentStatus(namesCount - 1)
status = swPackAndGo.GetDocumentSaveToNames(pgGetFileNames, pgDocumentStatus)
Debug.Print ""
Debug.Print " My Pack and Go path and filenames after adding prefix and suffix: "
For i = 0 To (namesCount - 1)
Debug.Print " My path and filename is: " & pgGetFileNames(i)
Next i
Spowoduje to wyświetlenie tylko ostatecznych nazw dokumentów w debugerze. Nie sądzę, żebyś tego potrzebował.
Wykonaj test krok po kroku, aby sprawdzić, czy nazwy plików zmieniają się poprawnie.
Oto fragment funkcjonalnego makra i czyste wyświetlacze w debuggerze:
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModelDoc As SldWorks.ModelDoc2
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim swPackAndGo As SldWorks.PackAndGo
Dim openFile As String
Dim pgFileNames As Variant
Dim pgFileStatus As Variant
Dim pgGetFileNames As Variant
Dim pgDocumentStatus As Variant
Dim status As Boolean
Dim warnings As Long
Dim errors As Long
Dim i As Long
Dim namesCount As Long
Dim myPath As String
Dim statuses As Variant
Sub main()
Set swApp = Application.SldWorks
' Open assembly
openFile = "C:\Users\DRO\Desktop\Nouveau dossier\Assemblage1.SLDASM"
Set swModelDoc = swApp.OpenDoc6(openFile, swDocASSEMBLY, swOpenDocOptions_Silent, "", errors, warnings)
'Set swModelDoc = swApp.ActiveDoc
Set swModelDocExt = swModelDoc.Extension
' Get Pack and Go object
Set swPackAndGo = swModelDocExt.GetPackAndGo
' Get number of documents in assembly
namesCount = swPackAndGo.GetDocumentNamesCount
' Include any drawings, SOLIDWORKS Simulation results, and SOLIDWORKS Toolbox components
swPackAndGo.IncludeDrawings = True
swPackAndGo.IncludeSimulationResults = True
swPackAndGo.IncludeToolboxComponents = True
' Get current paths and filenames of the assembly's documents
'status = swPackAndGo.GetDocumentNames(pgFileNames)
' Get current save-to paths and filenames of the assembly's documents
status = swPackAndGo.GetDocumentSaveToNames(pgFileNames, pgFileStatus)
' Set document paths and names for Pack and Go
For i = 0 To (namesCount - 1)
If InStr(pgFileNames(i), "XXXXX") <> 0 Then
pgFileNames(i) = Replace(pgFileNames(i), "XXXXX", "44444")
End If
Next i
status = swPackAndGo.SetDocumentSaveToNames(pgFileNames)
' Set folder where to save the files
myPath = "C:\Users\DRO\Desktop\Temp PDF\"
status = swPackAndGo.SetSaveToName(True, myPath)
' Flatten the Pack and Go folder structure; save all files to the root directory
swPackAndGo.FlattenToSingleFolder = True
' Add a prefix and suffix to the new Pack and Go filenames
swPackAndGo.AddPrefix = "SW_"
swPackAndGo.AddSuffix = "_PackAndGo"
' Pack and Go
statuses = swModelDocExt.SavePackAndGo(swPackAndGo)
End Sub
Uważaj, aby nie zapomnieć o linii:
status = swPackAndGo.SetDocumentSaveToNames(pgFileNames)
po pętli, aby zmienić nazwy plików, w tym "XXXXX", w przeciwnym razie PackAndGo nie uwzględni modyfikacji.
Pozdrowienia
Witam, po wypróbowaniu czystego makra nie zmienia nazwy pliku
Dołączam ASM do testów, aby sprawdzić, czy działa dla Ciebie
xxxxx.zip
Witam
po przetestowaniu mojego makra na twoim zestawie, działa to poprzez umieszczenie serii X małymi literami (x).
Pozdrowienia
Próbowałem kilka razy , ale nie myślałem o tym. Dziękuję
Z drugiej strony, nie zmienia to nazwy planów, które są z moim zespołem i moimi częściami? Masz pomysł?
Witam
Nie, nie zmienia to nazwy planu, ponieważ plik planu nie jest, ściśle mówiąc , częścią listy plików PackAndGo, a jedynie jest osadzony za pomocą znacznika wyboru funkcji. Możesz jednak w swoim planie makr zmienić nazwy wszystkich odpowiednich planów, po funkcji PackAndGo, za pomocą standardowych funkcji zarządzania plikami VBA, informacje na ten temat znajdziesz TUTAJ.
Pozdrowienia
Dziękuję bardzo, poradziłem sobie z tym zewnętrznym zarządzaniem w Solidworks.
Mam ostatnie pytanie, czy jest możliwość wykluczenia w makrze PackAndGo plików, które nie mają w nazwie pliku 'XXXXX'
Witam
Spróbuj, wpisując :
For i = 0 To (namesCount - 1)
If InStr(pgFileNames(i), "xxxxx") <> 0 Then
pgFileNames(i) = Replace(pgFileNames(i), "xxxxx", "44444")
Else
pgFileNames(i) = ""
End If
Next i
status = swPackAndGo.SetDocumentSaveToNames(pgFileNames)
Pozdrowienia