Makro-Identifizierung und Entfernung von fehlerhaften Constraints

Tag zusammen!

Kommen wir auf den Punkt:
BE von 28 Personen, die über die Option Kind-Features in Baugruppen löschen falsch informiert wurden

und die sich heute darüber ärgern:

.

Ich werde heute gefragt, ob es mit einem Makro möglich ist, die irrtümlichen Einschränkungen aufgrund fehlender Komponenten zu identifizieren und zu entfernen.

Mit Hilfe der KI habe ich diesen Code der leider nicht funktionsfähig ist (die Bedingung If swFeature.GetTypeName = " Mate " wird nie überprüft):

Dim swApp As Object
Dim swModel As ModelDoc2
Dim swAssembly As AssemblyDoc
Dim swMate As Mate2
Dim swFeature As Feature
Dim swEntity As Object
Dim swComponent As Component2
Dim swError As Long

Sub main()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssembly = swModel

' Parcourir toutes les contraintes de l'assemblage
Set swFeature = swAssembly.FirstFeature
    Do While Not swFeature Is Nothing
        If swFeature.GetTypeName = "Mate" Then
            Set swMate = swFeature.GetSpecificFeature2
            swError = swMate.Status
            ' Vérifier si la contrainte est en erreur
            If swError <> swMateStatusOK Then
                ' Vérifier les composants associés
                Set swEntity = swMate.GetMateEntities(0)
                If Not swEntity Is Nothing Then
                    Set swComponent = swEntity.GetComponent
                    If swComponent Is Nothing Then
                        ' Supprimer la contrainte en erreur
                        swAssembly.DeleteFeature swFeature.Name
                    End If
                End If
            End If
        End If
        Set swFeature = swFeature.GetNextFeature
    Loop
End Sub

Kann mir jemand sagen, was los ist?
Vielen Dank im Voraus.

Haben Sie es mit " Constraints " anstelle von " Mate " versucht? :


Bearbeiten: Nach dem Schnelltest und Hinzufügen einer debug.print:
image

MateGroup scheint für die 1. Überprüfung zu funktionieren, aber es buggt wieder direkt dahinter.

Hallo
Dieses Beispiel der API scheint mir die Notwendigkeit des Einschränkungsscans zu erfüllen.
Beispiel für Verknüpfungen und Verknüpfungselemente (VBA) - 2024 - SOLIDWORKS API-Hilfe
Auf der anderen Seite gibt es für den kaputten Constrained-Teil nichts Direktes, wenn ich keinen Fehler mache, so dass Sie eine Verarbeitung in der Zeile des Beispiels bewältigen müssen:

  Debug.Print "      Component         = " & swComp.Name2

In meinen Tests sind es normalerweise die beiden Komponenten, die mit einem " / " zwischen jedem Namen gekennzeichnet sind. Wenn welche fehlen (auch wenn es sich nur um eine Referenz handelt), fügt er den Namen des ASM als Namen der Komponente ein.

1 „Gefällt mir“

Hallo

Mit AI habe ich diesen Code:

Option Explicit

' Références nécessaires :
'  - SolidWorks 2020 Type Library
'  - SolidWorks 2020 Constant Type Library

' Constantes d'erreur (à adapter/compléter selon votre SW 2020)
Const swMateErrorNone              As Long = 0
Const swMateErrorEntityNotFound    As Long = 1
Const swMateErrorComponentNotFound As Long = 2

