Macro-identificatie en verwijdering van defecte beperkingen

Hallo allemaal!

Laten we ter zake komen:
BE van 28 mensen die verkeerd geïnformeerd zijn over de optie Onderliggende elementen in assemblages verwijderen

En die zich hier vandaag de dag aan ergeren:

.

Mij wordt vandaag gevraagd of het mogelijk is om met een macro de beperkingen in fout verband met ontbrekende componenten te identificeren en te verwijderen.

Met behulp van de AI heb ik deze code die helaas niet operationeel is (de voorwaarde Als swFeature.GetTypeName = " Mate " nooit is aangevinkt):

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

Kan iemand mij vertellen wat er aan de hand is?
Bij voorbaat dank.

Heb je het geprobeerd met " Constraints " in plaats van " Mate "? :


Bewerken: na een snelle test en het toevoegen van een debug.print:
image

MateGroup lijkt te werken voor de 1e controle, maar het zit er weer vlak achter.

Hallo
Dit voorbeeld van de API lijkt mij te voldoen aan de behoefte aan constraint scanning.
Voorbeeld van partners en partnerentiteiten ophalen (VBA) - 2024 - SOLIDWORKS API Help
Aan de andere kant, voor het gebroken beperkte deel is er niets direct als ik geen fout maak, dus je moet een verwerking beheren op de lijn van het voorbeeld:

  Debug.Print "      Component         = " & swComp.Name2

In mijn tests zijn er normaal gesproken de twee componenten die worden aangegeven met een " / " tussen elke naam. Als er een ontbreekt (al is het maar een referentie), zet hij de naam van de ASM als de naam van de component.

1 like

Hallo

Met behulp van AI heb ik deze 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

Aan de andere kant kan ik niet echt testen, want wanneer ik componenten verwijder, schakelen mijn bijbehorende beperkingen over naar een soort " verwijderd (ontbrekend) " toestand, maar niet naar " fout "?? :
image

EDIT: nieuwe code om alleen ontbrekende componenten aan te pakken

BEWERKEN 2:

Dit zijn de waarden van de foutcodes die worden geretourneerd door GetMateError2, zoals gedefinieerd in de opsomming van swFeatureError_e (mate-gerelateerde vermeldingen):

Betekenis van constantewaarde
swFeatureErrorNone 0 Geen fouten
swFeatureErrorMateInvalidEdge 38 Een van de randen van de mate is verwijderd, ongeldig of bestaat niet meer
swFeatureErrorMateInvalidFace 39 Een van de gezichten van de partner is verwijderd, ongeldig of bestaat niet meer
swFeatureErrorMateFailedCreatingSurface 40 Mat oppervlaktetype wordt niet ondersteund
swFeatureErrorMateInvalidEntity 41 Een van de functies in de mate is verwijderd, ongeldig of bestaat niet meer
swFeatureErrorMateUnknownTangent 42 De raakmaat is niet tevreden
swFeatureErrorMateDanglingGeometry 43 De mat wijst naar een "bungelende" geometrie (ontbrekend vlak/rand)
swFeatureErrorMateEntityNotLinear 44 Niet-lineaire randen kunnen niet worden gebruikt voor deze mate
swFeatureErrorMateEntityFailed 45 Koppeling wordt niet ondersteund of onmogelijk op een van de componenten
swFeatureErrorMateOverdefined 46 Deze matte overdefinieert de assemblage
swFeatureErrorMateIlldefined 47 Deze partner kan niet worden opgelost (slecht gedefinieerd)
swFeatureErrorMateBroken 48 Een of meer mate-entiteiten worden verwijderd/verwijderd (mate "verbroken")

Met deze constanten kunt u de redenen voor fouten in uw partners nauwkeurig filteren, bijvoorbeeld om alleen die entiteiten te verwijderen waarvan de entiteiten (vlakken, randen, enz.) ontbreken (codes 38, 39 of 43). (help.solidworks.com)


Misschien zou de constante om hier te plaatsen 41, 45 of 48 kunnen zijn:

