Annonces

Les forums de la communauté Autodesk ont un nouveau look. Pour en savoir plus sur ce qui a changé, consultez le tableau des annonces de la communauté.

inventor Manipulation Parametre texte.

tristan-haller
Collaborator

inventor Manipulation Parametre texte.

tristan-haller
Collaborator
Collaborator

Bonjour à tous,

 

J'aimerais insérer, dans un encart de texte, une partie du nom de la pièce (pas tout le nom seulement les charactére choisit)

tristanhaller_0-1734456448720.png

 

 

Je ne sait pas coment manipuler la chaine de charactére pour atteindre cette objectif, des idées ?

Je prefererais une solution sans iLogic si possible.

 

Au plaisir de vous lire.

0 J'aime
Répondre
Solutions acceptées (2)
327 Visites
15 Réponses
Replies (15)

vpeuvion
Advocate
Advocate
Solution acceptée

Bonjour,

Voici un exemple de code ilogic qui conserve les 5 premiers caractères de l'ipropriété Numéro de pièce.

Left(iProperties.Value("Project", "Part Number"),5)  

Je ne crois pas qu'il soit possible de modifier directement la chaîne dans le champ par une équation.

 Vincent.

Fabian_perree
Advisor
Advisor

A moins que ces éléments soient présents dans des paramétres et/ou des ipropriétés  que l'on pourrait combinés dans une Iprop personnalisée je ne vois pas non plus comment faire sans Ilogic.

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

tristan-haller
Collaborator
Collaborator

Entendu, pas de solution vanilla.

 

Merci pour vos réponses, je vais construire a partir de ça.

 

 

 

0 J'aime

vpeuvion
Advocate
Advocate
Solution acceptée

Tu peux peut-être te passer de iLogic en suivant l'idée de Fabian : 

Par exemple, tu peux créer 2 iPropriétés personnalisées Partie1 et Partie2.

vpeuvion_0-1734519435238.png

Ensuite tu peux ajouter une équation à la ipropriété Numéro de pièce.

vpeuvion_1-1734519502433.png

Dans ton encart, tu pourras insérer seulement Partie1.

Tout dépend de comment est géré ton flux et comment tu crées la valeur du numéro de pièce actuellement.

Vincent.

tristan-haller
Collaborator
Collaborator

<b@vpeuvion,onjour 

 

Actuellement nos pièce sont "nommée a la main" et c'est cette information que je viens chercher.

nous incluons l'arborescence de la position du fichier dans sont nom : 

tristanhaller_0-1734529029214.png

Ceci permet de lier les nom de piéce a leur N°dossier interne, ainsi qu'a la structure de conception (ensemble maitre / sous ensemble A / sous ensemble A_A / pieces A_A_B ... )  et de raccourcir les adresse.

 

Nous désirons garder cette unité de nommage pour le moment, et modifier les impropriétés du nom de piéces est contre productif, puisqu'il faudrait ensuite renommer et déplacer le fichier...

 

Je vais cherche comment intégrer / automatiser tout ça plus proprement.

 

Merci de vôtres aide !

vpeuvion
Advocate
Advocate

Bonjour @tristan-haller , merci pour les explications.

Je ne sais pas si ça peut t'être utile, mais voici un exemple de code qui crée le nom de fichier en fonction de l'emplacement sélectionné.

Cela ne doit pas répondre complètement à ton besoin mais c'est pour le principe.

Tu peux executer le code et sélectionner le dossier "B", il te créera le nom du fichier et le nom de l'ensemble maître.

