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
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?
Eerlijk gezegd bedankt, heel erg bedankt, vooral aan d.roger en Cyril.f voor de interesse en hulp die aan dit bericht is gegeven!
Het probleem was vrij eenvoudig, zoals in de meeste gevallen! Dit is na het lezen van de antwoorden van Cyril.f met de vraag of de paden identiek waren op alle werkstations en d.roger die zich afvroeg over de aanwezigheid van de SOLIDWORKS Data-map in het pad.
Inderdaad, op mijn computer was de kofferbakweergave niet op dezelfde plaats geïnstalleerd als op andere computers. Ik had het niet moeten vertrouwen...
Nogmaals bedankt en tot ziens voor andere verdraaide maar interessante vragen!