propriété dans Nomenclature Strucuré

propriété dans Nomenclature Strucuré

Anonymous
Non applicable
4 022 Visites
21 Réponses
Message 1 sur 22

propriété dans Nomenclature Strucuré

Anonymous
Non applicable

Bonjour a tous,

 

J'utilise Vault & Inventor 2018. 

 

Je souhaite exporter ma nomenclature "Structuré" dans un Excel, pour ensuite communiquer avec notre BDD interne. 

J'ai besoin pour cela d'aller récupérer des infos (Propriétés ou iPropriétés) dans les pièces de mon assemblage.

 

Je parviens a récupéré beaucoup d'infos, mais quelqu'une me manques.

Par exemple, j'ai besoin du nom du parent pour chaque pièce de ma nomenclature (Nom de mon assemblage en fait..), du numéro la révision de la pièce, de l'unité du de la pièce (mm ou inch), etc... 

Finalement des paramètres qui n'ont pas de besoin d’être des ipropriétés personnalisées, puisque les infos sont déja existantes. (et je souhaite éviter toutes les sources d'erreurs..)

 

image.png

 

As-t-on un moyen de sélectionner dans la liste de colonnes personnaliser les paramètres a afficher ? (pas ipropriétés prerso,,) j'ai rien trouvé dans l'éditeur de style. 

 

Ou avez-vous une autre méthode plus clean ? 

 

Merci d'avance

 

Ben

0 J'aime
Solutions acceptées (4)
4 023 Visites
21 Réponses
Replies (21)
Message 2 sur 22

Anonymous
Non applicable

Smiley tirant la langue Un de moins, j'ai finalement trouvé pour le numéro de Révision, (il fait partie des paramètres standard..)

 

reste le nom du parent et l'unité du modèle (mm ou inch)

 

Merci Smiley MDR

0 J'aime
Message 3 sur 22

ThomasB44
Mentor
Mentor

Salut @Anonymous

Alors pour les unités, on trouve l'information dans les propriétés du document, ce n'est pas une iPropriété, elle n'est donc pas accessible dans une nomenclature. Malgré cela, une solution pourrait consister en une règle iLogic, qui stockerait l'information dans une iPropriété personnalisée...

UoM = ThisDoc.Document.UnitsOfMeasure.LengthUnits
'Valeurs renvoyées :
'kCentimeterLengthUnits = 11268
'kMillimeterLengthUnits = 11269
'kInchLengthUnits = 11272

On regardera ensemble comment faire une règle adaptée, si c'est la solution que tu choisis.

 

De même, les paramètres ne sont pas accessibles directement dans la nomenclature, il faut passer par une iPropriété personnalisée ou/et une règle iLogic.

Sans utiliser iLogic, il suffit de cocher dans les paramètres de ta pièce, la case "paramètre à exporter".

Ainsi ce paramètre se retrouve lié dans une iPropriété personnalisée, que tu peux ensuite appeler dans une nomenclature.

 

Pour le nom du parent maintenant, malheureusement on tombe dans une impasse, car une même pièce peut être utilisée sur plusieurs assemblages.

C'est possible, mais uniquement avec iLogic, et dans le contexte d'un assemblage unique. Et encore une fois, il faudrait gérer les exceptions si une pièce est utilisée plusieurs fois.

 

Voilà, j'espère quand même t'éclairer Smiley clignant de l'œil

 


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 4 sur 22

Anonymous
Non applicable

Bonjour,

 

Excellent, oui ça m’intéresse de savoir comment faire une règle iLogic, car ça pourrait me servir beaucoup..

 

Comment dois-je procéder ? Smiley heureux 

0 J'aime
Message 5 sur 22

ThomasB44
Mentor
Mentor

Alors premièrement, connais tu le language VBA ou VB.NET ?

Le language VBA est utilisé dans les macro.

La language VB.NET est un VBA simplifié, et est utilisé dans les règles iLogic.

 

Pour cultiver ta programmation :

Sur ce lien, tu trouveras beaucoup d'exemples de codes, sur le forum en anglais.

Sur ce lien, tu trouveras un blog très utile et bien expliqué.

En tapant directement sur google avec le mot clé "iLogic", on trouve pas mal d'exemples aussi.

 

Maintenant revenons en à ton besoin. Je suppose que tu t'intéresses à iLogic pour renseigner les unités ?

Je te propose d'écrire une règle externe, que tu pourras activer selon le besoin (pas besoin d'évènement déclencheur je pense)