Imports System.IO
Sub Main()
	Dim FileExtension As String = String.Empty
	Select Case ThisDoc.Document.DocumentType.ToString
		Case "kPartDocumentObject"
			FileExtension = ".ipt"
		Case "kDrawingDocumentObject"
			FileExtension = ".idw"
		Case "kAssemblyDocumentObject"
			FileExtension = ".iam"
	End Select	
	
    Using folderBrowser As New FolderBrowserDialog()
        If folderBrowser.ShowDialog() = DialogResult.OK Then
            Dim selectedPath As String = folderBrowser.SelectedPath
            Dim parentDir As DirectoryInfo = Directory.GetParent(selectedPath)
            Dim grandParentDir As DirectoryInfo = parentDir.Parent
	Dim selectedFolderName As String = New DirectoryInfo(selectedPath).Name

            If parentDir IsNot Nothing AndAlso grandParentDir IsNot Nothing Then
                Dim fileName As String = Right(grandParentDir.Name,5) & "_" & parentDir.Name & "_" & selectedFolderName &  FileExtension
                Dim filePath As String = System.IO.Path.Combine(selectedPath, fileName)
		MessageBox.Show("Ensemble maître : " & Right(grandParentDir.Name,5))
                MessageBox.Show("Nom du fichier : " & System.IO.Path.GetFileName(filePath))
            Else
                MessageBox.Show("Impossible de déterminer les dossiers parents.")
            End If
        End If
    End Using
End Sub

J'espère que cela pourra t'être utile.

Vincent.

0 J'aime

tristan-haller
Collaborator
Collaborator

Bonjour @vpeuvion 

 

Ce code peut effectivement m'etre utile, Merci !

Il vas me falloir faire un environement de test pour vérifier coment il fonctionne et l'aguster a notre Workflow, mais il me semble fonctionel.

 

La fonction qu'il me manquerais dans ce code, c'est la vérification des Nom de fichier déjà présent dans le ParentDir, pour pouvoir incrémenter mes pièces en fonction de celle déjà présente

 

ex: dans le dossier D01234/A/B/A

je vais retrouver le sous ensemble 01234_A_B_A.iam

et toutes les pièces qu'il contient 

01234_A_B_A.ipt

01234_A_B_A_A.ipt

01234_A_B_A_B.ipt

01234_A_B_A_C.ipt

 

le fichier en cour devrais donc s'appeler >> 01234_A_B_A_D.ipt

 

un idée de coment lire tous les fichiers contenu jusqu'à la prochaine lettre disponible?

 

Bonne journée !

0 J'aime

vpeuvion
Advocate
Advocate

Bonjour @tristan-haller 

Je suis content que cela puisse t'être utile.

Je pense qu'il est possible de retrouver la prochaine lettre disponible. Je vais tester de mon côté et te ferai un retour prochainement.

Vincent.

gmassart
Collaborator
Collaborator

