API - Stabilität und Zuverlässigkeit von VBA-Makros, Add-Ins und Standalone-Makros

Hallo

Leider sehr enttäuscht von der Stabilität/Zuverlässigkeit der MyCADtools-Tools in einer PDM-Umgebung auf großen Baugruppen mit + vielen externen Referenzen,

Ich entwickle derzeit eine Python-Anwendung, die von vielen VBA-Makros unterstützt wird und die Solidworks-API verwendet.

Deshalb komme ich heute zu Ihnen, um die Meinung der Programmierer zur Stabilität und Zuverlässigkeit dieser Tools zu erfahren.

Damit meine ich: Neigt es zum Absturz/Einfrieren von SW? Führt dies häufig zum Absturz eigenständiger Apps?

Wenn Sie eine Behandlung mit einem großen Paket von Teilen beginnen, besteht die Möglichkeit, dass einige von ihnen nicht berücksichtigt werden?

In der Tat weiß ich nicht, wie MyCAD-Tools programmiert werden, aber es ist klar, dass sie ihre Aufgabe selten erledigen und dass, wenn sie das Ende erreicht haben, ohne abzustürzen, oft einige der Teile verloren gehen.

 

Also habe ich angefangen, ein einfaches Marco Excel zu programmieren, das die Dateien nacheinander öffnet, deren PATH in einer Spalte steht.

Ich bemerke, dass ich auch dort zufälliges Verhalten bekomme.

Glauben Sie, dass dies auf ein Programmierproblem mit meinem eigenen Code zurückzuführen ist, oder ist die SW-API von Natur aus überhaupt unzuverlässig?

Ich bin neu in VB und API sw, aber ich programmiere bereits in vielen verschiedenen Sprachen...

Vielen Dank für Ihre Antwort

Der folgende Code:

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 „Gefällt mir“

Hallo

Ich habe keine Erfahrung in der Python-Programmierung, ich verwende nie Makros in VBA, aber ich verwende viel von der solidworks API sowie der Epdm API in Programmen, die in C # geschrieben wurden, von denen einige für die Massenverarbeitung erstellt wurden (bis zu ca. 50000 Dateien und Verarbeitung von mehreren Stunden) und ich hatte sehr wenige Probleme wie als die, die Sie beschreiben und sicherlich keine unverarbeiteten Dateien.

Bei Solidworks ist ein Punkt, auf den Sie achten sollten, die maximale Anzahl von Fenstern, die Sie in Solidworks öffnen können (20), und scheuen Sie sich nicht, Solidworks programmgesteuert zu schließen und dann von Zeit zu Zeit neu zu starten.

Für Epdm benötigen Sie bereits eine gute Netzwerkverbindung und bereinigen regelmäßig die "AddInSrv"-Prozesse.

Für die Massenverarbeitung müssen Sie regelmäßig die Windows-Explorer-Prozesse "beenden", um einen Neustart durchzuführen.

Und dann noch ein bisschen "Multithreading" in Ihren Programmen, um das lästige "Don't Respond" zu vermeiden, aber das müssen Sie wissen.

Herzliche Grüße

3 „Gefällt mir“

Hallo

Wie Daniel Roger mache ich C# mit der API für die Massenverarbeitung, aber auf meiner Seite finde ich viele Instabilitätsprobleme aufgrund von SolidWorks ... Ich vermisse keine Dateien, weil ich mehrere Durchgänge versuche (ich erkenne, ob der erste Durchlauf nicht funktioniert hat, in diesem Fall versuche ich einen zweiten nach einem Kill des Prozesses).

Ich wollte das ein wenig gutmachen, weil ich versucht habe, einen WatchDog zu machen, um zu überprüfen, ob SolidWorks immer gut reagiert, aber ich habe den Eindruck, dass mein WatchDog 1 von 10 Mal nicht funktioniert ... Haben Sie irgendwelche Ideen, um meinen WatchDog zu verbessern (verwenden Sie eine Aufgabe, und ich mache eine Unterbrechung , falls die Zähleraufgabe früher als die SolidWorks-Aufgabe beendet wird)?

PS: Für die Wütenden unter Ihnen ist mir aufgefallen, dass SolidWorks weniger abstürzt, wenn Sie es einem einzigen logischen Kern mit hoher Priorität zuweisen und Ihr Programm auf den anderen Kernen des Prozessors ausführen.

Guten Abend.

Ich verwende Python am häufigsten, weil es meine Lieblingssprache ist, und ich habe einige Tests durchgeführt, um zu sehen, ob es leicht auf die Solidworks API anwendbar ist.

Das Ergebnis ist nicht perfekt, insbesondere bei vielen COM-Objektproblemen. Joshua Redstones Blog: Solidworks Macros via Python ist ein Muss. Trotz dieser Informationen widersetzen sich mir einige Funktionen (insbesondere das Exportieren eines Bauteils in DXF nach einer Ansicht). Daher empfehle ich diese Sprache nicht besonders.

Ich hänge meine Essays auf dem PC an, wenn Sie interessiert sind.


solidworks_python_api.pdf

Hallo

@yellow : Um deinen "WatchDog" verbessern zu können, wäre es schon gut, wenn du uns erzählst, wie es funktioniert. Schauen Sie sich die Eigenschaft "Responding" der Klasse "Process" an, sie sollte es Ihnen ermöglichen, Dinge zu tun.

Herzliche Grüße

1 „Gefällt mir“

Hallo

Vielen Dank für Ihre Antworten. Ich gehe nicht jeden Tag ins Forum, weil es ein Nebenprojekt ist, ich mache das Makro, wenn ich ein wenig Zeit habe.

Tatsächlich kam mein Problem nicht vom WatchDog ... Aber berühmte GUI-Objekte... (und da es in der Nacht abgestürzt ist, habe ich es nicht sofort verstanden). Um dies zu lösen, eine kleine (7500, weil wir unter Windows unter 10000 bleiben müssen):

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

oder (zu testen, scheint aber genauer zu sein):

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

PS für SWAppPID:

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

Was den WatchDog betrifft:

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;
}

Lass mich wissen, was du denkst!!

Vielen Dank im Voraus.

@mgauroy, danke, dass du deine Notizen geteilt hast:)

Aber verdammt, ich kenne mich mit Python überhaupt nicht aus ... :'(

@d.roger, in der Tat, danke für den Rat.

Ich sollte den "Antworten"-Test an einigen Stellen zusätzlich zu den Tests, die ich mache, hinzufügen.