Créer des fichiers numérotés

Résolu
castromanuel - 17 nov. 2012 à 15:45
 Utilisateur anonyme - 18 nov. 2012 à 17:19
Bonjour @tous,

J'espère avoir correctement choisi le Thème.

Voilà comme dit dans mon profil, je suis Concepteur de Produits en 3D via le logiciel SolidWorks.
Il arrive parfois que dans certaines de mes missions clients je rencontre des fonctions spéciales.
Dans ce cas un précédent dessinateur avait crée une macro pour enregistrer le fichier automatiquement avec des numéros pour éviter que les fichiers suivant ne prennent un numéro existant,
Bonne intention, cependant étant pûriste dans l'organisation du modèle 3D, le fait d'avoir des numéros ainsi créer n'est pas des plus propre.

Je suis persuadé que l'on doit pouvoir commencer à 1 et enchainer au fil de la construction du projet.
Je vous colle donc le code en espérant que certains auront aisément la solution.

Merci @vous

Code de la fonction NewTube

Public swApp As Object
Public swpart As Object
Public Nom_Doc As String
Public Ext_Doc As String
Public Val_Prop As String
Public part As Object
Public boolstatus As Boolean
Public FeatureData As Object
Public Feature As Object
Public Component As Object
Public entete As Integer
Public miseajour
Public propriété, val_propriété, retval As Variant
Public longstatus As Long, longwarnings As Long

Sub NewTube2011()

Dim swApp As SldWorks.SldWorks
Dim swpart As Object
Set swApp = Application.SldWorks
Set swpart = swApp.ActiveDoc
Dim componentDoc As Object
Dim swSelMgr As SldWorks.SelectionMgr
Dim swConfigMgr As SldWorks.ConfigurationManager
Dim swComp As SldWorks.Component2

Set swModel = swApp.ActiveDoc

Set swSelMgr = swModel.SelectionManager

Set swComp = swSelMgr.GetSelectedObjectsComponent2(1)

Set componentDoc = swComp.GetModelDoc

FichierActif = componentDoc.GetTitle


'""""""""""""" CALCUL DU NOUVEAU NOM """""""""""""""""""""""""

Dim MyTime, MySecond
index = Second(Now)


MyFolder = Strings.Left(swModel.GetPathName, Strings.InStrRev(swModel.GetPathName, "") - 1) + ""

FileName = Strings.Mid(swModel.GetTitle, 1, 11) + " - "

FileName = MyFolder & FileName & FichierActif & " - " & index & ".sldprt"



'""""""""""""" ENREGISTREMENT DU FICHIER SELECTIONNE """""""""""""""""""


componentDoc.SaveAs2 FileName, 0, False, False



End Sub

41 réponses

Utilisateur anonyme
18 nov. 2012 à 11:29
Il suffit de passer un paramètre supplémentaire à la fonction:

Function GetLastIndex(ByVal directory As String, ByVal Title As String)
  Const EXT_SLDPRT As String = ".sldprt"
  Dim file As String
  Dim indexPos As Long
  Dim index As Long
  Dim maxIndex As Long

  If Not VBA.Right$(directory, 1) "" Then directory directory & ""


  maxIndex = 0

  file = Dir(directory & Title & " -*" & EXT_SLDPRT, VbFileAttribute.vbNormal)
  While Not file = vbNullString
    indexPos = VBA.InStrRev(file, "-")
    If indexPos > 0 Then
      index = Int(Val(VBA.Trim$(VBA.Mid$(file, indexPos + 1, Len(file) - indexPos - Len(EXT_SLDPRT)))))
      If index > maxIndex Then maxIndex = index
    End If
    file = Dir()
  Wend

  GetLastIndex = maxIndex
End Function


Où title est ton "A", "B" ...

_____________
Kenji
3
Utilisateur anonyme
18 nov. 2012 à 14:06
Il faut ajouter l'argument lors de l'appel de la fonction :

index = GetLastIndex(MyFolder, Strings.Mid(swModel.GetTitle, 1, 11)) + 1 



_____________
Kenji
3
Utilisateur anonyme
17 nov. 2012 à 17:34
Bonjour,

En un mot; c'est quoi le problème avec tes secondes ?
0
castromanuel
17 nov. 2012 à 17:44
Bonjour Marcotte,

Les secondes sont .... en quelques sorte aléatoire ... et lorsque que l'on dessine le projet,
on ne va pas regarder un chronometre pour créer les tubes de 1 ... à 7 par exemple.

bref ... ce serait plus simple de créer le 1er tube nommé >XXXXXXXXXXXXXX - 1< et les suivants >XXXXXXXXXXXXXX - 2< et ainsi de suite.

