API - Stabilité et fiabilité des Macros, Addin et Standalone VBA

Bonjour,

Etant malheureusement très déçu de la stabilité/fiabilité des outils MyCADtools dans un environnement PDM sur de gros assemblage avec en + beaucoup de référence externe,

Je développe en ce moment une applicaiton Python épaullée de plein de macro VBA qui utilise l'API solidworks.

Je viens donc vers vous aujourd'hui pour avoir le ressentit des programmeurs sur la stabilité et la fiabilité de ces outils.

Par cela j'entend: Cela a t-il tendance à faire planter/freezer SW ? Cela fait-il souvent planter les appli standalone ?

Quand on lance un traitement sur un gros paquet de pièce, y a t-il des chances pour que certaines ne soient pas prise en compte ?

En effet, je ne sais pas comment sont programmés les outils MyCAD, mais force est de constater qu'ils vont rarement au bout de leur tâche, et que quand ils sont arrivé au bout sans crasher, une partie des pièces est souvent passée à la trappe.

 

J'ai donc commencé à coder une simple marco excel qui ouvre les fichiers un par un dont le PATH se trouve dans une colone.

Je constate que j'obtient un comportement aléatoire là aussi.

Pensez vous que cela soit du un un problème de programmation de mon propre code, ou alors l'API SW n'est nativement pas fiable du tout ??

Je suis novice en VB et API sw mais je programme déjà dans bcp de languages différents...

Merci pour votre réponse

Le code ci dessous:

Sub Ouvrir_un_par_un()
 
'Déclaration des variables :
    Dim nb_de_ligne As Integer    'nombre de lignes du document
    Dim increment As Integer      'incrément de 1 pour effectuer la boucle de recherche ligne par ligne
    Dim myCell As String          'variable pointant sur la cellule en cours
    Dim path_complete As String   'chemin complet de la pièce
    Dim myBool As Boolean
    Dim swApp As ISldWorks
    Dim swModel As ModelDoc2
    Dim nDocType As Integer
    Dim myErrors As Long
    Dim myWarnings As Long
    
'Initialisation de certaines variables:
    nb_de_ligne = Range("A1").End(xlDown).Row - 1
    If MsgBox("Vous vous apprêtez à ouvrir : " & nb_de_ligne & " fichiers à la chaine !" & Chr(13) & "Commencer ?", vbYesNo, "Demande de confirmation") = vbYes Then

'Déduction du type de fichier avec l'exension:
        If swApp Is Nothing Then
           Set swApp = CreateObject("SLDWORKS.application")
           swApp.Visible = True
           MsgBox ("Solidworks n'était pas ouvert, on vient de le lancer, appuyer sur OK quand il à l'air d'être prêt")
        Else
           Set swApp = Application.SldWorks
        End If
       
    'Boucle sur toutes les pièces:
        For increment = 1 To nb_de_ligne
            Set swModel = Nothing
            nDocType = 0
            myCell = "A" & (increment + 1)
            path_complete = Range(myCell).value
            If MsgBox("Voullez vous vérifier le fichier : " & Chr(13) & path_complete, vbYesNo, "Ouvrir ce fichier dans SW ?") = vbYes Then
            
                ' Determine type of SOLIDWORKS file based on file extension
            If InStr(LCase(path_complete), "sldprt") > 0 Then
                nDocType = swDocPART
            ElseIf InStr(LCase(path_complete), "sldasm") > 0 Then
                nDocType = swDocASSEMBLY
            ElseIf InStr(LCase(path_complete), "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(path_complete, nDocType, 1, "", myErrors, myWarnings)
                ' Comment utiliser OpenDoc7 ??
                'swModel.ViewZoomtofit2 ' Bug souvent, pourquoi ?
            End If
        Next increment
        
    End If
'Set swApp = Nothing
End Sub

 

 

1 « J'aime »

Bonjour,

Je n'ai pas d'expérience en programmation Python, je n'utilise jamais les macros en vba mais j'utilise beaucoup l'API solidworks ainsi que l'API Epdm dans des programmes écris en C# dont certains ont été créés pour des traitements de masses (jusqu'à environ 50000 fichiers et des traitements de plusieurs heures) et je n'ai eu que très peu de problèmes tels que ceux que tu décris et surement pas de fichier non traité.

Pour Solidworks, un point à surveiller est le nombre maximal de fenêtres que tu peux ouvrir dans Solidworks (20) et n'hésite pas, par programmation, à fermer Solidworks puis le redémarrer de temps en temps.

Pour Epdm, il faut déjà une bonne connexion réseau et purger régulièrement les processus "AddInSrv".

Pour les traitements en masse il faut régulièrement "tuer" les processus windows "explorer" pour en redémarrer un.

Et puis un peu de "Multithreading" dans tes programmes pour éviter les "Ne répond pas" bien énervants mais ça tu dois connaitre.

Cordialement,

3 « J'aime »

Bonjour,

Comme Daniel ROGER, je fais du C# avec l'API pour du traitement de masse, mais de mon coté je retrouve pas mal de problèmes d'instabilités dues à SolidWorks ... Je ne passe pas à coté de fichiers car je tente plusieurs passes (je détecte si la première passe n'a pas marché, dans ce cas j'en tente une seconde après un kill du processus).

Je voulais faire un petit up à ce sujet, car j'ai essayer de faire un WatchDog pour contrôler que SolidWorks répond bien toujours, mais j'ai l'impression que mon WatchDog ne fonctionne pas 1 fois sur 10 ... Auriez-vous des pistes pour améliorer mon WatchDog (utilisation d'une task, et je fais un interrupt en cas que la tâche de compteur finisse plus tôt que la tâche de SolidWorks).

