Gestion calque et pièce fantôme

Gestion calque et pièce fantôme

Anonymous
Non applicable
2 039 Visites
26 Réponses
Message 1 sur 27

Gestion calque et pièce fantôme

Anonymous
Non applicable

Bonjour,

 

J'aimerai savoir comment distinguer, par un type de ligne différent par exemple, les éléments fantômes de ma nomenclature.

Je pense qu'il est possible d'affecter ces éléments fantômes à un calque spécifique.

 

Merci de votre aide

 

 

 

0 J'aime
Solutions acceptées (2)
2 040 Visites
26 Réponses
Replies (26)
Message 2 sur 27

ThomasB44
Mentor
Mentor

Salut @Anonymous

 

Les pièces ou assemblages dont la structure de nomenclature est "Fantôme", ont le même style de lignes que les autres objets.

En revanche, les pièces ou assemblages dont la structure de nomenclature est "Référence", peuvent être paramétrés différemment dans l'éditeur de styles.

 

Ouvrir l'éditeur de styles (Gérer / Éditeur de styles)

Aller dans "Valeurs par défaut des objets.

Affecter à "Arête de pièce de référence" le calque de ton choix

 

Capture.JPG

 

Si malgré tout tu souhaites conserver une structure de nomenclature en "Fantôme", il va falloir aller sélectionner toutes les pièces, puis clic droit "Sélectionner comme arêtes", et affecter un autre calque.


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 3 sur 27

Anonymous
Non applicable
Merci pour la réponse. L'idée première est de pouvoir dans un assemblage, mettre certaines pièces en couleur de manière automatique sur toutes les vues. J'ai vu quelques posts parlant de "sélectionner comme arêtes" et de placer dans un calque specifique mais il faut gerer chaque vue indépendamment (c'est ce que je fais à ce jour). J'ai vue également un programme VBA à adapter... mais pas encore eu le temps d'approfondir
0 J'aime
Message 4 sur 27

ThomasB44
Mentor
Mentor

Salut @Anonymous

As tu essayé de régler la "structure de la nomenclature" sur "référence" ?

Comme indiqué plus haut, toutes les pièces "référence" seront automatiquement attribué à un calque, géré par le style.

 

Un développement iLogic / VBA sera certainement efficace, mais le développement de ce genre de solution peut être long en fonction de tes besoins.

As tu déjà programmé en iLogic ou VBA ?


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 5 sur 27

gmassart
Collaborator
Collaborator

Perso je passerais plutôt par une ipropriété type "mycolor" et je gérerai avec un script en vba ou ilogic pour lire cette propriété et faire le "sélectionner comme arrête" et changement de couleur avec le script.

L'astuce de la nomenclature c'est bien, mais c'est pas flexible et surtout ça va empêcher inventor de calculer correctement les poids, les pièces en référence n'ont pas poids et surtout sont partiellement représentée dans les vues de dessin

 

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022
EESignature

0 J'aime
Message 6 sur 27

ThomasB44
Mentor
Mentor

Oui tout à fait @gmassart

Mais je préfère toujours demander, et regarder ce qu'il est possible de faire avant de se lancer dans de la programmation Smiley clignant de l'œil


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 7 sur 27

gmassart
Collaborator
Collaborator

C'est clair qu'on prend des réflexes à tout programmer par facilité parfois 🙂

Je vais regarder ça de mon côté, ça peut servir peut être chez nous, sait-on jamais

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022
EESignature

0 J'aime
Message 8 sur 27

gmassart
Collaborator
Collaborator
Solution acceptée
Message 9 sur 27

Anonymous
Non applicable

Salut @ThomasB44

 

Le problème que je vois avec la structure type référencé, c'est que toutes les pièces "référencées" seront positionnées dans le même calque.

Je cherche également la possibilité de mettre des pièces dans des calques différents (de couleur par exemple).

 

Pour ce qui est de la programmation, je débute en ilogic mais j'apprends vite. Pour le VBA, sur excel principalement.

 

 

 

0 J'aime
Message 10 sur 27

Anonymous
Non applicable

Bonjour @gmassart

 

L'idée d'Ipropriétés "mycolor" me semble très intéressante. Je vais sans doute essayer de m'orienter dans cette direction.

Si jamais tu as une solution, je suis preneur.

 

Je reviens vers vous si je trouve de mon côté.

 

Merci encore.

0 J'aime
Message 11 sur 27

ThomasB44
Mentor
Mentor

@Anonymous

Très bien, ton besoin m'a l'air vraiment orienté vers une programmation ! Smiley tirant la langue

 

Voici un premier exemple :

  • Qui fonctionne pour chaque feuille et chaque vue d'un dessin
  • Il faut au préalable créer un calque qui s'appelle "Fantôme" sinon il y aura une erreur

Je n'ai pas mis les fioritures habituelles, si le document n'est pas un dessin, si il n'y a pas de vues...etc...le code renverra une erreur...

Mais bon, je pense que c'est déjà un bon début. Smiley clignant de l'œil

Il restera à l'adapter plus finement à ton besoin, en particulier concernant les différentes couleurs, je ne sais pas comment tu veux procéder.

 

Voici le code en iLogic :

 

'51969 = Defaut
'51974 = Indivisible
'51970 = Normal
'51971 = Fantôme
'51973 = Acheté
'51972 = Référence
'51975 = Variable

oDoc = ThisDrawing.Document
Dim oSheets As Sheets
oSheets = oDoc.Sheets
Dim oSheet As Sheet
Dim oViews As DrawingViews
Dim oView As DrawingView
Dim oAsmCompDef As AssemblyComponentDefinition
Dim oOcc As ComponentOccurrence
Dim oLayer As Layer

oLayer = oDoc.StylesManager.Layers("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
		oModelDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
		oAsmCompDef = oModelDoc.ComponentDefinition
		'Regarde dans chaque reférence du modèle
		For Each oOcc In oAsmCompDef.Occurrences
			If oOcc.Definition.BOMStructure = 51971 Then 'Fantôme
				'Varaibles pour la création d'une sélection de courbes
				Dim DrawCurves As DrawingCurvesEnumerator
				Dim DrawCurve As DrawingCurve
				Dim Segment As DrawingCurveSegment
				Dim TransObjs As TransientObjects
				TransObjs = ThisApplication.TransientObjects
				Dim ObjColl As ObjectCollection
				ObjColl = TransObjs.CreateObjectCollection()
				DrawCurves = oView.DrawingCurves(oOcc)
				'Sélectionne chaque courbe de la pièce
				For Each DrawCurve In DrawCurves
					For Each segment In DrawCurve.Segments
						ObjColl.Add(Segment)
					Next
				Next
				'Change le calque pour la sélection
				oView.Parent.ChangeLayer(ObjColl, oLayer)
			End If
		Next
	Next
Next	

Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 12 sur 27

Anonymous
Non applicable

Merci @ThomasB44

 

Je n'ai pas encore eu le temps de tester ce bout de programme. Pourrais tu m'expliquer en gros ce qu'il fait ?

D'après ce que je peux comprendre, il passe en revue l'ensemble des feuilles, puis des vues et déplacent les éléments de type courbe dans le calque fantôme. 

Est ce bien cela ?

 

Cela me permets déjà d'avoir un bout de programmation. Je me pencherai sur la fameuse ipropriété "mycolor" par la suite.

 

Merci encore

 

 

 

 

 

0 J'aime
Message 13 sur 27

ThomasB44
Mentor
Mentor

Oui @Anonymous

 

Sous la condition qu'il existe bien un calque nommé "Fantôme", que tu paramètres comme tu le souhaites (couleur, trait, épaisseur...), le code agit comme suit :

 

  • 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électionne toutes les courbes du composant
          • Envoi de la sélection dans le calque "Fantôme"
      • Pièce suivante
    • Vue suivante
  • Feuille suivante

Tout dépend par la suite comment tu veux affecter un calque (donc une couleur, des types de traits, une épaisseur) à une pièce fantôme.

Est ce que ce sera spécifique à la pièce ? Ou au dessin ? Faut il permettre à l'utilisateur de choisir via le code ?


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 14 sur 27

Anonymous
Non applicable

@ThomasB44

 

L'idée principale serait de pouvoir affecter une couleur à une pièce.

 

Nous utilisons beaucoup des réseaux aérauliques (je travaille dans le domaine papetier). Afin de les différentier, j'aimerai affecter par exemple une couleur par réseau (bleu, rouge ou vert, peu importe). L'idée d'ipropriété est très intéressante (je ne sais pas si cela est la meilleure), je pourrais par exemple affecter directement la couleur dans cette ipropriété.

 

Le programme pourrait alors effectuer la même recherche et représenter la pièce ou assemblage dans la couleur souhaitée.

Cela evite pas mal de travaille fastidieux de changer les couleurs dans chaque vue.

 

Merci encore pour ton aide... Je n'ai pas le de me pencher sur le sujet que j'ai déjà une réponse ..au top 🙂

 

 

0 J'aime
Message 15 sur 27

gmassart
Collaborator
Collaborator

L'avantage de l'ipropriété c'est que tu peux les gérer dans la nomenclature directement, ça fait gagner pas mal de temps

 

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022
EESignature

0 J'aime
Message 16 sur 27

gmassart
Collaborator
Collaborator

Ce que tu peux faire par exemple c'est de regarder l'ipropriété "mycolor", chopper sa valeur et voir si il existe un calque qui porte le nom de la couleur et ensuite tu appliques le calque

 

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022
EESignature

0 J'aime
Message 17 sur 27

ThomasB44
Mentor
Mentor

Oui, on peut affecter le calque "Bleu" à la pièce dont l'iPropriété personnalisée "Ma_couleur" = "Bleu"

On peut également créer le calque "Bleu" si il n'existe pas.

On peut également demander à l'utilisateur de choisir une couleur dans une liste si l'iPropriété "Ma_couleur" n'existe pas.


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 18 sur 27

gmassart
Collaborator
Collaborator

Perso ça pourrait nous intéresser, en fait parfois on doit mettre des couleurs selon si c'est fourni par notre société ou par le client.

 

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022
EESignature

0 J'aime
Message 19 sur 27

ThomasB44
Mentor
Mentor
Solution acceptée

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 ! Smiley clignant de l'œil


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 20 sur 27

gmassart
Collaborator
Collaborator

Je testerai mais je me demandai si on pouvait pas utiliser des dictionnaires pour les couleurs avec la clef "nom de la couleur" et la valeur le RGB, j'ai juste un doute si on peut stocker un array comme valeur dans un dico

D'ailleurs je sais pas si on peut utiliser les dico en ilogic, dans VBA faut ajouter une référence au projet je crois

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022
EESignature

0 J'aime