Identyfikacja makr i usuwanie wadliwych ograniczeń

Cześć wszystkim!

Przejdźmy do sedna:
BE 28 osób, które zostały błędnie poinformowane o opcji Usuń elementy podrzędne w zespołach

A którzy dziś są tym zirytowani:

.

Dzisiaj jestem pytany, czy możliwe jest zidentyfikowanie ograniczeń za pomocą makra z powodu brakujących komponentów i ich usunięcie.

Z pomocą sztucznej inteligencji mam ten kod, który niestety nie działa (warunek If swFeature.GetTypeName = " Mate " nigdy nie jest sprawdzany):

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

Czy ktoś mógłby mi powiedzieć, co jest nie tak?
Z góry dziękuję.

Czy próbowałeś z " Constraints " zamiast " Mate "? :


Edycja: po szybkim teście i dodaniu debug.print:
image

Wygląda na to, że MateGroup działa dla pierwszego sprawdzenia, ale zaraz za nim znowu błądzi.

Witam
Wydaje mi się, że ten przykład API spełnia potrzebę skanowania z ograniczeniami.
Pobierz wiązania i przykłady elementów wiązań (VBA) - 2024 - Pomoc SOLIDWORKS API
Z drugiej strony, dla uszkodzonej części ograniczonej nie ma nic bezpośredniego, jeśli nie popełnię błędu, więc musisz zarządzać przetwarzaniem w wierszu przykładu:

  Debug.Print "      Component         = " & swComp.Name2

W moich testach zwykle są to dwa komponenty oznaczone znakiem " / " między każdą nazwą. Jeśli brakuje jakichś (nawet jeśli jest to tylko odwołanie), umieszcza nazwę ASM jako nazwę komponentu.

1 polubienie

Witam

Korzystając z AI, mam taki kod:

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

Z drugiej strony tak naprawdę nie mogę testować, ponieważ kiedy usuwam komponenty, moje powiązane ograniczenia przełączają się w rodzaj stanu " usunięte (brakujące) ", ale nie na " błąd "?? :
image

EDYCJA: nowy kod wskazujący tylko na brakujące komponenty

EDYCJA2:

Poniżej przedstawiono wartości kodów błędów zwracanych przez GetMateError2, zgodnie z definicją w wyliczeniu swFeatureError_e (wpisy związane z wiązaniem):

Znaczenie wartości stałej
swFeatureErrorNone 0 Bez pomyłek
swFeatureErrorMateInvalidEdge 38 Jedna z krawędzi wiązania została usunięta, nieprawidłowa lub już nie istnieje
swFeatureErrorMateInvalidFace 39 Jedna ze ścian wiązania została usunięta, nieprawidłowa lub już nie istnieje
swFeatureErrorMateFailedCreatingSurface 40 Typ powierzchni maty nie jest obsługiwany
swFeatureErrorMateInvalidEntity 41 Jedna z operacji w wiązaniu została usunięta, nieprawidłowa lub już nie istnieje
swFeatureErrorMateUnknownTangent 42 Wiązanie styczne nie jest spełnione
swFeatureErrorMateDanglingGeometry 43 Wiązanie wskazuje na "zwisającą" geometrię (brak powierzchni/krawędzi)
swFeatureErrorMateEntityNotLinear 44 Dla tego wiązania nie można używać krawędzi nieliniowych
swFeatureErrorMateEntityFailed 45 Wiązanie nie jest obsługiwane lub niemożliwe na żadnym z komponentów
swFeatureErrorMateOverdefined 46 Ta maska nadmiernie definiuje zespół
swFeatureErrorMateIlldefined 47 To wiązanie nie może być rozwiązane (słabo zdefiniowane)
swFeatureErrorMateBroken 48 Jeden lub więcej elementów wiązania jest usuwanych/usuwanych ("zerwane")

Stałe te pozwalają na precyzyjne filtrowanie przyczyn błędów w wiązaniach, na przykład w celu usunięcia tylko tych, których elementów (ścian, krawędzi itp.) brakuje (kody 38, 39 lub 43). (help.solidworks.com)


Być może stałą, którą należy tutaj umieścić, może być 41, 45 lub 48:

Const swMateErrorComponentNotFound As Long = 41

Inne stałe tutaj: Wyliczanie swFeatureError_e - 2021 - Pomoc SOLIDWORKS API
Próbowałem 63 i 64, ale też nie działa...

1 polubienie

Witam
Musisz zaznaczyć tę opcję w ogólnych opcjach oprogramowania:

3 polubienia

Dziękuję @Cyril_f , nie mogłem już znaleźć tej opcji.

Tak więc @Silver_Surfer , możliwą alternatywą dla makra, jest odznaczenie pola pokazanego przez @Cyril_f , które grupuje ograniczenia z brakującymi komponentami poza innymi błędami:

image

Wszystko, co musisz zrobić, to zaznaczyć wszystkie ograniczenia w folderze " (brakujące) ", kliknąć prawym przyciskiem myszy, a następnie " usunąć " (czerwony krzyżyk).

Do potwierdzenia w każdym razie, jeśli nic innego nie można znaleźć w tym przypadku. Moje nawyki związane z ograniczeniami są zbyt dobre; Mam problem z generowaniem błędów :sweat_smile:

1 polubienie

Muszą być usuwane jeden po drugim!! To wciąż najlepszy sposób na ich edukację.

1 polubienie

Dziękuję wszystkim za odpowiedzi;
Przyjrzę się temu wszystkiemu i wrócę do postu.

1 polubienie

To nie ich wina: mój poprzednik powiedział im, żeby nigdy nie zaznaczali tej opcji!

W rzeczywistości nie jest to taki dobry pomysł, ponieważ zapłaciliby za naprawę swoich c_nneries.
Naprawdę najlepszym sposobem jest wstrzymanie wynagrodzenia do wysokości czasu straconego z powodu ich c_nneries! Tylko w ten sposób będzie pasować.

Na pewno dla opcji ok, ale dla przyzwyczajeń jest zła wola; Nigdy nie zaznaczałem tej opcji i nigdy nie zostawiłem ograniczeń związanych z komponentami, które już nie istnieją.

Może to tylko ja jestem zbyt twardy, ale brak dyscypliny, który wpływa na resztę zespołu, doprowadza mnie do szału.

Witam

Nie znam się zbytnio na kodowaniu w VBA, ale oto kod, który działa w C# (bez obsługi podzespołów lub obsługi błędów)

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

Nawiasem mówiąc, sztuczna inteligencja wymyśla wiele metod, które nie istnieją w API Solidworks :roll_eyes:

2 polubienia