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?
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
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.
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?
Sie wären nicht dagegen, aber sie würden es nicht 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 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 . 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:
Und möglicherweise auf der Variablenseite dieses Kontrollkästchen, aber es überprüft nicht den Wert, sondern nur seine Existenz:
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.
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 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.
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 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 mich! Ich werde immer noch sehen, ob ich eine zusätzliche Schleife verschachteln kann, wenn nDocType = dwDocASSEMBLY. Danke noch einmal