Opróżnianie właściwości wirtualnego (za pomocą makra?)

Witam
Szukam rozwiązania automatycznego (czyli niewidocznego dla przeciętnego użytkownika) do wyczyszczenia karty danych wirtualnej części/złożenia zawartego w innym złożeniu.
Rzeczywiście, jeśli przekażę część wirtualnie w złożeniu, zachowuje ona swoje właściwości Solidworks, w szczególności numer części, który może powodować konflikt z oryginalną częścią (ponieważ numer części jest zmienną PDM, która musi być unikalna w przechowalni).
Myślałem w szczególności o stworzeniu makra vba w oprogramowaniu, które zajęłoby się usunięciem danej właściwości oprogramowania.
Mam kilka pytań:

  • Kiedy i jak uruchomić to makro automatycznie? Na temat czynności archiwizacji? Nagranie? Podczas zmiany stanu?
  • Jaka jest składnia wyodrębniania/ewidencjonowania pliku w oprogramowaniu VBA?
  • Czy istnieje prostsze rozwiązanie? (skonfigurowane w SW jak jest zarządzany wirtualnie ?

Z góry dziękuję za pomysły!

Witam
Jeśli chodzi o stronę makr, nie możesz uruchomić go automatycznie, musisz przejść przez dodatek i pracować ze zdarzeniami. Tak więc, aby programować w języku .NET
Po tym nie wiem, czy istnieje prostsze rozwiązanie

I czy uruchomienie podczas zmiany stanu PDM jest wykonalne?

Makro musi być już uruchomione, aby zareagować na zmianę stanu PDM, nazywa się to zarządzaniem zdarzeniami. Metoda subskrybuje zdarzenie, a gdy zdarzenie jest uruchamiane, metoda jest wykonywana. Wracamy więc do pudełka z dodatkami.

OK, muszę zagłębić się w temat dodatku, nie wiem co to jest.

Witam
Bez konieczności przechodzenia przez dodatek, możesz również zmodyfikować łącze wskazujące na plik SW exe, aby dodać uruchomienie makra podczas uruchamiania.
Pozwoliłoby to na korzystanie ze zdarzeń SW i PDM. Wadą tej metody jest to, że trzeba interweniować na wszystkich stacjach roboczych, aby zmienić to łącze i pamiętać, aby robić to za każdym razem, gdy zmieniana jest wersja oprogramowania.
W przeciwnym razie, czy Twoi użytkownicy naprawdę byliby przeciwni dodaniu ikony, którą należy kliknąć, aby zainicjować działanie?

1 polubienie

Nie byliby przeciwni, ale też by :slight_smile: tego nie uruchomili.
Problem jest dla nich niewidoczny, blok jest wykonywany później, gdy zmiana stanu jest błędna, ponieważ jest zmienna w duplikacie.

Na tym polega problem :slight_smile:
Więc nadal istnieje dodatek lub udało się zmodyfikować link uruchamiania exe, aby móc wstrzyknąć makro po uruchomieniu oprogramowania.
W przeciwnym razie proponowałbym wysyłkę, aby przeprowadziła kontrolę podczas archiwizacji, ale wydaje mi się, że po stronie PDM pliki wirtualne nie są tak naprawdę zarządzane, więc dyspozytor nie mógł ich zinterpretować, ponieważ nie są to pliki fizyczne.
Z drugiej strony, w przypadku makra, które ma zostać uruchomione ręcznie, wystarczy dodać właściwość do pliku i sprawdzić, czy jest ona obecna podczas ewidencjonowania. Jeśli nie jest obecny, odmów archiwizacji

Dziękujemy za Twoją opinię.
Co oznacza dodatek? Kodowanie uzupełnienia trochę jak MyPDMTools?
Tym .exe to dobry pomysł, z tym, że raczej powinieneś uruchomić makro po modyfikacjach, a nie na otwarciu :slight_smile: . Ale mógłbym też uruchomić go tylko na automacie, który generuje nasze neutralne pliki... Muszę kopać głębiej.
Dispatch jest również rozwiązaniem, nawet jeśli oznacza to uruchomienie go na wszystkich plikach bez kierowania.

Ostatnie pytanie: kiedy mówisz "odmów archiwizacji" na końcu swojej wiadomości, to bardziej jak odmowa zmiany stanu, prawda? Nie wydawało mi się, że możemy zablokować archiwum.

Możesz zablokować archiwum, ja robię to na przykład na pliku Word, który nie używa prawej ramki.
W przypadku makra uruchomionego przy otwarciu jest to po prostu makro, które działałoby w tle i przechwytywało zdarzenia oprogramowania w celu zastosowania przetwarzania zgodnie z docelowym zdarzeniem.
Dodatek jest plikiem wykonywalnym, ale tam znowu musi zostać uruchomiony.

Więc na razie chcę wiedzieć, jak zablokować archiwum pliku, który nie ma odpowiedniej ramki (na przykład), ponieważ na razie wiem, jak to zrobić tylko poprzez zablokowanie zmiany stanu. Czy stosuje się wycenę zmienną, gdy używana jest odpowiednia rama?
O ile mi wiadomo, mam tylko te opcje blokowania archiwum:
2023-11-03 14_40_47-Window

I ewentualnie po stronie zmiennej, ten checkbox, ale nie sprawdza wartości, tylko jej istnienie:
2023-11-03 14_45_36-Clipboard

Robię to z wysyłką.

Nie testowany na oprogramowaniu, ale w każdym razie działa bardzo dobrze w programie Word (anuluje żądanie archiwum i ponownie otwiera plik)

2 polubienia

Witam

Coś, co może pomóc w zaimplementowaniu makra: w Solidworks wszystkie pliki wirtualne zawierają znak ^, po którym następuje nazwa pliku, w którym plik wirtualny jest zapisany (Uwaga: W przypadku poziomu podrzędnego mamy również znaki _ oprócz znaku ^ w nazwie pliku wirtualnego, ale nie powinno to mieć żadnego wpływu).
Tak więc to właśnie na plikach zawierających ten znak ^ powinieneś uruchomić swoje makro (powinno to unikać umieszczania pasma w plikach niewirtualnych).
Ponieważ pliki wirtualne są tymczasowe, makro musi zostać uruchomione w otwartym zestawie. w normalnym trybie pracy powinno działać, ale jeśli sprytny facet ma frajdę z archiwizowania/przenoszenia pliku zawierającego virtual przez Windows, to jest martwy (chyba że wymusisz otwarcie pliku w Solidworks przed rozpoczęciem pracy nad czyszczeniem właściwości).

Jeśli chodzi o część makro, to z pewnością nasz przyjaciel @Cyril_f będzie najbardziej bystry.

1 polubienie

Dziękuję wam obojgu, muszę zagłębić się w wasze propozycje.
Ze względu na fakt, że plik musi zostać otwarty, może to być wykonalne, ponieważ to właśnie podczas otwierania asm w sterowniku PLC w celu wygenerowania neutralnych plików pojawia się problem z archiwizacją (i o dziwo nie wtedy, gdy to projektant archiwizuje...). Mogłem więc uruchomić makro na automacie przed generacją.

Witam wszystkich i życzę szczęśliwego Nowego Roku! Wrócę jeszcze do mojego tematu sprzątania nieruchomości w virtualach.
Zanim zajmę się częścią "uruchom makro automatycznie", najpierw spróbowałbym utworzyć makro, które będę mógł ręcznie uruchomić na zablokowanym pliku, jako administrator.
Czy ktoś z Was mógłby mnie pokierować do napisania makra, które wykonałoby następujące czynności:

  • W złożeniu, które jest już otwarte, skanuj wszystkie złożenia i części pochodne
  • Jeśli imię dziecka zawiera znak "^", otwórz je
  • Otwórz okno właściwości tego pliku wirtualnego
  • usuń właściwość "Odniesienie" w zakładce "Dostosuj" oraz we wszystkich konfiguracjach znajdujących się w zakładce "Specyficzne dla konfiguracji"
  • Zamknij okno Właściwości
  • Jeśli otwarty plik wirtualny sam w sobie jest zestawem, w ten sam sposób zapętl się na jego elementach podrzędnych
  • Zapisz plik wirtualny
  • Przejdź do następnego dziecka
  • Wyboczenie do ostatniego dziecka
  • Wyświetl wyskakujące okienko po zakończeniu.

Oczywiście to, co opisuję, to sekwencja działań za pomocą okien, na pewno jest sposób, aby to wszystko uprościć za pomocą funkcji, ale jestem wielkim noobem makr SW. Z drugiej strony jestem gotowy do nauki, jeśli kierują mnie przykłady istniejących makr, nie proszę o gotową :slight_smile: pracę.
Próbowałem użyć funkcji "Nagraj makro", ale nie działa ona w oknie Właściwości.

W tym samym czasie spróbuję sprawdzić, czy mogę użyć narzędzia BatchProperties w myCADTools.

Witam

Kod niekoniecznie optymalizowany, ale częściowo zaspokajający potrzebę.
Jeśli chodzi o pętlę zwrotną na wirtualnym ASM, nie zdążyłem jeszcze zajrzeć (czy zainspiruje kogoś innego do dokończenia kodu, bo na razie niekoniecznie więcej czasu na to).

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, ale to świetnie! I to działa :slight_smile:
Bardzo dziękuję!
Na razie będę z tego zadowolony, w rzeczywistości nie zamyka się na asm child, ale mogę go ponownie uruchomić po tym, jak asm dziecko o tym mówi, jest ze :stuck_out_tongue: mną w porządku!
Zobaczę jeszcze, czy uda mi się zagnieździć dodatkową pętlę, jeśli nDocType = dwDocASSEMBLY.
Jeszcze raz dziękuję

1 polubienie