Sub main()
    Dim swApp       As SldWorks.SldWorks
    Dim swModel     As SldWorks.ModelDoc2
    Dim swAssy      As SldWorks.AssemblyDoc
    Dim swFeat      As SldWorks.Feature
    Dim nextFeat    As SldWorks.Feature
    Dim swMate      As SldWorks.Mate2
    Dim deleteCount As Long
    Dim ok          As Boolean
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' Vérification : document ouvert et de type assemblage
    If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
        MsgBox "Ouvrez un assemblage avant d'exécuter la macro.", vbExclamation
        Exit Sub
    End If
    
    Set swAssy = swModel
    deleteCount = 0
    
    ' Parcours de toutes les features
    Set swFeat = swModel.FirstFeature
    Do While Not swFeat Is Nothing
        Set nextFeat = swFeat.GetNextFeature
        
        ' Tenter de récupérer un Mate2
        On Error Resume Next
        Set swMate = swFeat.GetSpecificFeature2
        On Error GoTo 0
        
        If Not swMate Is Nothing Then
            ' **Filtre** : on ne supprime QUE si c'est bien un
            ' composant manquant (code 2)
            If swMate.GetMateError2 = swMateErrorComponentNotFound Then
                swModel.ClearSelection2 True
                ok = swFeat.Select2(False, -1)
                If ok Then
                    swAssy.EditDelete
                    deleteCount = deleteCount + 1
                End If
            End If
        End If
        
        Set swFeat = nextFeat
    Loop
     
    MsgBox deleteCount & " contrainte(s) en erreur supprimée(s).", vbInformation
End Sub

Auf der anderen Seite kann ich nicht wirklich testen, denn wenn ich Komponenten lösche, wechseln meine zugehörigen Einschränkungen in eine Art " gelöscht (fehlend) " Zustand, aber nicht in " Fehler " ?? :
image

EDIT: Neuer Code, der nur auf fehlende Komponenten abzielt

BEARBEITUNG 2:

Im Folgenden sind die Werte der von GetMateError2 zurückgegebenen Fehlercodes aufgeführt, wie in der swFeatureError_e Enumeration definiert (Verknüpfungseinträge):

Bedeutung des konstantenWerts
swFeatureErrorNone 0 Keine Fehler
swFeatureErrorMateInvalidEdge 38 Eine der Kanten der Verknüpfung wurde gelöscht, ist ungültig oder nicht mehr vorhanden
swFeatureErrorMateInvalidFace 39 Eine der Flächen der Verknüpfung wurde gelöscht, ist ungültig oder nicht mehr vorhanden
swFeatureErrorMateFailedCreatingSurface 40 Mattenoberflächentyp wird nicht unterstützt
swFeatureErrorMateInvalidEntity 41 Eines der Features in der Verknüpfung wurde gelöscht, ist ungültig oder nicht mehr vorhanden
swFeatureErrorMateUnbekanntTangente 42 Die Tangentenverbindung ist nicht erfüllt
swFeatureErrorMateDanglingGeometry 43 Die Verknüpfung zeigt auf eine "baumelnde" Geometrie (fehlende Fläche/Kante)
swFeatureErrorMateEntityNotLinear 44 Nichtlineare Kanten können für diese Verknüpfung nicht verwendet werden
swFeatureErrorMateEntityFailed 45 Das Stecken wird bei keiner der Komponenten unterstützt oder ist nicht möglich
swFeatureErrorMateÜberdefiniert 46 Diese Maske überdefiniert die Baugruppe
swFeatureErrorMateIlldefiniert 47 Diese Verknüpfung kann nicht gelöst werden (schlecht definiert)
swFeatureErrorMateBroken 48 Eine oder mehrere Verknüpfungselemente werden gelöscht/gelöscht (Verknüpfung "defekt")

Mit diesen Konstanten können Sie die Gründe für Fehler in Ihren Verknüpfungen genau filtern, z. B. nur diejenigen entfernen, deren Elemente (Flächen, Kanten usw.) fehlen (Codes 38, 39 oder 43). (help.solidworks.com)


Vielleicht könnte die Konstante, die hier eingefügt werden soll, 41, 45 oder 48 sein:

Const swMateErrorComponentNotFound As Long = 41

Weitere Konstanten hier: swFeatureError_e Aufzählung - 2021 - SOLIDWORKS API-Hilfe
Ich habe 63 und 64 ausprobiert, funktionieren aber auch nicht...

1 „Gefällt mir“

