Obtention de la dernière version d'un fichier provenant du coffre EPDM

Bonjour,

J'ouvre ce nouveau post en relation avec un autre : http://www.lynkoa.com/forum/import-export-formats-neutres/lien-vba-epdm car suite aux conversation j'ai compris que mon problème était autre part.

J'ai réalisé une macro afin de facilité l'utilisatation des fichiers CAO par mes collègues j'arrive à la fin de mes objectifs, il me reste un unique point bloquant : les fichiers sont stockés dans le coffre EPDM de mon entreprise, suite à des tests j'ai remarqué que ma macro fonctionnait seulement lorsque que les fichiers étaient extraits ou étaient déjà présent dans le cache local.

J'aimerais donc trouver le moyen en vba de faire automatiquement  "Obtention de la dernière version du fichier" car si cet version n'est pas présente mon code ne marche pas. Il n'y a pas l'air d'avoir d'obtention automatique de programmée.

Merci

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,

1 « J'aime »

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?

2 « J'aime »