Umbenennen aller Komponenten in einer Baugruppe, auch derjenigen, die in einer Unterbaugruppe enthalten sind

Hallo 

Ich fing an, ein Makro mit kleinen Stücken zu schreiben, die hier und da im Netz zu finden waren. 

Die Idee ist, alle Komponenten umzubenennen (3D-Dateien + Feature-Manager), deren Eigenschaft " SWOODCP_PanelStockLength " sich von "" unterscheidet.

Ich kann die umzubenennenden Teile nicht in der Baugruppe und im Windows-Explorer bekommen. 

Ich hänge den Anfang meines Codes an, wenn Sie mir helfen könnten. 

Vielen Dank im Voraus 

 

Option Explizit

Dim swApp als SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swRootComp als SldWorks.Component2
Dimmen von Kindern als Variante
Dim swChild As SldWorks.Component2
Dim SwSelData As SldWorks.SelectData
Dim ChildCount so lange
Dim oldName als Zeichenfolge
Dimmen newName als Zeichenfolge
Sonne i So lang
Sonne j So lang
Dim ParentName als Zeichenfolge

Sub main()

Legen Sie swApp = Application.SldWorks fest

Festlegen von swModel = swApp.ActiveDoc

Legen Sie swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True) fest.

Untergeordnete Elemente = swRootComp.GetChildren

ChildCount = UBound(Kinder)

Set SwSelData = swModel.SelectionManager.CreateSelectData

 

Für i = 0 bis ChildCount

j = 1

Set swChild = Kinder(i)

swChild.Select4 False, SwSelData, False
Übergeordneter Name = Links(swModel.GetTitle, 7)
newName = Übergeordneter Name & "-" & "000" & j
swModel.Extension.RenameDocument newName
j = d + 1

Weiter i
swModel.ForceRebuild3 Wahr

Ende Sub

Option Explizit

Dim swApp als SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swRootComp als SldWorks.Component2
Dimmen von Kindern als Variante
Dim swChild As SldWorks.Component2
Dim SwSelData As SldWorks.SelectData
Dim ChildCount so lange
Dim oldName als Zeichenfolge
Dimmen newName als Zeichenfolge
Sonne i So lang
Sonne j So lang
Dim ParentName als Zeichenfolge

Sub main()

Legen Sie swApp = Application.SldWorks fest

Festlegen von swModel = swApp.ActiveDoc

Legen Sie swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True) fest.

Untergeordnete Elemente = swRootComp.GetChildren

ChildCount = UBound(Kinder)

Set SwSelData = swModel.SelectionManager.CreateSelectData

 

Für i = 0 bis ChildCount

j = 1

Set swChild = Kinder(i)

swChild.Select4 False, SwSelData, False
Übergeordneter Name = Links(swModel.GetTitle, 7)
newName = Übergeordneter Name & "-" & "000" & j
swModel.Extension.RenameDocument newName
j = d + 1

Weiter i
swModel.ForceRebuild3 Wahr

Ende Sub

 

Hallo

Um helfen zu können, müssten Sie wissen, was das Problem ist. Als ersten Ansatz, damit es funktioniert, müssen Sie die Änderungen speichern und bei Bedarf alle Anwendungsfälle aktualisieren.

Grundsätzlich nimmt die Funktion nur eine temporäre Änderung vor, wenn kein Datensatz vorhanden ist, wird die Änderung nicht gespeichert.

1 „Gefällt mir“

Hallo Cyril, 

Die Funktion berücksichtigt keine untergeordneten Elemente in Unterbaugruppen und benennt 3D-Dateien nicht korrekt um, sondern nur die Dateien in der Struktur.

Hallo

Im Anhang befindet sich der Code zum Durchlaufen der Baugruppe und der Unterbaugruppen.

Was den Code blockierte, war die Position von j=1, die dazu führte, dass er eine Schleife auf diesen Wert führte und daher systematisch versuchte, ihn mit dem Inkrement 0001 umzubenennen.

Für das Update im Explorer müssen Sie speichern, damit sich die Auswirkungen auf den Namen des Dateidatensatzes auswirken, da die Umbenennungsfunktion die Dateinamen nur vorübergehend ändert (nur im Featuremanager aktualisiert).

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swRootComp As SldWorks.Component2
Dim Children As Variant
Dim swChild As SldWorks.Component2
Dim SwSelData As SldWorks.SelectData
Dim ChildCount As Long
Dim oldName As String
Dim newName As String
Dim i As Long
Dim j As Long
Dim NomParent As String
Dim errorsRename As Long
Dim status As Boolean
Dim warnings As Long
Dim errorsSave As Long

