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