De nieuwste versie van een bestand ophalen uit de EPDM-kluis

Hallo

Ik open deze nieuwe post in relatie tot een andere: http://www.lynkoa.com/forum/import-export-formats-neutres/lien-vba-epdm omdat ik na de gesprekken begreep dat mijn probleem ergens anders lag.

Ik heb een macro gemaakt om het gebruik van CAD-bestanden door mijn collega's te vergemakkelijken, ik kom aan het einde van mijn doelen, ik heb maar één blokkeerpunt: de bestanden worden opgeslagen in de EPDM-kluis van mijn bedrijf, na tests merkte ik dat mijn macro alleen werkte als de bestanden waren uitgepakt of al in de lokale cache aanwezig waren.

Dus ik zou graag een manier vinden in vba om automatisch  "Haal de nieuwste versie van het bestand" te doen, want als deze versie niet aanwezig is, werkt mijn code niet. Er lijkt geen automatisch geprogrammeerd te worden.

Bedankt

Hoe lost het beste antwoord op je andere bericht je probleem niet op?

Pas op voor subtiliteit:

Download de nieuwste versie (inclusief kinderen in de toekomstige versie)

en:

Koop de as-built versie (hetzelfde voor kinderen)

Als we naar EPDM-taken kijken, is deze parameter er en stellen we deze vaak in op "as built"

 

Voorbeeld:

ASM = versie 3/3

PRT1 = 5/5

PRT2 = 9/9

Als de ASM is gebouwd met

PRT1 = 4/5

PRT2 = 7/9

 

Als u "de nieuwste versie ophalen", moet u:

ASM = 3/3

PRT1 = 5/5

PRT2 = 9/9

Je zult dus niet in "as built" zijn!

Hallo

U moet de Getfile-functie van de IedmFile-methode gebruiken

En controleer eventueel vooraf het aantal versies om te weten welke u moet openen.

Ik antwoord je hier omdat het in het andere onderwerp verloren zal gaan voor deze specifieke behoefte.

Hieronder vindt u de GetFile-methode die wordt gegeven door de PDM 2009 API-hulp in 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 omdat het een goed antwoord is, maar het lost mijn probleem niet op, de fout blijft bestaan.

olivier42 Ik begrijp nu de subtiliteit, maar mijn stukken zitten niet in een assemblage, ik open alleen onderdelen. Bovendien worden deze onderdelen juist in de kluis geplaatst om nieuwe aanpassingen te voorkomen, omdat het standaarden zijn. Als er op een dag mogelijke veranderingen zijn als gevolg van nieuwe productiemiddelen, zal dit moeten worden goedgekeurd door de directie en pas dan zullen de wijzigingen worden doorgevoerd. En deze zullen met deze onderdelen (als die er zijn) naar alle bestanden moeten worden gebracht.

Deze onderdelen zitten in de kluis omdat ze worden geproduceerd, dus we willen ze bijhouden, maar niet wijzigen. Mijn collega's kunnen er echter naar kijken en er een kopie van maken om een product te maken dat we "speciaal" noemen, maar in dit geval zal het een nieuw bestand zijn.

Cyril.f Ik denk er al aan om deze functie te gebruiken via deze regel:

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

Ik denk dat mijn probleem is dat wanneer je een onderdeel opent of zelfs maar bekijkt in de EPDM-verkenner, MOET laden "de nieuwste versie om het in de cache te zetten. Maar in mijn geval klikt niemand fysiek op het bestand om het te laden omdat het een macro is, dus in mijn cache heb ik geen versie, dus voor hem bestaat het niet.

Je mist het: ga weg. GetFileCopy

Het stukje code dat ik heb geplaatst, bevat alles om deze functie te gebruiken van de getFileFromPath-methode.

Als ik het goed begrijp, moet ik een nieuwe functie aanmaken waarbij ik de code die je hebt aangegeven moet schrijven en vervolgens deze functie moet aanroepen net voordat ik mijn kamer open?

Maar wanneer plaats ik het pad (de locatie) van mijn bestand of map alstublieft? In plaats van MyFile.txt?

Bewerken:

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

Ik heb dit voor mezelf geschreven, het is gewoon, nietwaar?

Bewerken bis:

Wanneer ik de macro start, stopt deze op Me.Hwnd en verschijnt er een foutmelding "Methode niet gevonden". Is er een referentie om toe te voegen?

Bestand toegevoegd. GetFileCopy 0, 0 folder.ID onder uw Set-bestand. Aan de andere kant moet u de ID ophalen van de map waarin het bestand zich bevindt.