Sub main()

Set swApp = Application.SldWorks

Set swModel = swApp.ActiveDoc
NomParent = Left(swModel.GetTitle, 7)
Set swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)
j = 1
TraverseComponent swRootComp, 1
swModel.ForceRebuild3 True
status = swModel.Save3(swSaveAsOptions_SaveReferenced, errorsSave, warnings)


End Sub
Sub TraverseComponent _
(swComp As SldWorks.Component2, nLevel As Long)
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swCompConfig As SldWorks.Configuration
    Dim sPadStr As String
    Dim i As Long
   
    
    For i = 0 To nLevel - 1
        sPadStr = sPadStr + "  "
    Next i
    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp, nLevel + 1
        swChildComp.Select4 False, SwSelData, False
        newName = "Test" & "-" & "000" & j
        errorsRename = swModel.Extension.RenameDocument(newName)
        j = j + 1
    Next i
End Sub

 

Der Code muss noch angepasst werden, um auf die Dateien abzuzielen, die umbenannt werden sollen, außerdem habe ich nicht länger gesucht, aber die Reihenfolge ist etwas zufällig.

3 „Gefällt mir“

Super Cyril, 

 

Vielen Dank, ich würde es lieben, wenn es so einfach wäre, wie es sich anhört! 

Alles, was ich jetzt tun muss, ist zu testen, ob eine Konfigurationseigenschaft jedes der Kinder existiert, und wenn ja, benenne ich sie um, andernfalls gehe ich zum nächsten Kind über. ( egal in welcher Reihenfolge.. )

Und dann muss ich den Zähler richtig verwalten, damit die Summe meines Dateinamens 12 Ziffern nicht überschreitet. 

Andernfalls muss das MycadTools-Tool, auf das Sie Zugriff haben müssen, wenn Sie Ihre Medaille in Ihrem Profil haben,  über ProjectManager ohne Programmierkenntnisse machbar sein

2 „Gefällt mir“

Hallo sbadenis, 

Ja, projectManager funktioniert, aber es ist zu lang für die geringe Programmierung, die es kostet. 

Dank Cyril muss ich nur auf die Konfigurationseigenschaften zugreifen, über die ich im Internet keine Informationen finden kann, und das war's:) 

Vielen Dank für den Rat, 

Herzliche Grüße

Keine Sorge @vincent.bottier für die Konfigurationseigenschaften, hier ist ein Beispiel für mein Macrotec:


 '---------------------------------------------------------------------------
' Preconditions:
' 1. Open a part document.
' 2. Open the Immediate window.
'
' Postconditions:
' 1. Adds a date custom property to the part's configuration.
' 2. Tests whether the custom property is editable, and if so,
'    edits it.
' 3. Gets all custom properties in the configuration.
' 4. Deletes a custom property.
' 5. Examine the Immediate window.
'---------------------------------------------------------------------------

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim config As SldWorks.Configuration
Dim cusPropMgr As SldWorks.CustomPropertyManager
Dim lRetVal As Long
Dim vPropNames As Variant
Dim vPropTypes As Variant
Dim vPropValues As Variant
Dim ValOut As String
Dim ResolvedValOut As String
Dim wasResolved As Boolean
Dim linkToProp As Boolean
Dim resolved As Variant
Dim linkProp As Variant
Dim nNbrProps As Long
Dim j As Long
Dim custPropType As Long
Dim bRet As Boolean

Sub main()


    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set config = swModel.GetActiveConfiguration
    Set cusPropMgr = config.CustomPropertyManager
   

    ' Get the number of custom properties for this configuration
    nNbrProps = cusPropMgr.Count
    Debug.Print "Number of properties for this configuration:            " & nNbrProps
   

    ' Gets the custom properties
    lRetVal = cusPropMgr.GetAll3(vPropNames, vPropTypes, vPropValues, resolved, linkProp)

    ' For each custom property, print its name, type, and evaluated value
    For j = 0 To nNbrProps - 1
        custPropType = cusPropMgr.GetType2(vPropNames(j))
        Debug.Print "    Name, swCustomInfoType_e value, and resolved value:  " & vPropNames(j) & ", "; custPropType & ", " & vPropValues(j)
    Next j

   
    ' Get the number of custom properties for this configuration
    nNbrProps = cusPropMgr.Count
    Debug.Print "Number of properties for this configuration:            " & nNbrProps

