On me demande aujourd’hui s’il est possible avec une macro d’identifier les contraintes en erreur pour cause de composant manquants et de les supprimer.
A l’aide de l’IA, j’ai ce code qui malheureusement n’est pas opérationnel (la condition If swFeature.GetTypeName = « Mate » n’est jamais vérifiée) :
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
Est-ce que quelqu’un saurait me dire ce qu’il cloche ?
Merci par avance.
Bonjour,
Cet exemple de l’API me semble répondre au besoin pour ce qui est du scanne des contraintes. Get Mates and Mate Entities Example (VBA) - 2024 - SOLIDWORKS API Help
En revanche pour la partie contrainte rompue il n’y a rien de direct si je ne fais pas d’erreur, il faut donc gérer un traitement sur la ligne de l’exemple :
Debug.Print " Component = " & swComp.Name2
Dans mes tests, normalement il y a les deux composants indiqués avec un « / » entre chaque nom. S’il en manque (ne serait-ce qu’une référence) il met en nom de composant le nom de l’ASM.
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
Par contre je ne peux pas vraiment tester car quand je supprime des composants, mes contraintes associées basculent dans une espèce d’état « supprimé (manquant) » mais pas en « erreur » ?? :
EDIT: nouveau code pour cibler les composants manquants uniquement
EDIT2:
Voici les valeurs des codes d’erreur retournés par GetMateError2, telles qu’elles sont définies dans l’énumération swFeatureError_e (mate‑related entries) :
Constante
Valeur
Signification
swFeatureErrorNone
0
Pas d’erreur
swFeatureErrorMateInvalidEdge
38
L’une des arêtes du mate est supprimée, invalide ou n’existe plus
swFeatureErrorMateInvalidFace
39
L’une des faces du mate est supprimée, invalide ou n’existe plus
swFeatureErrorMateFailedCreatingSurface
40
Type de surface de mate non pris en charge
swFeatureErrorMateInvalidEntity
41
L’une des entités du mate est supprimée, invalide ou n’existe plus
swFeatureErrorMateUnknownTangent
42
Le mate tangent n’est pas satisfait
swFeatureErrorMateDanglingGeometry
43
Le mate pointe vers une géométrie « dangling » (face/edge manquante)
swFeatureErrorMateEntityNotLinear
44
Arêtes non linéaires ne peuvent pas être utilisées pour ce mate
swFeatureErrorMateEntityFailed
45
Mating non supporté ou impossible sur l’un des composants
swFeatureErrorMateOverdefined
46
Ce mate sur‑définit l’assemblage
swFeatureErrorMateIlldefined
47
Ce mate ne peut pas être résolu (mal défini)
swFeatureErrorMateBroken
48
Un ou plusieurs mate entities sont supprimés/supprimés (mate “cassé”)
Ces constantes vous permettent de filtrer précisément les raisons d’erreur de vos mates, par exemple pour ne supprimer que ceux dont les entités (faces, arêtes…) sont manquantes (codes 38, 39 ou 43). (help.solidworks.com)
Peut-être que la constante à mettre ici pourrait être 41, 45, ou 48 :
Merci @Cyril_f , je ne retrouvais plus cette option.
Du coup @Silver_Surfer , une alternative possible à la macro, est justement de décocher la case montrée par @Cyril_f ce qui groupe les contraintes à composants manquants à part des autres erreurs :
Il suffit alors de sélectionner toutes les contraintes dans le dossier « (manquants) », clic droit, puis « effacer » (la croix rouge quoi).
A confirmer quand même si rien d’autre ne peut se retrouver dans ce dossier. Moi mes habitudes de contraintes sont trop bonnes ; j’ai du mal à générer des erreurs
En fait c’est pas une si bonne idée car ils seraient payés à réparer leurs c_nneries.
Le vrai meilleur moyen, c’est une retenue sur salaire à hauteur du temps perdu causé par leurs c_nneries ! Y a que comme ça que ça rentrera.
Certes pour l’option ok, mais pour les habitudes ya de la mauvaise volonté ; je n’ai jamais coché l’option et je n’ai jamais laissé des contraintes liées à des composants qui n’existent plus.
Après c’est peut-être juste moi qui suis trop dur, hein, mais un manque de rigueur qui impacte le reste de l’équipe ça me rend dingue.