Voilà, est ce un peu plus claire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 nov. 2012 à 18:03
Bonjour,
Au bout du compte :
1) Seule la dernière partie de ton code est concernée. La première partie ne nous intéresse-pas
2) ton problème est-il simplement d' "affubler" tes noms de fichiers d'un n° par ordre croissant, en commençant par le n° 1 ?
- très simple si, pour chaque projet, les fichiers sont créés dans la même session de ton appli (et que donc, tu n'auras plus de fichiers à créer dans le même dossier) ===W>> il te suffit d'une variable static que tu incrément de une unité à chaque fois ! Cette variable static est bien évidemment à remettre à zéro entre deux projets (donc deux dossiers)
- si par contre, tu es susceptible de quitter ton appli et de la reprendre ultérieurement pour continuer àç mettre des fichiers dans le même dossier, il va te falloir en plus mémoriser (hors appli) le dernier numéro utilisé et l'affecter à ta variable static lors de la "reprise" de ton appli.
Bref ===>> tu as là deux stratégies simples à mettre en oeuvre, à adapter au besoin en fonction de ce que tu es seul à connaître de tes dossiers et des reprises éventuelles. Quel que soit le cas, c'est fort simple !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Utilisateur anonyme
17 nov. 2012 à 18:06
En gros, tu veux obtenir le numéro du dernier modèle d'un répertoire.
Pour cela, il faut pouvoir identifier les fichiers à traiter.
Je suppose que les fichiers modèles ont une extension particulière ?
Le nom des modèles est-il variable ("XXX - 1", "XXXXXX - 2", "XXXX XXXXX XX - 3") ?

_____________
Kenji
0
castromanuel
17 nov. 2012 à 18:15
Bonsoir ucfoutu,

vite fait sur la fin de ton message,
je suis convaincu que cela doit être fort simple ... pour des personnes qui sont fort en programmation et la maitrise.

j'ai tout mis, car j'ai lu que pour créer un code propre il convient de définir l'ensemble des variables ... enfin si j'ai bien compris.

Lors de la conception du 3D,
on peut être amener à concevoir la ligne de tube en plusieurs fois :
soit parce que la fin de journée est arrivée et que l'on reprend le lendemain,
soit parce l'on apporte des rectifications plus tard à cause de modifications clients

en fait suite à différentes lectures sur l'incrémentation de fichiers ....
je voyais plus les actions suivantes :
analyser la présence de fichiers
relever celui qui est le plus récent (numéro le plus haut)
incrémenter le fichier de +1

Voilà ... pour pousser plus loin la réflexion.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 nov. 2012 à 18:33
passer par le recensement des fichiers pour déterminer le dernier N° utilisé alourdit sans raison.
Il te suffit :
- d'enregistrer ce numéro en quittant l'appli dans chaque dossier concerné. ==>> écriture d'un fichier encours.txt ne contenant que ce numéro.
- de repartir de ce numéro + 1, puis d'incrémenter de 1 en tant que de besoin
- d'ajouter ce numéro à la fin de chaque fichier créé dans le dossier concerné.
Que ne sais-tu faire dans ce but ?
manipuler un fichier texte (ouverture, lecture, écriture) ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
castromanuel
17 nov. 2012 à 18:38
Bonsoir Charles Racaud,

oui tous les fichiers se terminent par .sldprt comme montrer dans le code pour la création du filename.
non étant donné que le nom de fichier mixe un partie de la ligne de tube avec le type de tube utilisé, ensuite tous les tubes de la ligne portent la meme base de nom.



En espérant que vous verrez l'image et que cela vous avance ...
0
Utilisateur anonyme
17 nov. 2012 à 18:40
Cette solution marche mais pour la reprise d'un projet existant ? D'un projet d'un collègue ? Ou ajout manuel ...
Peut-être une combinaison des deux méthodes ?

Enfin, bon, ce ne sont que des propositions, cela dépend du domaine d'application.

_____________
Kenji
0
castromanuel
17 nov. 2012 à 18:54
ucfoutu,

c'est surement pour cela qu'un ancien du bureau d'études a pris le parti des ...
secondes

tu souleves une autre alternative l'ecriture de tous les noms de fichiers dans un fichiers textes ....
mais comme tu peux voir l'image dans un message à Charles ...
tu as un échantillon de différentes lignes de tubes .... ou de pièces car certaines pièces standards sont modifiables et du coup ils utilisent aussi la macro pour creer une version sans que cela touche le modèle standard.

et meme si tu peux apprendre à dessiner quelques formes en lisant 2 3 tutos du logiciel SolidWorks, tu ne pourrais pas construire des projets et réfléchir à la conception en un temps réduit,
c'est mon cas là ... même si j'arrive à comprendre très légèrement quelques notions des fonctions comme prendre le nom de fichier compter -8 ou -9 pour extraire l'extension + l'indice ...

bref ... la programmation ne s'improvise pas un weekend !
0
castromanuel
17 nov. 2012 à 19:05
Charles,

le domaine d'application >> c'est la conception 3D, le domaine client >> des stations de filtration, le contenu majeur du projet >> des tubes dans tous les sens.

il se peut que les projets soient modifiés par d'autres dessinateurs ... il faut garder cette éventualité.

@suivre
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 nov. 2012 à 19:12
tu souleves une autre alternative l'ecriture de tous les noms de fichiers dans un fichiers textes ....

heu ... je n'ai en aucun cas proposé cela ! Si, maintenant, on a en plus un problème de compréhension, "on n'est pas sortis de l'auberge", hein ...
Quant à ton "image", tu es seul à la voir si sur ton disque dur et on déposée sur un site ad-hoc partagé !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
castromanuel
17 nov. 2012 à 19:20
ucfoutu,

comment traduis-tu cela

Que ne sais-tu faire dans ce but ?
manipuler un fichier texte (ouverture, lecture, écriture) ?


pour ce qui est du fichier il est stocké sur mon skydrive et il est partagé en mode consultation ... enfin j'ai fait que cliquer là ou me semblait évident de rendre possible l'acces au fichier par les gens à qui je communique l'URL.

je vais aller y voir quels clics j'ai pu oublié pour le rendre accessible ...

@suivre
0
Utilisateur anonyme
17 nov. 2012 à 19:24
Je te propose cette petite fonction, qui te retourne le dernier index, il suffira de l'incrémenter d'un pour le nouvel index.

Function GetLastIndex(ByVal directory As String)
  Const EXT_SLDPRT As String = ".sldprt"
  Dim file As String
  Dim indexPos As Long
  Dim index As Long
  Dim maxIndex As Long

  If Not VBA.Right$(directory, 1) "" Then directory directory & ""

  maxIndex = 0

  file = Dir(directory & "*" & EXT_SLDPRT, VbFileAttribute.vbNormal)
  While Not file = vbNullString
    indexPos = VBA.InStrRev(file, "-")
    If indexPos > 0 Then
      index = Int(Val(VBA.Trim$(VBA.Mid$(file, indexPos + 1, Len(file) - indexPos - Len(EXT_SLDPRT)))))
      If index > maxIndex Then maxIndex = index
    End If
    file = Dir()
  Wend

  GetLastIndex = maxIndex
End Function


Elle sera peut-être à améliorer pour le filtrage des nom si
il y a plusieurs projet dans un même répertoire.

Je suppose que c'est du VBA pour SolidWorks et non du VB.NET (ton code n'étant pas du .NET). J'ai fais la fonction avec VB6, j'espère qu'elle marchera.

