Abrufen der neuesten Version einer Datei aus dem EPDM-Tresor

Hallo

Ich öffne diesen neuen Beitrag in Bezug auf einen anderen: http://www.lynkoa.com/forum/import-export-formats-neutres/lien-vba-epdm weil ich nach den Gesprächen verstanden habe, dass mein Problem woanders liegt.

Ich habe ein Makro erstellt, um meinen Kollegen die Verwendung von CAD-Dateien zu erleichtern Ich nähere mich dem Ende meiner Ziele, ich habe nur einen Blockadepunkt: Die Dateien werden im EPDM-Tresor meines Unternehmens gespeichert, nach Tests habe ich festgestellt, dass mein Makro nur funktionierte, wenn die Dateien extrahiert wurden oder bereits im lokalen Cache vorhanden waren.

Also möchte ich in VBA einen Weg finden, automatisch "Holen Sie sich die neueste Version der Datei" zu tun,  denn wenn diese Version nicht vorhanden ist, funktioniert mein Code nicht. Es scheint keine automatische Programmierung zu geben.

Vielen Dank

Wie löst die beste Antwort auf Ihren anderen Beitrag Ihr Problem nicht?

Vorsicht vor Subtilität:

Holen Sie sich die neueste Version (einschließlich Kinder in der zukünftigen Version)

und:

Holen Sie sich die As-Built-Version (auch für Kinder)

Wenn wir uns EPDM-Jobs ansehen, ist dieser Parameter vorhanden, und wir setzen ihn oft auf "as built"

 

Beispiel:

ASM = Version 3/3

PRT1 = 5/5

PRT2 = 9/9

Wenn das ASM mit

PRT1 = 4/5

PRT2 = 7/9

 

Wenn Sie auf "Neueste Version herunterladen" klicken, werden Sie Folgendes benötigen:

ASM = 3/3

PRT1 = 5/5

PRT2 = 9/9

Sie werden also nicht in "as built" sein!

Hallo

Sie müssen die Getfile-Funktion der IedmFile-Methode verwenden

Und überprüfen Sie möglicherweise im Voraus die Anzahl der Versionen, um zu wissen, welche geöffnet werden soll.

Ich antworte Ihnen hier, weil es in dem anderen Thema für diesen speziellen Bedarf verloren gehen wird.

Im Folgenden finden Sie die GetFile-Methode, die von der PDM 2009-API-Hilfe in vba bereitgestellt wird

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 , weil es eine gute Antwort ist, aber es behebt mein Problem nicht, der Fehler bleibt bestehen.

olivier42 Ich verstehe jetzt die Feinheit, aber meine Stücke sind nicht in einer Baugruppe, ich öffne nur Teile. Darüber hinaus werden diese Teile genau so in den Tresor gelegt, dass keine neuen Modifikationen vorgenommen werden können, da es sich um Standards handelt. Wenn es eines Tages potenzielle Änderungen aufgrund neuer Produktionsmittel gibt, muss dies von der Geschäftsleitung genehmigt werden und erst dann werden die Änderungen vorgenommen. Und diese müssen in alle Dateien gebracht werden, die diese Teile verwenden (falls es welche gibt).

Diese Teile befinden sich im Tresor, da sie produziert werden, daher möchten wir sie verfolgen, aber nicht ändern. Es kann jedoch sein, dass meine Kollegen sie sich ansehen und eine Kopie davon anfertigen, um ein Produkt herzustellen, das wir als "besonders" bezeichnen, aber in diesem Fall wird es eine neue Datei sein.

Cyril.f Ich denke bereits darüber nach, diese Funktion über diese Zeile zu verwenden:

Set File = Vault.GetFileFromPath("C:\SOLIDWORKS Data\Schaublin_RODS\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5", Folder)

Ich denke, mein Problem ist, dass, wenn Sie ein Teil öffnen oder sogar im EPDM-Explorer anzeigen, "die neueste Version geladen werden muss, um es in den Cache zu legen. Aber in meinem Fall klickt niemand physisch auf die Datei, um sie zu laden, weil es sich um ein Makro handelt, also habe ich in meinem Cache keine Version, also existiert sie für ihn nicht.

Du verpasst es: geh weg. GetFileCopy (Englisch)

Der Codeausschnitt, den ich eingefügt habe, enthält alles, um diese Funktion aus der getFileFromPath-Methode zu verwenden.

