• Ce forum est la traduction générée par la machine de www.cad3d.it/forum1 - la communauté italienne du design. Plusieurs termes ne sont pas traduits correctement.

Macro VB pour exporter en pdf simultanément plusieurs modèles

alxG88

Guest
Bonjour à tous,

pour me faciliter dans mon travail, j'écris une série de macros pour les bords solides qui simplifient les opérations que je travaille le plus souvent.
Le problème que je souhaite soumettre est le suivant: J'essaie d'écrire une macro qui permet aux individus d'ouvrir tous les dfts et, pour chacun d'eux, d'enregistrer une copie au format pdf et une au format dxf dans un répertoire spécifique.
J'avais déjà écrit une macro exécutant la même opération avec un dft à la fois, mais maintenant je ne peux pas étendre ce concept à tous les dfts ouverts.
Je mets le code que j'ai écrit :
Code:
module

dim objapp comme un cadre solide. demande
dim objdft en tant que document solidedgedraft.draft
dim nom de fichier comme chaîne
dim cheminname_1 comme chaîne
dim cheminname_2 comme chaîne

Sous-main()
suite de l'erreur

objapp = getobject(, "solidedge.application") ' crée une application avec certaines caractéristiques

si objapp n'est rien alors
msgbox("bord solide n'est pas ouvert! ouvrir le bord solide.", vbcritic, "attention")
sortie sous
fin si

si objapp.activedocumenttype < solidedgeframework.documenttypeconstants.igdraftdocument puis
msgbox("pas de projet de document ouvert! ouvrir une ébauche.", vb information, "attention")
sortie sous
fin si

ojdft = document actif
si objdft n'est rien alors
msgbox("pas de document ouvert!", vbinformation, "attention")
sortie sous
fin si

suivre le cycle aussi longtemps qu'il y a des projets ouverts
appel objdft.save() ' mis avant le nom, pour de nouveaux fichiers est correctement demandé de donner le nom

fichiername = left(objdft.name, len(objdft.name) - 4)' ne dérive que le nom du fichier
cheminname_1 = "s:\ug\dxf\" chemin fichier dxf
cheminname_2 = "s:\ug\dati\" ' chemin de fichier pdf

objapp.displayalerts = false 'écrase automatiquement les fichiers avec le même nom sans demander

appel objdft.saveas(pathname_1 + nom de fichier + "." + "dxf") ' sauve par nom
appel objdft.saveas(pathname_2 + nom de fichier + "." + "pdf") ' enregistrer par nom

objapp.displayalerts = true 'reactive windows alerte messages

call objdft.close() « ferme le fichier brouillon qu'il vient de créer pdf et dxf

objdft = rien
objapp = rien
boucle jusqu'à objapp.activedocumenttype <> solidedgeframework.documenttypeconstants. igprojet de document
fin
fin du module
comme vous pouvez le voir, j'ai essayé de créer un do...loop jusqu'au cycle de sorte qu'il va chercher des dfts ouverts de temps en temps, mais cela ne fonctionne pas: le résultat est qu'il ne m'enregistre que le premier dft actif et s'arrête, me forçant à recommencer la macro pour chaque fichier.

Tu peux m'aider ? Où ai-je tort ?

merci à tous à l'avance

alex
 
cela ne fonctionne pas parce que vous mettez "objapp = rien" dans le cycle de boucle.
Par conséquent, vous n'avez plus d'objapp valide sur lequel continuer.
vous devez également installer objdft dans la boucle sinon cela vous donnera également une erreur.

Si alors parmi vos documents ouverts vous avez un modèle 3d, votre boucle se terminera prématurément.

Bonjour.
 
Merci pour la réponse.
J'ai essayé de changer le code en suivant vos instructions : Il fonctionne mieux, mais parfois il ne fait pas l'opération sur tous les dfts, mais il me laisse un ouvert. Quoi ?

En attendant, je vous demande: si vous voulez ajouter la macro au menu rapide du bord solide, dans quel environnement dois-je l'insérer? J'ai essayé de le mettre dans l'environnement d'ébauche, mais ça ne fonctionne pas, il ne fait que l'opération sur le dft à partir duquel il a été commencé.
Code:
module