Map instellen = vault.getfolderfrompath(C:\xxx")

Ik kreeg net dezelfde foutmelding als jij, probeer de extensie toe te voegen aan je bestandsnaam (.sldprt voor een deel).

Vriendelijke groeten

Allereerst bedankt voor je interesse in dit bericht!

Dus ik heb de extensie van mijn bestand (.sldprt) toegevoegd, ik heb ook toegevoegd waar Cyril het over heeft.f  

Ik krijg eindelijk deze 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

Het werkt... maar alleen op mijn post (met verschillende EPDM-sessies). Dus dat is wat ik vreesde, deze macro werkt met documenten uit mijn lokale cache. Dit komt door de File.GetFileCopy-regel 0, 0, Folder.ID toch?

Edit: Aan de andere kant d.roger in je code (op de andere post) die je gebruikt 

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

En niet het bestandspad, is dat normaal?

De Folder.LocalPath is de naam van de map die wordt opgehaald door de GetFileFromPath en de File.Name is de naam van het bestand: het bespaart me gewoon van kopiëren en plakken en voor mijn tests had ik maar één regel om te veranderen, normaal gesproken heeft het geen impact. Om dezelfde reden in de regel swApp.ActivateDoc2 File.Name, False, longstatus zet ik File.Name in plaats van de bestandsnaam.

Voor de regel File.GetFileCopy 0, 0, Folder.ID kunt u proberen met File.GetFileCopy HWnd, 0, Folder.ID

Ik heb net een andere post geprobeerd en alles doet wonderen.....

Het is oké, ik heb HWnd toegevoegd, maar het verandert niets, ik kan mijn macro niet op een andere computer uitvoeren.
Het blijft altijd steken op dezelfde lijn. Moet je HWnd as Long definiëren?

Bewerken: in lijn 

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)

Je zet ,1,2, wat maakt het uit? Stp

De 1 om te zeggen dat het een sldprt is, de 2 om het in read-only te openen.

Is het bestandspad op elke computer hetzelfde?

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

Ja, het is hetzelfde pad voor elke positie. Ik zal mijn code terugplaatsen als ik een fout had gekregen tijdens het wijzigen

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)

Eerlijk gezegd verlies ik de hoop een beetje omdat ik de indruk heb dat hij niet alleen op mijn computer werkt, maar ook alleen het bestand "laadt", maar niet de bijbehorende tekeningen.

Het is normaal dat het alleen het bestand laadt en niet de tekeningen, je moet de tekeningen ook lokaal hebben. Als u meerdere bestanden lokaal wilt plaatsen, is het beter om de functie CreateUtility (EdmUtility) te gebruiken.EdmUtil_BatchGet) maar hier, in VBA, is het misschien wat moeilijker. Hier is een voorbeeld in c# als bijlage.

Wees voorzichtig, dit is slechts een voorbeeld dat overeenkomt met een behoefte die ik had!!


fonction_lastversion.txt

Goedenavond

Inderdaad, het laadt alleen het aangeroepen bestand. In vba moet je verschillende acties combineren om de ouders en kinderen van het bestand te herstellen (afhankelijk van het type bestand). GetNextChild of GetNextParent in de API-help.

De door d.roger voorgestelde batch is bij mijn weten niet bruikbaar met VBA. Alleen C# en VB.Net

 

Ik ben erg teleurgesteld omdat ik denk dat ik heel dicht bij de oplossing ben, maar ik heb niet veel tijd meer om aan deze macro te besteden omdat ik verder moet ...

Vooral omdat d.roger je zegt dat het werkt op verschillende werkstations met deze code? Bestandspad  : C:\SOLIDWORKS Data\Mon_coffre\04-Solidworks Drawings\01-Drawings pieces\80-\80-5\CAO_W25_80-5.SLDPRT omdat dit het pad is dat ik vind in de verkenner (ik vind hetzelfde op de andere werkstations) maar het lijkt me raar dat het op een lokale schijf staat. Misschien heb je de paden veranderd? 

Ik weet niet meer wat ik moet doen...  

Edit: d.roger kunt u de volledige code die u gebruikte toen je zei dat het werkt wonderen alstublieft?

Hallo

Hier is de testcode die perfect voor mij werkt:

Dim swApp als object

Deel dimmen als object
Dim boolstatus als Booleaanse
Dim longstatus As Long, longwarnings As Long

Sub hoofd()

    Stel swApp = Toepassing.SldWorks in

    Dim Vault als nieuwe EdmVault5

    Bestand dimmen als IEdmFile5
    Map dimmen als IEdmFolder5

    Vault.LoginAuto "Coffre_BE", 0

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

Einde Sub

Voor het bestandspad is het normaal dat het een lokaal bestand is, omdat het degene is uit de lokale weergave van de kluis, het verbaast me alleen dat deze weergave in SOLIDWORKS-gegevens staat.

Om een mogelijk verschil in de positie van de kluisweergave tussen de verschillende stations te compenseren, kunt u beginnen met uw code, zoeken naar de kluisweergave en vervolgens uw bestandspad aanroepen dat begint met Vault.rootfolder.localpath, bijvoorbeeld:

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

voorbeeld van het vinden van kluisweergaven in C# en vervolgens verbinding maken:

vault1 = nieuwe EdmVault5();
                
IEdmVault8 kluis = (IEdmVault8)kluis1;

 EdmViewInfo[] Weergaven = null;

Gewelf. GetVaultViews(out Views, onwaar);
            
comboBox1.Items.Clear();
            
foreach (EdmViewInfo Weergave in weergaven)
{
      comboBox1.Items.Add(View.mbsVaultName);
}
if (comboBox1.Items.Count > 0)
{
      comboBox1.Text = (tekenreeks)comboBox1.Items[0];
}

als (!vault1. Is ingelogd)
{
      kluis1. LoginAuto(comboBox1.Text, dit. Handvat.ToInt32());
}

Vriendelijke groeten

1 like

Hallo

In uw code kunt u GetFolderFromPatch verwijderen omdat u het in de GetFileFromPath krijgt (het zal de verwerking al verlichten en kopieer- / plakfouten voorkomen).

Hebben alle gebruikers in de kluisinstellingen toegang tot deze map? Heb je geen extra rechten die ervoor zorgen dat het op jouw werk werkt en niet op iemand anders?

2 likes