Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks Enterprise PDM
  PDM CopyTree Funktion mit VBA nutzen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Warum sich Subscription für SOLIDWORKS lohnt!
Autor Thema:  PDM CopyTree Funktion mit VBA nutzen (548 / mal gelesen)
MantaJochen
Mitglied
CAD-Admin

Sehen Sie sich das Profil von MantaJochen an!   Senden Sie eine Private Message an MantaJochen  Schreiben Sie einen Gästebucheintrag für MantaJochen

Beiträge: 4
Registriert: 29.03.2023

SW21 + PDM21 Professional

erstellt am: 29. Mrz. 2023 10:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 String

Sub 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


Sehen Sie sich das Profil von riesi an!   Senden Sie eine Private Message an riesi  Schreiben Sie einen Gästebucheintrag für riesi

Beiträge: 1073
Registriert: 06.05.2002

SWX Office Pre. 2020-Sp5

erstellt am: 29. Mrz. 2023 13:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für MantaJochen 10 Unities + Antwort hilfreich

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

Sehen Sie sich das Profil von MantaJochen an!   Senden Sie eine Private Message an MantaJochen  Schreiben Sie einen Gästebucheintrag für MantaJochen

Beiträge: 4
Registriert: 29.03.2023

SW21 + PDM21 Professional

erstellt am: 29. Mrz. 2023 14:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von riesi an!   Senden Sie eine Private Message an riesi  Schreiben Sie einen Gästebucheintrag für riesi

Beiträge: 1073
Registriert: 06.05.2002

SWX Office Pre. 2020-Sp5

erstellt am: 29. Mrz. 2023 15:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für MantaJochen 10 Unities + Antwort hilfreich

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

Sehen Sie sich das Profil von MantaJochen an!   Senden Sie eine Private Message an MantaJochen  Schreiben Sie einen Gästebucheintrag für MantaJochen

Beiträge: 4
Registriert: 29.03.2023

SW21 + PDM21 Professional

erstellt am: 30. Mrz. 2023 06:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Sehen Sie sich das Profil von MantaJochen an!   Senden Sie eine Private Message an MantaJochen  Schreiben Sie einen Gästebucheintrag für MantaJochen

Beiträge: 4
Registriert: 29.03.2023

SW21 + PDM21 Professional

erstellt am: 04. Apr. 2023 09:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 ansehenTeamleitung, Gruppenleitung
riesi
Mitglied
CAD-Admin


Sehen Sie sich das Profil von riesi an!   Senden Sie eine Private Message an riesi  Schreiben Sie einen Gästebucheintrag für riesi

Beiträge: 1073
Registriert: 06.05.2002

SWX Office Pre. 2020-Sp5

erstellt am: 04. Apr. 2023 12:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für MantaJochen 10 Unities + Antwort hilfreich

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz