Salut @Anonymous et @gmassart
Voici un nouveau code qui fonctionne comme suit :
- Déclarations des variables
- Création d'une liste de couleurs
- Vérification des calques associés, création si nécessaire
- Vérification des iPropriétés, création si nécessaire
- 1ère boucle sur chaque feuille
- 2ème boucle sur chaque vue
- 3ème boucle sur chaque pièce
- Si le composant est un fantôme :
- Sélection de toutes les courbes du composant
- Lecture de l'iPropriété
- Vérification par rapport à la liste de couleur, sinon, arrêt du code et message d'erreur
- Envoi de la sélection dans le calque correspondant
- Pièce suivante
- Vue suivante
- Feuille suivante
Voici le code :
'Variables du document
oDoc = ThisDrawing.Document
Dim oSheets As Sheets
oSheets = oDoc.Sheets
Dim oSheet As Sheet
Dim oViews As DrawingViews
Dim oView As DrawingView
Dim DocFile As Document
'Variables de l'ensemble
Dim oAsmCompDef As AssemblyComponentDefinition
Dim oOcc As ComponentOccurrence
'Variables de la sélection
Dim DrawCurves As DrawingCurvesEnumerator
Dim DrawCurve As DrawingCurve
Dim Segment As DrawingCurveSegment
Dim TransObjs As TransientObjects
TransObjs = ThisApplication.TransientObjects
Dim ObjColl As ObjectCollection
'Variable pour les iPropriétés
Dim CustomPropSet As PropertySet
Dim CustomProp As Inventor.Property
Dim Check As Boolean
'''Créé une liste de couleurs
Dim MyColor As String
Dim MyColors As New ArrayList
MyColors.Add("Rouge")
MyColors.Add("Vert")
MyColors.Add("Bleu")
'Ajouter autant de couleurs que nécessaire...
'''Gestion des calques
'Variables des calques
Dim oLayer As Layer
For i = 0 To MyColors.Count - 1
Try
'Vérifie que le calque existe
oLayer = oDoc.StylesManager.Layers(MyColors(i))
Catch
'Le calque n'existe pas
'Copie le 1er calque disponible
oLayer = oDoc.StylesManager.Layers.Item(1).Copy(MyColors(i))
'Choisi le type de ligne
oLayer.LineType = LineTypeEnum.kContinuousLineType
'Choisi l'épaisseur du trait
oLayer.LineWeight = 0.025 'valeur en cm
End Try
'Enregistre les couleurs
Select Case MyColors(i)
'Format des couleurs en RVB, valeur de 0 à 255
Case MyColors(0) '"Rouge"
oLayer.Color = TransObjs.CreateColor(255, 0, 0)
Case MyColors(1) '"Vert"
oLayer.Color = TransObjs.CreateColor(0, 255, 0)
Case MyColors(2) '"Bleu"
oLayer.Color = TransObjs.CreateColor(0, 0, 255)
'Ajouter autant de couleurs que nécessaire...
End Select
Next
'''Vérifie les iPropriétés des pièces fantômes du document
For Each DocFile In oDoc.AllreferencedDocuments
If DocFile.ComponentDefinition.BOMStructure = 51971 Then 'Fantôme
CustomPropSet = DocFile.PropertySets.Item("Inventor User Defined Properties")
Try
'Vérifie que l'iPropriété existe
CustomProp = CustomPropSet.Item("Ma Couleur")
Catch
'L'iPropriété n'existe pas
MyColor = InputListBox("Entrez une couleur pour le composant : " _
& vbNewLine & "Titre : " & DocFile.FullFileName, _
MyColors, MyColors, Title := "iLogic", ListName := "Choix de couleurs")
'Créé l'iPropriété
CustomPropSet.Add(MyColor, "Ma Couleur")
End Try
End If
Next
'''Assigne un calque à chaque pièce fantôme
'Regarde dans chaque feuille
For Each oSheet In oSheets
oViews = oSheet.DrawingViews
'Regarde dans chaque vue
For Each oView In oViews
'Trouve la référence du modèle de lavue
oModelDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
oAsmCompDef = oModelDoc.ComponentDefinition
'Regarde dans chaque composant du modèle
For Each oOcc In oAsmCompDef.Occurrences
If oOcc.Definition.BOMStructure = 51971 Then '=> Composant fantôme
'Créé une sélection
ObjColl = TransObjs.CreateObjectCollection()
DrawCurves = oView.DrawingCurves(oOcc)
'Sélectionne chaque courbe du composant
For Each DrawCurve In DrawCurves
For Each Segment In DrawCurve.Segments
'Ajoute à la sélection
ObjColl.Add(Segment)
Next
Next
'Trouve la couleur du calque dans l'iPropriété du composant
CustomPropSet = oOcc.Definition.Document.PropertySets.Item("Inventor User Defined Properties")
CustomProp = CustomPropSet.Item("Ma Couleur")
MyColor = CustomProp.Value
'Vérifie que la couleur existe
Check = False
For i = 0 To MyColors.Count - 1
If MyColor = MyColors(i) Then 'Couleur trouvée dans la liste
Check = True
End If
Next
'Affecte la couleur
If Check = True Then
oView.Parent.ChangeLayer(ObjColl, oDoc.StylesManager.Layers.Item(MyColor))
Else
'La couleur n'existe pas
MessageBox.Show("La couleur " & Chr(34) & MyColor & Chr(34) & " n'existe pas..." _
& vbNewLine & "Dans le composant : " & oOcc.Definition.Document.FullFileName _
& vbNewLine & "Arrêt de la règle...", _
"iLogic", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1)
Return 'Arrêt du code
End If
End If
Next
Next
Next
Je vous laisse tester ça ! 
Thomas
Mechanical Designer / Inventor Professional 2025