Voir ce lien, pour le fonctionnement et la configuration des règles externes.

 

Cette règle serait à lancer depuis l'assemblage de plus haut niveau et fonctionnerait comme suit :

  • Boucle sur chaque composant de l'assemblage
    • Créé, si nécessaire la propriété personnalisée "Unité"
    • Renseigne la propriété personnalisée suivant la propriété du document
  • Composant suivant

Est ce que ce genre de règle répondrait à ton besoin ?


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 6 sur 22

Anonymous
Non applicable

Oui je pense que ça répondrait bien. 

 

Je connais pas beaucoup la programmation VBA ou VB.NET, mais je suis disposé a apprendre.

0 J'aime
Message 7 sur 22

ThomasB44
Mentor
Mentor
Solution acceptée

Voici un exemple de règle pour stocker les unités de chaque document dans une iPropriété personnalisée.

En bonus, à la fin de la règle, la possibilité d'importer une configuration de nomenclature Smiley clignant de l'œil

 

'''Début de la règle
Dim oDoc As Document
oDoc = ThisApplication.ActiveDocument
'Vérifie que le document est un assemblage
If oDoc.DocumentType <> kAssemblyDocumentObject Then
	MsgBox ("Ce n'est pas un assemblage !",MessageBoxIcon.Error, "Erreur")
	Return 'Fin de la règle
End If

'Variables de l'ensemble
Dim oCompDef As ComponentDefinition
oCompDef = oDoc.ComponentDefinition

'Regarde dans chaque composant de l'ensemble
For Each oOcc In oCompDef.Occurrences
	'Variables des composants
	oOccDoc = oOcc.Definition.Document
	oCustomPropSet = oOccDoc.PropertySets.Item("Inventor User Defined Properties")
	Dim UoM As UnitsOfMeasure = oOccdoc.UnitsOfMeasure	
	
	'Vérification de l'iPropriété personnalisée
	Try
		'Teste si "Unité" existe
		oProp = oCustomPropSet.Item("Unité")
	Catch
		'Si elle n'existe pas, alors création
		oCustomPropSet.Add("","Unité")
	End Try

	'Enregistre dans l'iPropriété personnalisée les unités du document
	oCustomPropSet.Item("Unité").Value = UoM.GetStringFromType(UoM.LengthUnits)
Next 'Composant suivant

'Importe une configuration de nomenclature sauvegardée (optionnel)
'oFile = "Chemin complet du fichier.xml"
'oCompDef.BOM.ImportBOMCustomization(oFile)
'''Fin de la règle

Je te laisse tester ça. Smiley tirant la langue


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

Message 8 sur 22

Anonymous
Non applicable

ça marche du feu de dieu !!! Smiley très heureuxSmiley MDR un gros Merci !

 

 

0 J'aime
Message 9 sur 22

Anonymous
Non applicable

Dernier point, je dois afficher dans ma nomenclature, le poids en Kg, mais aussi le poids en Livre... (ouai...)

 

Pas de problème pour le poids en Kg, puisque c'est la masse par défaut dans mon document. Mais comment faire pour celle en lbs ?

 

Deplus, lorsque mon gabarit par défault sera celui en Lbs, je devrais aller chercher le poids non par défaut soit en Kg.. et oui un casse tête l’Amérique vous dis-je !..

 

Merci d'avance !

0 J'aime
Message 10 sur 22

Anonymous
Non applicable

@ThomasB44 en effet, une pièce peut être utilisé pour plusieurs assemblages.

Mais dans mon cas, ça pourrait peut être se faire simplement en affichant le nom de mon dessin et/ou assemblage, qu'en dis-tu ?

0 J'aime
Message 11 sur 22

ThomasB44
Mentor
Mentor

Alors pour le poids, effectivement si tu utilises les 2 unités ça se complique.

Je pense qu'il faudrait créer 2 iPropriétés personnalisées via iLogic, l'une en KG l'autre convertie en LBS.

Sauf si toutes tes pièces sont en KG...1 propriété en LBS suffit.

Et ensuite appeler la bonne (donc celle en LBS) dans ta liste de pièces du dessin.

De même pour ton assemblage de plus haut niveau, et ton cartouche de dessin.

 

Pour le nom de ton dessin/assemblage, on peut afficher le nom de l'assemblage (ou du dessin) de plus haut niveau dans une iPropriété personnalisée également.

