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

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

2 likes