Const swMateErrorComponentNotFound As Long = 41

Andere constanten hier: swFeatureError_e Opsomming - 2021 - SOLIDWORKS API Help
Ik heb 63 en 64 geprobeerd, maar werken ook niet...

1 like

Hallo
U moet deze optie aanvinken in de algemene SW-opties:

4 likes

Bedankt @Cyril_f , ik kon deze optie niet meer vinden.

Een mogelijk alternatief voor de macro is dus @Silver_Surfer het uitschakelen van het vakje dat wordt weergegeven door @Cyril_f die de beperkingen groepeert met ontbrekende componenten, afgezien van de andere fouten:

image

Het enige wat u hoeft te doen is alle beperkingen in de map " (ontbrekend) " te selecteren, met de rechtermuisknop te klikken en vervolgens " verwijderen " (het rode kruis).

In ieder geval te bevestigen als er in dit geval niets anders te vinden is. Mijn gewoonten van beperkingen zijn te goed; Ik heb problemen met het genereren van fouten :sweat_smile:

1 like

Ze moeten één voor één worden gewist!! Dit is nog steeds de beste manier om ze op te voeden.

2 likes

Bedankt allemaal voor jullie antwoorden;
Ik zal dit allemaal bekijken en ik kom terug op de post.

1 like

Niet hun schuld: mijn voorganger zei dat ze deze optie nooit moesten aanvinken!

In feite is het niet zo'n goed idee, omdat ze zouden worden betaald om hun c_nneries te repareren.
De echte beste manier is om een salaris in te houden tot de hoeveelheid verloren tijd veroorzaakt door hun c_nneries! Dat is de enige manier waarop het past.

Zeker voor de optie ok, maar voor gewoontes is er slechte wil; Ik heb de optie nooit aangevinkt en ik heb nooit beperkingen achtergelaten met betrekking tot componenten die niet meer bestaan.

Misschien ben ik de enige die te hard is, hè, maar een gebrek aan strengheid dat de rest van het team beïnvloedt, maakt me gek.

Hallo

Ik weet niet te veel hoe ik in VBA moet coderen, maar hier is een code die werkt in C# (zonder subassembly-afhandeling of foutafhandeling)

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

1 like

Trouwens, AI bedenkt veel methoden die niet bestaan in de Solidworks API :roll_eyes:

2 likes

Re: Hallo allemaal!