End Sub

 

1 „Gefällt mir“

Hallo

Hier ein kleines Beispiel, um den Wert Ihrer Immobilie zu überprüfen:

Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)
    Dim vChildComp As Variant
    Dim swChildComp As Component2
    Dim i As Long
    Dim swModelChild As SldWorks.ModelDoc2
    Dim swCustProp As CustomPropertyManager
    Dim val As String
    Dim valout As String

    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp, nLevel + 1
        swChildComp.Select4 False, SwSelData, False
        Set swModelChild = swChildComp.GetModelDoc2
        Set swCustProp = swModelChild.Extension.CustomPropertyManager("Défaut") 'mettre le nom de la configuration comprenant la propriété
        status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
        If valout <> "" Then
            newName = Left(swModelChild.GetTitle, 4) & "-" & "000" & j
            errorsRename = swModel.Extension.RenameDocument(newName)
            Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
            j = j + 1
        End If
    Next i
End Sub

Kleine Information auch, wenn ein Teil mehrmals in Ihrer Baugruppe vorhanden ist, wird es genauso oft behandelt und nimmt daher den Namen des letzten Zählers an, mit dem es behandelt wurde, ich weiß nicht, ob dies für Ihre Anwendung ärgerlich ist.

Herzliche Grüße

5 „Gefällt mir“

Hallo 

Vielen Dank für Ihre Antworten, ich werde versuchen, diesen Code anzupassen! 

@d.Roger : Ich sollte in der Lage sein, ihm zu sagen, dass, wenn er so viele Ziffern in seinem Namen hat und die ersten 7 gleich den ersten 7 der Versammlung sind, er nicht verarbeitet und es wird sich in diesem Fall nicht duplizieren:) 

Ich halte euch auf dem Laufenden und poste meinen endgültigen Code! 

Nochmals vielen Dank für Ihre Hilfe.

1 „Gefällt mir“

Wie von d.roger versprochen;  

Ich habe es mit Ihrem Code versucht. Ich habe einen Fehler in der Zeile: Set swCustProp = swModelChild.Extension.CustomPropertyManager("Default")

Und doch ist die Konfiguration aller meiner Räume in der Tat so. Haben Sie eine Idee? 

Vielen Dank 

Guten Abend

Es gibt wahrscheinlich eine Datei, die diese Konfiguration nicht in ihren Einstellungen hat.

Angefügt ist der Code, der geändert wurde, um das Vorhandensein oder Nichtvorhandensein der Standardkonfiguration zu berücksichtigen

Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)
    Dim vChildComp As Variant
    Dim swChildComp As Component2
    Dim i As Long
    Dim swModelChild As SldWorks.ModelDoc2
    Dim swCustProp As CustomPropertyManager
    Dim val As String
    Dim valout As String

    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp, nLevel + 1
        swChildComp.Select4 False, SwSelData, False
        Set swModelChild = swChildComp.GetModelDoc2
        Set swCustProp = swModelChild.Extension.CustomPropertyManager("Défaut") 'mettre le nom de la configuration comprenant la propriété
        If Not swCustProp Is Nothing Then
        status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
        If valout <> "" Then
            newName = Left(swModelChild.GetTitle, 4) & "-" & "000" & j
            errorsRename = swModel.Extension.RenameDocument(newName)
            Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
            j = j + 1
        End If
        End If
    Next i
End Sub

 

2 „Gefällt mir“

Hallo 

Ich fange an, die richtigen Tests zu machen, und tatsächlich verstehe ich, was Sie mir sagen wollten. 

Der Komponentenname in den Eigenschaften stimmt nicht mit dem Namen der 3D-Datei überein. 

Ich habe eine Zeile hinzugefügt und dachte, es würde funktionieren, auch wenn es nicht alle Zahlen braucht. Und ich habe auch Teile, die eine "Standard"-Konfiguration haben (verdammte amerikanische :)).  

Wenn nicht, ist swCustProp nichts, dann
            status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
            Wenn valout <> "" Dann
                newName = Übergeordneter Name & "-" & "000" & j
                errorsRename = swModel.Extension.RenameDocument(newName)
                swChildComp.Name2 = neuer Name
                Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsUmbenennen
                j = d + 1
            Ende, wenn
        Ende, wenn

 

Im Moment gibt es fast keine Komponenten, die im Baum den gleichen Namen haben wie im Windows-Ordner.  

