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ę.
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.
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 "?? :
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:
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:
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
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.