W jaki sposób najlepsza odpowiedź na Twój drugi post nie rozwiązuje Twojego problemu?
Uważaj na subtelność:
Pobierz najnowszą wersję (w tym dzieci w przyszłej wersji)
i:
Pobierz wersję powykonawczą (taką samą dla dzieci)
Kiedy patrzymy na zadania EPDM, ten parametr jest tam i często ustawiamy go na "jak zbudowane"
Przykład:
ASM = wersja 3/3
PRT1 = 5/5
PRT2 = 9/9
Jeśli usługa ASM została skompilowana przy użyciu
PRT1 = 4/5
PRT2 = 7/9
Jeśli zrobisz "pobierz najnowszą wersję", zajmie Ci to:
ASM = 3/3
PRT1 = 5/5
PRT2 = 9/9
więc nie znajdziesz się w "As Built"!
Witam
Należy użyć funkcji Getfile metody IedmFile
I potencjalnie sprawdź wcześniej liczbę wersji, aby wiedzieć, którą z nich otworzyć.
Odpowiadam Ci tutaj, ponieważ w innym temacie zostanie to stracone dla tej konkretnej potrzeby.
Poniżej znajduje się metoda GetFile podana przez pomoc API PDM 2009 w języku vba
Private Sub GetMyFile(vault As EdmVault5)
On Error GoTo ErrHand
Dim folder As IEdmFolder5
Set folder = vault.RootFolder
Dim file As IEdmFile5
Set file = folder.GetFile("MyFile.txt")
file.GetFileCopy Me.hWnd, 0, folder.ID
Exit Sub
ErrHand:
Dim ename As String
Dim edesc As String
vault.GetErrorString Err.Number, ename, edesc
MsgBox ename + vbLf + edesc
End Sub
KVuilleumier , ponieważ jest to dobra odpowiedź, ale to nie rozwiązuje mojego problemu, błąd nadal występuje.
olivier42 Teraz rozumiem subtelność, ale moje elementy nie są w zespole, tylko otwieram części. Ponadto części te są umieszczane w sejfie właśnie po to, aby uniknąć nowych modyfikacji, ponieważ są to standardy. Jeśli któregoś dnia nastąpią potencjalne zmiany związane z nowymi środkami produkcji, będzie to musiało zostać zatwierdzone przez kierownictwo i dopiero wtedy zmiany zostaną wprowadzone. I będą one musiały zostać przeniesione do wszystkich plików przy użyciu tych części (jeśli takie istnieją).
Te części znajdują się w skarbcu, ponieważ są produkowane, więc chcemy je śledzić, ale nie modyfikować. Jednak moi koledzy mogą je przejrzeć i zrobić z nich kopię, aby stworzyć produkt, który nazywamy "specjalnym", ale w tym przypadku będzie to nowy plik.
Cyril.f Już myślę o użyciu tej funkcji przez ten wiersz:
Set File = Vault.GetFileFromPath("C:\SOLIDWORKS Data\Schaublin_RODS\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5", Folder)
Myślę, że mój problem polega na tym, że kiedy otwierasz część lub nawet przeglądasz ją w eksploratorze EPDM MUSISZ załadować "najnowszą wersję, aby umieścić ją w pamięci podręcznej. Ale w moim przypadku nikt fizycznie nie klika na plik, aby go załadować, ponieważ jest to makro, więc w mojej pamięci podręcznej nie mam żadnej wersji, więc dla niego to nie istnieje.
Tęsknisz za tym: odejdź. Pobieranie pliku Kopiuj
Fragment kodu, który umieściłem, zawiera wszystko, co potrzebne do użycia tej funkcji z metody getFileFromPath.
Jeśli dobrze rozumiem, muszę stworzyć nową funkcję, w której muszę napisać wskazany przez Ciebie kod, a następnie wywołać tę funkcję tuż przed otwarciem mojego pokoju?
Ale kiedy mam podać ścieżkę (lokalizację) mojego pliku lub folderu? Zamiast MyFile.txt?
Redagować:
Sub GetMyFile(vault As EdmVault5)
On Error GoTo ErrHand
Dim folder As IEdmFolder5
Set folder = vault.GetFolderFromPath("C:\SOLIDWORKS Data\Mon_coffre\04-Dessins Solidworks\01-Dessins pieces\80-\80-5")
Dim file As IEdmFile5
Set file = folder.GetFile("CAO_W25_80-5")
file.GetFileCopy Me.HWnd, 0, folder.ID
Exit Sub
ErrHand:
Dim ename As String
Dim edesc As String
vault.GetErrorString Err.Number, ename, edesc
MsgBox ename + vbLf + edesc
End Sub
Napisałem to dla siebie, to po prostu, prawda?
Edycja bis:
Kiedy uruchamiam makro, zatrzymuje się ono na Me.Hwnd i pojawia się błąd "Nie znaleziono metody ". Czy jest jakieś odniesienie do dodania?
Dodano plik. GetFileCopy 0, 0, folder.ID w pliku Set. Z drugiej strony musisz pobrać identyfikator folderu, w którym znajduje się plik.
Ustaw folder = vault.getfolderfrompath(C:\xxx")
Właśnie dostałem ten sam komunikat o błędzie co ty, spróbuj dodać rozszerzenie do swojej nazwy pliku (częściowo .sldprt).
Pozdrowienia
Przede wszystkim dziękujemy za zainteresowanie tym wpisem!
Dodałem więc rozszerzenie mojego pliku (.sldprt) Dodałem też to, o czym mówi Cyryl.f
W końcu dostaję ten kod
Private Sub CBox_etat_Click()
'Déclaration des varaibles nécessaires
Dim Part As SldWorks.ModelDoc2
Dim boolstatus As Boolean
Dim longstatus As Long
Dim longwarnings As Long
Dim swModel As ModelDoc2
Dim swDesignTable As SldWorks.DesignTable
Dim xlWS As Worksheet
Dim DebutDesignation As Range
Dim r As Range
Dim Vault As New EdmVault5
Dim File As IEdmFile5
Dim Folder As IEdmFolder5
Vault.LoginAuto "Schaublin_RODS", 0
If Info_general.CBox_type.Value = ("Pince W25") Then
'Ouverture du fichier correspond au besoin choisi dans la liste
'Chemin à changer lors du changement d'emplacement des fichiers EXEMPLE : Lors de l'insertion dans l'ePDM
If CBox_etat.Value = ("Pince finie") Then
Set Folder = Vault.GetFolderFromPath("C:\SOLIDWORKS Data\BE\04-Dessins Solidworks\01-Dessins pieces\80-\80-5")
Set File = Vault.GetFileFromPath("C:\SOLIDWORKS Data\BE\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT", Folder)
File.GetFileCopy 0, 0, Folder.ID
Set Part = swApp.OpenDoc6("C:\SOLIDWORKS Data\BE\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT", 1, 0, "", longstatus, longwarnings)
swApp.ActivateDoc2 "CAO_W25_80-5", False, longstatus
'Activation du modèle ouvert, nécessaire pour accéder à la famille de pièces
Set swModel = swApp.ActiveDoc
'Récupération de la famille de pièces
Set swDesignTable = swModel.GetDesignTable()
'Si récupération correcte de la famille de pièces
If Not swDesignTable Is Nothing Then
To działa... ale tylko na moim poście (z różnymi sesjami EPDM). Więc tego się obawiałem, to makro działa z dokumentami z mojej lokalnej pamięci podręcznej. Wynika to z wiersza File.GetFileCopy 0, 0, Folder.ID prawda?
Edit: Z drugiej strony d.roger w swoim kodzie (w drugim poście) używasz
Set Part = swApp.OpenDoc6(Folder.LocalPath & "/" & File.Name, 1, 2, "", longstatus, longwarnings)
A nie ścieżka do pliku, czy to normalne?
Folder.LocalPath to nazwa folderu pobranego przez GetFileFromPath, a File.Name to nazwa pliku: po prostu oszczędza mi to kopiowania i wklejania, a dla moich testów miałem tylko jedną linię do zmiany, zwykle nie ma to wpływu. Z tego samego powodu w wierszu swApp.ActivateDoc2 File.Name, False, longstatus umieściłem File.Name zamiast nazwy pliku.
Dla wiersza File.GetFileCopy 0, 0, Folder.ID możesz spróbować z File.GetFileCopy HWnd, 0, Folder.ID
Właśnie przymierzyłem inny post i wszystko działa cuda.....
W porządku, dodałem HWnd, ale to nic nie zmienia, nie mogę uruchomić mojego makra na innym komputerze.
Zawsze utknie na tej samej linii. Czy musisz definiować HWnd jako Long?
Edycja: w linii
Set Part = swApp.OpenDoc6("C:\SOLIDWORKS Data\Mon_coffre\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT", 1, 0, "", longstatus, longwarnings)
Stawiasz ,1,2, jaką to robi różnicę? Stp
1 mówi, że jest to sldprt, 2, aby otworzyć go w trybie tylko do odczytu.
Czy ścieżka do pliku jest taka sama na każdym komputerze?
"C:\SOLIDWORKS Data\Mon_coffre\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT"
Tak, jest to ta sama ścieżka dla każdej pozycji. Wstawię mój kod z powrotem, jeśli poślizgnąłem się błąd podczas modyfikowania
Private Sub CBox_etat_Click()
'Déclaration des varaibles nécessaires
Dim Part As SldWorks.ModelDoc2
Dim boolstatus As Boolean
Dim longstatus As Long
Dim longwarnings As Long
Dim swModel As ModelDoc2
Dim swDesignTable As SldWorks.DesignTable
Dim xlWS As Worksheet
Dim DebutDesignation As Range
Dim r As Range
Dim Vault As New EdmVault5
Dim File As IEdmFile5
Dim Folder As IEdmFolder5
Dim HWnd As Long
Vault.LoginAuto "BE", 0
If Info_general.CBox_type.Value = ("Pince W25") Then
'Ouverture du fichier correspond au besoin choisi dans la liste
'Chemin à changer lors du changement d'emplacement des fichiers EXEMPLE : Lors de l'insertion dans l'ePDM
If CBox_etat.Value = ("Pince finie") Then
Set File = Vault.GetFileFromPath("C:\SOLIDWORKS Data\BE\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT", Folder)
Set Folder = Vault.GetFolderFromPath("C:\SOLIDWORKS Data\BE\04-Dessins Solidworks\01-Dessins pieces\80-\80-5")
File.GetFileCopy HWnd, 0, Folder.ID
Set Part = swApp.OpenDoc6("C:\SOLIDWORKS Data\BE\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT", 1, 0, "", longstatus, longwarnings)
swApp.ActivateDoc2 "CAO_W25_80-5", False, longstatus
'Activation du modèle ouvert, nécessaire pour accéder à la famille de pièces
Set swModel = swApp.ActiveDoc
'Récupération de la famille de pièces
Set swDesignTable = swModel.GetDesignTable()
'Si récupération correcte de la famille de pièces
If Not swDesignTable Is Nothing Then
'Récupération de la feuille excel
Set xlWS = swDesignTable.EditTable2(False)
Szczerze mówiąc trochę tracę nadzieję, bo mam wrażenie, że oprócz tego, że działa tylko na moim komputerze, to tylko "ładuje" plik, ale nie powiązane z nim rysunki.
To normalne, że ładuje tylko plik, a nie rysunki, musisz również pobrać rysunki, aby mieć je lokalnie. Jeśli masz kilka plików do umieszczenia lokalnie, lepiej użyć funkcji CreateUtility(EdmUtility).EdmUtil_BatchGet), ale tutaj, w VBA, może to być trochę trudniejsze. Oto przykład w języku C# jako załącznik.
Uważaj, to tylko przykład odpowiadający potrzebie, którą miałem!!
fonction_lastversion.txt
Dobry wieczór
Rzeczywiście, ładuje tylko wywołany plik. W vba musisz połączyć kilka działań, aby odzyskać rodziców i dzieci pliku (w zależności od typu pliku). GetNextChild lub GetNextParent w pomocy interfejsu API.
O ile mi wiadomo, partia proponowana przez d.rogera nie nadaje się do użytku z vba. Tylko C# i VB.Net
Jestem bardzo rozczarowany, bo myślę, że jestem bardzo blisko rozwiązania, ale nie zostało mi dużo czasu, aby poświęcić się temu makro, bo muszę iść dalej...
Zwłaszcza, że d.roger mówisz, że działa na kilku stacjach roboczych z tym kodem? Ścieżka do pliku : C:\SOLIDWORKS Data\Mon_coffre\04-Solidworks Drawings\01-Drawings pieces\80-\80-5\CAO_W25_80-5.SLDPRT, ponieważ jest to ścieżka, którą znajduję w eksploratorze (znajduję tę samą na innych stacjach roboczych), ale wydaje mi się dziwne, że znajduje się na dysku lokalnym. Może zmieniłeś ścieżki?
Już nie wiem co robić...
Edycja: d.roger czy mógłbyś umieścić cały kod, którego użyłeś, kiedy powiedziałeś, że działa cuda?
Witam
Oto kod testowy, który działa dla mnie idealnie:
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
Dim Vault jako nowy EdmVault5
Przyciemnij plik jako IEdmFile5
Przyciemnij folder jako IEdmFolder5
Vault.LoginAuto "Coffre_BE", 0
Set File = Vault.GetFileFromPath("C:\Coffre_BE\TEST\0088880001.SLDPRT", Folder)
Ustaw część = swApp.OpenDoc6(Folder.LocalPath & "/" & File.Name, 1, 2, "", longstatus, longwarnings)
swApp.ActivateDoc2 File.Name, Fałsz, longstatus
Ustaw swModel = swApp.ActiveDoc
swModel.ViewZoomtofit2
Koniec subwoofera
W przypadku ścieżki pliku normalne jest, że jest ona podobna do pliku lokalnego, ponieważ jest to plik z lokalnego widoku repozytorium, jestem po prostu zaskoczony, że ten widok znajduje się w danych SOLIDWORKS.
Aby skompensować ewentualną różnicę w położeniu widoku repozytorium między różnymi pikietami, można rozpocząć od kodu, wyszukać widok repozytorium, a następnie wywołać ścieżkę pliku zaczynającą się od Vault.rootfolder.localpath, na przykład:
Skarbiec1. FolderGłówny.Ścieżka_lokalna + \TEST\0088880001.SLDPRT"
przykład znajdowania widoków repozytorium w języku C#, a następnie nawiązywania połączenia:
vault1 = nowy EdmVault5();
IEdmVault8 vault = (IEdmVault8)skarbiec1;
EdmViewInfo[] Widoki = null;
Sklepienie. GetVaultViews(out Views, false);
comboBox1.Items.Clear();
foreach (EdmViewInfo View w widokach)
{
comboBox1.Items.Add(View.mbsVaultName);
}
if (comboBox1.Items.Count > 0)
{
comboBox1.Text = (ciąg)comboBox1.Items[0];
}
if (!vault1. IsLoggedIn)
{
Skarbiec1. LoginAuto(comboBox1.Text, ten. Uchwyt.ToInt32());
}
Pozdrowienia
Witam
W swoim kodzie możesz usunąć GetFolderFromPatch, ponieważ otrzymasz go w GetFileFromPath (już zmniejszy to przetwarzanie i pozwoli uniknąć błędów kopiowania/wklejania).
Czy w ustawieniach repozytorium wszyscy użytkownicy mają dostęp do tego folderu? Czy nie masz dodatkowych uprawnień, które sprawiają, że działa to na Twoim stanowisku, a nie na kimś innym?
Szczerze dziękuję, bardzo dziękuję szczególnie d.rogerowi i Cyril.f za zainteresowanie i pomoc udzieloną temu postowi!
Problem był dość prosty, jak w większości przypadków! Dzieje się tak po przeczytaniu odpowiedzi Cyril.f pytającego, czy ścieżki są identyczne na wszystkich stacjach roboczych i d.rogera zastanawiającego się nad obecnością folderu SOLIDWORKS Data w ścieżce.
Rzeczywiście, na moim komputerze widok bagażnika nie został zainstalowany w tym samym miejscu, co na innych komputerach. Nie powinnam była ufać...
Jeszcze raz dziękuję i do zobaczenia wkrótce na inne zawiłe, ale interesujące pytania!