Hallo

Ich verstehe nicht, was Sie mit der hinzugefügten Zeile bezwecken.

Wie ich bereits in der ersten Antwort sagte, werden die Datensatznamen der Dateien und Unterbaugruppen nicht geändert, wenn kein Datensatz mit den Update-Einstellungen der Kinder vorhanden ist, daher die mangelnde Sichtbarkeit im Windows Explorer.

Hallo 

Ich versuche, den Windows-Dateinamen mit dem Komponentennamen abzugleichen. 

Und für mich mache ich ein Backup, siehe unten

 

Option Explizit

Dim swApp als SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swRootComp als SldWorks.Component2
Dimmen von Kindern als Variante
Dim swChild As SldWorks.Component2
Dim SwSelData As SldWorks.SelectData
Dim ChildCount so lange
Dim oldName als Zeichenfolge
Dimmen newName als Zeichenfolge
Sonne i So lang
Sonne j So lang
Dim ParentName als Zeichenfolge
DimmfehlerUmbenennen wie lang
Status dimmen: Als boolescher Wert
Schwache Warnungen So lange
Sparen Sie so lange
Dim swModelDocExt als ModelDocExtension
Dim swCustProp As CustomPropertyManager
Dim bool als boolescher Wert
Dim val As String
Dim valout As String

Sub main()

Legen Sie swApp = Application.SldWorks fest

Festlegen von swModel = swApp.ActiveDoc
Übergeordneter Name = Links(swModel.GetTitle, 7)
Legen Sie swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True) fest.
j = 1
TraverseComponent swRootComp, 1
swModel.ForceRebuild3 Wahr
status = swModel.Save3(swSaveAsOptions_SaveReferenced, errorsSave, Warnungen)

Ende Sub


Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)
    Dim vChildComp als Variante
    Dim swChildComp als Komponente2
    Sonne i So lang
    Dim swModelChild als SldWorks.ModelDoc2
    Dim swCustProp As CustomPropertyManager
    Dim val As String
    Dim valout As String

    vChildComp = swComp.GetChildren
    Für i = 0 TB UBound(vChildComp)
        Legen Sie swChildComp = vChildComp(i) fest.
        TraverseComponent swChildComp, nLevel + 1
        swChildComp.Select4 Falsch, SwSelData, Falsch
        Legen Sie swModelChild = swChildComp.GetModelDoc2 fest
        Set swCustProp = swModelChild.Extension.CustomPropertyManager("Default") ' Setze den Namen der Konfiguration, einschließlich der
        Wenn nicht, ist swCustProp nichts, dann
            status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
            Wenn valout <> "" Dann
                newName = Übergeordneter Name & "-" & "000" & j
                errorsRename = swModel.Extension.RenameDocument(newName)
                swChildComp.Name2 = neuer Name
                Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsUmbenennen
                j = d + 1
            Ende, wenn
        Ende, wenn
    Weiter i
Ende Sub
 


capture.png

Die Zeile swChildComp.Name2 = newName fügt nicht mehr hinzu, als die Umbenennungsfunktion bereits tut.

Für den Screenshot sehe ich nicht, was falsch ist. Der Dateiname ist gut.

Alles, was bleibt, ist zu überprüfen, ob die Dateien nicht schreibgeschützt geöffnet sind, das kann ich nur sehen.

Ja, weil ich es von Hand umbenannt habe, aber wenn ich mein Makro irgendwo mit einer Assembly ausführe, gibt es nicht den gleichen Namen, als ob der Indikator nicht funktioniert hätte. 

Und wenn ich ein Teil von Hand umbenenne, indem ich mit der rechten Maustaste auf "Teil umbenennen" klicke, ändert sich der Name des Fensters, aber nicht der Name der Komponente. 

Ist das normal? 

Ich verstehe das Problem nicht oder es gibt eine Feinheit bei Swood, die ich nicht beherrsche.

Nun, ich bin ein bisschen verrückt und finde es verwirrend, dass der Name, der im Featuremanager angezeigt wird, nicht mit dem Namen der Windows-Datei übereinstimmt. Nein? 

Gibt es eine Befehlszeile, die es mir ermöglicht, den Namen der Komponente so umzubenennen, dass ich ihn direkt mit dem Namen der Datei abgleichen kann? 

In diesem Fall geht es eher um das Einrichten der Modelle. In meinem Fall ist filename = Name, der im Featuremanager angezeigt wird.