API: Een onderdeel "alleen in deze configuratie" repareren

Hallo, ik hervat een discussie over een probleem dat al in deze hieronder is genoemd, maar onbeantwoord bleef in mijn laatste bericht:

Omdat dit bericht oud is en als opgelost is gemarkeerd, trekt het geen aandacht.

Het probleem is om alle componenten te repareren, alleen in de actieve configuratie.

Het lijkt er volgens codestack op dat de API op dit punt een gat heeft, en het biedt een alternatief om het commando rechtstreeks via windows aan te roepen.

Voor het algemene idee wordt het HIER behandeld

Voor de specifieke toepassing op de zaak die mij interesseert, is hier EEN VOORBEELD

Denk ik

" Sub Main " kan al dan niet de " fixcomponent " actie uitvoeren op de reeks componenten die letterlijk zijn aangeduid (deel 1-1 tot deel 1-4), afhankelijk van of de actie is ingesteld op Waar of onwaar

" Sub fixcomponent " beschrijft de procedure die wordt aangeroepen in " Sub main " voor elk onderdeel.

Allereerst, heb ik het mis?

Zo niet, dan zou ik graag in staat zijn om de letterlijke lijst van componenten te vervangen door een lus die elk onderdeel van het hoogste niveau in mijn assembly aanroept.

Weet iemand hoe ik dit moet schrijven?

Bij voorbaat dank.

PS: mijn doel is om vereenvoudigde configuraties van mijn assemblages te maken. Het beste van het beste zou zijn, vanuit de kopmontage, om een " Vereenvoudigde " configuratie te maken voor elke subassemblage, om de componenten te verwijderen die niet erg belangrijk zijn (meestal de schroeven, de sortering kan worden gedaan op basis van het volume, met een drempel te definiëren in mm3), en om de componenten te bevestigen. En om een update uit te voeren als de configuratie al bestaat, om de componenten in deze configuratie vrij te geven en ze vervolgens opnieuw te repareren.

Bij voorbaat dank

Hallo
In de voorbeeldcode wordt de parameter True of False gebruikt om fixcomponent toe te passen op de huidige conf of op alle confs.

'**********************
'Auteursrecht(C) 2022 Xarial Pty Limited
'Referentie: Fix of float component in actieve of alle configuraties met behulp van SOLIDWORKS API
"Licentie: Licentie
'**********************

Als ditConf Dan
cmd = CMD_FixCompInThisConf
Anders
cmd = CMD_FixCompInAllConf
Einde als

Als u in de boom wilt lussen, moet u de analysefuncties van de typische boom gebruiken: Doorlopen van assemblage op componentniveau Voorbeeld (VBA) - 2021 - SOLIDWORKS API Help

2 likes

Dank u Cyril voor uw bericht. In het voorbeeld dat u aanhaalt, zie ik niet de "actie" die door de macro wordt gemaakt, die ik zou kunnen vervangen door mijn commando "fix in this config"

Is het, in de 1e, "Sub Main" opent het document "C:\Users[...]\stepped_shaft.sldasm", dan activeren we de module "Traverse componenten"? Maar wat gebeurt er als een actie op elk onderdeel?..
Als dat klopt, zou ik in Sub Main moeten vragen om de "Vereenvoudigde" configuratie van het huidige document te activeren. als er geen "vereenvoudigde" configuratie is, doen we niets, einde van de macro.

Hallo
Het API-voorbeeld laat alleen zien hoe u componenten uit de functiebeheerder kunt weergeven.
Er is geen andere verwerking uitgevoerd, het geeft alleen het pad naar het bestand en de recordnaam weer met behulp van debug.print

1 like

Dus in plaats van debug print, plak ik wat ik heb geïdentificeerd als een commando dat bij mij past:
' Windows FloatCompInThisConf opdracht:
SendMessage swApp.Frame(). GetHWnd(), &H111, 51609, 0
' Windows FloatCompInAllConf opdracht:
SendMessage swApp.Frame(). GetHWnd(), &H111, 51608, 0
' Windows FixCompInThisConf opdracht:
SendMessage swApp.Frame(). GetHWnd(), &H111, 51605, 0
' Windows-opdracht: FixCompInAllConf:
SendMessage swApp.Frame(). GetHWnd(), &H111, 51611, 0

En als ik in Main de configuratie met de naam "Vereenvoudigd" wil activeren, zijn deze paar regels dan voldoende?

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

Het lijkt me een beetje kort...

Als ik deze vraag stel, is dat omdat ik met mycad Integration altijd een foutmelding krijg als ik om deze actie vraag. Ik begrijp niet waarom... en aangezien je iets van deze "Sub Main" moet plaatsen, dacht ik dat het een oplossing zou zijn

Op het eerste gezicht zou ik ja zeggen. Aan de andere kant, uit het geheugen, geeft de traverse-component ook een overzicht van de bestanden die aanwezig zijn in herhalingen en ook andere elementen (afhankelijk van het type bestand), dus je moet met deze boomscanprocedure spelen om de verschillende gevallen te beheren en te weten wanneer je moet stoppen met verwerken of iets anders moet toepassen, afhankelijk van de behoefte.

Voorbeeld van itereren door alle configuraties (VBA) - 2021 - SOLIDWORKS API Help

Ik dacht dat ik op macroniveau vooruitgang had geboekt, maar ik heb nog een lange weg te gaan. Niet in staat om de activering van de "Vereenvoudigde" configuratie van de huidige assemblage te coderen... Het verdient een ander onderwerp, of kan iemand me een stukje code doorgeven dat hier werkt?

Ik kan een functioneel stukje code leveren om een conf te activeren als niemand eerder gaat, maar hier ben ik met iets anders bezig.

:+1:

Hier is het codefragment, alleen om een specifieke configuratie van het huidige document mogelijk te maken

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, ik zal dat testen.
Maar mijn IT-afdeling heeft me zojuist de toegang tot Codestack geblokkeerd.
Kan iemand de code voor mij op dit adres plakken?
Nogmaals bedankt

'**********************
'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

Anders tip gaat via google translate (Google wordt nooit geblokkeerd door bedrijven...) om een geblokkeerde site te gaan bekijken, als de site niet te veel java bevat, zie je het hele ding. (U hoeft niet te vertalen, u kunt het Engels in de vertaling laten...)

1 like