| | | Warum sich Subscription für SOLIDWORKS lohnt! |
Autor
|
Thema: PDM CopyTree Funktion mit VBA nutzen (548 / mal gelesen)
|
MantaJochen Mitglied CAD-Admin
Beiträge: 4 Registriert: 29.03.2023 SW21 + PDM21 Professional
|
erstellt am: 29. Mrz. 2023 10:53 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, Mein Vorhaben: aktuell geöffnetes Teil/Baugruppe in Solidworks mittels einem Klick kopieren und dabei den Seriennummergenerator von PDM nutzen. Der manuelle Weg über "Verwendungsnachweis"->"Struktur kopieren"->"Umbenennen mit Seriennummer" ist einfach zu aufwendig, da in den meisten Fällen nur das geöffnete Teil und keine darunter befindlichen Teile kopiert werden sollen. Nun habe ich mich etwas in die API Hilfe von PDM eingelesen, leider sind dort alle Beispiele für VB.NET und nicht VBA. Ich konnte auch schon erfolgreich eine neue Seriennummer generieren, nur leider hänge ich bei der Methode CopyTree. Mein Code bisher: Code:
Private Declare PtrSafe Function GetParent Lib "user32.dll" (ByVal hwnd As Integer) As Integer Dim pdmVault As EdmVault5 Dim snNoValue As IEdmSerNoValue Dim newEpdmNo As Long Dim snNo As StringSub main() Set pdmVault = New EdmVault5 pdmVault.LoginAuto "XXXXXXX", 0 If pdmVault.IsLoggedIn Then 'TODO: Implement the routine Else Err.Raise vbError, "User is not logged in to the vault" End If Dim snNbrs As IEdmSerNoGen7 Set snNbrs = pdmVault.CreateUtility(EdmUtility.EdmUtil_SerNoGen) Set snNoValue = snNbrs.AllocSerNoValue("Dateinamen", 0, "", 0, 0, 0, 0) snNo = snNoValue.Value SetLastErpNo = snNo Dim Folder As IEdmFolder9 Set Folder = pdmVault.RootFolder Dim copyTreeOptions As EdmCopyTreeOptions copyTreeOptions.mbsPrefix = "Copy_" copyTreeOptions.mbsSuffix = "" copyTreeOptions.mbIncludeDrawings = -1 '-1 = included copyTreeOptions.mbUseLatestVersion = -1 '-1 = copy latest versions of files Dim destFolder As String destFolder = "C:\XXXXXX\XXXXX" Dim aFile As IEdmFile5 Dim Pfad As String Dim lHwnd As Integer Pfad = "C:\XXXXXX\Hydraulikteile\Hydraulikaggregat" Set aFile = pdmVault.GetFileFromPath(Pfad) Dim bool As Boolean bool = pdmVault.CopyTree(aFile.ID, Folder.ID, destFolder, True, True, copyTreeOptions, lHwnd) End Sub
Ich erhalte in der letzten Zeile den Fehler "Variable verwendet einen in Visual Basic nicht unterstützten Typ der Automatisierung. 458" Ich vermute mal es liegt am "Parent window handle", leider werde ich aus der Solidworks API Hilfe zu Copytree nicht so richtig schlau, bzw. weiß nicht genau was ich da machen muss :D. Verweis zur Library habe ich angehakt, sonst würde ich ja auch keine Seriennummer bekommen... Die Zeile "Private Declare PtrSafe Function GetParent Lib "user32.dll" (ByVal hwnd As Integer) As Integer" brachte leider auch kein Erfolg. (64bit wir verwendet) Kann mir jemand weiterhelfen und hat diese Methode schonmal verwendet? Oder bin ich komplett auf dem Holzweg für mein Vorhaben? Auszug aus Solidworks-API-Hilfe: Beispiel für Copytree unter VB.Net:
Code:
' Copy the assembly's tree of files to the specified destination folder Dim copyTreeOptions As EdmCopyTreeOptions = Nothing copyTreeOptions.mbsPrefix = "Copy_" copyTreeOptions.mbsSuffix = "" copyTreeOptions.mbIncludeDrawings = -1 copyTreeOptions.mbUseLatestVersion = -1 aFile = vault2.GetFileFromPath(Folder.LocalPath + "\" + FileNames(0)) destFolder = ListBox1.Items(0) vault2.CopyTree(aFile.ID, Folder.ID, destFolder, True, True, copyTreeOptions, Me.Handle.ToInt32())
Bei Me.Handle.ToInt32() bringt VBA den Fehler: "Ungültige Verwendung von Me". Vielen Dank schonmal! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 29. Mrz. 2023 13:45 <-- editieren / zitieren --> Unities abgeben: Nur für MantaJochen
CopyTree ist eine Methode und liefert keinen Wert zurück. Als Window-Handler kannst Du auch eine 0 einsetzen, wenn Du auf die Meldungen verzichten kannst. Hast Du beim Login ja auch so gemacht. Dann aber die Meldungen durch CopyTree ausblenden. Code:
pdmVault.CopyTree(aFile.ID, Folder.ID, destFolder, False, False, copyTreeOptions, 0)
Weiterhin sieht es für mich so aus, als würdest Du den zu kopierende Datei nicht mit geben, sondern nur ein Verzeichnis. Aaaaber -- nach dem Kopieren musst Du das Zielverzeichnis noch nach den neuen Dateien abgrasen und diese mit einer neuen Seriennummer versehen. Da diese zu diesem Zeitpunkt noch nicht eingecheckt sind, kann Dir Datenbank bei der Pflege der Zeichnungs-Referenz nicht helfen. Ich würde nur den Nummern-Generator antriggern und die Arbeit mit SolidWorks erledigen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MantaJochen Mitglied CAD-Admin
Beiträge: 4 Registriert: 29.03.2023 SW21 + PDM21 Professional
|
erstellt am: 29. Mrz. 2023 14:08 <-- editieren / zitieren --> Unities abgeben:
Hallo riesi, vielen Dank für deine Antwort. Gibt es bei den CopyTreeOptions die Möglichkeit das Umbenennen mit Seriennummer zu verwenden? Ansonsten muss ich dir Recht geben, nachträglich Umbenennen ist aufgrund der Zeichnungsreferenz blöd. Diesen Schritt hatte ich noch nicht bedacht, da es schon vorher gehapert hatte. Wenn ich das ganze mit Solidworks mache bleibt aber die Zeichnung auf der Strecke, und Variablen leeren und neu befüllen, was ich über einen automatischen Statusübergang in PDM nur für "Struktur kopieren" machen müsste ich dann auch in Solidworks umsetzen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 29. Mrz. 2023 15:05 <-- editieren / zitieren --> Unities abgeben: Nur für MantaJochen
Zitat: Original erstellt von MantaJochen:
Gibt es bei den CopyTreeOptions die Möglichkeit das Umbenennen mit Seriennummer zu verwenden? ... Wenn ich das ganze mit Solidworks mache bleibt aber die Zeichnung auf der Strecke...
Zur ersten Frage: Leider nein. Zu Weg mit SolidWorks:
- Ausgehend vom aktiven Modell den aktuellen Pfad inkl. Verzeichnis aus SolidWorks holen.
- ebenfalls die aktive Konfiguration mit nehmen
- Mit Pfad das File- und Folder-Objekt aus dem PDM anziehen
- Damit die aktuelle Versions-Nummer holen (CurrentVersion müsste es sein)
- Vom File-Object ein Verweis auf die Refernenzen setzen
- Mit der Versions-Nummer und Deiner aktiven Konfiguration den Eltern-Verweise ziehen
- In dieser Liste sollte nur eine Zeichnung zu finden sein, dass Referenz-Object enthält auch eine Eigenschaft mit dem vollständigem Pfad.
- Öffnen der Zeichnung in SolidWorks
- Nummern-Generator antriggern
- Jeweils "Speichern unter..." in SolidWorks auslösen
Bei meinem Arbeitgeber habe ich es anders gelöst: Da wir oft Varianten-Konstruktion machen, kennen wir schon im Vorfeld die Einzeilteile und Baugruppen, welche kopiert werden müssen. Für diese Komponenten habe ich einen Vorlagen-Ordner im PDM angelegt, wo alles drin ist. Dazu gibt es eine Liste mit Dateien, welche kopiert werden müssen. (Wie "Struktur kopieren...", nur fertig angekreuzt) Die Dateien kopiere ich anschließend hänge ich die Referenzen mit der Document-Manager-Api um. Der Kollegen braucht nur die neue Kommissions-Nr. eingeben, die Kopier-Liste auswählen, der Rest geht danach von allein. Wenn Du Detail-Fragen hast, gerne -- das fertige Programm möchte ich nicht veröffentlichen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MantaJochen Mitglied CAD-Admin
Beiträge: 4 Registriert: 29.03.2023 SW21 + PDM21 Professional
|
erstellt am: 30. Mrz. 2023 06:49 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank riesi! Der Weg ist nun klar, die Solidworks-Funktionen beherrsche ich, bei den PDM Funktionen schau ich in die Hilfe, aber da werden sicher Fragen aufkommen ;-) Danke mal, ich habe zu tun Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MantaJochen Mitglied CAD-Admin
Beiträge: 4 Registriert: 29.03.2023 SW21 + PDM21 Professional
|
erstellt am: 04. Apr. 2023 09:56 <-- editieren / zitieren --> Unities abgeben:
Hallo Riesi, ich habe nun den Seriennummerngenerator getriggert und ein geöffnetes Part als Kopie gespeichert. Leider erhalte ich einen Fehler bei GetFileFromPath, da die zuvor mit SaveAs3 erzeugte Kopie nur eine lokale Datei im Tresor ist. File ist dann einfach Nothing. Wenn ich nach der Kopie die Datei manuell "zum Dateitresor hinzufüge" und dann das Makro Schrittweise weiterführe funktioniert alles. Ich habe auch schon in den Gruppeneinstellungen unter PDM die Dateiendungen der SW-Dateien für das automatische Hinzufügen von Dateien zum Tresor eingefügt. .sldasm;.sldprt;.slddrw Leider bringt das auch nichts. Wenn ich eine SW-Datei von außen per Drag&Drop in den Tresor ziehe funktioniert das automatische Hinzufügen. Was muss ich an meinem Makro ändern, damit die Datei auch zum Tresor hinzugefügt wird? Code:
Dim swApp As Object Dim Part As ModelDoc2 Dim swModelDocExt As ModelDocExtension 'Solidworks Kopie Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc Set swModelDocExt = Part.Extension fullModelPath = Part.GetPathName If fullModelPath = "" Then MsgBox ("Fehler, Datei wurde zuvor nicht gespeichert!") End End If speicherPfadAlt = Left(fullModelPath, InStrRev(fullModelPath, "\")) Dateiendung = Mid(fullModelPath, InStrRev(fullModelPath, ".")) speicherPfadNeu = "C:\XXXXXXX\01_Anwender\" & str_UserName & "\" & snNo & Dateiendung If Part.GetType() = 1 Then 'Part boolstatus = swModelDocExt.SaveAs3(speicherPfadNeu, 0, 2, Nothing, AdvOptData, Error, Warning) swApp.CloseDoc Part.GetPathName() ' Original Dokument schließen End If Dim file As IEdmFile5 Dim folder As IEdmFolder5 Set folder = pdmVault.GetFolderFromPath(speicherPfadNeu) Set file = pdmVault.GetFileFromPath(speicherPfadNeu, folder)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Technical Project Manager (f/m/x) | Sich etwas Neues trauen, über sich hinauswachsen und dabei die Grenzen des Machbaren neu de?nieren. Genau das ist es, was unsere Mitarbeitenden täglich leben dürfen und sollen. Um mit unseren Innovationen das Tempo vorzugeben und Großartiges zu ermöglichen. Denn hinter jedem erfolgreichen Unternehmen stehen eine ganze Menge faszinierender Menschen. Die Mitarbeitenden von ZEISS arbeiten in einem offenen und modernen Umfeld mit zahlreichen Entwicklungs- und Weiterbildungsmöglichkeiten.... | Anzeige ansehen | Teamleitung, Gruppenleitung |
|
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 04. Apr. 2023 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für MantaJochen
AddFile2 aus dem Folder-Object ist dafür gut geeignet. Zitat: Original erstellt von MantaJochen:
Was muss ich an meinem Makro ändern, damit die Datei auch zum Tresor hinzugefügt wird? Code:
... (Wegen der Übersicht entfernt) Dim file As IEdmFile5 Dim folder As IEdmFolder8 ' Änderung, AddFile aus IEdmFolder5 ist in der Hilfe als Obsolete markiert Set folder = pdmVault.GetFolderFromPath(speicherPfadNeu) ' Ab hier mein Beispiel Dim errorCode as long Dim fileId as long fileId = folder.AddFile2(0, speicherPfadNeu, errorCode) If errorCode = 0 then Set file = pdmVault.GetObject(EdmObjectType.EdmObject_File, fileId) Else ' Fehlerbehandlung hier End If
Hab' den Code jetzt ungetestet hier im Browser getippt. Es kann allerdings sein, dass es trotzdem nicht klappt, weil SolidWorks den FileLock auf die Datei hält. Aber auch das ist "umschiffbar" und habe ich hier im Forum auch schon gelöst. In dem Fall siehe hier: API - geöffnete Zeichnung mit Schreibrechten auschecken
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|