Dans cet exemple, un ficher texte "log" est renseigné a chaque ouverture du fichier dans lequel est itégré la macro.
Comme toujours je ne comprends pas grand chose mais j'essai de déchiffrer pour progresser.
La macro est composé de deux modules : Macro et HandlerModule. Je pensais que l'un permettait de lacer la macro au démarrage et l'autre contenait la tache à effectuer, mais a la lecture du code je n'en suis plus vraiment sur. je dispose bien d'une macro qui permet d'exporter en PDF ou / et JPEG, mais je ne sais pas bien si la coller dans le HandlerModule est la bonne procédure.
Un autre point qui me chiffonne, et qui vous aura peut être aussi piqué les yeux, c'est la fermeture automatique du document après l'export. si je souhaite travailler sur mon document de façon normale, il va y avoir un problème: j'ouvre, et paf, ca se ferme. Si je n’intégrer pas ma macro au document, je devrait pouvoir ruser en déplaçant temporairement la macro dans un autre répertoire. Mais y aurait-il un autre moyen?
Enfin, et même si c'est très secondaire, est il possible d'exporter le folio "1" en PDF et le folio "2" en JPEG?
De prime abord je n'utiliserai pas les macros feature mais plutôt la gestion des évènements de Solidworks (détection de l'ouverture d'un fichier puis traitement par la macro).
Ceci demanderait de modifier l'executable de lancement de SW pour y ajouter une macro à charger en mémoire à l'ouverture de SW.
Pour le côté un peu incompatible de vouloir travailler et faire de l'exportation en automatique, à part ouvrir une fenêtre (msgbox) permettant de sélectionner ce que l'on veut faire je ne vois pas trop de solution.
Sinon autre solution, utiliser le planificateur de tâches de SW pour faire ces exports par batch.
Pour la dernière question, oui c'est possible, il faut juste être sûr d'une part qu'il n'y a bien que 2 folios sinon il faut faire du traitement complémentaire pour savoir vers quel format de fichier exporter.
La macro feature incorpore la macro (tel une fonction) a ton assemblage pour que le code se relance a chaque ouverture du fichier. Donc a chaque fois que tu ouvrira le fichier le macro se lancera et t'exportera les fichier en pdf et jpg.
Pas sur que ce soit ce que tu cherche.
Si tu souhaite juste faire du traitement en lot a partir d'une liste de fichier, ce n'est clairement pas la macro qu'il te faut.
Dans ce cas ce type de programme ou macro correspond plus à ta demande:
modifier l'executable de lancement de SW ca me semble un poil trop intrusif pour mon bête niveau
utiliser le planificateur de tâches de SW ne convient pas a mon besoin : l'export doit se faire sans toucher à solidworks. en l'occurence, une personne lambda (ou même un programme informatique) clic sur un bouton (un .bat) , et récupère le pdf dans un répértoir donné.
@ Sbadenis:
La macro feature incorpore la macro (tel une fonction) a ton assemblage pour que le code se relance a chaque ouverture du fichier. Donc a chaque fois que tu ouvrira le fichier le macro se lancera et t'exportera les fichier en pdf et jpg. Pas sur que ce soit ce que tu cherche.
Pour la macro feature, oui elle répond à votre besoin mais pas au besoin de pouvoir travailler sur les fichiers puisqu'elle va systématiquement faire des exports puis fermer le fichier. En gros votre fichier devient totalement inutilisable à mon sens, sauf à ajouter une fenêtre de validation à chaque fois pour savoir quoi faire (fermer le fichier ou le laisser ouvert).
Concernant le planificateur de tâche, je ne comprends pas trop. Dans tous les cas il faut que SW s'ouvre pour ouvrir la mise en plan et l'exporter. Il n'y a rien qui se fait en tâche de fond sans jamais ouvrir le logiciel principal.
Le fichier Plan1.SLDDRW s'ouvre bien mais la macro ne se lance pas. Je pense que ça vient du fait qu'aucune application par défaut n'est définie pour les fichiers .swp
J'ai essayé d'applique swvbaserver.exe et drawcompare.exe comme application par défaut mais sans succès.
Je ne pense pas que ça provienne d'une application non définie pour les fichiers swp mais plutôt liée à la macro qui n'a aucune execution "automatique". Un peu à l'image des macros Word/Excel il faut une execution au moment de l'évènement d'ouverture pour déclencher par la suite des actions.
Un autre point qui me chiffonne, et qui vous aura peut être aussi piqué les yeux, c'est la fermeture automatique du document après l'export. si je souhaite travailler sur mon document de façon normale, il va y avoir un problème: j'ouvre, et paf, ca se ferme. Si je n’intégrer pas ma macro au document, je devrait pouvoir ruser en déplaçant temporairement la macro dans un autre répertoire. Mais y aurait-il un autre moyen?
Comme tu a pu deviner c'est problématique de faire ce genre de macro. Le mieux, selon moi, c'est de faire un bouton macro qui te permettra d'enregistré ton document en PDF/JPEG dans les dossiers de ton choix et de fermé la mise en plan.
Tu peu aussi faire un macro qui ouvre la mise en plan du document que tu a sélectionné dans ton arborescence, enregistré et fermé la mise en plan.
Il faut aussi faire attention car a l'ouverture de certaine mise en plan les document sont en alléger et donc le 'bullage de pièce' se met en invisible (c'est un de mes problème de mise en plan et je cherche l'action en macro pour rendre les vue résolue)
Personnellement je n'utilise aucun exécutable de lancement je trouve ça un peu trop intrusif même si sur certaines de mes macro l'application pourrait être utile mais elles sont utile que sur des anciens fichier et je pense que je ne peu pas incorporé ce genre de macro a des fichiers déjà existant.
Retour au point de départ/ selon toutes vos remarques, ce qui me convient le mieux est une macro A intégrée dans le plan qui demande à l'ouverture du plan l'exécution d'une macro B présente dans un répertoire. Cette macro B doit demander:
1: chargement du plan et des composant en résolu
2: export du plan
3: fermeture du plan sans enregistrer
Si je veux travailler normalement sur le plan, je supprime la macro B de son répertoire, ce qui bloque les actions précédantes. je gère le message d'erreur "macro B introuvable" manuellement car c'est un cas particulier exceptionnel.
Pour ceux qui trouve ma demande étrange je veux bien expliquer le pourquoi, mais je ne veux pas que cela transforme cette conversation en champ de bataille pour me dire si c'est selon eux une bonne ou mauvaise idée. J'ai un fichier excel qui modifie les porpriétés personnalisé d'une pièce sans avoir à l'ouvrir.La géométrie de la pièce est mise a jour avec les valeur de l'excel. Un simple clic sur un bouton doit permettre l'édition d'un plan de la pièce en pdf. Tout ceci pour que l'utilisateur n'ai pas à utiliser solidworks.
Merci mais ça ne va pas convenir pour mon application. Je vais continuer à plancher sur la solution macro intégré qui appel à l'ouverture d'autres macro. Pour le moment ça patinne
Pour ceux qui trouve ma demande étrange je veux bien expliquer le pourquoi, mais je ne veux pas que cela transforme cette conversation en champ de bataille pour me dire si c'est selon eux une bonne ou mauvaise idée. J'ai un fichier excel qui modifie les porpriétés personnalisé d'une pièce sans avoir à l'ouvrir.La géométrie de la pièce est mise a jour avec les valeur de l'excel. Un simple clic sur un bouton doit permettre l'édition d'un plan de la pièce en pdf. Tout ceci pour que l'utilisateur n'ai pas à utiliser solidworks.
Il suffirait donc sur ton bouton excel de programmer l'ouverture de ta pièce et de ton plan dans solidworks, d'exporter ton plan folio 1 en pdf et ton plan folio 2 en jpeg. Puis de fermer la pièce et l'assemblage. Tout cela en codant dans excel.
Voici un bout de code qui depuis excel ouvre une pièce et une MEP, je viens de tester par curiosité et cela fonctionne parfaitement.
Sub EssaiSW()
Dim swApp As SldWorks.SldWorks
Dim swModelUn As SldWorks.ModelDoc2
Dim swModelDeux As SldWorks.ModelDoc2
If swApp Is Nothing Then
Set swApp = CreateObject("SLDWORKS.application")
swApp.Visible = True
Else
Set swApp = Application.SldWorks
End If
Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\sebastien.denis\Desktop\Pièce5.sldprt")
Set swModelUn = swApp.OpenDoc7(swDocSpecification)
MsgBox swModelUn.GetTitle
Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\sebastien.denis\Desktop\Pièce5.slddrw")
Set swModelUn = swApp.OpenDoc7(swDocSpecification)
MsgBox swModelUn.GetTitle
swApp.CloseDoc swModelUn.GetTitle
Set swModelUn = swApp.ActiveDoc
MsgBox swModelUn.GetTitle
Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\sebastien.denis\Desktop\Pièce6.sldprt")
Set swModelDeux = swApp.OpenDoc7(swDocSpecification)
swApp.CloseDoc swModelUn.GetTitle
MsgBox swModelDeux.GetTitle
swApp.CloseDoc swModelDeux.GetTitle
End Sub
Merci @d.rogerpour ce code disponible par ailleurs dans mon lien plus haut.
Il reste plus ensuite à exporter le pdf et le jpeg. Ce qui est largement réalisable et devrait être assez simple.
A moins bien sûr qu'un point ne m'échappe encore?
Pour info les macros intégrés pour en avoir testés plusieurs c'est compliqué à mettre en ouvre et reste dangereux sans parler des plantages avec.
Je suis du même avis que @sbadenisles macro incorporé au plan/pièce je n'ai jamais pratiqué mais il me semble que c'est assez complexe et je trouve ça trop 'intrusif'.
Vue que tu part d'un fichier excel ou tu renseigne les cotes a modifier je pense que le plus simple reste un bouton macro excel qui envoi travaillé sur Solidworks.
Le bouton peu te permettre d'ouvrir la pièce renseigné les dimensions, ouvrir le plan enregistré puis fermé, ou continué a travailler en modifiant les cotes puis enregistré a nouveaux si tu a un tableau de cote ce qui peu te faire gagné quelques seconde a chaque ouverture/fermeture.
Si tu veux éviter a tes utilisateur d'utilisé Solidworks je pense que c'est la meilleur solution. Tu risque de vite être agacé si tu dois changer un plan et tu a oublié de bougé la macro, ou si Solidworks t'ouvre une fenêtre a chaque modification/création de plan disant qu'il n'a pas trouvé la macro sans parlé des erreurs/bug éventuel de Solidworks.
Sinon, si je comprend bien ta demande, tu voudrais que l'utilisateur clic sur le fichier DRWG de la pièce dans l'explorateur Windows. que Solidworks ouvre ce plan fasse une corrélation avec le fichier excel d'ouvert, mette a jours les données puis enregistre/ferme automatiquement le plan sans que l'utilisateur ne le vois.
Je voudrais quand même essayer la macro intégrée, si ca ne vous embête pas trop.
Pouvez vous m'expliquer quel est la méthode pour fusionner cette macro qui lance une action à l'ouverture d'un fichier, avec cette macro qui exécute un série de macro ?
En plus, c'est super simple à déployer sur une série de documents.
j'ai un peu bataillé avec les références à activer, mais ça avance bien.
J'ai quand même un petit bug : la macro "exortPDF" appelée pat la macro intégrée plante sur la récupération du chemin du fichier, alors que si je la lance manuellement ça fonctionne.
On dirait que c'est parceque la macro "exportPDF" se lance avant que le fichier solid ne soit complétement chargé (le fenetre d'erreur me propose le degeugage, mais le fichier solidworks n'apparait pas) Est il possible de mettre un genre de temporisation pour voir si c'est bien ca?
J'ai eu le même soucis, impossible de lancé une macro extérieur avec la méthode qu'il propose et j'ai pas eu le temps de creuser le sujet.
Je viens de réussir a en lancé une essaye avec ça :
Option Explicit Dim swApp As SldWorks.SldWorks Dim boolstatus As Boolean Sub main() Set swApp = Application.SldWorks Dim runMacroError As Long boolstatus = swApp.RunMacro2("chemin", "module", "nom", 1, 0) End Sub
J'ai aussi remplacé 'swRunMacroUnloadAfterRun' par 1 et 'runMacroError' par 0
[ Malheur, ca ne fonctionne plus... les modifications que tu porpose ne touchent que le handlermodule, mais c'est dans l'autre module que ca coince...] Erreur résolue
J'ai replacé le contenu du handlermodul par ce que tu m'a proposé, ca ne fonctionne toujours pas. J'ai toujours le message d'erreur au niveau de la macro appelée par le andlermodule alors que le plan n'est pas encore affiché dans SW. Si la macro essaye d'exporter un plan qui n'est pas encore ouvert, c'est pas étonnant. Mais je pensais que le handlermodule n'etait déclanché qu'une fois le plan complétement chargé...
Par ailleurs je ne comprends pas ce que tu entends par "J'ai aussi remplacé 'swRunMacroUnloadAfterRun' par 1 et 'runMacroError' par 0"