PS : pour les plus furieux d'entre vous, j'ai remarqué que SolidWorks plante moins si vous l'affecté à un seul coeur logique avec la priorité haute, et que vous faite tourner votre programme sur les autres coeurs du processeur.

Bonsoir.

Moi j'utilise Python le plus souvent car c'est mon langage préféré et j'ai fait quelques essais pour voir si cela était applicable facilement à l'API Solidworks.

Le résultat n'est pas parfait, notamment pour des nombreux problèmes d'objets COM. La lecture du blog suivant est obligatoire : Joshua Redstone's Blog: Solidworks Macros via Python. Malgré ces informations, certaines fonctions me résistent (export d'une pièce en DXF selon une vue notamment). Je ne conseille donc pas particulièrement ce langage en premier.

Je vous joins mes essais en PJ si cela vous intéresse.


solidworks_python_api.pdf

Bonjour,

@jaune : Pour pouvoir améliorer ton "WatchDog" il serait déjà bien que tu nous dise comment il fonctionne. Regarde du coté de la propriété "Responding" de la classe "Process", cela doit permettre de faire des choses.

Cordialement,

1 « J'aime »

Bonjour,

Merci de vos réponses. Je ne passe pas tous les jours sur le forum car c'est un projet annexe, je fais la macro quand j'ai un peu de temps.

En fait mon problème ne venait pas du WatchDog ... Mais des fameux objets GUI ... (et comme ça plantait dans la nuit, je n'ai pas compris de suite). Pour résoudre ça, un petit (7500 car on doit rester en dessous des 10000 avec Windows) :

if (Process.GetProcessById(SWAppPID).HandleCount >= 7500)

ou (à tester, mais semblerait plus juste) :

if(GetGuiResources(Process.GetProcessById(SWAppPID).Handle, 0) >= 7500)

PS pour SWAppPID :

SWApp = Activator.CreateInstance(Type.GetTypeFromProgID("SldWorks.Application")) as SldWorks;
SWAppPID = SWApp.GetProcessID();

En ce qui concerne le WatchDog :

internal static void WatchDogDelay()
{
    Thread.Sleep(300000);
}
internal static SldWorks CallAGetApplication()
{
    Thread SWOpen = new Thread(GetApplication);
    Thread Watchdog = new Thread(WatchDogDelay);
    Watchdog.Start();
    SWOpen.Start();
    while (Watchdog.IsAlive && SWOpen.IsAlive) ;
    if (SWOpen.IsAlive)
    {
        SWOpen.Interrupt();
        Dispose();
        return CallAGetApplication();
    }
    return SWApp;
}

Dites-moi ce que vous en pensez !!

Merci par avance.

@mgauroy, merci d'avoir partagé tes notes :)

Mais purée, je ne suis pas familier du tout avec le Python ... :'(

@d.roger, effectivement, merci du conseil.

Je devrais rajouter le test du "Responding" à quelques endroits en plus des tests que j'effectue.