Mais si jamais tu utilises une des pièces dans un autre assemblage, et que tu relances la règle, la valeur sera écrasée...d'où le problème que j'avais évoqué plus haut.


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 12 sur 22

ThomasB44
Mentor
Mentor

Pour exploiter les unités et valeurs de masse, voici le code à ajouter à l'intérieur de la boucle "For each...Next"

 

'Regarde l'unité de masse
	oMassUnit = UoM.GetStringFromType(UoM.MassUnits)
	oMass = oOccDoc.PropertySets.Item("Design Tracking Properties").Item("Mass").Value
	Select Case oMassUnit
	Case "kilogramme"
		MessageBox.Show(Round(oMass, 2) & " kg, soit :" _
		& vbNewLine & Round(oMass * 2.2046226218488, 2) & " lbs", "iLogic")
	Case "gramme"
		MessageBox.Show(Round(oMass, 2) & " gr", "iLogic")
	Case "slug"
		MessageBox.Show(Round(oMass, 2) & " slug", "iLogic")
	Case "livre"
		MessageBox.Show(Round(oMass, 2) & " lbs, soit : " _
		& vbNewLine & Round(oMass * 0.45359237, 2) & " kg", "iLogic")
	End Select

A toi de voir comment tu veux exploiter ces données Smiley clignant de l'œil

 

Je vais réfléchir un peu plus à ton besoin d'afficher le nom de l'assemblage utilisé.

Je l'ai fait sur une de mes règles, mais j'écris directement dans l'Excel sans passer par la nomenclature. La règle est un peu plus complexe, mais ça va encore.

Peux tu me préciser ton besoin :

  • Est ce uniquement d'afficher le nom de l'assemblage de plus haut niveau sur chaque composant et sous composant ?
  • Faut il afficher le nom de l'assemblage de niveau supérieur dans chaque composant ?
  • Est il intéressant de conserver cette information dans une propriété ?
  • Le but est uniquement d'en disposer temporairement dans Excel ?

Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 13 sur 22

Anonymous
Non applicable

Salut Thomas,

 

Je pourrai définir que toutes mes pièces ont leurs unités de masse en LBS (celles en pouce et mm), puisque c'est toujours ce qui est utilisé et affiché sur les dessins de détails. (Oui, même celles en pouce)

Par contre, dans les dessins d'assemblages, ce sont les KG qui doivent être afficher. Donc, oui le plus simple serait de créer une seul régle qui convertie et renseigne un champ de propriété personnalisé "Masse en KG" 

 

De cette façon, je pourrai appeler la masse en LBS, sur mes dessins de détails, la masse en KG sur mes dessins d'assemblages, et pour finir appeler les deux champs dans les colonnes de ma nomenclature structuré  🙂 

 

Je ne parviens pas encore a écrire mon code. Pourrais-tu m'aider Smiley heureux

 

Merci

0 J'aime
Message 14 sur 22

Anonymous
Non applicable

ThomasB44 a écrit :

Peux tu me préciser ton besoin :

  • Est ce uniquement d'afficher le nom de l'assemblage de plus haut niveau sur chaque composant et sous composant ?
  • Faut il afficher le nom de l'assemblage de niveau supérieur dans chaque composant ?
  • Est il intéressant de conserver cette information dans une propriété ?
  • Le but est uniquement d'en disposer temporairement dans Excel ?

 -  Oui

 -  Oui

 -  Pas forcement, mais j'ai besoin de l'importer dans ma nomenclature structuré

 -  En effet ca peut etre seulement temporaire, je pourrais toujours le sauvegarder dans mon fichier excel.

 

Merci !

0 J'aime
Message 15 sur 22

ThomasB44
Mentor
Mentor

Quelque chose comme ça alors ?

 