Hallo
Sie müssen diese Option in den allgemeinen SW-Optionen aktivieren:

3 „Gefällt mir“

Vielen Dank @Cyril_f , ich konnte diese Option nicht mehr finden.

Eine mögliche Alternative zum Makro besteht also @Silver_Surfer darin, das von @Cyril_f angezeigte Kontrollkästchen zu deaktivieren, das die Einschränkungen mit fehlenden Komponenten neben den anderen Fehlern gruppiert:

image

Alles, was Sie tun müssen, ist, alle Einschränkungen im Ordner " (fehlt) " auszuwählen, mit der rechten Maustaste zu klicken und dann " Löschen " (das rote Kreuz) zu wählen .

Zu bestätigen sowieso, wenn in diesem Fall nichts anderes zu finden ist. Meine Gewohnheiten der Zwänge sind zu gut; Ich habe Probleme beim Generieren von Fehlern :sweat_smile:

1 „Gefällt mir“

Sie müssen einer nach dem anderen gelöscht werden!! Dies ist immer noch der beste Weg, um sie zu erziehen.

1 „Gefällt mir“

Vielen Dank an alle für Ihre Antworten;
Ich werde mir das alles ansehen und auf den Beitrag zurückkommen.

1 „Gefällt mir“

Nicht ihre Schuld: Mein Vorgänger hat ihnen gesagt, dass sie diese Option niemals ankreuzen sollen!

In der Tat ist es keine so gute Idee, weil sie dafür bezahlt würden, ihre c_nneries zu reparieren.
Der wirklich beste Weg ist, ein Gehalt bis zu dem Zeitverlust einzubehalten, der durch den c_nneries verursacht wurde! Nur so wird es passen.

Sicherlich für die Option in Ordnung, aber für Gewohnheiten gibt es bösen Willen; Ich habe die Option nie überprüft und ich habe nie Einschränkungen in Bezug auf Komponenten hinterlassen, die nicht mehr vorhanden sind.

Vielleicht bin nur ich zu hart, aber ein Mangel an Strenge, der sich auf den Rest des Teams auswirkt, macht mich verrückt.

Hallo

Ich weiß nicht, wie man zu viel in VBA codiert, aber hier ist ein Code, der in C # funktioniert (ohne Unterbaugruppenbehandlung oder Fehlerbehandlung)

ModelDoc2 swDoc = null;
Feature swFeat = null;
List<Feature> listFeat = new List<Feature>();
Mate2 swMate = null;
Object swSpecificFeature = null;
bool boolstatus = false;

swDoc = ((ModelDoc2)(swApp.ActiveDoc));
swFeat = (Feature)swDoc.FirstFeature();

while (swFeat != null)
{
    if (swFeat.GetTypeName() == "MateGroup")
    {
        swFeat = (Feature)swFeat.IGetFirstSubFeature();
        while (swFeat != null)
        {
            swSpecificFeature = swFeat.GetSpecificFeature2();
            swMate = swSpecificFeature as Mate2;
            if (swMate != null)
            {
                int errorCode = swFeat.GetErrorCode2(out boolstatus);
                if (errorCode == (int)swFeatureError_e.swSketchErrorExtRefFail)
                {
                    listFeat.Add(swFeat); //ajoute à la liste les contraintes avec l'erreur référence manquante
                }
            }
            swFeat = (Feature)swFeat.IGetNextSubFeature();
        }
        break;
    }
    swFeat = (Feature)swFeat.GetNextFeature();
}

int count = 0;
foreach (Feature swFeatSuppr in listFeat) // supprime les contraintes présentes dans la liste
{
    if (swFeatSuppr.Select2(false, 0))
    {
        swDoc.EditDelete();
        count++;
    }
}

MessageBox.Show(count + " contraintes ont été supprimées");

image

image

Übrigens, KI erfindet eine Menge Methoden, die es in der Solidworks API nicht gibt :roll_eyes:

2 „Gefällt mir“