_____________
Kenji
0
castromanuel
17 nov. 2012 à 19:35
Charles,

c'est bien du VBA pour SolidWorks.

merci pour ta fonction .... mais je ne vois ABSOLUMENT pas où je dois la mettre ...

RAPPEL ... un débutant en VBA est un million de fois plus fort que moi.

@suivre
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 nov. 2012 à 21:04
RAPPEL ... un débutant en VBA est un million de fois plus fort que moi

Il sera alors peut-être sage de confier cette tâche à un véritable développeur. Même un débutant ferait l'affaire, pourvu toutefois que les tenants et aboutissants (au moins) lui soient exposés de manière technique et très précise, ce qui ne me parait pas encore le cas.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
castromanuel
17 nov. 2012 à 22:28
ucfoutu,

je n'ai certes aucune aucune expérience en programmation,
cependant ... j'ai une certaine rigueur dans ma conception, et celle des choses.

hors ici, le programmeur qui a pondu la macro n'a pas pensé que malgré qu'aléatoire il y a des probabilités de tomber sur la même seconde de création du nouveau tube qu'un précédent existant.

et donc les tenants ... il me semble est le code actuel
et aboutissants..... qu'il faut modifier de tel sorte que les numéros démarrent de 1 et s'incrémentent sans écraser les précédents,
cela suppose éventuellement de sonder l'existence de fichiers précédents dans le cas d'un modification ou de retravaille sur le fichier le jour suivant par exemple.

je ne vois pas quelle description du cahier des charges de cette macro te manque ... attendu que certains arrivent à proposer des solutions ...
0
Utilisateur anonyme
17 nov. 2012 à 22:40
Tu peux mettre la fonction juste après le "End Sub"
Pour l'appel de la fonction, je propose sans chambouler tout le code existant :

MyFolder = Strings.Left(swModel.GetPathName, Strings.InStrRev(swModel.GetPathName, "") - 1) + ""

index = GetLastIndex(MyFolder) + 1 ' <---- ICI ---------------

FileName = Strings.Mid(swModel.GetTitle, 1, 11) + " - "

FileName = MyFolder & FileName & FichierActif & " - " & index & ".sldprt"


_____________
Kenji
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 nov. 2012 à 22:47
je ne vois pas quelle description du cahier des charges de cette macro te manque ... attendu que certains arrivent à proposer des solutions ...

Tu crois ? Tu as peut-être raison, mais : quand je lis et relis tout ce que tu as écrit depuis le début, je n'en suis personnellement pas certain, y compris en ce qui concerne les propositions que je t'ai faites moi-même. Relis-toi donc (tout, y compris les passages relatifs à une certaine "éventualité"...) calmement.
Eh oui : une définition précise de tous les tenants et aboutissants fait bel et bien défaut, selon moi.
Mais je peux me tromper et lirai avec le plus grand intérêt la suite, donc.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Rejoignez-nous