'''Début de la règle
Dim oDoc As Document
oDoc = ThisApplication.ActiveDocument
'Vérifie que le document est un assemblage
If oDoc.DocumentType <> kAssemblyDocumentObject Then
	MsgBox ("Ce n'est pas un assemblage !",MessageBoxIcon.Error, "Erreur")
	Return 'Fin de la règle
End If

'Variables de l'ensemble
Dim oCompDef As ComponentDefinition
oCompDef = oDoc.ComponentDefinition
Dim AsmName As String
AsmName = ThisDoc.FileName(False) 'without extension

'Regarde dans chaque composant de l'ensemble
For Each oOcc In oCompDef.Occurrences
	'Variables des composants
	oOccDoc = oOcc.Definition.Document
	oCustomPropSet = oOccDoc.PropertySets.Item("Inventor User Defined Properties")
	Dim UoM As UnitsOfMeasure 
	UoM = oOccdoc.UnitsOfMeasure	
	
	'Vérification de l'iPropriété personnalisée
	Try
		'Teste si "Unité" existe
		oProp = oCustomPropSet.Item("Unité")
	Catch
		'Si elle n'existe pas, alors création
		oCustomPropSet.Add("","Unité")
	End Try
	'Enregistre dans l'iPropriété personnalisée les unités du document
	oCustomPropSet.Item("Unité").Value = UoM.GetStringFromType(UoM.LengthUnits)
	
	'Vérification de l'iPropriété personnalisée
	Try
		'Teste si "MasseKG" existe
		oProp = oCustomPropSet.Item("MasseKG")
	Catch
		'Si elle n'existe pas, alors création
		oCustomPropSet.Add("","MasseKG")
	End Try
	'Regarde l'unité de masse
	oMassUnit = UoM.GetStringFromType(UoM.MassUnits)
	oMass = oOccDoc.PropertySets.Item("Design Tracking Properties").Item("Mass").Value
	If oMassUnit = "livre" Then
	'Si la masse est en lbs, enregistre la masse en KG dans une iPropriété personnalisée
	oCustomPropSet.Item("MasseKG").Value = Round(oMass * 0.45359237, 2) & " kg"
	End If
	
	'Vérification de l'iPropriété personnalisée
	Try
		'Teste si "Nom_ASM" existe
		oProp = oCustomPropSet.Item("Nom_ASM")
	Catch
		'Si elle n'existe pas, alors création
		oCustomPropSet.Add("","Nom_ASM")
	End Try
	'Enregistre dans l'iPropriété personnalisée le nom de l'assemblage
	oCustomPropSet.Item("Nom_ASM").Value = AsmName
	
Next 'Composant suivant

'Importe une configuration de nomenclature sauvegardée (optionnel)
'oFile = "Chemin complet du fichier.xml"
'oCompDef.BOM.ImportBOMCustomization(oFile)
'''Fin de la règle

Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

Message 16 sur 22

Anonymous
Non applicable

Merci @ThomasB44, ca fonctionne très bien. J'ai juste un petit souci sur la valeur affiché en KG (700Kg, alors que ça devrait faire quelques dizaines de Kilo max), je vais regarder dans mes paramètres d'ou ça peut venir.

0 J'aime
Message 17 sur 22

ThomasB44
Mentor
Mentor
Solution acceptée

Huum je pense que j'ai trouvé le problème.

En débuggant avec une message box, je vois que la valeur de masse retournée ne correspond pas, c'est étrange, et je me demande bien ce qu'il se passe avec cette propriété.

 

Voici un autre code, j'ai juste changé la façon de lire la masse.

Tu mettras des guillemets sur la message box (ou tu supprimes), c'est ce qui m'a permis de trouver le problème.

Normalement ça fonctionne mieux Smiley clignant de l'œil

 

