En quoi la meilleure réponse sur ton autre post ne résoud pas ton problème ?
Attention à la subtilité:
Obtenir dernière version (dont les enfants en version future)
et :
Obtenir la version tel que construite (de même pour les enfants)
Quand on regarde les tâches EPDM, ce paramètre y figure, et on le règle souvent sur "tel que construit"
Exemple :
ASM = version 3/3
PRT1 = 5/5
PRT2 = 9/9
si l'asm a été construit avec
PRT1 = 4/5
PRT2 = 7/9
si tu fais "obtenir derniere version" cela va te prendre :
ASM = 3/3
PRT1 = 5/5
PRT2 = 9/9
donc tu ne sera pas en "tel que construit" !
Bonjour,
Il faut utiliser la fonction Getfile de la méthode IedmFile
Et potentiellement vérifier le nombre de version en amont afin de savoir laquelle ouvrir.
Je te réponds ici car dans l'autre sujet ça va se perdre pour ce besoin précis.
Ci-dessous la méthode GetFile donnée par l'aide de l'API de PDM 2009 en 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 car c'est une bonne réponse mais cela ne corrige pas mon problème l'erreur persiste.
olivier42 je comprends maintenant la subtilité mais mes pièces ne sont pas dans un assemblage, j'ouvre des pièces seulement. De plus ces pièces là sont entrain d'être mise dans le coffre fort justement pour éviter toutes nouvelles modifications car ce sont des standards. Si un jour il y a de potentiels changements dû à de nouveaux moyens de production cela devra être approuvé par la direction et seulement ensuite les modifications seront apportées. Et ces-dernières devront être apportées à tous les fichiers utilisant ces pièces (s'il y en a ).
Ces pièces sont dans le coffre fort car elles sont produites donc nous voulons en garder une trace mais pas modifiées. Néanmoins il se peut que mes collègues les consultent et en fassent une copie pour faire un produit que nous appelons "spécial" mais dans ce cas ça sera un nouveau fichier.
Cyril.f je pense déjà utiliser cette fonction au travers de cette ligne :
Set File = Vault.GetFileFromPath("C:\SOLIDWORKS Data\Schaublin_RODS\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5", Folder)
Je pense que mon problème c'est que lorsqu'on ouvre une pièce ou même visualise celle-ci dans l'explorateur EPDM DOIT charger "la dernière version pour la mettre dans le cache. Or dans mon cas personne clique physiquement sur le fichier pour la charger car c'est un macro donc dans mon cache je n'ai aucune version donc pour lui cela n'existe pas.
Il te manque : file.GetFileCopy
Le bout de code que j'ai mis contient tout pour utiliser cette fonction depuis la méthode getFileFromPath.
Si je comprends bien, je dois créer une nouvelle fonction où je dois écrire le code que tu as indiqué et ensuite faire appel à cette fonction juste avant d'ouvrir ma pièce ?
Mais à quel moment je mets le chemin (la localisation) de mon fichier ou dossier stp ? A la place de MyFile.txt ?
Edit :
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
J'ai écris ça pour moi c'est juste non ?
Edit bis :
Lorsque je lance la macro cela s'arrête sur Me.Hwnd et un erreur apparaît "Method not found". Il y a une référence à ajouter ?
Ajoute file.GetFileCopy 0, 0, folder.ID sous ton Set file. Par contre il faut que tu récupères l'ID du dossier dans lequel se trouve le fichier.
Set folder = vault.getfolderfrompath(C:\xxx")
Je viens d'avoir enfin le même message d'erreur que toi, essaye en ajoutant l'extension à ton nom de fichier (.sldprt pour une part).
Cordialement,
Tout d'abord merci pour l'intérêt que vous portez à ce post !
Alors j'ai ajouté l'extension de mon fichier (.sldprt) j'ai également ajouté ce dont parle Cyril.f
J'obtiens finalement ce code
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
Cela fonctionne... mais uniquement sur mon post (avec différentes sessions EPDM). Donc c'est bien ce que je craignais cette macro fonctionne avec des documents de mon cache local. C'est dû à la ligne File.GetFileCopy 0, 0, Folder.ID non ?
Edit : Par contre d.roger dans ton code (sur l'autre post) tu utilises
Set Part = swApp.OpenDoc6(Folder.LocalPath & "/" & File.Name, 1, 2, "", longstatus, longwarnings)
Et non le chemin du fichier, est-ce normal ?
Le Folder.LocalPath est le nom du dossier récupéré par le GetFileFromPath et le File.Name est le nom du fichier : cela m'évite juste de faire du copié-collé et pour mes tests je n'avais qu'une ligne à changer, normalement cela n'a pas d'impact. Pour la même raison dans la ligne swApp.ActivateDoc2 File.Name, False, longstatus j'ai mis File.Name à la place du nom de fichier.
Pour la ligne File.GetFileCopy 0, 0, Folder.ID tu peux essayer avec File.GetFileCopy HWnd, 0, Folder.ID
Je viens d'essayer sur un autre poste et tout fonctionne à merveille .....
C'est bon j'ai ajouté HWnd mais cela ne change rien je ne peux pas exécuter ma macro sur un autre poste.
Cela bloque toujours à la même ligne. Il faut bien définir HWnd comme Long ?
Edit : dans la ligne
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)
Tu mets ,1,2, qu'est-ce que ça change ? stp
Le 1 pour dire que c'est un sldprt, le 2 pour l'ouvrir en lecture seule.
Le chemin du fichier est-il le même sur chaque poste ?
"C:\SOLIDWORKS Data\Mon_coffre\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT"
Oui c'est le même chemin pour chaque poste. Je remets mon code si jamais j'avais glissé un erreur en modifiant
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)
Franchement je perds un peu espoir car j'ai l'impression qu'en plus de ne marcher que sur mon poste, ça "charge" uniquement le fichier mais pas les mises en plan associées.
Il est normal que ça ne charge que le fichier part et pas les mises en plan, il faut aussi obtenir les mises en plans pour les avoir en local. Si tu as plusieurs fichier à mettre en local il vaut mieux passer par la fonction CreateUtility(EdmUtility.EdmUtil_BatchGet) mais là, en vba, ça risque d'être un peu plus corsé. Voici un exemple en c# en pièce jointe.
Attention ce n'est qu'un exemple correspondant à un besoin que j'ai eu !!!!
fonction_lastversion.txt
Bonsoir,
Effectivement ça ne charge que le fichier appelé. En vba il faut dans ce cas cumuler plusieurs actions afin de récupérer les parents et enfants du fichier (en fonction du type de fichier). GetNextChild ou GetNextParent dans l'aide de l'API.
Le batch proposé par d.roger n'est pas utilisable avec vba à ma connaissance. Seul C# et VB.Net
Je suis très déçu car je pense être très proche de la solution mais je n'ai plus beaucoup de temps à consacrer à cette macro car je dois passer à autre chose...
Surtout que d.roger tu dis que ça marche sur plusieurs postes avec ce code ? Je me demandais est-ce que cela pourrait être un problème de Chemin de fichier : C:\SOLIDWORKS Data\Mon_coffre\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT car ça c'est le chemin que je retrouve dans l'explorateur (je retrouve le même sur les autres postes) mais cela me paraît bizarre que ce soit sur un disque local. Peut-être as-tu changé les chemins ?
Je ne sais plus quoi faire...
Edit : d.roger tu pourrais mettre le code complet que tu as utilisé quand tu disais que ça marche à merveille stp ?
Bonjour,
Voici pour rappel le code de test qui fonctionne parfaitement pour moi :
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Sub main()
Set swApp = Application.SldWorks
Dim Vault As New EdmVault5
Dim File As IEdmFile5
Dim Folder As IEdmFolder5
Vault.LoginAuto "Coffre_BE", 0
Set File = Vault.GetFileFromPath("C:\Coffre_BE\TEST\0088880001.SLDPRT", Folder)
Set Part = swApp.OpenDoc6(Folder.LocalPath & "/" & File.Name, 1, 2, "", longstatus, longwarnings)
swApp.ActivateDoc2 File.Name, False, longstatus
Set swModel = swApp.ActiveDoc
swModel.ViewZoomtofit2
End Sub
Pour le chemin du fichier, c'est normal qu'il soit comme un fichier local car c'est celui de la vue local du coffre-fort, je suis juste surpris que cette vue soit dans SOLIDWORKS Data.
Pour palier à une possible différence de position de la vue du coffre-fort entre les différents postes, tu peux au départ de ton code, chercher la vue du coffre puis appeler ton chemin de fichier en commençant par Vault.rootfolder.localpath, par exemple :
vault1.RootFolder.LocalPath + \TEST\0088880001.SLDPRT"
exemple de recherche des vues des coffre-fort en C# puis connexion :
vault1 = new EdmVault5();
IEdmVault8 vault = (IEdmVault8)vault1;
EdmViewInfo[] Views = null;
vault.GetVaultViews(out Views, false);
comboBox1.Items.Clear();
foreach (EdmViewInfo View in Views)
{
comboBox1.Items.Add(View.mbsVaultName);
}
if (comboBox1.Items.Count > 0)
{
comboBox1.Text = (string)comboBox1.Items[0];
}
if (!vault1.IsLoggedIn)
{
vault1.LoginAuto(comboBox1.Text, this.Handle.ToInt32());
}
Cordialement,
Bonjour,
Dans ton code tu peux virer GetFolderFromPatch puisque tu le récupères dans le GetFileFromPath (ça va déjà alléger le traitement est éviter les erreurs de copier/coller).
Est-ce que dans les paramétrages du coffre tous les utilisateurs ont accés à ce dossier? N'as-tu pas des droits supplémentaire qui font que ça fonctionne sur ton poste et pas chez un autre?
Franchement merci, merci beaucoup particulièrement à d.roger et Cyril.f pour l'intérêt et l'aide apporté à ce poste!
Le problème était tout bête comme dans la plus par des cas ! C'est suite à la lecture des réponses de Cyril.f demandant si les chemins étaient identiques sur tous les postes et de d.roger s'interrogeant sur la présence du dossier SOLIDWORKS Data dans le chemin.
Effectivement sur mon ordinateur la vue du coffre n'était pas installé au même endroit que sur les autres ordinateurs. Je n'aurais pas du faire confiance...
Merci encore et à bientôt pour d'autres questions aussi tordues mais intéressantes !