Annonces
La communauté Autodesk sera en lecture seule du 26 avril au 27 avril, le temps de réaliser une maintenance essentielle. Nous retirerons cette bannière une fois l’opération terminée. Merci pour votre compréhension.
Announcements
We are currently migrating data within this board to improve the community. During this process, posting, replying, editing and other features are temporarily disabled. We sincerely apologize for any inconvenience caused and appreciate your understanding. Thank you for your patience and support.

Inventor 2023 : Modifier la Matière d'une pièce depuis un Assemblage en iLogic

Sébastien_G
Advocate Advocate
484 Visites
9 Réponses
Message 1 sur 10

Inventor 2023 : Modifier la Matière d'une pièce depuis un Assemblage en iLogic

Sébastien_G
Advocate
Advocate

Bonjour à Tous,

 

Voici le contexte dans lequel je souhaite apporter des modifications.

Je travaille dans un Assemblage (iam) qui contient des pièces (ipt).

Des données sont transmises dans l’Assemblage par l’intermédiaire de fichiers XML.

Les données vont intervenir entre autres sur les paramètres utilisateur et les iPropriétés personnalisés.

 

Parmi les données transmises, il y a la matière des pièces.

 

Ma question est la suivante :

Comment transmettre et affecter la matière aux pièces via un code iLogic ?

 

J’ai le début d’un code qui remplit cette fonction.

Malheureusement, ce code m’oblige à passer par un formulaire et pour des questions de CAD Serveur je dois me passer de formulaires.

Voici le code :

Dim oADoc As Inventor.AssemblyDocument = DirectCast(ThisApplication.ActiveDocument, Inventor.AssemblyDocument)
Dim oADef As AssemblyComponentDefinition = oADoc.ComponentDefinition
Dim oOccs As ComponentOccurrences = oADef.Occurrences

For Each oOcc As ComponentOccurrence In oOccs
	If oOcc.Name.StartsWith("Pièce de Destination Matière:1") Then
		Dim oList As IList = MultiValue.List(oOcc.Name, "ParamName")
		Dim oVal As String = InputListBox("Choose Material To Apply To Part.", oList)
		iProperties.MaterialOfComponent(oOcc.Name) = oVal
	End If
Next
'##
'Mise à Jour du Modèle.
iLogicVb.UpdateWhenDone = True

Je joins également les fichiers suivants qui me servent de base de recherche :

  • Assemblage Source Matière.iam

Qui contient

  • Pièce de Destination Matière.ipt
  • Construction soudé Destination Matière.iam

 

Auriez-vous des idées pour coder le transfert de la matière…

1.  De l’assemblage vers une pièce simple

Sbastien_G_0-1693988990608.png

 

2.  De l'assemblage vers un ensemble construction soudé

Sbastien_G_1-1693989209156.png

 

Je suis à l’écoute de vos propositions.

@Sébastien_G 

 

 

 

 

postez un commentaire
postez un commentaire
0 J'aime
Solutions acceptées (1)
485 Visites
9 Réponses
Replies (9)
Message 2 sur 10

ThomasB44
Mentor
Mentor

Salut @Sébastien_G 

Sujet intéressant 😉

 

Tu dois d'abord résoudre les questions suivantes :

Comment l'utilisateur sélectionne une matière à affecter ?

  • Liste de la bibliothèque de matières active ?
  • Liste exhaustive ?
  • La matière existe t elle ? Dans quelle bibliothèque ?
  • InputListBox ? Windows Form ?

En fonction de la réponse tu pourras choisir ou non de créer et remplir un paramètre multi-valeurs dans le document de plus haut niveau.

Le nom dans la liste doit permettre de retrouver cette matière dans une bibliothèque.

Et de copier cette matière dans le document si elle n'existe pas.

 

Par exemple, on peut facilement créer une liste de matières actives dans le document :

Dim oActLib As Inventor.AssetLibrary = ThisApplication.ActiveAppearanceLibrary
Dim oMats As Inventor.AssetsEnumerator = oActLib.MaterialAssets
Dim oMat As Inventor.MaterialAsset
Dim oMatList As New List(Of String)