dim objapp comme un cadre solide. demande
dim objdft en tant que document solidedgedraft.draft
dim nom de fichier comme chaîne
dim cheminname_1 comme chaîne
dim cheminname_2 comme chaîne

Sous-main()
suite de l'erreur

objapp = getobject(, "solidedge.application") ' crée une application avec certaines caractéristiques

si objapp n'est rien alors
msgbox("bord solide n'est pas ouvert! ouvrir le bord solide.", vbcritic, "attention")
sortie sous
fin si

si objapp.activedocumenttype < solidedgeframework.documenttypeconstants.igdraftdocument puis
msgbox("pas de projet de document ouvert! ouvrir une ébauche.", vb information, "attention")
sortie sous
fin si

suivre le cycle aussi longtemps qu'il y a des projets ouverts
ojdft = document actif
appel objdft.save() ' mis avant le nom, pour de nouveaux fichiers est correctement demandé de donner le nom

fichiername = left(objdft.name, len(objdft.name) - 4)' ne dérive que le nom du fichier
cheminname_1 = "s:\ug\dxf\" chemin fichier dxf
cheminname_2 = "s:\ug\dati\" ' chemin de fichier pdf

objapp.displayalerts = false 'écrase automatiquement les fichiers avec le même nom sans demander

appel objdft.saveas(pathname_1 + nom de fichier + "." + "dxf") ' sauve par nom
appel objdft.saveas(pathname_2 + nom de fichier + "." + "pdf") ' enregistrer par nom

objapp.displayalerts = true 'reactive windows alerte messages

call objdft.close() « ferme le fichier brouillon qu'il vient de créer pdf et dxf
boucle jusqu'à objapp.activedocumenttype <> solidedgeframework.documenttypeconstants. igprojet de document

si objdft n'est rien alors
msgbox("pas de document ouvert!", vbinformation, "attention")
sortie sous
fin si

objdft = rien
objapp = rien
fin
fin du module
Je vous remercie.

alex
 
de la façon dont vous avez structuré le code votre boucle se termine au premier non- Projet de document que vous rencontrez.
fermer les documents que vous n'avez aucun contrôle sur le prochain qui devient une raison active pour qu'il puisse finir avant d'être dû.

Je au lieu de "do - boucle" ferait un cycle "pour chaque" sur objapp.documents

Bonjour.
 
Donc une chose comme ça :
Code:
Objdft = documents objapp.
pour chaque objdft dans objapp. Documents
...
...
suivant
De cette façon, cependant, j'intercepte tous les documents, même ceux qui ne sont pas dft. Je devrais donc lui donner l'instruction d'ignorer (ou de fermer) tous les fichiers non dft et de ne prendre soin que des dfts.
Vraiment ?

Je vous remercie.

alex
 
Code:
pour chaque document dans objapp. Documents

si document.

jeu objdft = document
...

fin si

document suivant
 
Merci beaucoup.
maintenant le programme semble fonctionner et il a été écrit comme ceci:
Code:
module

dim objapp comme un cadre solide. demande
dim objdft en tant que document solidedgedraft.draft
dim nom de fichier comme chaîne
dim cheminname_1 comme chaîne
dim cheminname_2 comme chaîne

Sous-main()
suite de l'erreur

objapp = getobject(, "solidedge.application") ' crée une application avec certaines caractéristiques

si objapp n'est rien alors
msgbox("bord solide n'est pas ouvert! ouvrir le bord solide.", vbcritic, "attention")
sortie sous

sinon si objapp.activedocument n'est rien alors
msgbox("pas de document ouvert!", vbinformation, "attention")
sortie sous

otherif objapp.document.type <> solidedgeframework.documenttypeconstants.igdraftdocument puis
msgbox("pas de projet de document ouvert! ouvrir une ébauche.", vb information, "attention")
sortie sous
fin si

pour chaque document dans objapp. les documents font le cycle aussi longtemps qu'il y a des ébauches ouvertes

i document.type = solidedgeframework.documenttypeconstants.igdraftdocument puis
objdft = document
appel objdft.save() ' mis avant le nom, pour de nouveaux fichiers est correctement demandé de donner le nom

