Witam
W załączeniu znajduje się kod do przechodzenia przez zespół i podzespoły.
To, co blokowało kod, to pozycja j=1, która powodowała, że zapętlał się na tej wartości i dlatego systematycznie próbował zmieniać nazwę z przyrostem 0001.
W przypadku aktualizacji w eksploratorze należy zapisać, aby wpływ został odzwierciedlony w nazwie rekordu pliku, ponieważ funkcja zmiany nazwy tylko tymczasowo zmienia nazwy plików (zaktualizowane tylko w menedżerze operacji).
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
Kod nadal musi być dostosowany do docelowych plików, których nazwy mają zostać zmienione, co więcej, nie szukałem dłużej, ale kolejność jest nieco losowa.
3 polubienia
Super Cyryl,
Dziękuję bardzo, chciałbym, aby to było tak proste, jak się wydaje!
Wszystko, co muszę teraz zrobić, to przetestować, czy istnieje właściwość konfiguracyjna każdego z dzieci, a jeśli tak, zmieniam jej nazwę, w przeciwnym razie przechodzę do następnego dziecka. (bez względu na zamówienie.. )
A potem muszę poprawnie zarządzać licznikiem, aby suma mojej nazwy pliku nie przekraczała 12 cyfr.
W przeciwnym razie z narzędziem MycadTools, do którego musisz mieć dostęp, podając swój medal w swoim profilu, musi to być możliwe do wykonania za pośrednictwem ProjectManager bez posiadania jakiejkolwiek wiedzy programistycznej
2 polubienia
Witaj sbadenis,
Tak, projectManager działa, ale jest za długi w stosunku do niewielkich kosztów programowania.
Dzięki Cyrilowi wszystko, co muszę zrobić, to uzyskać dostęp do właściwości konfiguracji, o których nie mogę znaleźć żadnych informacji w internecie i to by było na tyle:)
Dziękuję za radę,
Pozdrowienia
Nie martw się @vincent.bottier o właściwości konfiguracji, oto przykład mojego 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 polubienie
Witam
Oto mały przykład, aby sprawdzić wartość swojej nieruchomości:
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
Mała informacja również, jeśli część jest obecna kilka razy w twoim zespole, to będzie traktowana tyle samo razy i dlatego przyjmie nazwę ostatniego licznika, z którym została potraktowana, nie wiem, czy jest to denerwujące dla twojej aplikacji.
Pozdrowienia
5 polubień
Witam
Dziękuję za odpowiedzi, postaram się dostosować ten kod!
@d.Roger : Powinienem być w stanie mu powiedzieć, że jeśli ma tyle cyfr w swoim nazwisku, a pierwsze 7 są równe pierwszym 7 w zestawie, to nie przetwarza i w tym przypadku to się nie powtórzy :)
Będę Cię informować na bieżąco i opublikuję mój ostateczny kod!
Jeszcze raz dziękuję za pomoc.
1 polubienie
Zgodnie z obietnicą d.rogera;
Próbowałem z twoim kodem. Mam błąd w wierszu: Set swCustProp = swModelChild.Extension.CustomPropertyManager("Default")
A jednak konfiguracja wszystkich moich pokoi jest rzeczywiście taka. Masz pomysł?
Dziękuję
Dobry wieczór
Prawdopodobnie istnieje plik, który nie ma tej konfiguracji w swoich ustawieniach.
W załączeniu znajduje się kod zmodyfikowany w celu uwzględnienia istnienia lub nie konfiguracji domyślnej
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 polubienia
Witam
Zaczynam robić prawdziwe testy i rzeczywiście rozumiem, co chciałeś mi powiedzieć.
Nazwa komponentu we właściwościach nie jest zgodna z nazwą pliku 3D.
Dodałem linię i pomyślałem, że zadziała, nawet jeśli nie uwzględni wszystkich liczb. A mam też części, które mają "domyślną" konfigurację (cholerny amerykański :)).
Jeśli nie, swCustProp jest niczym, to
status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
Jeśli wartość <> "" to
newName = ParentName & "-" & "000" & j
errorsRename = swModel.Extension.RenameDocument(nowaNazwa)
swChildComp.Name2 = nowaNazwa_
Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
j = d + 1
Zakończ jeżeli:
Zakończ jeżeli:
Na razie nie ma prawie żadnych komponentów o takiej samej nazwie w drzewie, jak w folderze Windows.
Witam
Nie rozumiem, co próbujesz zrobić z dodaną linią.
Ponadto, jak już powiedziałem w pierwszej odpowiedzi, jeśli nie ma rekordu z ustawieniami aktualizacji dzieci, nie będzie zmiany nazw rekordów plików i podzespołów, stąd brak widoczności w Eksploratorze Windows.
Witam
Próbuję dopasować nazwę pliku systemu Windows do nazwy składnika.
I dla mnie robię kopię zapasową, patrz poniżej
Opcja jawna
Dim swApp jako SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swRootComp jako SldWorks.Component2
Przyciemnione dzieci jako wariant
Dim swChild jako SldWorks.Component2
Dim SwSelData jako SldWorks.SelectData
Dim ChildCount As Long
Dim oldName As String
Dim newName As Ciąg
Słońce i tak długo
Słońce j tak długo
Dim ParentName As Ciąg
Błędy przyciemnieniaZmień nazwę na tak długo
Stan przyciemnienia Jako wartość logiczna
Ostrzeżenia o przyciemnieniu tak długo
Oszczędzaj tak długo
Dim swModelDocExt As ModelDocExtension
Dim swCustProp As CustomPropertyManager
Dim bool As wartość logiczna
Dim val As String
Dim valout As String
Sub main()
Ustaw swApp = Application.SldWorks
Ustaw swModel = swApp.ActiveDoc
ParentName = Lewo(swModel.GetTitle, 7)
Set swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)
j = 1
Komponent trawersu swRootComp, 1
swModel.ForceRebuild3 Prawda
status = swModel.Save3(swSaveAsOptions_SaveReferenced, errorsSave, ostrzeżenia)
Koniec subwoofera
Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)
Dim vChildComp jako wariant
Dim swChildComp As Component2 (Komponent2)
Słońce i tak długo
Dim swModelChild jako SldWorks.ModelDoc2
Dim swCustProp As CustomPropertyManager
Dim val As String (Ciąg dim val)
Dim valout As String
vChildComp = swComp.GetChildren
Dla i = 0 TB UBound(vChildComp)
Ustaw swChildComp = vChildComp(i)
PrzechodzićKomponent swChildComp, nLevel + 1
swChildComp.Select4 False, SwSelData, False
Set swModelChild = swChildComp.GetModelDoc2
Set swCustProp = swModelChild.Extension.CustomPropertyManager("Default") ' ustawia nazwę konfiguracji wraz z parametrem
Jeśli nie, swCustProp jest niczym, to
status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
Jeśli wartość <> "" to
newName = ParentName & "-" & "000" & j
errorsRename = swModel.Extension.RenameDocument(nowaNazwa)
swChildComp.Name2 = nowaNazwa_
Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
j = d + 1
Zakończ jeżeli:
Zakończ jeżeli:
Dalej i
Koniec subwoofera
capture.png
Wiersz swChildComp.Name2 = nowaNazwa, nie dodaje nic więcej ponad to, co już robi funkcja zmiany nazwy.
Na zrzucie ekranu nie widzę, co jest nie tak. Nazwa pliku jest dobra.
Pozostaje tylko sprawdzić, czy pliki nie są otwarte w trybie tylko do odczytu, widzę tylko to.
Tak, ponieważ zmieniłem jego nazwę ręcznie, ale kiedy uruchamiam makro z zestawem gdzieś, nie podaje ono tej samej nazwy, co gdyby licznik nie działał.
A kiedy ręcznie zmieniam nazwę części, klikając prawym przyciskiem myszy zmień nazwę części, zmienia to nazwę okna, ale nie nazwę komponentu.
Czy to normalne?
Nie rozumiem problemu lub jest jakaś subtelność w Swoodzie, której nie opanowuję.
Cóż, jestem trochę maniakiem i uważam za mylące, że nazwa wyświetlana w featuremanager nie jest taka sama jak nazwa pliku Windows. Nie?
Czy istnieje wiersz poleceń, który pozwala mi zmienić nazwę komponentu, aby można było dopasować ją bezpośrednio do nazwy pliku ?
W tym przypadku chodzi bardziej o ustawienie modeli. W moim przypadku filename = nazwa wyświetlana w menedżerze operacji.
W porządku
cóż, nie mam możliwości wyświetlenia nazwy pliku, co wydaje mi się dziwne...
capture.png
Jest on ukryty w sekcji "Pokaż nazwy komponentów". Nazwa składnika jest taka sama jak nazwa rekordu.
W przeciwnym razie należy zajrzeć do opcji ogólnych na poziomie odnośnika zewnętrznego, jeśli zaznaczona jest opcja "Aktualizuj nazwy komponentów po zastąpieniu dokumentów".
1 polubienie
Świetnie, ta opcja odniesień zewnętrznych nie była :) sprawdzana!
Od dzisiejszego ranka testuję go na kilku zestawach i nadal mam przepraszam pytanie^^
Czy istnieją przypadki, w których funkcja zmiany nazwy nie działa?
Ponieważ tutaj mam dwie części, których nazwy nie są zmieniane, a mimo to przekazuję program krok po kroku przechodzi na nich i uruchamia linię: errorsRename = swModel.Extension.RenameDocument(newName)
Ale nie zmieniaj jego nazwy. Masz pomysł?
Miłego weekendu