API: Napraw komponent "tylko w tej konfiguracji"

Witam, wznawiam dyskusję na temat problemu, o którym już wspomniałem poniżej, ale pozostał bez odpowiedzi w moim ostatnim poście:

Ponieważ ten post jest stary i oznaczony jako rozwiązany, nie przyciąga uwagi.

Problem polega na tym, aby naprawić wszystkie komponenty, tylko w aktywnej konfiguracji.

Wygląda na to, że według codestack interfejs API ma lukę w tym punkcie i oferuje alternatywę dla wywołania polecenia bezpośrednio przez system Windows.

Dla ogólnej idei jest to omówione TUTAJ

Dla konkretnego zastosowania w przypadku, który mnie interesuje, oto PRZYKŁAD

Tak myślę

" Sub Main " może, ale nie musi, wykonać akcję " fixcomponent " na serii komponentów oznaczonych dosłownie (od part1-1 do part1-4), w zależności od tego, czy akcja jest ustawiona na Prawda czy Fałsz

" Sub fixcomponent " szczegółowo opisuje procedurę, która jest wywoływana w " Sub main " dla każdego komponentu.

Po pierwsze, czy się mylę?

Jeśli nie, chciałbym mieć możliwość zastąpienia dosłownej listy komponentów pętlą, która wywołuje każdy komponent najwyższego poziomu w moim złożeniu.

Czy ktoś wie jak to napisać?

Z góry dziękuję.

PS: moim celem jest stworzenie uproszczonych konfiguracji moich zestawów. Najlepszym z najlepszych byłoby, począwszy od zespołu głowicy, stworzenie " uproszczonej " konfiguracji dla każdego podzespołu, usunięcie komponentów, które nie są bardzo ważne (zazwyczaj, sortowanie można przeprowadzić na podstawie objętości, z progiem do zdefiniowania w mm3) i zamocowanie komponentów. Aby dokonać aktualizacji, jeśli konfiguracja już istnieje, zwolnij składniki w tej konfiguracji, a następnie napraw je ponownie.

Z góry dziękuję

Witam
W przykładowym kodzie parametr True lub False służy do stosowania fixcomponent do bieżącej konfiguracji lub do wszystkich konfiguracji.

'**********************
"Prawa autorskie(C) 2022 Xarial Pty Limited
'Odniesienie: Unieruchomienie lub ruchomość komponentu w aktywnych lub wszystkich konfiguracjach przy użyciu interfejsu API SOLIDWORKS
'Licencja: Licencja
'**********************

Jeśli thisConf to
cmd = CMD_FixCompInThisConf
Inaczej
cmd = CMD_FixCompInAllConf
Zakończ jeżeli:

Aby utworzyć pętlę w drzewie, należy użyć funkcji analizy typowego drzewa: Przykład złożenia ciągu poligonowego na poziomie komponentu (VBA) - 2021 - Pomoc SOLIDWORKS API

2 polubienia

Dziękuję Cyrylowi za twoją wiadomość. W przykładzie, który cytujesz, nie widzę "akcji" wykonanej przez makro, którą mógłbym zastąpić moim poleceniem "napraw w tej konfiguracji"

Czy to w 1. "Sub Main" otwiera dokument "C:\Users[...]\stepped_shaft.sldasm", to aktywujemy moduł "Przechodzenie komponentów"? Ale co dzieje się jako akcja na każdym komponencie?..
Jeśli to prawda, musiałbym poprosić w Sub Main o aktywację "uproszczonej" konfiguracji bieżącego dokumentu. jeśli nie ma "uproszczonej" konfiguracji, to nic nie robimy, koniec makra.

Witam
Przykład interfejsu API pokazuje tylko, jak wyświetlić listę komponentów z menedżera funkcji.
Nie jest wykonywane żadne inne przetwarzanie, wyświetla tylko ścieżkę do pliku i nazwę jego rekordu za pomocą debug.print

1 polubienie

Więc zamiast debug print, wklejam to, co zidentyfikowałem jako polecenie, które mi odpowiada:
Polecenie FloatCompInThisConf systemu Windows:
SendMessage swApp.Frame(). GetHWnd(), &H111, 51609, 0
Polecenie FloatCompInAllConf systemu Windows:
SendMessage swApp.Frame(). GetHWnd(), &H111, 51608, 0
Komenda FixCompInThisConf systemu Windows:
SendMessage swApp.Frame(). GetHWnd(), &H111, 51605, 0
' Polecenie systemu Windows: FixCompInAllConf:
SendMessage swApp.Frame(). GetHWnd(), &H111, 51611, 0

A jeśli w Main chcę aktywować konfigurację o nazwie "Uproszczony", czy te kilka linijek wystarczy?

