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.
Alles klar
Nun, ich habe nicht die Möglichkeit, den Namen der Datei anzuzeigen, was mir seltsam vorkommt ...
capture.png
Es ist unter "Komponentennamen anzeigen" versteckt. Der Name der Komponente ist identisch mit dem Namen des Datensatzes.
Andernfalls sollten Sie in den allgemeinen Optionen auf der externen Referenzebene nachsehen, ob die Option "Komponentennamen aktualisieren, wenn Dokumente ersetzt werden" aktiviert ist.
1 „Gefällt mir“
Super, diese Option der externen Referenzen wurde :) nicht angekreuzt!
Ich habe es seit heute Morgen an mehreren Baugruppen getestet, und ich habe immer noch eine traurige Frage^^
Gibt es Fälle, in denen die Umbenennungsfunktion nicht funktioniert?
Da ich hier zwei Teile habe, die nicht umbenannt werden, ich aber das Programm Schritt für Schritt eingebe, gibt es sie weiter und löst die Zeile aus: errorsRename = swModel.Extension.RenameDocument(newName)
Aber benennen Sie es nicht um. Haben Sie eine Idee?
Schönes Wochenende