Lien Vba - EPDM

Bonjour à tous,

J'ai un souci pour ouvrir mes fichiers EDPM via ma macro. Dans mon projet actuel, j'ai été amené à créer une macro afin d'ouvrir mes fichiers étant stockés dans le coffre fort EPDM or lorsque que je lance ma macro, marchant très bien quand les piéces sont sur mon bureau la macro se met en Debug : 

Lors de l'execution de la macro, les fichiers ne sont pas extrait de EPDM et c'est une volonté pour l'avoir uniquement en lecture seule. J'ai ce problème sur mon poste avec ma session EPDM, avec ma session sur un autre poste et sur un autre poste avec une autre session donc rien à voir avec le psote ou la session.

Or j'ai découvert quelque chose : Lorsque j'ouvre EPDM dans l'exploreur Windows et que je clique sur ma pièce (pas de double clique juste cliqué pour l'avoir dans la prévisualisation) j'ai une fenêtre qui s'ouvre :

Et suite à ce chargement, ne durant pas 3h comme indiqué, ma macro fonctionne à merveille..

Donc je me demandais si quelqu'un savait d'oû cela venait et peut-être corriger un problème dans le chargement automatique ?

Un dernier point, j'ai besoin, pour que ma macro fonctionne, de cliquer Uniquement sur les fichiers 3D, les mises en plan ne me posent pas de problèmes.

Bon après-midi

 


capture_error.png

Bonjour,

Dans ta macro tu dois commencer par te connecter à ton coffre fort puis obtenir la dernière version de ton fichier avant de l'ouvrir, je ne sais pas comment cela s'écrit en VBA mais voici un exemple en C# :

vault1 = new EdmVault5();

if (!vault1.IsLoggedIn)
{
      vault1.LoginAuto("Ton coffre fort", this.Handle.ToInt32());
}

IEdmFile5 file3D = default(IEdmFile5);

IEdmFolder5 folderBOM = null;

file3D = vault1.GetFileFromPath("Ton Fichier", out folderBOM);

file3D.GetFileCopy(this.Handle.ToInt32(), "");

Cordialement,

1 « J'aime »

Bonjour d.roger,

Merci beaucoup pour ta réponse car cela me rassure de savoir qu'il y a une solution !
Par contre je commence à avoir des connaissances en Vba mais sans plus et je n'y connais rien en langage C# donc je vais attendre d'autres réponses afin de connaître la marche à suivre en Vba.

Dans EPDM avec l'explorateur windows,

le fait d'avoir comme réglage "miniature SW 3D"

que le dernier onglet utilisé dans EPDM soit "Prévisualisation"

et qu'on sélectionne un nouveau fichier,