Wenn ich das richtig verstehe, muss ich eine neue Funktion erstellen, bei der ich den von Ihnen angegebenen Code schreiben und diese Funktion dann aufrufen muss, bevor ich meinen Raum öffne.

Aber wann gebe ich bitte den Pfad (den Speicherort) meiner Datei oder meines Ordners ein? Statt MyFile.txt?

Redigieren:

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

Ich habe das für mich selbst geschrieben, es ist nur, nicht wahr?

Bearbeiten bis:

Wenn ich das Makro starte, stoppt es auf Me.Hwnd und es wird die Fehlermeldung "Methode nicht gefunden" angezeigt. Gibt es eine Referenz, die hinzugefügt werden kann?

Datei hinzugefügt. GetFileCopy 0, 0 folder.ID unter Ihrer Set-Datei. Auf der anderen Seite müssen Sie die ID des Ordners abrufen, in dem sich die Datei befindet.

Set folder = vault.getfolderfrompath(C:\xxx")

Ich habe gerade die gleiche Fehlermeldung wie Sie erhalten, versuchen Sie, die Erweiterung zu Ihrem Dateinamen hinzuzufügen (.sldprt für einen Teil).

Herzliche Grüße

Zunächst einmal vielen Dank für Ihr Interesse an diesem Beitrag!

Also habe ich die Erweiterung meiner Datei (.sldprt) hinzugefügt, ich habe auch hinzugefügt, wovon Cyril spricht.  

Ich bekomme endlich diesen 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

Es funktioniert... aber nur in meinem Beitrag (mit verschiedenen EPDM-Sitzungen). Das ist es, was ich befürchtet habe, dieses Makro funktioniert mit Dokumenten aus meinem lokalen Cache. Das liegt an der File.GetFileCopy-Zeile 0, 0, Folder.ID oder?

Bearbeiten: Auf der anderen Seite verwenden Sie d.roger in Ihrem Code (im anderen Beitrag)

Set Part = swApp.OpenDoc6(Folder.LocalPath & "/" & File.Name, 1, 2, "", longstatus, longwarnings)

Und nicht der Dateipfad, ist das normal?

Der Folder.LocalPath ist der Name des Ordners, der von GetFileFromPath abgerufen wird, und der File.Name ist der Name der Datei: Es erspart mir nur das Kopieren und Einfügen und für meine Tests hatte ich nur eine Zeile zum Ändern, normalerweise hat es keine Auswirkungen. Aus dem gleichen Grund habe ich in der Zeile swApp.ActivateDoc2 File.Name, False, longstatus File.Name anstelle des Dateinamens eingefügt.

Für die Zeile File.GetFileCopy 0, 0, Folder.ID können Sie es mit File.GetFileCopy HWnd, 0, Folder.ID versuchen

Ich habe gerade einen anderen Beitrag ausprobiert und alles wirkt Wunder.....

Es ist in Ordnung, ich habe HWnd hinzugefügt, aber es ändert nichts, ich kann mein Makro nicht auf einem anderen Computer ausführen.
Es bleibt immer auf der gleichen Linie hängen. Müssen Sie HWnd als Long definieren?

Bearbeiten: in Linie 

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)

Sie geben ,1,2 ein, welchen Unterschied macht das? Stp

Die 1, um zu sagen, dass es sich um eine sldprt handelt, die 2, um sie schreibgeschützt zu öffnen.

Ist der Dateipfad auf jedem Computer gleich?

"C:\SOLIDWORKS Data\Mon_coffre\04-Dessins Solidworks\01-Dessins pieces\80-\80-5\CAO_W25_80-5.SLDPRT"

Ja, es ist für jede Position derselbe Pfad. Ich setze meinen Code zurück, wenn ich beim Ändern einen Fehler übersehen habe

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)

Ehrlich gesagt verliere ich ein wenig die Hoffnung, weil ich den Eindruck habe, dass er nicht nur auf meinem Computer arbeitet, sondern nur die Datei, aber nicht die zugehörigen Zeichnungen "lädt".

Es ist normal, dass nur die Datei und nicht die Zeichnungen geladen werden, Sie müssen auch die Zeichnungen abrufen, um sie lokal zu haben. Wenn Sie mehrere Dateien lokal ablegen müssen, ist es besser, die Funktion CreateUtility(EdmUtility) zu verwenden.EdmUtil_BatchGet), aber hier, in VBA, kann es etwas schwieriger sein. Hier ist ein Beispiel in C# als Anhang.

Seien Sie vorsichtig, dies ist nur ein Beispiel, das einem Bedürfnis entspricht, das ich hatte!!