For Each oMat In oMats
	oMatList.Add(oMat.DisplayName)
Next

Reste à choisir la matière à l'aide de oMat.DisplayName, et c'est oMat qu'il faudra affecter.

 

Ensuite, comment vas tu traverser l'ensemble de tes occurrences ?

  • Il y a des sous-ensembles ?
  • Des sous-sous-ensembles ? 😁
  • Des pièces de tôlerie ?

 

Le plus simple est de réutiliser le code classique "Traverse Assembly" disponible dans l'aide, pour traverser et modifier toutes les occurrences en filtrer sur :

  • Les pièces
  • Les sous-assemblages à traverser
  • Les assemblages soudés à modifier, puis traverser

La création de fonctions dans ton code sera d'une grande aide.

 

Au final, changer la matière n'est pas si compliqué lorsque les déclarations sont bien faites :

oPartDoc.ActiveMaterial = oMat
Dim oAsmWCompDef As Inventor.WeldmentComponentDefinition
oAsmWCompDef = oAsmDoc.ComponentDefinition
oAsmWCompDef.WeldBeadMaterial = oMat

Il faut au préalable vérifier que la matière existe dans le document, et la copier si nécessaire :

oMat = oMat.CopyTo(oAsmDoc)

 


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

postez un commentaire
postez un commentaire
0 J'aime
Message 3 sur 10

Fabian_perree
Advisor
Advisor

Du coup en lisant ta réponse je me demande :

 

Si on ne voulait changer que la densité du matériau sans forcément changer la matière et qu'elle n'existe pas en bibliothèque ?

Fabian Perrée
Giùp.fr | LinkedIn

Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Cliquez ici pour accéder à toutes mes formations en ligne
Inventor 2022 : Modélisation et documentation de systèmes mécaniques
postez un commentaire
postez un commentaire
0 J'aime
Message 4 sur 10

ThomasB44
Mentor
Mentor

Elle existe alors au moins dans le document.

Il faut regarder dans :

Dim oMaterial As MaterialAsset
oMaterial = oDoc.ActiveMaterial

Ensuite, c'est comme les iPropriétés, soit tu sais ce que tu cherches :

Dim oValue As Double
oValue = oMaterial.PhysicalPropertiesAsset.Item(8).Value
MessageBox.Show (oValue,"Résistance à la traction")

Soit il faut créer une boucle dans le oMaterial et regarder ce que tu trouves...😉

For i = 1 To oMaterial.PhysicalPropertiesAsset.Count
	oDisplayName = oMaterial.PhysicalPropertiesAsset.Item(i).DisplayName

Pour lire et écrire la valeur de la densité, il faut connaître son type, qui est Float

 

Le code exemple à disposition dans l'aide "DumpAllPhysicalPropertiesInAllLibraries" répond de façon générale à tout cela.

Sauf qu'il boucle sur l'ensemble des bibliothèques, apparences, matériaux, propriétés, valeurs 😁

La démarche est la même, mais pour le matériau actif uniquement.


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

postez un commentaire
postez un commentaire
0 J'aime
Message 5 sur 10

Sébastien_G
Advocate
Advocate

 

Bonjour Thomas,

Merci pour ton aide.

J’ai réussi à avancer un peu grâce à tes infos mais il me manque encore quelques lignes de code. Je pense que mes explications étaient trop compliquées par rapport à ce que je veux au final.

 

Pour transmettre la matière, de l’assemblage général vers une pièce simple, j’ai cette ligne de code.

iProperties.MaterialOfComponent("Pièce de Destination Matière:1") = Matière_Pièce_de_Destination_1

Avec « Matière_Pièce_de_Destination_1 » qui est un paramètre utilisateur multivaleur dans l’assemblage général.

Les valeurs correspondent aux matières de la bibliothèque.

 

Grâce à un formulaire dans l’Assemblage, je peux faire varié la matière de la pièce.

Sbastien_G_0-1694179340507.png   Sbastien_G_1-1694179340509.png

 

