Zmienianie nazw wszystkich komponentów w złożeniu, nawet tych zawartych w podzespole

Witam 

Zacząłem pisać makro z małych kawałków znalezionych tu i ówdzie w sieci. 

Chodzi o to, aby zmienić nazwy (pliki 3D + menedżer funkcji) wszystkich komponentów, których właściwość " SWOODCP_PanelStockLength " różni się od "".

Nie mogę zmienić nazw części w zespole i w eksploratorze Windows. 

Załączam początek mojego kodu, jeśli mógłbyś mi pomóc. 

Z góry dziękuję

 

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

Sub main()

Ustaw swApp = Application.SldWorks

Ustaw swModel = swApp.ActiveDoc

Set swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)

Dzieci = swRootComp.GetChildren

ChildCount = UBound(Dzieci)

Ustaw SwSelData = swModel.SelectionManager.CreateSelectData

 

Dla i = 0 do liczby dzieci

j = 1

Set swChild = Dzieci(i)

swChild.Select4 False, SwSelData, False
ParentName = Lewo(swModel.GetTitle, 7)
newName = ParentName & "-" & "000" & j
swModel.Extension.RenameDocument newName (nowaNazwa)
j = d + 1

Dalej i
swModel.ForceRebuild3 Prawda

Koniec subwoofera

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

Sub main()

Ustaw swApp = Application.SldWorks

Ustaw swModel = swApp.ActiveDoc

Set swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)

Dzieci = swRootComp.GetChildren

ChildCount = UBound(Dzieci)

Ustaw SwSelData = swModel.SelectionManager.CreateSelectData

 

Dla i = 0 do liczby dzieci

j = 1

Set swChild = Dzieci(i)

swChild.Select4 False, SwSelData, False
ParentName = Lewo(swModel.GetTitle, 7)
newName = ParentName & "-" & "000" & j
swModel.Extension.RenameDocument newName (nowaNazwa)
j = d + 1

Dalej i
swModel.ForceRebuild3 Prawda

Koniec subwoofera

 

Witam

Aby móc pomóc, musiałbyś wiedzieć, na czym polega problem. W pierwszej kolejności, aby to zadziałało, musisz zapisać zmiany i w razie potrzeby zaktualizować wszystkie przypadki użycia.

Zasadniczo funkcja wprowadza tylko tymczasową zmianę, jeśli nie ma rekordu, zmiana nie jest zapisywana.

1 polubienie

Witaj Cyrylu, 

Funkcja nie uwzględnia elementów podrzędnych w podzespołach i nie zmienia poprawnie nazw plików 3D, a jedynie te w drzewie.

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.