Dim instance As IModelDoc2
Dim ConfigurationName As String
Dim value As Boolean
 
value = instance.ShowConfiguration2(Simplifié)

Wydaje mi się, że to trochę za krótko...

Jeśli zadaję to pytanie, to dlatego, że w przypadku integracji z mycad zawsze pojawia się błąd, gdy proszę o tę czynność. Nie rozumiem dlaczego... a skoro trzeba coś z tego wstawić "Sub Main", to pomyślałem, że to będzie rozwiązanie

Na pierwszy rzut oka powiedziałbym, że tak. Z drugiej strony, z pamięci, komponent trawersu wyświetla również pliki obecne w powtórzeniach, a także inne elementy (w zależności od typu pliku), więc musisz pobawić się tą procedurą skanowania drzewa, aby zarządzać różnymi przypadkami i wiedzieć, kiedy przerwać przetwarzanie lub zastosować coś innego w zależności od potrzeb.

Przykład iteracji po wszystkich konfiguracjach (VBA) - 2021 - Pomoc SOLIDWORKS API

Myślałem, że zrobiłem postęp na poziomie makro, ale przede mną jeszcze długa droga. Nie można zakodować aktywacji "uproszczonej" konfiguracji bieżącego zespołu... Zasługuje na inny temat, czy ktoś może mi przekazać kawałek kodu, który tu działa?

Mogę dostarczyć funkcjonalny fragment kodu, aby aktywować konferencję, jeśli nikt wcześniej tego nie zrobi, ale tutaj jestem przy czymś innym.

:+1:

Oto fragment kodu, aby umożliwić określoną konfigurację bieżącego dokumentu

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim sConfigName As String
Dim bShowConfig As Boolean

Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
sConfigName = "Simplifié"
bShowConfig = swModel.ShowConfiguration2(sConfigName)

End Sub

Supezr, przetestuję to.
Ale mój dział IT po prostu zablokował mi dostęp do Codestack.
Czy ktoś mógłby mi przykleić kod pod tym adresem?
Jeszcze raz dziękuję

'**********************
'Copyright(C) 2022 Xarial Pty Limited
'Reference: https://www.codestack.net/solidworks-api/document/assembly/components/fix-float/
'License: https://www.codestack.net/license/
'**********************

#If VBA7 Then
     Private Declare PtrSafe Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#Else
     Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#End If

Dim swApp As SldWorks.SldWorks

Sub main()

    Set swApp = Application.SldWorks
    
    Dim swAssy As SldWorks.AssemblyDoc
    
    Set swAssy = swApp.ActiveDoc
    
    FixComponent swAssy.GetComponentByName("Part1-1"), True
    FixComponent swAssy.GetComponentByName("Part1-2"), False
    FloatComponent swAssy.GetComponentByName("Part1-3"), True
    FloatComponent swAssy.GetComponentByName("Part1-4"), False
    
End Sub

Sub FixComponent(comp As SldWorks.Component2, thisConf As Boolean)

    Const CMD_FixCompInThisConf As Long = 51605
    Const CMD_FixCompInAllConf As Long = 51611
    
    If False <> comp.Select4(False, Nothing, False) Then
        
        Const WM_COMMAND As Long = &H111
        Dim cmd As Long
        
        If thisConf Then
            cmd = CMD_FixCompInThisConf
        Else
            cmd = CMD_FixCompInAllConf
        End If
        
        SendMessage swApp.Frame().GetHWnd(), WM_COMMAND, cmd, 0
    Else
        Err.Raise vbError, "", "Failed to select component"
    End If
    
End Sub

Sub FloatComponent(comp As SldWorks.Component2, thisConf As Boolean)
    
    Const CMD_FloatCompInThisConf As Long = 51609
    Const CMD_FloatCompInAllConf As Long = 51608
    
    If False <> comp.Select4(False, Nothing, False) Then
        
        Const WM_COMMAND As Long = &H111
        Dim cmd As Long
        
        If thisConf Then
            cmd = CMD_FloatCompInThisConf
        Else
            cmd = CMD_FloatCompInAllConf
        End If
        
        SendMessage swApp.Frame().GetHWnd(), WM_COMMAND, cmd, 0
    Else
        Err.Raise vbError, "", "Failed to select component"
    End If
    
End Sub

W przeciwnym razie wskazówka przechodzi przez tłumacza Google (Google nigdy nie jest blokowany przez firmy...), aby przejść i zobaczyć zablokowaną witrynę, jeśli witryna nie zawiera zbyt dużo javy, zobaczysz całość. (Nie musisz tłumaczyć, możesz zostawić angielski w tłumaczeniu...)

1 polubienie