Maintenant, je cherche à faire la même chose pour une construction soudé. Donc, dans l’Assemblage général, je dois pouvoir intervenir sur les iPropriétés dans Soudure de la construction soudé.

 

 

Sbastien_G_7-1694180140404.png  Sbastien_G_8-1694180175118.png    Sbastien_G_4-1694179340510.png

 

Pour ça, je dois probablement utiliser les objets API et intervenir sur iPropriété « WeldsComponentDefinition ».

 

Sbastien_G_6-1694179888737.png

 

J’ai un début de codage mais je ne suis pas certain d’acceder correctement aux iPropriété « WeldsComponentDefinition ».

Dim oADoc As Inventor.AssemblyDocument = DirectCast(ThisApplication.ActiveDocument, Inventor.AssemblyDocument)
Dim oWDef As WeldmentComponentDefinition = oADoc.ComponentDefinition
Dim oLibrary As AssetLibrary
oLibrary = ThisApplication.AssetLibraries.Item("HX-MaterialLibrary")
Dim oMaterial As Asset = oLibrary.MaterialAssets.Item(Matière_Construction_soudé_Destination_1)
'##
Try
oMaterial = oMaterial.CopyTo(oADoc)
Catch
oMaterial = oADoc.Assets.Item(oMaterial.DisplayName=("Construction soudé Destination Matière:1"))
End Try
'##
oWDef.WeldBeadMaterial = oMaterial
'##
'Mise à Jour du Modèle.
iLogicVb.UpdateWhenDone = True

 

As-tu une idée à me suggérer ?

 

 

postez un commentaire
postez un commentaire
0 J'aime
Message 6 sur 10

ThomasB44
Mentor
Mentor

J'avais ça dans mes déclarations :

Dim oMaterial As Inventor.MaterialAsset

Ensuite je pense que le problème est de gérer les exceptions.

Si le matériau existe déjà, tu ne peux pas le copier.

Si le matériau actif est le même, tu ne peux pas l'affecter.

Il faudrait que je vérifie cependant.

 


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

postez un commentaire
postez un commentaire
0 J'aime
Message 7 sur 10

Sébastien_G
Advocate
Advocate

Pour l'instant, j'ai cette erreur sur le code que je t'ai transmis auparavant

Sbastien_G_0-1694184731177.png

 

postez un commentaire
postez un commentaire
0 J'aime
Message 8 sur 10

ThomasB44
Mentor
Mentor
Solution acceptée

Salut @Sébastien_G 

Si tu as une erreur dès ta ligne 2 :

Dim oWDef As WeldmentComponentDefinition = oADoc.ComponentDefinition

C'est que cet assemblage (oADoc) n'est pas un assemblage de construction soudée.

 

Pour lancer ton code depuis l'assemblage de plus haut niveau, il faut procéder comme je l'avais indiqué plus haut en créant une boucle sur les occurrences du document.

Si le document est un assemblage, et que son type est assemblage soudé, procéder à la modification de matière.


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

postez un commentaire
postez un commentaire
0 J'aime
Message 9 sur 10

patrick.emin
Alumni
Alumni

Bonjour @Sébastien_G 

Si une des réponses résout votre problème ou vous a permis de mieux le comprendre, voulez vous avoir l'amabilité de cliquer sur le bouton  APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Cela facilitera la navigation de nos utilisateurs qui pourront directement atteindre la solution

Sachez qui si vous avez marqué une réponse comme solution par erreur, vous pouvez annuler ce marquage en cliquant sur le menu du fil (les trois points verticaux) et choisir "pas la solution"
Merci de ne pas accepter comme solution le message que vous êtes en train de lire.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
postez un commentaire
postez un commentaire
0 J'aime
Message 10 sur 10

patrick.emin
Alumni
Alumni

Bonjour @Sébastien_G 

Parmi les réponses qui vous ont été données, si une (ou plusieurs) d'entre elles apporte une solution à votre problème ou vous a permis de mieux l'analyser et le comprendre, voulez vous avoir l'amabilité de cliquer sur le bouton  APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Merci de ne pas accepter comme solution le message que vous êtes en train de lire.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
postez un commentaire
postez un commentaire
0 J'aime