Leeren der Eigenschaften eines virtuellen (per Makro?)

Hallo
Ich bin auf der Suche nach einer automatischen Lösung (d.h. unsichtbar für den durchschnittlichen Benutzer), um die Datenkarte eines virtuellen Teils/einer virtuellen Baugruppe, die in einer anderen Baugruppe enthalten ist, zu bereinigen.
Wenn ich ein Teil virtuell in einer Baugruppe übergebe, behält es seine Solidworks-Eigenschaften bei, insbesondere die Teilenummer, die einen Konflikt mit dem ursprünglichen Teil verursachen kann (da die Teilenummer eine PDM-Variable ist, die im Tresor eindeutig sein muss).
Ich habe insbesondere daran gedacht, ein VBA-Makro unter SW zu erstellen, das sich um die Entfernung der betreffenden SW-Eigenschaft kümmert.
Ich habe mehrere Fragen:

  • Wann und wie wird dieses Makro automatisch gestartet? Bei einer Archivierungsaktion? Aufzeichnung? Während eines Zustandswechsels?
  • Wie lautet die Syntax zum Extrahieren/Einchecken einer Datei in VBA SW?
  • Gibt es eine einfachere Lösung? (unter SW eingerichtet, wie wird eine virtuelle verwaltet?

Vielen Dank im Voraus für Ihre Ideen!

Hallo
Auf der Makroseite können Sie es nicht automatisch starten, Sie müssen ein Add-In durchlaufen und mit den Ereignissen arbeiten. Also in einer .NET-Sprache zu programmieren
Danach weiß ich nicht, ob es eine einfachere Lösung gibt

Und ist der Start während einer PDM-Zustandsänderung möglich?

Das Makro muss bereits gestartet sein, um auf eine Änderung des PDM-Zustands zu reagieren, dies wird als Ereignisverwaltung bezeichnet. Eine Methode abonniert ein Ereignis, und wenn das Ereignis ausgelöst wird, wird die Methode ausgeführt. Kommen wir also zurück zur Add-In-Box.

OK, ich muss mich mit dem Add-In-Thema befassen, ich weiß nicht, was es ist.

Hallo
Ohne unbedingt ein Add-In zu durchlaufen, können Sie auch den Link ändern, der auf die SW-EXE verweist, um den Start eines Makros beim Start hinzuzufügen.
Dies würde die Verwendung von SW- und PDM-Ereignissen ermöglichen. Nachteil dieser Methode: Sie müssen auf allen Arbeitsplätzen eingreifen, um diesen Link zu ändern, und denken Sie daran, dies jedes Mal zu tun, wenn die SW-Version geändert wird.
Wären Ihre Benutzer sonst wirklich dagegen, ein Symbol hinzuzufügen, auf das sie klicken müssen, um eine Aktion zu starten?

1 „Gefällt mir“

Sie wären nicht dagegen, aber sie würden es nicht :slight_smile: starten.
Das Problem ist für sie unsichtbar, die Sperre wird später durchgeführt, wenn eine Zustandsänderung falsch gemacht wird, weil sie doppelt variabel ist.

Das ist das Problem :slight_smile:
Es gibt also immer noch das Add-In oder es gelingt, den exe-Startlink so zu ändern, dass ein Makro eingefügt werden kann, wenn SW gestartet wird.
Andernfalls hätte ich Dispatch vorgeschlagen, um die Kontrolle während der Archivierung durchzuführen, aber es scheint mir, dass auf der PDM-Seite die virtuellen Dateien nicht wirklich verwaltet werden, so dass Dispatch sie nicht interpretieren konnte, da es sich nicht um physische Dateien handelt.
Wenn das Makro jedoch manuell gestartet werden soll, fügen Sie der Datei einfach eine Eigenschaft hinzu und prüfen Sie, ob sie beim Einchecken vorhanden ist. Falls nicht vorhanden, verweigern Sie die Archivierung

Vielen Dank für Ihr Feedback.
Was bedeutet ein Add-In? Codieren Sie eine Ergänzung ein bisschen wie MyPDMTools?
Die .exe es ist eine gute Idee, außer dass Sie das Makro lieber nach den Änderungen starten sollten, nicht beim Öffnen :slight_smile: . Aber ich könnte es auch nur auf dem Automaten laufen lassen, der unsere neutralen Dateien generiert... Ich muss tiefer graben.
Dispatch ist auch eine Lösung, auch wenn es bedeutet, dass es für alle Dateien ohne Targeting ausgeführt werden muss.

Letzte Frage: Wenn Sie am Ende Ihrer Nachricht "Archivierung ablehnen" sagen, ist das eher so, als würden Sie die Zustandsänderung ablehnen, nicht wahr? Es schien mir nicht, dass wir ein Archiv blockieren könnten.

Sie können ein Archiv blockieren, ich mache es zum Beispiel bei einer Word-Datei, die nicht den richtigen Rahmen verwendet.
Für das Makro, das bei der Eröffnung gestartet wird, handelt es sich nur um ein Makro, das im Hintergrund ausgeführt wird und die SW-Ereignisse abfängt, um die Verarbeitung entsprechend dem Zielereignis anzuwenden.
Ein Add-In ist eine ausführbare Datei, aber auch hier muss es gestartet werden.

Also möchte ich vorerst wissen, wie man ein Archiv einer Datei blockiert, die nicht den richtigen Rahmen hat (zum Beispiel), denn im Moment weiß ich, wie man das nur macht, indem ich die Zustandsänderung blockiere. Verwenden Sie eine variable Bewertung, wenn der richtige Rahmen verwendet wird?
Meines Wissens habe ich nur diese Möglichkeiten, ein Archiv zu blockieren:
2023-11-03 14_40_47-Window

Und möglicherweise auf der Variablenseite dieses Kontrollkästchen, aber es überprüft nicht den Wert, sondern nur seine Existenz:
2023-11-03 14_45_36-Clipboard

Ich mache es mit Dispatch.

Nicht auf SW getestet, funktioniert aber auf jeden Fall sehr gut auf Word (es bricht die Archivierungsanfrage ab und öffnet die Datei erneut)

2 „Gefällt mir“

Hallo

Etwas, das bei der Implementierung eines Makros hilfreich sein kann: In Solidworks enthalten alle virtuellen Dateien das Zeichen ^, gefolgt vom Namen der Datei, in der die virtuelle Datei gespeichert ist (Hinweis: Im Falle der Unterebene haben wir zusätzlich zum Zeichen ^ auch _ Zeichen im Namen der virtuellen Datei, aber das sollte keine Auswirkungen haben).
Bei Dateien, die dieses ^-Zeichen enthalten, sollten Sie Ihr Makro ausführen (es sollte vermeiden, den Strang in nicht-virtuellen Dateien abzulegen).
Da virtuelle Dateien temporär sind, muss das Makro in einer geöffneten Assembly gestartet werden. Im normalen Arbeitsmodus sollte es funktionieren, aber wenn ein schlauer Kerl Spaß daran hat, eine Datei mit virtuellen Dateien über Windows zu archivieren/zu übertragen, ist sie tot (es sei denn, Sie erzwingen das Öffnen der Datei in Solidworks, bevor Sie an der Eigenschaftsbereinigung arbeiten).

Was den Makroteil betrifft, so ist es sicherlich unser Freund @Cyril Freund , der am klügsten sein wird.

1 „Gefällt mir“

Vielen Dank an euch beide, ich muss mich mit euren Vorschlägen befassen.
Für die Tatsache, dass die Datei geöffnet werden muss, kann dies machbar sein, denn gerade beim Öffnen des ASM auf einer SPS zur Erzeugung neutraler Dateien tritt das Archivierungsproblem auf (und seltsamerweise nicht, wenn es der Designer ist, der archiviert...). So konnte ich das Makro vor der Generierung auf dem Automaten laufen lassen.

Hallo zusammen, und ein frohes neues Jahr! Ich komme noch einmal auf mein Thema der Reinigung von Immobilien in virtuellen Räumen zurück.
Bevor ich mich mit dem Teil "Makro automatisch starten" befasse, würde ich zunächst versuchen, ein Makro zu erstellen, das ich als Administrator manuell auf einer blockierten Datei starten kann.
Könnte mir jemand von Ihnen helfen, ein Makro zu schreiben, das die folgenden Aktionen ausführen würde:

  • Scannen Sie bei einer bereits geöffneten Baugruppe alle Baugruppen und untergeordneten Teile
  • Wenn der Name des Kindes das Zeichen "^" enthält, öffnen Sie es
  • Öffnen Sie das Eigenschaftenfenster für diese virtuelle Datei
  • Entfernen Sie die Eigenschaft "Referenz" auf der Registerkarte "Anpassen" und in allen Konfigurationen, die auf der Registerkarte "Konfigurationsspezifisch" vorhanden sind.
  • Schließen Sie das Eigenschaftenfenster
  • Wenn es sich bei der geöffneten virtuellen Datei selbst um eine Assembly handelt, wird die untergeordnete Datei auf die gleiche Weise in einer Schleife ausgeführt
  • Speichern Sie die virtuelle Datei
  • Gehen Sie zum nächsten Kind über
  • Anschnallen bis zum letzten Kind
  • Zeigen Sie ein Pop-up an, wenn es fertig ist.

Offensichtlich ist das, was ich beschreibe, die Abfolge von Aktionen über Fenster, es gibt sicherlich eine Möglichkeit, all dies über Funktionen zu vereinfachen, aber ich bin ein großer Noob von SW-Makros. Auf der anderen Seite bin ich bereit zu lernen, wenn ich mich an Beispielen vorhandener Makros orientiert, ich verlange keine fertige :slight_smile: Arbeit.
Ich habe es über die Funktion "Makro aufnehmen" versucht, aber es funktioniert nicht im Eigenschaftenfenster.

Gleichzeitig werde ich versuchen zu sehen, ob ich das BatchProperties-Tool von myCADTools verwenden kann.

Hallo

Der Code ist nicht unbedingt optimiert, sondern erfüllt teilweise den Bedarf.
Für das Loopback auf einem virtuellen ASM hatte ich noch keine Zeit zu suchen (ob es jemand anderen dazu inspiriert, den Code fertigzustellen, weil nicht unbedingt mehr Zeit dafür im Moment aufwenden muss).

Option Explicit
Dim swApp           As SldWorks.SldWorks
Dim doc             As SldWorks.ModelDoc2
Dim swModel         As SldWorks.ModelDoc2
Dim asm             As SldWorks.AssemblyDoc
Dim compDoc         As SldWorks.ModelDoc2
Dim swModelDocExt   As ModelDocExtension
Dim swCustProp      As CustomPropertyManager
Dim swConfig        As SldWorks.Configuration
Dim swConfMgr       As SldWorks.ConfigurationManager
Dim comp            As SldWorks.Component2

Dim components      As Variant
Dim vComp           As Variant
Dim pathChain       As Variant
Dim titleChain      As Variant
Dim vPath           As Variant
Dim vConfigNameArr  As Variant
Dim vConfigName     As Variant
Dim vPropNames      As Variant
Dim vPropTypes      As Variant
Dim vPropValues     As Variant
Dim resolved        As Variant
Dim linkProp        As Variant

Dim nDocType        As Long
Dim nErrors         As Long
Dim nWarnings       As Long
Dim nNbrProps       As Long
Dim lRetVal         As Long
Dim j               As Long
Dim i               As Long

Dim bResult3        As Boolean
Dim boolstatus      As Boolean
Dim wasResolved     As Boolean
Dim linkToProp      As Boolean

Dim ValOut          As String
Dim ResolvedValOut  As String
Dim sCustProp       As String
Dim sConfig         As String
Sub main()

    Set swApp = Application.SldWorks
    Set doc = swApp.ActiveDoc
    If doc Is Nothing Then Exit Sub
    If doc.GetType <> swDocASSEMBLY Then Exit Sub
    Set asm = doc
    components = asm.GetComponents(False)   ' Get all components
    
    If IsArray(components) Then
        For Each vComp In components
            Set comp = vComp
            Set compDoc = comp.GetModelDoc2
            If Not compDoc Is Nothing Then
                bResult3 = compDoc.Extension.IsVirtualComponent3(pathChain, titleChain)
                If bResult3 <> False Then
                    For Each vPath In pathChain
                        If vPath <> doc.GetPathName Then
                            If InStr(LCase(vPath), "sldprt") > 0 Then
                                nDocType = swDocPART
                            ElseIf InStr(LCase(vPath), "sldasm") > 0 Then
                                nDocType = swDocASSEMBLY
                            ElseIf InStr(LCase(vPath), "slddrw") > 0 Then
                                nDocType = swDocDRAWING
                            Else
                                ' Probably not a SOLIDWORKS file
                                nDocType = swDocNONE
                                ' So cannot open the file
                                Exit Sub
                            End If
                        Set swModel = swApp.OpenDoc6(vPath, nDocType, swOpenDocOptions_Silent, "", nErrors, nWarnings)
                        Set swModelDocExt = swModel.Extension
                        Set swCustProp = swModelDocExt.CustomPropertyManager("")
                        nNbrProps = swCustProp.Count
                        lRetVal = swCustProp.GetAll3(vPropNames, vPropTypes, vPropValues, resolved, linkProp)
                        For j = 0 To nNbrProps - 1
                            For i = 0 To UBound(vPropNames)
                                sCustProp = vPropNames(i)
                                boolstatus = swModel.DeleteCustomInfo2("", sCustProp)
                            Next i
                        Next j
                        Set swConfMgr = swModel.ConfigurationManager
                        Set swConfig = swConfMgr.ActiveConfiguration
                        vConfigNameArr = swModel.GetConfigurationNames
                        For Each vConfigName In vConfigNameArr
                            Set swCustProp = swModelDocExt.CustomPropertyManager(vConfigName)
                            nNbrProps = swCustProp.Count
                            lRetVal = swCustProp.GetAll3(vPropNames, vPropTypes, vPropValues, resolved, linkProp)
                            For j = 0 To nNbrProps - 1
                                sConfig = vConfigName
                                For i = 0 To UBound(vPropNames)
                                    sCustProp = vPropNames(i)
                                    boolstatus = swModel.DeleteCustomInfo2(sConfig, sCustProp)
                                Next i

                            Next j
                        Next
                    End If
                    Next
                End If
            End If
        Next
    End If
End Sub

Wow, aber das ist großartig! Und es funktioniert :slight_smile:
Vielen Dank!
Damit bin ich im Moment zufrieden, es schließt nicht wirklich auf asm child, aber ich kann es neu starten, nachdem ich das betreffende asm child habe, es ist in Ordnung für :stuck_out_tongue: mich!
Ich werde immer noch sehen, ob ich eine zusätzliche Schleife verschachteln kann, wenn nDocType = dwDocASSEMBLY.
Danke noch einmal

1 „Gefällt mir“