'''Début de la règle
Dim oDoc As Document
oDoc = ThisApplication.ActiveDocument
'Vérifie que le document est un assemblage
If oDoc.DocumentType <> kAssemblyDocumentObject Then
	MsgBox ("Ce n'est pas un assemblage !",MessageBoxIcon.Error, "Erreur")
	Return 'Fin de la règle
End If

'Variables de l'ensemble
Dim oCompDef As ComponentDefinition
oCompDef = oDoc.ComponentDefinition
Dim AsmName As String
AsmName = ThisDoc.FileName(False) 'without extension

'Regarde dans chaque composant de l'ensemble
For Each oOcc In oCompDef.Occurrences
	'Variables des composants
	oOccDoc = oOcc.Definition.Document
	oCustomPropSet = oOccDoc.PropertySets.Item("Inventor User Defined Properties")
	Dim UoM As UnitsOfMeasure 
	UoM = oOccdoc.UnitsOfMeasure	
	
	'Vérification de l'iPropriété personnalisée
	Try
		'Teste si "Unité" existe
		oProp = oCustomPropSet.Item("Unité")
	Catch
		'Si elle n'existe pas, alors création
		oCustomPropSet.Add("","Unité")
	End Try
	'Enregistre dans l'iPropriété personnalisée les unités du document
	oCustomPropSet.Item("Unité").Value = UoM.GetStringFromType(UoM.LengthUnits)
	
	'Vérification de l'iPropriété personnalisée
	Try
		'Teste si "MasseKG" existe
		oProp = oCustomPropSet.Item("MasseKG")
	Catch
		'Si elle n'existe pas, alors création
		oCustomPropSet.Add("","MasseKG")
	End Try
	'Regarde l'unité de masse
	oMassUnit = UoM.GetStringFromType(UoM.MassUnits)
	oMass = iProperties.Mass(oOcc)
	If oMassUnit = "livre" Then
	'Si la masse est en lbs, enregistre la masse en KG dans une iPropriété personnalisée
	oCustomPropSet.Item("MasseKG").Value = Round(oMass * 0.45359237, 2) & " kg"
	MessageBox.Show("Masse du document : " & oMass & oMassUnit _
	& vbNewLine & "Masse du document en livres : " & Round(oMass, 2) _
	& vbNewLine & "Masse convertie en kilo : " & Round(oMass * 0.45359237, 2), "iLogic")
	End If
	
	'Vérification de l'iPropriété personnalisée
	Try
		'Teste si "Nom_ASM" existe
		oProp = oCustomPropSet.Item("Nom_ASM")
	Catch
		'Si elle n'existe pas, alors création
		oCustomPropSet.Add("","Nom_ASM")
	End Try
	'Enregistre dans l'iPropriété personnalisée le nom de l'assemblage
	oCustomPropSet.Item("Nom_ASM").Value = AsmName
	
Next 'Composant suivant

'Importe une configuration de nomenclature sauvegardée (optionnel)
'oFile = "Chemin complet du fichier.xml"
'oCompDef.BOM.ImportBOMCustomization(oFile)
'''Fin de la règle

 


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

Message 18 sur 22

ThomasB44
Mentor
Mentor

Bon je n'ai pas poussé mes recherches plus loin, vu que la proposition précédente solutionne le problème.

Mais j'ai remarque que la commande : "oOccDoc.PropertySets.Item("Design Tracking Properties").Item("Mass").Value"

Retourne des valeurs en grammes, si les unités du document sont en kilogrammes.

Je n'ai pas trouvé l'unité anglaise/américaine utilisée si les unités du document sont en livres...Smiley frustré

 

Alors que les commandes :

"iProperties.Mass(oOcc)" et

"oOcc.MassProperties.Mass"

Retournent des valeurs qui concordent avec l'unité du document...va comprendre Smiley indifférent


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

Message 19 sur 22

Anonymous
Non applicable

Merci @ThomasB44 ! 

 

J'ai encore un p'**** bug, la valeur de masse en KG s'affiche identique dans toutes les pièces de mon assemblage..  sais tu d'ou est-ce que ça peut venir ?

 

 

0 J'aime
Message 20 sur 22

ThomasB44
Mentor
Mentor
Solution acceptée

Bon je crois que j'ai compris...Smiley frustré

1ère piste remplacer iProperties.Mass(oOcc) par iProperties.Mass(oOcc.Name), cela semble fonctionner. Par contre, dans mon cas, ça n'affiche que les masses en KG, les valeurs retournées pour les masses en LB sont égales à zéro...je ne comprends pas donc c'est un échec. Smiley frustré

 

2ème piste oOccDoc.PropertySets.Item("Design Tracking Properties").Item("Mass").Value semble retourner des masses en grammes quelque soit l'unité du document. Essaie de vérifier avec cet extrait du code à modifier. Smiley clignant de l'œil

 

	'Regarde l'unité de masse
	oMassUnit = UoM.GetStringFromType(UoM.MassUnits)
	Dim oMass As Decimal
	oMass = oOccDoc.PropertySets.Item("Design Tracking Properties").Item("Mass").Value
	'Retourne des valeurs en grammes
	If oMassUnit = "livre" Then
	'Si la masse est en lbs, enregistre la masse en KG dans une iPropriété personnalisée
	oCustomPropSet.Item("MasseKG").Value = Round(oMass / 1000, 2) & " kg"
	MessageBox.Show("Nom du document : " & oOcc.Name _
	& vbNewLine & "Masse du document : " & oMass _
	& vbNewLine & "Unité du document : " & oMassUnit _
	& vbNewLine & "Masse du document en livres : " & Round(oMass / 1000 / 0.45359237, 2) _
	& vbNewLine & "Masse convertie en kilo : " & Round(oMass / 1000, 2), "iLogic")
	End If

Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature