Ouverture et actualisation de la famille de pièce via une macro

Bonjour,

j'ai une macro qui demande une dimension. Je souhaite ouvrir ensuite en automatique ma famille de pièce et actualiser les valeurs avec cette dimension.

Sauriez vous comment ouvrir une famille de pièce et modifier le contenu d'une cellule par une valeur ?

merci de votre retour

1 « J'aime »

Bonjour,

Avec ces deux liens vers l'aide de l'API, je pense que vous trouverez la solution.

http://help.solidworks.com/2020/english/api/sldworksapi/get_or_set_whether_edits_update_design_table_example_vb.htm

http://help.solidworks.com/2020/english/api/sldworksapi/get_design_table_example_vb.htm

A partir du second lien, il suffit d'ajouter une commande type swDesTable.SetEntryValue en ayant ciblé la colonne et la ligne à modifier.

1 « J'aime »

Bonjour Cyril

un grand merci. La macro 1 est top pour vérifier que la famille de pièce existe.

J'ai utilisé le code de la macro 2 pour ouvrir la famille de pièce. Le fichier Excell  s'ouvre bien, les valeurs indiquées sont correctes mais le 3D n'est pas réactualisé. Il se réactualise si je réouvre la famille de pièce.

 

Voici le code de la macro 2 que j'ai indiqué:

 

Set swDesTable = swModel.GetDesignTable
bRet = swDesTable.Attach
Debug.Assert bRet
swDesTable.Detach
Part.ForceRebuild

j'avou que je ne comprends pas bien à quoi servent ces lignes .... si tu le sais, je suis preneuse de l'info

Pourrais tu me dire comment forcer la reconstruction sans que j'ai à retourner en manuel dans la famille de pièces ?

un grand merci d'avance

Bonjour,

Dans le bout de code que tu donne tu récupère la table de l'objet "swModel" mais tu demande une reconstruction sur l'objet "Part", essaye en mettant "swModel.ForceRebuild" à la place de "Part.ForceRebuild".

Cordialement,

1 « J'aime »

Bonjour,

Pour swDesTable.Detach j'avoue ne pas savoir exactement à quoi ça sert mais dans l'aide : Detaches the design table from the Microsoft Excel sheet.

Dans le cas de l'utilisation demandée je ne pense pas que ce soit nécessaire.

swDesTable.Attach par contre sert à activer la table.

Debug.assert est un point d'arrêt conditionnel si je ne fais pas d'erreur si le booléen bret est faux, la macro s'arrête sur cette ligne (en gros si la table ne s'ouvre pas).

Pour mettre à jour le modèle il faut utiliser swDesTable.UpdateTable 2, True

Pour plus d'infos sur la méthode: 

IDesignTable Interface Members - 2020 - SOLIDWORKS API Help

swDesignTableUpdateOptions_e Enumeration - 2020 - SOLIDWORKS API Help

1 « J'aime »

Merci à tous les 2 pour vos réponses. Ca marche. J'ai encore la l'application excell (j'imagine du fait de la famille de pièce) qui reste ouverte. serait il possible de la fermer et de revenir sur le 3D en fin de macro ? merci d'avance de votre retour

Normalement la ligne swDesTable.UpdateTable 2, True ferme la famille de pièce et par conséquent Excel en théorie.

 

je te confirme que cette fonction ferme bien le fichier de la famille de pièce mais pas l'application excell...

 

Il doit y avoir autre chose dans la macro qui bloque la fermeture d'Excel. Pour ma part, j'ai bien Excel qui disparait des processus actifs dès que la macro se termine (mais je n'ai qu'un bout de code qui ouvre la table, met à jour une valeur, ferme la table et met à jour le 3D).

Il faudrait le code complet pour voir s'il n'y a pas une autre fonction qui bloque.

1 « J'aime »

Voici les lignes...

j'ai fait un mix avec les modèles envoyés....

merci de ton expertise !

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView

myModelView.FrameState = swWindowState_e.swWindowMaximized


'-----------------------------------
' Preconditions:
' 1. Open a part document that contains a design table.
' 2. Verify that the part document contains a design
'    table by expanding Tables in the ConfigurationManager.
' 3. Open the Immediate window.
'
' Postconditions:
' 1. Gets whether the design table is updatable before
'    running the macro.
' 2. Sets the design table to not updatable if it is
'    updatable or vice versa.
' 3. Examine the Immediate window.
'-----------------------------------
'Option Explicit
'Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDesignTable As SldWorks.DesignTable
Dim boolstatus As Boolean
Dim laststate As Variant
 Dim swDesTable              As SldWorks.DesignTable
 Dim Hauteur As Double
 
 

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDesignTable = swModel.GetDesignTable()
    ' Allow changes to the characteristics of the
    ' design table
    swDesignTable.EditFeature
    ' Get whether design table is updatable
    laststate = swDesignTable.Updatable
    Debug.Print "Design table updatable: " & CStr(laststate)
    ' If design table is updatable, then set it
    ' to not updatable or vice versa
    swDesignTable.Updatable = Not laststate
    ' Update this characteristic of the design table
    boolstatus = swDesignTable.UpdateFeature()
    ' Get whether design table is updatable
    laststate = swDesignTable.Updatable
    Debug.Print "Design table updatable: " & CStr(laststate)

Hauteur = InputBox("Merci d'indiquer la Hauteur du convoyeur .... ")
'swModel.GetEquationMgr.Value("Hauteur") = Hauteur
    Set swDesTable = swModel.GetDesignTable
    bRet = swDesTable.Attach
    
    'Debug.Assert bRet           'point d'arrêt si la table ne s'ouvre pas, si bret est faux
    swDesTable.UpdateTable 2, True
    swDesTable.Detach
    swModel.ForceRebuild        'pour reconstruire une parte Part.ForceRebuild
    
   Set swApp = Application.SldWorks
   
  
End Sub
 

Bonjour,

Idem pour moi, Excel se ferme bien et disparait de la liste des processus à la fin de la macro mais il y a un petit laps de temps avant que cela ne se fasse, laps de temps qui est plus court en supprimant la dernière ligne "Set swApp = Application.SldWorks" qui ne sert à rien puisque cette variable swApp est déjà définie au début de ta macro.

J'ai déjà remarqué que parfois le processus Excel a du mal à se fermer quand on écrit des macros et que l'on passe souvent en mode debug surtout quand la macro bloque en cours d'éxécution ...

Cordialement,

Merci Roger. Aurais tu au moins une astuce pour afficher la fenetre active Solidworks du coup car j'ai cette fichue fenetre Excel qui prend le dessus.... j'aimerai juste au moins finir ma macro en affichant la fenetre Sldworks... merci

Sur le code, je ne vois rien de particulier, pour ma part je n'ai toujours aucune trace d'Excel à la fin de la macro.

Pour remettre SW au premier plan, sauf erreur de ma part c'est 

bret = swapp.visible

Après pour le problème en lui-même soit c'est un plantage d'Excel soit c'est un bug de la version de Solidworks.

Est-ce que la famille de pièce est ouverte dans une autre fenêtre ou est-elle bien ouverte dans SW?

Autre solution un peu barbare, c'est les commandes shell pour tuer le processus Excel:

Shell "taskkill /f /im excel.exe", vbHide

 

Sinon autre idée, ça peut provenir de la mise à jour automatique de la table à l'ouverture, peut-être que SW attend quelque chose en tâche de fond (fenêtre qui aurait basculée en arrière plan) et du coup bloque la fermeture d'Excel.

Il faudrait tester le code avec la désactivation de la mise à jour automatique de la table, de mémoire c'est dans l'un des deux codes de l'aide de ma première réponse.

1 « J'aime »

Bonjour Cyril,

j'ai tenté la 1ere option... ca n'a pas marché. Du coup, j'ai essayé la 2nde et ca marche nickel

un grand merci à toi

bonne semaine

Bonjour,
déterrage de topic,
je vais tenter d’être claire.
cette macro fonctionne super bien sauf que…
1- je modifie une esquisse
2- j’exécute la macro (qui se déroule bien) mais à l’issu il verrouille toute les cotes des esquisses donc plus possible depuis sw de modifier une valeur.
3- je réexécute la macro et la j’ai de nouveau accès à la modification des esquisses depuis sw.
pour résumer si je lance la macro après modification d’une esquisse je dois la relancer une seconde fois pour pouvoir de nouveau modifier une valeur.
j’ai beau bidouiller je trouve pas pourquoi.
si quelqu’un peux éclairer ma lanterne.
que la force soit avec vous.

1 « J'aime »

Bonjour,
Je ne suis pas sûr d’avoir bien cerné le problème.
J’ai beau être dans une esquisse ou modifier directement en double cliquant sur la fonction, je n’ai aucun verrouillage des cotes.
Par contre comme il y a un force rebuild on se retrouve forcément sorti de l’esquisse.

Bonjour,
voici une vidéo explicative.
j’explique ce qui se passe.
1-on vois que je peux modifier à volonté une valeur.
2-j’execute la macro pour mettre la pièce à jour
3- je souhaites remodifier cette même valeur mais la impossible de modifier
4-je réexécute la macro et la j’ai de nouveau accès en modification.
pourquoi faut il réexécuter la macro pour avoir accès en modif ???
que la force soit avec vous

Bonjour,
Je viens de comprendre.
En fait il faut enlever cette partie du code qui change le comportement de mise à jour de la table.

    Set swDesignTable = swModel.GetDesignTable()
    ' Allow changes to the characteristics of the
    ' design table
    swDesignTable.EditFeature
    ' Get whether design table is updatable
    laststate = swDesignTable.Updatable
    Debug.Print "Design table updatable: " & CStr(laststate)
    ' If design table is updatable, then set it
    ' to not updatable or vice versa
    swDesignTable.Updatable = Not laststate
    ' Update this characteristic of the design table
    boolstatus = swDesignTable.UpdateFeature()
    ' Get whether design table is updatable
    laststate = swDesignTable.Updatable
    Debug.Print "Design table updatable: " & CStr(laststate)

Elle bascule de « Permettre la mise à jour de la famille de pièces par les modifications du modèle » à « Interdire les modifications du modèle qui mettraient à jour la famille de pièce ».
Du coup, premier coup elle bascule sur le second mode, au second lancement elle fait l’inverse.

2 « J'aime »

@Cyril.f
tu es un champion mon champion.
c’est nickel un grand merci pour cette solution efficace.
que la force soit avec toi.

2 « J'aime »