API: Fixer un composant “uniquement dans cette configuration”

Bonjour, je relance que discussion concernant un problème déjà évoqué dans celle-ci dessous, mais resté sans réponse à mon dernier poste :

Comme ce poste est ancien, et marqué comme résolu, il n’attire pas les regards.

Le problème posé est de fixer tous les composants, uniquement dans la configuration active.

Il semble selon codestack que l’API a une lacune sur ce point, et il propose une alternative pour invoquer la commande via windows directement.

Pour l’idée générale, elle est traitée ICI

Pour l’application particulière au cas qui m’intéresse, en voici UN EXEMPLE

Je suppose que

« Sub Main » exécute ou non l’action « fixcomponent » sur la série de composant désigné littéralement ( part1-1 à part1-4), selon que l’on indique True ou false

« Sub fixcomponent » détail la procédure qui est appelé dans « Sub main » pour chaque composant.

Déjà, est-ce que je me trompe ?

Si non, j’aimerais arriver à remplacer la liste littérale des composants par une boucle qui appel chaque composant de premier niveau de mon assemblage.

Est-ce que quelqu’un sait comment écrire ça ?

D’avance merci.

PS: mon but est de créer des config simplifiées de mes assemblages. le top du top serait, a partir de l’assemblage de tête, e créer une config « Simplifié » pour chaque sous assemblages, d’y supprimer les composant pas trèes importats (typiquement la visserie, le tri pouvant se faire sur la base de le volume, avec un seuil à définir en mm3), et de fixer les composants. Et pour faire une mise à jour si la config existe déjà, de libérer les composants dans cette config, puis les re-fixer.

D’avance merci

Bonjour,
Dans le code exemple, la paramètre True ou False permet d’appliquer fixcomponent sur la conf active ou sur toutes les conf.

'**********************
'Copyright(C) 2022 Xarial Pty Limited
'Reference: Fix or float component in active or all configurations using SOLIDWORKS API
'License: License
'**********************

If thisConf Then
cmd = CMD_FixCompInThisConf
Else
cmd = CMD_FixCompInAllConf
End If

Pour boucler dans l’arbre il faut utiliser les fonctions d’analyse de l’arbre type : Traverse Assembly at Component Level Example (VBA) - 2021 - SOLIDWORKS API Help

2 « J'aime »

Merci Cyril pour ton message. Dans l’exemple que tu cite, je ne vois pas « l’action » faite par la macro, que je pourrais remplacer par ma commande « fixer dans cette config »

est ce que, en 1er, « Sub Main » ouvre le document « C:\Users[…]\stepped_shaft.sldasm », puis on active le module « Traverse components »? mais que se passe t-il comme action sur chaque composant?..
Si c’est bien ça, il faudrait que dans Sub Main, je demande d’activer la config « Simplifié » du document courant. si pas de config « Simplifié », allors, on ne fait rien, fin de la macro.

Bonjour,
L’exemple de l’API ne montre que comment lister les composants à partir du feature manager.
Il n’y a aucun autre traitement fait, elle n’affiche que le chemin d’accès au fichier ainsi que son nom d’enregistrement à l’aide du debug.print

1 « J'aime »

Donc à la place de debug print, je colle ce que j’ai identifié comme commande me convenant :
’ commande Windows FloatCompInThisConf:
SendMessage swApp.Frame().GetHWnd(), &H111, 51609, 0
’ commande Windows FloatCompInAllConf:
SendMessage swApp.Frame().GetHWnd(), &H111, 51608, 0
’ commande Windows FixCompInThisConf:
SendMessage swApp.Frame().GetHWnd(), &H111, 51605, 0
’ commande Windows FixCompInAllConf:
SendMessage swApp.Frame().GetHWnd(), &H111, 51611, 0

Et si dans Main je veux activer le config qui s’appel « Simplifié », est ce que ces quelques lignes suffisent?

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

Ca me semble un peu court…

Si je pose cette question c’est parceque, avec mycad Intégration, j’ai toujours une erreur lorsque je demande cette action. je ne comprends pas pourquoi… et comme il faut bien mettre quelque chose de ce « Sub Main », je me suis dit que ce serait une solution

En première approche je dirai oui. Par contre de mémoire, traverse component liste aussi les fichiers présents dans des répétitions et également d’autres éléments (en fonction du type de fichier) donc faut jouer déjà avec cette procédure de scan de l’arbre pour gérer les différents cas et savoir quand arrêter le traitement ou appliquer autre chose en fonction du besoin.

Iterate Through All Configurations Example (VBA) - 2021 - SOLIDWORKS API Help

Je pensais avoir progressé niveau macro, mais j’ai encore du chemin à faire. Pas capable de coder l’activation de la configuration « Simplifié » de l’assemblage courrant… Ca mérite une autre sujet, ou quelqu’un peut me passer un bout de code qui fonctionne ici?

Je peux fournir un bout de code fonctionnel pour activer une conf si personne ne passe avant mais là je suis sur autre chose.

:+1:

Voilà le bout de code, juste pour activer une configuration spécifique du document actif

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, je vais tester ça.
Mais mon Service informatique viens de me bloquer l’acces à Codestack.
Quelqu’un pourrait me coller le code présent à cette adresse?
Encore merci

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

Sinon astuce passe par google traduction (Google n’est jamais bloqué par les entreprises…) pour aller voir un site bloqué, si le site ne contient pas trop de java, tu vas en voir l’intégralité. (Pas besoin de traduire tu peux laisser anglais dans la traduction…)

1 « J'aime »