fonction_lastversion.txt

Guten Abend

Tatsächlich wird nur die aufgerufene Datei geladen. In VBA müssen Sie mehrere Aktionen kombinieren, um die Eltern und Kinder der Datei wiederherzustellen (abhängig vom Dateityp). GetNextChild oder GetNextParent in der API-Hilfe.

Der von d.roger vorgeschlagene Batch ist meines Wissens nicht mit VBA verwendbar. Nur C# und VB.Net

 

Ich bin sehr enttäuscht, weil ich denke, dass ich der Lösung sehr nahe bin, aber ich habe nicht mehr viel Zeit, um mich diesem Makro zu widmen, weil ich weitermachen muss...

 Zumal d.roger du sagst, dass es auf mehreren Workstations mit diesem Code funktioniert? Dateipfad  : C:\SOLIDWORKS Data\Mon_coffre\04-Solidworks Drawings\01-Drawings pieces\80-\80-5\CAO_W25_80-5.SLDPRT, da dies der Pfad ist, den ich im Explorer finde (ich finde den gleichen auf den anderen Arbeitsstationen), aber es kommt mir seltsam vor, dass er sich auf einer lokalen Festplatte befindet. Vielleicht haben Sie die Wege geändert? 

Ich weiß nicht mehr, was ich tun soll...  

Bearbeiten: D.Roger,  könnten Sie bitte den vollständigen Code einfügen, den Sie verwendet haben, als Sie sagten, dass es Wunder wirkt?

Hallo

Hier ist der Testcode, der für mich perfekt funktioniert:

Dimmen swApp als Objekt

Teil als Objekt dimmen
Dim boolstatus als boolescher Wert
Dim longstatus As Long, longwarnings As Long

Sub main()

    Legen Sie swApp = Application.SldWorks fest

    Dim Vault als neues EdmVault5

    Dim-Datei als IEdmFile5
    Dim-Ordner als IEdmFolder5

    Vault.LoginAuto "Coffre_BE", 0

    Set File = Vault.GetFileFromPath("C:\Coffre_BE\TEST\0088880001.SLDPRT", Ordner)
    
    Set Part = swApp.OpenDoc6(Folder.LocalPath & "/" & File.Name, 1, 2, "", longstatus, longwarnings)
    
    swApp.ActivateDoc2 File.Name, False, longstatus
    
    Festlegen von swModel = swApp.ActiveDoc
    
    swModel.ViewZoomtofit2

Ende Sub

Für den Dateipfad ist es normal, dass er wie eine lokale Datei ist, da es sich um die Datei aus der lokalen Ansicht des Tresors handelt. Ich bin nur überrascht, dass sich diese Ansicht in SOLIDWORKS Daten befindet.

Um einen möglichen Unterschied in der Position der Tresoransicht zwischen den verschiedenen Stationen auszugleichen, können Sie von Ihrem Code ausgehen, nach der Tresoransicht suchen und dann Ihren Dateipfad beginnend mit Vault.rootfolder.localpath aufrufen, z. B.:

vault1. RootFolder.LocalPath + \TEST\0088880001.SLDPRT"

Beispiel für das Suchen von Tresoransichten in C# und das anschließende Herstellen einer Verbindung:

vault1 = neues EdmVault5();
                
IEdmVault8-Tresor = (IEdmVault8)vault1;

 EdmViewInfo[] Ansichten = null;

Gewölbe. GetVaultViews(out Views, false);
            
comboBox1.Items.Clear();
            
foreach (EdmViewInfo-Ansicht in Ansichten)
{
      comboBox1.Items.Add(Ansicht.mbsVaultName);
}
if (comboBox1.Items.Count > 0)
{
      comboBox1.Text = (Zeichenfolge)comboBox1.Artikel[0];
}

if (!vault1. IsLoggedIn)
{
      vault1. LoginAuto(comboBox1.Text, this. Handle.ToInt32());
}

Herzliche Grüße

1 „Gefällt mir“

Hallo

In Ihrem Code können Sie GetFolderFromPatch entfernen, da Sie es im GetFileFromPath erhalten (es erleichtert bereits die Verarbeitung und vermeidet Fehler beim Kopieren / Einfügen).

Haben in den Tresoreinstellungen alle Benutzer Zugriff auf diesen Ordner? Haben Sie nicht zusätzliche Rechte, die dafür sorgen, dass es für Ihren Job funktioniert und nicht für jemand anderen?

2 „Gefällt mir“