cela fait automatiquement un "obtenir" sur le fichier (si il n'y a aucune version en cache sur le pc)

 

après si on a déjà une version en "cache" sans être la dernière,

il n'y a pas de "auto obtenir" avec l'onglet "Prévisu"

Mais ce comportement peut être changé suivant les réglages utilisateur/groupe.

(comme laisser l'utisateur gérer les versions en cache, ou forcer derniere version, etc...)

1 « J'aime »

Salut,

Je crois que cela est une limite de l'API SW en VBA. Car si on recherche dans l'aide aucune documentation en VBA : http://help.solidworks.com/SearchEx.aspx?q=EdmVault5&sort=&version=2017&lang=english&prod=api

1 « J'aime »

Bonjour, si les API existent en .net, je pense qu'elles existent aussi en vba.

Pour vous aider, vous pouvez copier le code que l'on vous a donné dans un convertisseur C# VB.net. Vous en trouverez plusieurs sur internet. Vba étant tiré de vb.net, le code sera assez proche pour que vous le compreniez.

De mémoire, il y a une dll à charger pour accéder aux objets pdm.

Cordialement.

1 « J'aime »

Yves.T :

Pas besoin de convertisseur les exemples en vb.net sont nombreux. Voici plusieurs liens : http://help.solidworks.com/2017/english/api/epdmapi/Traverse_Folders_and_Files_in_Vault_Example_VBNET.htm

1 « J'aime »

Bonjour,

Il y a effectivement une DLL à charger, c'est "EPDM.Interop.epdm.dll" qui se trouve dans le répertoire d'installation de SOLIDWORKS Entreprise PDM.

Cordialement,

1 « J'aime »

Re-bonjour,

Tu peux essayer dans une nouvelle macro avec les lignes suivantes :

     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 "Le_nom_de_ton_coffre-fort", 0

         Set File = Vault.GetFileFromPath("Le_nom_de_ton_fichier_avec_le_chemin", Folder)
    
         Set Part = swApp.OpenDoc6("Le_nom_de_ton_fichier_avec_le_chemin", 1, 0, "", longstatus, longwarnings)

     End Sub

N'oublie pas de modifier le nom du coffre-fort et le nom du fichier.

Cordialement,

1 « J'aime »

Bonjour à tous,

étant sur 2 projets en simultané je n'ai pas encore pu réaliser de tests mais je devrais pouvoir aujourd'hui par contre j'ai quelques questions suite à vos réponses :

- Pour le ddl a chargé, je ne sais pas comment faire... Est-ce un fichier à télécharger ? Un fichier à lier uniquement à mes pièces ?
- Dans les codes que j'ai pu parcourir comme celui de d.roger j'ai remarqué qu'il y avait une fonction LoginAuto comment fonctionne-t-elle ? Car je dois me connecter à EPDM à travers cette fenêtre :

Est-ce que cette fonction va rentrer en conflit avec ma méthode de connexion habituelle ? Peut-être que j'interprète mal le terme "Auto".

Car dans l'idéale j'aimerais qu'au lancement de la macro il y ait une vérification de connexion à EPDM (grâce à la fenêtre ci-dessus) et si oui ensuite charger les document dans le cache lorsque c'est nécessaire.

Mais avant de me lancer dans le code, ne serait-il pas plus simple de modifier les paramètres EPDM comment "Vider le cache lors de la déconnexion"  ou autre comme dans la pièce jointe.

Merci pour votre grande aide


para_epdm.png

Bonjour,

Pour la connexion ça ne rentrera pas en conflit. LoginAuto utilise les paramètres de connexion locaux donc si demande de login/mdp à la connexion, la fenêtre sera présentée.

En ce qui concerne le fait de vider le cache à la déconnexion, il faut vraiment peser le pour et le contre. Ceci a une incidence sur les fichiers extraits (les assemblages en particulier si ma mémoire est bonne) et peu générer la perte de travail. Tout dépend de vos règles d'archivages et de la rigueur de vos utilisateurs.

Pour le reste, il n'y a effectivement plus d'exemple en vba (sur la 2009 il y en avait) mais à partir de VB.NET on peut s'y retrouver. Il restera cependant des fonctionnalités réservées à C# et VB.NET.

 

2 « J'aime »

Bonjour,

Pour la DLL à charger cela est nécessaire pour les programmes en C#. En VBA il faut à priori juste mettre en référence "PDMWorks Enterprise 20xx Type Library" dans ta macro, voir l'image jointe.

Pour la fenêtre de connexion, voir la réponse de Cyril.f ci-dessus.

Autrement, je pense qu'il est plus interressant de se lancer dans l'apprentissage d'un langage comme le VB.net ou le C# qui permettent de faire beaucoup plus de choses soit sous forme de macros soit sous forme de programmes indépendants permettant de piloter aisément EPDM et/ou SolidWorks mais ce n'est qu'un avis personnel. Il existe d'excellents cours d'apprentissage de ces langages sur différents sites comme par exemple https://openclassrooms.com/courses/apprenez-a-developper-en-c

Cordialement,


references.png
2 « J'aime »

Je pense que cela te seras utile. De plus c'est très intéressant.

Le VB.net est plus ressemblant au VBA. L'apprentissage sera plus aisé.

Perso j'utilise l'EDi Visual Studio en version Community : https://www.visualstudio.com/fr/thank-you-downloading-visual-studio/?sku=Community&rel=15

Je te conseil aussi l'excellent developpez.com :

Le forum .net

Les cours .net

La FAQ .net

La rubrique Visual Studio

 

A d.roger :

Comment executes-tu du code C ou VB.net sous forme de macros dans SW ?

 

 

 

2 « J'aime »

Pour ce projet, je vais essayer de me contenter du Vba car je suis en stage et malheureusement je ne serai pas embaucher et les personnes qui utiliseront mon programme ont à peine les base de Vba...

Mais pour de futures applications, je m'y attarderai plus. Par contre j'ai une question très bête, en quoi cela est mieux que le Vba ? Plus de possibilité ? Ce sont aussi des programmes à coder dans un module spécifique d'un logiciel ou c'est indépendant ? (Juste des petites questions histoire d'avoir une idée avant que je commence l'apprentissage)

Le Vb.net est effectivement beaucoup plus ressemblant au VBA donc plus aisé à apprendre, le C# est nettement moins "verbeux", c'est une histoire de goût.

Pour les macros en C# ou VB.net dans SW, je crée des DLL et lorsque j'insère des nouveaux boutons dans SW je fais appel à ces DLL, voir image jointe. J'ai fini par me faire une DLL qui ne sert qu'à lire un fichier texte dans lequel je met le chemin de mon executable principal puis à lancer cet executable, cela me permet d'avoir beaucoup plus de souplesse sur mes programmes.

Pour mes programmes, j'utilise l'EDI open source SharpDevelop.

Cordialement,


capture-2.png
1 « J'aime »

en quoi cela est mieux que le Vba ? Plus de possibilité ? : Visual Basic for Applications (VBA) est une implémentation de Microsoft Visual Basic, VB.NET ou C# sont des langages de programmation à part entière. BEAUCOUP plus de possibilité.

Ce sont aussi des programmes à coder dans un module spécifique d'un logiciel ou c'est indépendant ? Programmation indépendante (création d'éxécutables), l'utilisation d'un EDI tel que Visual Studio Community ou Sharpdevelop facilite énormément les choses.

2 « J'aime »

Effectivement cela à l'air plus intéressant ! Donc c'est décidé après mon projet je passe à l'apprentissage VB.net.

Mais concernant mon problème J'ai essayé la macro de d.roger et le début à l'air de fonctionner car lorsque je clique sur un choix, j'ai la fenêtre de connexion EPDM qui s'ouvre.

Mais la ligne suivante n'a pas l'air de faire son travail de moins elle ne corrige pas mon problème :

'Active la seconde ComboBox lorsqu'un type est sélectionné dans la 1er liste
 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 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 "Nom_coffre", 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("Chemin + nom de fichier", Folder)
    Set Part = swApp.OpenDoc6("Chemin + nom de fichier", 1, 0, "", longstatus, longwarnings)
    swApp.ActivateDoc2 "Nom fichier", 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...........................
                
             

Voici une partie de mon code et l'erreur "object not set"  apparaît à la ligne de la récupération de la famille de pièces.

Merci pour votre aide.

Set swDesignTable = swModel.GetDesignTable sans les () ?

Et Dim SwDesignTable as SldWorks.DesignTable

Dans la ligne :

Vault.LoginAuto "Nom_coffre", 0

tu n'as pas mis le nom de ton coffre-fort, je doutes qu'il s'appelle Nom_coffre.

Idem dans les lignes :

Set File = Vault.GetFileFromPath("Chemin + nom de fichier", Folder)
Set Part = swApp.OpenDoc6("Chemin + nom de fichier", 1, 0, "", longstatus, longwarnings)

ou Chemin + nom de fichier doit être le nom de ton fichier avec son chemin donc sous la forme "C:\Coffre-BE\TEST\FichierTest.sldprt" par exemple

Cordialement,

Oui oui d.roger ne t'inquiète pas j'ai changé ça ^^. J'ai juste enlevé les noms pour mettre sur le forum ;).

Cyril.f j'ai essayé mais cela ne marche toujours pas.

Edit : je pense que cela a un impact mais lorsque j'exécute pas à pas mes varaibles File, Part et swDesigntable = Nothing mais je ne vois pas le problème cela marche si je fais le chargement de la version antérieur manuellement.