fichiername = left(objdft.name, len(objdft.name) - 4)' ne dérive que le nom du fichier
cheminname_1 = "s:\ug\dxf\" chemin fichier dxf
cheminname_2 = "s:\ug\dati\" ' chemin de fichier pdf

objapp.displayalerts = false 'écrase automatiquement les fichiers avec le même nom sans demander

appel objdft.saveas(pathname_1 + nom de fichier + "." + "dxf") ' sauve par nom
appel objdft.saveas(pathname_2 + nom de fichier + "." + "pdf") ' enregistrer par nom

objapp.displayalerts = true 'reactive windows alerte messages
call objdft.close() « ferme le fichier brouillon qu'il vient de créer pdf et dxf
fin si

document suivant

objdft = rien
objapp = rien
fin
fin du module
Avez-vous d'autres conseils à me donner pour rendre le programme plus précis ou vous sentez-vous bien? Je n'ai toujours pas beaucoup d'expérience dans la programmation visuelle de base emi aimerait que qui a plus d'expérience que moi me donne des conseils pour une bonne rédaction d'un programme.

Merci encore.

alex
 
Merci beaucoup.
maintenant le programme semble fonctionner et il a été écrit comme ceci:
Code:
module

dim objapp comme un cadre solide. demande
dim objdft en tant que document solidedgedraft.draft
dim nom de fichier comme chaîne
dim cheminname_1 comme chaîne
dim cheminname_2 comme chaîne

Sous-main()
suite de l'erreur

objapp = getobject(, "solidedge.application") ' crée une application avec certaines caractéristiques

si objapp n'est rien alors
msgbox("bord solide n'est pas ouvert! ouvrir le bord solide.", vbcritic, "attention")
sortie sous

sinon si objapp.activedocument n'est rien alors
msgbox("pas de document ouvert!", vbinformation, "attention")
sortie sous

otherif objapp.document.type <> solidedgeframework.documenttypeconstants.igdraftdocument puis
msgbox("pas de projet de document ouvert! ouvrir une ébauche.", vb information, "attention")
sortie sous
fin si

pour chaque document dans objapp. les documents font le cycle aussi longtemps qu'il y a des ébauches ouvertes

i document.type = solidedgeframework.documenttypeconstants.igdraftdocument puis
objdft = document
appel objdft.save() ' mis avant le nom, pour de nouveaux fichiers est correctement demandé de donner le nom

fichiername = left(objdft.name, len(objdft.name) - 4)' ne dérive que le nom du fichier
cheminname_1 = "s:\ug\dxf\" chemin fichier dxf
cheminname_2 = "s:\ug\dati\" ' chemin de fichier pdf

objapp.displayalerts = false 'écrase automatiquement les fichiers avec le même nom sans demander

appel objdft.saveas(pathname_1 + nom de fichier + "." + "dxf") ' sauve par nom
appel objdft.saveas(pathname_2 + nom de fichier + "." + "pdf") ' enregistrer par nom

objapp.displayalerts = true 'reactive windows alerte messages
call objdft.close() « ferme le fichier brouillon qu'il vient de créer pdf et dxf
fin si

document suivant

objdft = rien
objapp = rien
fin
fin du module
Avez-vous d'autres conseils à me donner pour rendre le programme plus précis ou vous sentez-vous bien? Je n'ai toujours pas beaucoup d'expérience dans la programmation visuelle de base emi aimerait que qui a plus d'expérience que moi me donne des conseils pour une bonne rédaction d'un programme.

Merci encore.

alex
Puisque c'est une macro que vous commencerez à rédiger toute la partie initiale sur la vérification de l'existence du bord solide et un projet de document que vous pouvez éviter.
en outre, vous devez éviter d'utiliser "sur erreur reprendre ensuite" et gérer les différents types d'erreur qui pourraient émerger.

Je n'aime pas vraiment le fait que vous allez fermer les différents brouillons une fois que vous êtes sauvé, mais j'imagine que cela fait partie de votre workflow.

Bonjour.
 

Statistiques du forum

Sujets
58 521
Messages
499 056
Membres
104 110
Dernier membre
ChristianR

Membres en ligne

Aucun membre en ligne actuellement.
Retour
Haut