Het beste antwoord zal dus aan @Konti worden toegeschreven: zelfs als ik in veel andere antwoorden elementen heb gevonden om me te ontgrendelen, is het zijn antwoord dat me het meest in staat stelde om vooruit te komen (en dit ondanks het feit dat zijn code in C# is geschreven).

Dank je wel @Konti !

Hier is de oplossing in detail:
Inderdaad, zoals de @Konti code laat zien, is het de foutcode 51 swSketchErrorExtRefFail die moet worden gebruikt.
Wanneer een onderdeel wordt verwijderd zonder de bijbehorende beperkingen te verwijderen, krijgen de beperkingsverwijzingen een vlag **External**
image

Om de een of andere reden was het eerste idee dat ik had om te controleren of de component die was gekoppeld aan de wiebelige beperkingsreferentie-entiteit niet werkte: er was nog steeds een bestandsnaam aan gekoppeld, maar die had niets te maken met de oorspronkelijke. Kort! Onbegrijpelijk.

De voorwaarde om dit te laten werken is dat de systeemoptie Ontbrekende beperkingsverwijzingen als fouten behandelen, moet worden gecontroleerd (juist om code 51 aan de beperking te koppelen).

VOORZICHTIG!! Als een bestand ontbreekt (d.w.z. SW kan het niet vinden), wordt het weergegeven als verwijderd in de structuur en voor alle configuraties als die er zijn, en de beperkingen die eraan verbonden zijn, gaan ook terug naar foutcode 51; Het is daarom noodzakelijk om na te denken over het oplossen/vinden van deze componenten voordat u de macro exploiteert.

Het andere probleem dat ik tegenkwam, heeft te maken met de functie van het groeperen van beperkingen op status (*Met dank aan @Sylk voor het laten verschijnen van deze weergave-optie in een van zijn berichten):
Als de beperking een subfunctie is van de functie Standaardbeperkingen in de structuur van een assembly, bevinden de gebruikersmappen of mappen voor automatische groepering zich op hetzelfde niveau en moeten ze worden verwijderd voordat de beperking wordt geanalyseerd.

Daar ga je! Nogmaals bedankt allemaal.
Hieronder staat mijn code:

Option Explicit

Dim swApp As SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim swSelMgr As SldWorks.SelectionMgr

Dim swFeat As SldWorks.Feature
Dim swMateGroup As SldWorks.Feature
Dim swSubFolder As SldWorks.Feature
Dim swMateFeat As SldWorks.Feature
Dim swSubFeat As SldWorks.Feature

Dim swMate As IMate2
Dim swComp As SldWorks.Component2
Dim swMateEnt(2) As SldWorks.MateEntity2

Dim fileName As String
Dim Error As Long
Dim IsWarning As Boolean
Dim i As Long
Dim DeleteOption As Long
Dim status As Boolean
Dim Append As Boolean
Dim Mark As Integer
Dim List As Boolean


Sub main()
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swSelMgr = swModel.SelectionManager
    Set swModelDocExt = swModel.Extension
    
    'Get the first feature in the assembly
    Set swFeat = swModel.FirstFeature
    'Iterate over features in FeatureManager design tree
    Do While Not swFeat Is Nothing
        If "MateGroup" = swFeat.GetTypeName Then
            Set swMateGroup = swFeat
            Exit Do
        End If
        Set swFeat = swFeat.GetNextFeature
    Loop
    
    Debug.Print "  " & swMateGroup.Name
    Debug.Print ""
    
    
    Set swSubFeat = swMateGroup.IGetFirstSubFeature
   'iterate over subfeatures (Mate or folders)
    Do While Not swSubFeat Is Nothing
        If "FtrFolder" = swSubFeat.GetTypeName Then
            '--------------------------------------------------------------------
            Debug.Print "swSubFeat TypeName:        " & swSubFeat.GetTypeName _
            & ",        Name:        " & swSubFeat.Name
            '--------------------------------------------------------------------
            GoTo Line1
        ElseIf "GroupedMatesFolder" = swSubFeat.GetTypeName Then
            '--------------------------------------------------------------------
            Debug.Print "swSubFeat TypeName:        " & swSubFeat.GetTypeName _
            & ",        Name:        " & swSubFeat.Name
            '--------------------------------------------------------------------
            GoTo Line1
            
        End If
        'MsgBox swSubFeat.GetTypeName
       Set swMate = swSubFeat.GetSpecificFeature2
        If Not swMate Is Nothing Then
            Error = swSubFeat.GetErrorCode2(IsWarning)

            ' Error 51 ?
            If Error = 51 Then List = swSubFeat.Select2(True, 0)
        End If
Line1:
                    
        Set swSubFeat = swSubFeat.IGetNextSubFeature
        
    Loop

    'Delete List
        ' To delete absorbed features, use enum swDeleteSelectionOptions_e.swDelete_Absorbed
        ' To delete children features, use enum swDeleteSelectionOptions_e.swDelete_Children
        ' To keep absorbed features and children features, set DeleteOption = 0
    DeleteOption = swDeleteSelectionOptions_e.swDelete_Absorbed
    'DeleteOption = swDeleteSelectionOptions_e.swDelete_Children
    'DeleteOption = 0
    'DeleteOption =swDeleteSelectionOptions_e.swDelete_Absorbed + swDeleteSelectionOptions_e.swDelete_Children
    
    status = swModelDocExt.DeleteSelection2(DeleteOption)
    
End Sub

4 likes

F *** maar hoe geweldig je macro is!

Kom op, een kleine back-up in de mijne. Bedankt voor het delen en gefeliciteerd met het geleverde werk!

2 likes

In navolging van de macro-bug die hierboven door @coin37coin werd gedeeld (zie Multi-beperking. Wat is het? -dankzij hem-), deel ik met u de macro die is gecorrigeerd om rekening te houden met de meervoudige beperkingsbestanden:

Option Explicit

Dim swApp As SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim swSelMgr As SldWorks.SelectionMgr

Dim swFeat As SldWorks.Feature
Dim swMateGroup As SldWorks.Feature
Dim swSubFolder As SldWorks.Feature
Dim swMateFeat As SldWorks.Feature
Dim swSubFeat As SldWorks.Feature

Dim swMate As IMate2
Dim swComp As SldWorks.Component2
Dim swMateEnt(2) As SldWorks.MateEntity2

Dim fileName As String
Dim Error As Long
Dim IsWarning As Boolean
Dim i As Long
Dim DeleteOption As Long
Dim status As Boolean
Dim Append As Boolean
Dim Mark As Integer
Dim List As Boolean


Sub main()
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swSelMgr = swModel.SelectionManager
    Set swModelDocExt = swModel.Extension
    
    'Get the first feature in the assembly
    Set swFeat = swModel.FirstFeature
    'Iterate over features in FeatureManager design tree
    Do While Not swFeat Is Nothing
        If "MateGroup" = swFeat.GetTypeName Then
            Set swMateGroup = swFeat
            Exit Do
        End If
        Set swFeat = swFeat.GetNextFeature
    Loop
    
    Debug.Print "  " & swMateGroup.Name
    Debug.Print ""
    
    
    Set swSubFeat = swMateGroup.IGetFirstSubFeature
   'iterate over subfeatures (Mate or folders)
    Do While Not swSubFeat Is Nothing
        If "FtrFolder" = swSubFeat.GetTypeName Then
            '--------------------------------------------------------------------
            Debug.Print "swSubFeat TypeName:        " & swSubFeat.GetTypeName _
            & ",        Name:        " & swSubFeat.Name
            '--------------------------------------------------------------------
            GoTo Line1
        ElseIf "GroupedMatesFolder" = swSubFeat.GetTypeName Then
            '--------------------------------------------------------------------
            Debug.Print "swSubFeat TypeName:        " & swSubFeat.GetTypeName _
            & ",        Name:        " & swSubFeat.Name
            '--------------------------------------------------------------------
            GoTo Line1
        ElseIf "MultipleMateFolder" = swSubFeat.GetTypeName Then
            '--------------------------------------------------------------------
            Debug.Print "swSubFeat TypeName:        " & swSubFeat.GetTypeName _
            & ",        Name:        " & swSubFeat.Name
            '--------------------------------------------------------------------
            GoTo Line1
            
        End If
        'MsgBox swSubFeat.GetTypeName
       Set swMate = swSubFeat.GetSpecificFeature2
        If Not swMate Is Nothing Then
            Error = swSubFeat.GetErrorCode2(IsWarning)

            ' Error 51 ?
            If Error = 51 Then List = swSubFeat.Select2(True, 0)
        End If
Line1:
                    
        Set swSubFeat = swSubFeat.IGetNextSubFeature
        
    Loop

    'Delete List
        ' To delete absorbed features, use enum swDeleteSelectionOptions_e.swDelete_Absorbed
        ' To delete children features, use enum swDeleteSelectionOptions_e.swDelete_Children
        ' To keep absorbed features and children features, set DeleteOption = 0
    DeleteOption = swDeleteSelectionOptions_e.swDelete_Absorbed
    'DeleteOption = swDeleteSelectionOptions_e.swDelete_Children
    'DeleteOption = 0
    'DeleteOption =swDeleteSelectionOptions_e.swDelete_Absorbed + swDeleteSelectionOptions_e.swDelete_Children
    
    status = swModelDocExt.DeleteSelection2(DeleteOption)
    
End Sub
5 likes