Dans le code tu peux faire une boucle en utilisant la fonction chr() ou équivalent qui te permet de générer un caractère à partir d'un nombre et ça tombe bien A c'est 65 jusque Z 90 (les minuscules c'est de 97 à 122 je pense)

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022
EESignature

tristan-haller
Collaborator
Collaborator

Merci @gmassart 

 

Effectivement savoir comment transposer en numérique les charactére vas etre utile merci ! 

 

Dans l'exemple ci dessus la boucle for devrais donc commencer avec i=65  pour vérifier les lettre, cela di je ne sait toujour pas comment "lire" les nom de fichier du windows... 😅

0 J'aime

gmassart
Collaborator
Collaborator

Avec System.IO tu as des fonction pour lister les fichiers d'un répertoire GetFiles

Tu peux ensuite parcourir ces fichiers pour déterminer si il existe

 

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022
EESignature

vpeuvion
Advocate
Advocate

Bonjour @tristan-haller ,

J'ai fait quelques tests suivant ta réponse précédente et voici un exemple de code.

Il va rechercher le nombre de fichiers déjà présents dans le dossier sélectionné et suivant le cas va créer un numéro ou l'incrémenter si des fichiers existent déjà.

J'ai ajouté des commentaires pour expliquer le fonctionnement. J'espère que cela pourra t'être utile.

 

Imports System.IO
Imports System.Windows.forms
Sub Main()
	' Initialisation
	Dim FileExtension As String = String.Empty ' Chaine contenant l'extension du document
	Dim FileType As String = String.Empty ' Chaine contenant le type pour filtrer par extension
	Dim Filename As String = String.Empty ' Nom du fichier calculé par rapport au dossier sélectionné
	Dim NextFileName As String = String.Empty ' Nom du fichier calculé par rapport aux fichiers déjà présents dans le dossier
	Dim oLastChar As Char = "A"c ' ' Dernier caractère utilisé par le nom de fichier
	Dim oNextChar As Char = Nothing ' Caractère par défaut qui sera ajouté au nom de fichier
	
	' Recherche du type de document
	Select Case ThisDoc.Document.DocumentType.ToString ' Chargement des chaines FileType et File Extension en fonction du type de fichier actuel
		Case "kPartDocumentObject"
			FileType = "*.ipt"
			FileExtension = ".ipt"
		Case "kDrawingDocumentObject"
			FileType = "*.idw"
			FileExtension = ".idw"
		Case "kAssemblyDocumentObject"
			FileType = "*.iam"
			FileExtension = ".iam"
	End Select
	
	' Utilisation de la sélection d'un dossier
	Using folderBrowser As New FolderBrowserDialog() 
        If folderBrowser.ShowDialog() = DialogResult.OK Then
			Filename = GetFileName(folderBrowser.SelectedPath, FileExtension) ' Utilisation de la fonction pour calculer le nom du fichier en fonction de l'emplacement du dossier
						
			Dim folderPath As String = folderBrowser.SelectedPath ' Chemin du dossier sélectionné
	        Dim files As String() = Directory.GetFiles(folderPath, FileType) ' Extraction de tous les fichiers du dossier en filtrant par rapport à l'extension
			
			Select Case files.Count ' Sélection du cas en fonction du nombre de fichiers retrouvés dans le dossier
				Case 0 ' Aucun fichier détecté avec l'extension, le nouveau nom est égal au nom calculé par rapport à l'emplacement
					NextFileName = Filename
				Case 1 ' 1 fichier détecté, le nouveau nom sera égal au nom calculé avec un ajout de "_A" avant le .
					NextFileName = Filename.Insert(Filename.LastIndexOf("."),"_A")
				Case Is >1 ' Plus d'un fichier détecté, il faut retrouver le dernier caractère utilisé
					For Each file As String In files ' Pour chaque fichier du dossier
						If System.IO.Path.GetFileName(File)(System.IO.Path.GetFileName(File).LastIndexOf(".") -1) > oLastChar Then ' Si le caractère avant le . est après oLastChar qui a été initialisé à "A" au démarrage
							oLastChar = System.IO.Path.GetFileName(File)(System.IO.Path.GetFileName(File).LastIndexOf(".") -1) ' Alors je remplace la valeur de oLastChar par ce caractère
						End If
		        	Next ' Continuer la boucle
					oNextChar = Chr(Asc(oLastChar) + 1) ' oNextChar est égal au caractère suivant oLastChar
					NextFileName = Filename.Insert(Filename.LastIndexOf("."), "_" & oNextChar) 'J'insère "_" et le prochain caractère au nom calculé
			End Select
			ThisDoc.Document.SaveAs(NextFileName,False) ' J'enregistre sous le document
		End If
    End Using    
End Sub

Function GetFileName (oSelectedPath As String, oExtension As String) As String ' Fonction qui calcule le nom du fichier en fonction du dossier sélectionné et le type du document actuel.
		Dim parts As String() = oSelectedPath.Split("\"c) ' Je découpe la chaine par rapport au caractère "\"
		Dim result As New List(Of String)() ' Je crée une nouvelle liste de chaine
		Dim foundFirst As Boolean = False ' Je crée un booléen qui sera vrai lorsque je serai à la chaine "D01234"

		For i As Integer = parts.Length - 1 To 0 Step -1
    		If parts(i).Length > 1 Then
	        	If Not foundFirst Then
            		foundFirst = True
        		Else
            		Exit For
        		End If
    		End If
    		result.Insert(0, parts(i)) 'J'insère chaque partie de la chaine dans la liste jusqu'à ce que je tombe sur "D01234"
		Next

		Dim finalResult As String = String.Join("\", result) ' Je recompose une chaine en ajoutant "\" entre chaque partie
		finalResult = finalResult.Replace("\", "_") ' Je remplace le caractère "\" par celui-ci "_"
		finalResult = finalResult.Substring(1) ' Je retire le premier caractère de la chaine qui est "D"

		Dim fileName As String = finalResult & oExtension ' J'ajoute l'extension
		Dim filePath As String = System.IO.Path.Combine(oSelectedPath, fileName) ' Je combine le nom de fichier au chemin du dossier
		Return filePath ' Je retourne le chemin complet
End Function

Vincent.

 

tristan-haller
Collaborator
Collaborator

Bonjour @vpeuvion 

 

Merci pour ce code, il semble effectivement répondre a de nombreux besoins, et clarifier pour moi comment lire les fichier Windows et manipuler les chaine de charactére en lien.

 

Pour pousser l'exercice, j'aimerais lier ce code a la création d'un nouveaux .iam ou .ipt depuis un Enssemble :

_Lecture de l'adresse / nom de l'ensemble en cour

       (ex : MasterPath D01234/A et MasterName 01234_A.iam )

_Trouver le nouveaux nom pour le prochain .ipt dans MasterPath 

       (ex : NewIptName 01234_A_G.ipt)

_Trouver le nouveaux nom et dossier pour le prochain sous ensemble .iam

       (ex : NewIamPath D01234/A/E NewIamName 01234_A_E.iam)

_Produire dans l'ensemble en cour  la nouvelle piéce ou sous-enssemble a partir d'une des comande suivante :

     => "créer" nouvel .ipt

     => "créer" nouvel .iam (sous ensemble)

     => "enregistrer et remplacer" un .ipt 

     => "enregistrer et remplacer" un .iam (sous ensemble) 

     =>"Composant>Descendre" un .iam (sous ensemble) 

 

Ceci nécessiterais en plus des bloc iLogic précédent de :

_trouver dans quel ensemble ou sous ensemble on est en cour de travail

(ex : Ci dessous ici je travail dans 02024_B_A.iam)

tristanhaller_0-1736267552289.png

_lire nom et adresse Windows directement, à la place  de sélectionner le dossier via folderBrowser

( ex : ci dessus  adresse D02024/B/A ) 

_exécuter une des 3 fonction "créer", "enregistrer et remplacer" et "Composant>Descendre" en récupérant l'information du composant en cour de sélection si besoins

 

Par ailleur plutôt que de lire tout les fichier du dossier et de trouver la dernière lettre utilisée, serait-il possible d'incrémenter le nom voulu (ex : 01234_A_A.ipt puis 01234_A_B.ipt >> C >> D ...etc... ) et de vérifier si ce fichier est ou non présent dans le dossier? ceci permettrais de "boucher les trous" si le nommage n'as pas été rigoureux jusque la.

ceci permet aussi plus facilement les nom a double lettre après le "_"  (si j'ai + de pièces que de lettres j'utilise le même système que les colonnes Excel X>Y>Z>AA>AB>AC ...etc...)

tristanhaller_1-1736268966206.png

 

Merci encore @vpeuvion c'est chouette d'etre épauler sur ce genre de sujet (assez loin de ma zone de confort)

 

 

0 J'aime

vpeuvion
Advocate
Advocate

Bonjour @tristan-haller ,

Merci pour la réponse. Je vois ce que tu veux faire.

Je ne pourrai pas te créer le code complet, mais si tu me laisses un peu de temps, je pourrai t'envoyer prochainement des extraits de code qui pourront t'aider à modifier et créer selon tes demandes.

J'essaye de t'envoyer ça semaine prochaine ou au pire la suivante.

Vincent.

0 J'aime

tristan-haller
Collaborator
Collaborator

Bonjour @vpeuvion,

 

j'ai eue le temps de regarder de plus près ce code et j'ai construit (avec l'aide de Chat GPT ... 😅 ) le code ci dessous.

 

pour l'instant il :

verifie qu'il travail dans un enssemble ou s'arrete

crée le nom .ipt du prochain fichier pièce à ajouter a l'assemblage (ou sous assemblage actif) et l'affiche

crée le chemin complet (y compris le nouveau sous dossier et nom.iam) du sous assemblage et l'affiche

 

apres plusieurs test il semble robuste et fonctionel.

 

Il me faudra ajouter une interface de choix d'action en début de code

nouveau ipt/iam

remplacer la sélection par ipt/iam

descendre la sélection dans nouveau iam

>> 5 options,  peut etre avec un message précisant les choix possible en numérique?

 

puis crée concrètement les nouveau fichier / dossier 😍

 

vois tu du code incorrect ? 

j'ai remarqué que tu nome parfois tes variable avec une première lettre minuscule, j'ai vu ça dans d'autre code, avec des o souvent mais aussi des e des s ... a quoi serve t'elle et coment choisit tu celle à utilisée ?

 

Merci encore pour tout cette aide, c'est précieux 😊

 

Tristan.

 

Sub Main()
	
    ' Vérification que le document actif est un assemblage Sinon STOP
    If ThisDoc.Document.DocumentType <> DocumentTypeEnum.kAssemblyDocumentObject Then
        MessageBox.Show("Cette règle doit être exécutée dans un assemblage.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Return
    End If
	
	 ' Utilisation de l'assemblage de travail en cour
    Dim activeAssembly As AssemblyDocument = ThisDoc.Document  
	
	' Appel de la fonction pour obtenir le nouveau nom de la pièce
    Dim newPartName As String = GetNewPartName(activeAssembly) 
    If newPartName <> "" Then' Affichage du nouveau nom
        MessageBox.Show("Le nouveau nom généré pour la pièce est : " & vbCrLf & newPartName, "Nouveau Nom", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Else
        MessageBox.Show("Impossible de trouver un suffixe alphanumérique disponible.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If

    ' Appel de la fonction pour obtenir le nouveau chemin et nom de l'ensemble
    Dim newSubAssemblyPath As String = GetnewSubAssemblyPath(activeAssembly)
    If newSubAssemblyPath <> "" Then
        MessageBox.Show("Le nouveau chemin généré pour le sous-ensemble est : " & vbCrLf & newSubAssemblyPath, "Nouveau Sous-ensemble", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Else
        MessageBox.Show("Impossible de trouver un suffixe alphanumérique disponible pour le sous-ensemble.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If
	
	
End Sub

' Fonction pour obtenir le nouveau nom de la pièce (Part) avec suffixe disponible
Function GetNewPartName(activeAssembly As AssemblyDocument) As String
    ' Variables de base
    Dim assemblyName As String = ThisDoc.FileName(False)  
    Dim assemblyFolder As String = ThisDoc.Path  

    ' Liste des fichiers existants dans le dossier de l'assemblage
    Dim existingFiles As String() = IO.Directory.GetFiles(assemblyFolder, assemblyName & "_*.ipt")
    Dim existingSuffixes As New List(Of String)  ' Liste des suffixes existants

    ' Identification des suffixes alphanumériques existants
    For Each file As String In existingFiles
        ' Extraction du nom de fichier sans son extension
        Dim fileName As String = IO.Path.GetFileNameWithoutExtension(File)
        
        ' Extraction du suffixe après le préfixe (par exemple "_A", "_B", etc.)
        Dim fileSuffix As String = fileName.Replace(assemblyName & "_", "")
        
        ' Vérification que le suffixe est valide (composé uniquement de lettres)
        If IsValidSuffix(fileSuffix) Then
            existingSuffixes.Add(fileSuffix)  ' Ajout du suffixe à la liste des suffixes existants
        End If
    Next

    ' Trouver le premier suffixe disponible
    Dim newSuffix As String = GetNextSuffix(existingSuffixes)

    ' Retourner le nom complet avec le suffixe et l'extension ".ipt"
    If newSuffix <> "" Then
        Return assemblyName & "_" & newSuffix & ".ipt"
    Else
        Return ""  ' Aucun suffixe disponible
    End If
End Function

' Fonction pour obtenir le nom du sous-ensemble (Assembly) dans le dossier correspondant
Function GetnewSubAssemblyPath(activeAssembly As AssemblyDocument) As String
    ' Variables de base
    Dim assemblyName As String = ThisDoc.FileName(False)  
    Dim assemblyFolder As String = ThisDoc.Path  

    ' Liste des dossiers existants dans le dossier de l'assemblage
	Dim existingFolder As String() = IO.Directory.EnumerateDirectories(assemblyFolder).ToArray()
	Dim existingSuffixes As New List(Of String)  ' Liste des suffixes existants

	' Identification des suffixes alphanumériques existants
    For Each folder As String In existingFolder
        ' Extraction du suffixe après le préfixe (par exemple "A", "B", etc.)
        Dim folderSuffix As String = folder.Replace(assemblyFolder & "\", "")
		
        ' Vérification que le suffixe est valide (composé uniquement de lettres)
        If IsValidSuffix(folderSuffix) Then
            existingSuffixes.Add(folderSuffix)  ' Ajout du suffixe à la liste des suffixes existants
        End If
    Next

	' Trouver le premier suffixe de sous enssemble disponible
    Dim subSuffix As String = GetNextSuffix(existingSuffixes)

    ' Retourner le nom complet du sous-ensemble avec suffixe
    If subSuffix <> "" Then
        Return assemblyFolder & "\" & subSuffix & "\" & assemblyName & "_" & subSuffix & ".iam"
    Else
        Return ""  ' Aucun suffixe disponible
    End If
End Function

' Fonction pour vérifier si un suffixe est valide (une lettre ou combinaison de lettres)
Function IsValidSuffix(suffix As String) As Boolean
    ' Le suffixe doit être une ou plusieurs lettres
    Return suffix.Length > 0 AndAlso suffix.All(Function(c) Char.IsLetter(c))
End Function

' Fonction pour obtenir le prochain suffixe disponible
Function GetNextSuffix(existingSuffixes As List(Of String)) As String
    ' Recherche du premier suffixe disponible
    Dim nextSuffix As String = ""

    ' Vérification des suffixes à 1 caractère (de A à Z)
    For Each c As Char In "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        If Not existingSuffixes.Contains(c.ToString()) Then
            nextSuffix = c.ToString()  ' Utilisation de "nextSuffix" pour le suffixe trouvé
            Return nextSuffix
        End If
    Next

    ' Si aucun suffixe de 1 caractère n'est disponible, vérifier les suffixes de 2 caractères (de AA à ZZ)
    For Each c1 As Char In "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        For Each c2 As Char In "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            Dim twoCharSuffix As String = c1.ToString() & c2.ToString()  ' Suffixe de 2 caractères
            If Not existingSuffixes.Contains(twoCharSuffix) Then
                nextSuffix = twoCharSuffix  ' Utilisation de "nextSuffix" pour le suffixe trouvé
                Return nextSuffix
            End If
        Next
    Next

    ' Retourne une chaîne vide si aucun suffixe n'est disponible (théoriquement ce cas ne devrait pas se produire)
    Return ""
End Function

 

 

 

0 J'aime