• Este fórum é a tradução automática de www.cad3d.it/forum1 - a comunidade italiana de design. Vários termos não foram traduzidos corretamente.

Macro VB para exportar em pdf simultaneamente vários projetos

alxG88

Guest
Bom dia a todos.

para me facilitar no meu trabalho estou escrevendo uma série de macros para bordas sólidas que simplificam as operações que trabalho com mais frequência.
o problema que eu quero enviar é o seguinte: Estou tentando escrever uma macro que os indivíduos todos os dfts abertos e, para cada um deles, salva uma cópia em formato pdf e uma em formato dxf dentro de um diretório específico.
Eu já tinha escrito uma macro executando a mesma operação com um dft de cada vez, mas agora não posso estender esse conceito a todos os dfts abertos.
Pus o código que escrevi:
Código:
módulo do módulo

dim objapp como solidedgeframework. aplicação
dim objdft como sólidoedgedraft.draftdocumento
dim filename como string
dim pathname_1 como string
dim pathname_2 como string

sub principal()
em resumo de erro em seguida

objapp = getobject(, "solidedge.application") ' cria uma aplicação com certas características

se objapp não é nada então
msgbox (a borda sólida não está aberta! borda sólida aberta.", vbcritical, "atenção"
saída sub
terminar se

se objapp.activedocumenttype < solidedgeframework.documenttypeconstants.igdraftdocument então
msgbox("nenhum rascunho de documento aberto! abrir um rascunho.
saída sub
terminar se

objdft = objapp.activedocument
se objdft não é nada então
msgbox("nenhum documento aberto!", vbinformation, "atenção")
saída sub
terminar se

fazer 'seguir o ciclo desde que haja rascunhos abertos
call objdft.save() ' colocado antes do nome, para novos arquivos é solicitado corretamente para dar o nome

filename = left(objdft.name, len(objdft.name) - 4)' deriva apenas o nome do arquivo
pathname_1 = "s:\ug\dxf\" ' path file dxf
pathname_2 = "s:\ug\dati\" ' file path pdf

objapp.displayalerts = false 'overwrites files automaticamente com o mesmo nome sem pedir

call objdft.saveas(pathname_1 + filename + ". + "dxf") ' salva pelo nome
call objdft.saveas(pathname_2 + filename + ". + "pdf") ' save by name

objapp.displayalerts = verdadeiras 'reativas mensagens de alerta de janelas

call objdft.close() 'closes the draft file it has just created pdf and dxf

não é nada
objapp = nada
loop até objapp.activedocumenttype <> solidedgeframework.documenttypeconstants. Documento de identificação
fim
módulo final
como você pode ver eu tentei criar um do...loop até o ciclo para que ele vai à procura de dfts abertos de tempos em tempos, mas não funciona: o resultado é que ele só me salva o primeiro dft ativo e, em seguida, pára, forçando-me a iniciar a macro novamente para cada arquivo.

Podes ajudar-me? Onde estou errado?

graças a todos com antecedência

Alex
 
não funciona porque você coloca "objapp = nada" dentro do ciclo de loop.
Como resultado, você não tem mais um objapp válido para continuar.
você também precisa instalar objdft dentro do loop caso contrário isso também lhe dará erro.

se, em seguida, entre seus documentos abertos você tem algum modelo 3d seu loop terminará prematuramente.

Olá.
 
Obrigado pela resposta.
Eu tentei mudar o código seguindo suas instruções: Ele funciona melhor, mas às vezes não executa a operação em todos os dfts, mas deixa-me um aberto. O que poderia ser?

entretanto eu pergunto: se você quer adicionar a macro ao menu rápido da borda sólida, em que ambiente devo inseri-lo? Eu tentei colocá-lo no ambiente de rascunho, mas não funciona, ele só executa a operação no dft a partir do qual foi iniciado.
Código:
módulo do módulo

dim objapp como solidedgeframework. aplicação
dim objdft como sólidoedgedraft.draftdocumento
dim filename como string
dim pathname_1 como string
dim pathname_2 como string

sub principal()
em resumo de erro em seguida

objapp = getobject(, "solidedge.application") ' cria uma aplicação com certas características

se objapp não é nada então
msgbox (a borda sólida não está aberta! borda sólida aberta.", vbcritical, "atenção"
saída sub
terminar se

se objapp.activedocumenttype < solidedgeframework.documenttypeconstants.igdraftdocument então
msgbox("nenhum rascunho de documento aberto! abrir um rascunho.
saída sub
terminar se

fazer 'seguir o ciclo desde que haja rascunhos abertos
objdft = objapp.activedocument
call objdft.save() ' colocado antes do nome, para novos arquivos é solicitado corretamente para dar o nome

filename = left(objdft.name, len(objdft.name) - 4)' deriva apenas o nome do arquivo
pathname_1 = "s:\ug\dxf\" ' path file dxf
pathname_2 = "s:\ug\dati\" ' file path pdf

objapp.displayalerts = false 'overwrites files automaticamente com o mesmo nome sem pedir

call objdft.saveas(pathname_1 + filename + ". + "dxf") ' salva pelo nome
call objdft.saveas(pathname_2 + filename + ". + "pdf") ' save by name

objapp.displayalerts = verdadeiras 'reativas mensagens de alerta de janelas

call objdft.close() 'closes the draft file it has just created pdf and dxf
loop até objapp.activedocumenttype <> solidedgeframework.documenttypeconstants. Documento de identificação

se objdft não é nada então
msgbox("nenhum documento aberto!", vbinformation, "atenção")
saída sub
terminar se

não é nada
objapp = nada
fim
módulo final
Obrigado.

Alex
 
de como você estruturado o código que seu loop termina no primeiro não- Projeto de documento que você encontra.
fechar os documentos que você não tem controle sobre o próximo que se torna motivo ativo por que ele poderia acabar antes de devido.

Eu em vez de "fazer - loop" faria um ciclo "para cada" em objapp.documents

Olá.
 
Então uma coisa assim:
Código:
objdft = objapp. documentos
para cada objdft em objapp. documentos
...
...
Próximo
Desta forma, entretanto, eu intercepto todos os documentos, mesmo aqueles que não são dft. Portanto, devo dar-lhe uma instrução para ignorar (ou fechar) todos os arquivos não dft e cuidar de apenas dfts.
Estás a falar a sério?

Obrigado.

Alex
 
Código:
para cada documento em objapp. documentos

se documentar.

set objdft = documento
...

terminar se

próximo documento
 
Muito obrigado.
agora o programa parece funcionar e foi escrito assim:
Código:
módulo do módulo

dim objapp como solidedgeframework. aplicação
dim objdft como sólidoedgedraft.draftdocumento
dim filename como string
dim pathname_1 como string
dim pathname_2 como string

sub principal()
em resumo de erro em seguida

objapp = getobject(, "solidedge.application") ' cria uma aplicação com certas características

se objapp não é nada então
msgbox (a borda sólida não está aberta! borda sólida aberta.", vbcritical, "atenção"
saída sub

elseif objapp.activedocument não é nada então
msgbox("nenhum documento aberto!", vbinformation, "atenção")
saída sub

otherif objapp.document.type <> solidedgeframework.documenttypeconstants.igdraftdocument então
msgbox("nenhum rascunho de documento aberto! abrir um rascunho.
saída sub
terminar se

para cada documento em objapp. documentos' executa o ciclo desde que haja rascunhos abertos

se document.type = solidedgeframework.documenttypeconstants.igdraftdocument então
objdft = documento
call objdft.save() ' colocado antes do nome, para novos arquivos é solicitado corretamente para dar o nome

filename = left(objdft.name, len(objdft.name) - 4)' deriva apenas o nome do arquivo
pathname_1 = "s:\ug\dxf\" ' path file dxf
pathname_2 = "s:\ug\dati\" ' file path pdf

objapp.displayalerts = false 'overwrites files automaticamente com o mesmo nome sem pedir

call objdft.saveas(pathname_1 + filename + ". + "dxf") ' salva pelo nome
call objdft.saveas(pathname_2 + filename + ". + "pdf") ' save by name

objapp.displayalerts = verdadeiras 'reativas mensagens de alerta de janelas
call objdft.close() 'closes the draft file it has just created pdf and dxf
terminar se

próximo documento

não é nada
objapp = nada
fim
módulo final
Você tem algum outro conselho para me dar para tornar o programa mais preciso ou você se sente bem? Eu ainda não tenho muita experiência com programação em emi visual básico gostaria que aquele que tem mais experiência do que eu me dê conselhos para uma boa elaboração de um programa.

Obrigado novamente.

Alex
 
Muito obrigado.
agora o programa parece funcionar e foi escrito assim:
Código:
módulo do módulo

dim objapp como solidedgeframework. aplicação
dim objdft como sólidoedgedraft.draftdocumento
dim filename como string
dim pathname_1 como string
dim pathname_2 como string

sub principal()
em resumo de erro em seguida

objapp = getobject(, "solidedge.application") ' cria uma aplicação com certas características

se objapp não é nada então
msgbox (a borda sólida não está aberta! borda sólida aberta.", vbcritical, "atenção"
saída sub

elseif objapp.activedocument não é nada então
msgbox("nenhum documento aberto!", vbinformation, "atenção")
saída sub

otherif objapp.document.type <> solidedgeframework.documenttypeconstants.igdraftdocument então
msgbox("nenhum rascunho de documento aberto! abrir um rascunho.
saída sub
terminar se

para cada documento em objapp. documentos' executa o ciclo desde que haja rascunhos abertos

se document.type = solidedgeframework.documenttypeconstants.igdraftdocument então
objdft = documento
call objdft.save() ' colocado antes do nome, para novos arquivos é solicitado corretamente para dar o nome

filename = left(objdft.name, len(objdft.name) - 4)' deriva apenas o nome do arquivo
pathname_1 = "s:\ug\dxf\" ' path file dxf
pathname_2 = "s:\ug\dati\" ' file path pdf

objapp.displayalerts = false 'overwrites files automaticamente com o mesmo nome sem pedir

call objdft.saveas(pathname_1 + filename + ". + "dxf") ' salva pelo nome
call objdft.saveas(pathname_2 + filename + ". + "pdf") ' save by name

objapp.displayalerts = verdadeiras 'reativas mensagens de alerta de janelas
call objdft.close() 'closes the draft file it has just created pdf and dxf
terminar se

próximo documento

não é nada
objapp = nada
fim
módulo final
Você tem algum outro conselho para me dar para tornar o programa mais preciso ou você se sente bem? Eu ainda não tenho muita experiência com programação em emi visual básico gostaria que aquele que tem mais experiência do que eu me dê conselhos para uma boa elaboração de um programa.

Obrigado novamente.

Alex
Uma vez que é uma macro que você vai começar a elaborar toda a parte inicial em verificar a existência de borda sólida e um rascunho de documento que você pode evitar.
além disso, você deve evitar usar "no retome de erro em seguida" e gerenciar os vários tipos de erro que podem surgir.

Eu não gosto muito do fato de que você vai fechar os vários rascunhos uma vez que você está salvo, mas eu imagino que seja parte do seu fluxo de trabalho.

Olá.
 

Estatísticas do fórum

Tópicos
58,521
Mensagens
499,056
Membros
104,110
Último membro
ChristianR

Membros online

Nenhum membro online agora.
Voltar
Topo