Criando uma janela de Salvar no Processing

15 views
Skip to first unread message

Guilherme Vieira

unread,
Aug 10, 2020, 10:53:05 AM8/10/20
to processing-brasil
Olá pessoal, tudo certo?

Alguém por aqui já fez uma aplicação em Processing com uma janela de salvar arquivo tradicional?

To tentando entender como fazer isso através da referência do Processing, mas está um pouco confuso para mim.

Dando um pouco mais de contexto, a aplicação em questão gera um SVG, e queria algo similar ao que o p5.js faz ao gerar uma saída quando o usuário não definiu uma pasta padrão no browser. Ele abre uma janela de salvar do sistema já com nome sugerido de arquivo e a pessoa só escolhe o local e clica em salvar.

Se alguém tiver alguma dica, agradeço!

Abraços

Guilherme Vieira
guilhermevieira.info
55 11 97590 9639

Sergio Venancio

unread,
Aug 10, 2020, 11:11:06 AM8/10/20
to processing-brasil
Opa Guilherme, é Processing Java?




--
Você recebeu essa mensagem porque está inscrito no grupo "processing-brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para processing-bra...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/processing-brasil/CAMfe_3_aPM8QYjq4-kx6zzHTmnTNDqYoN-jmQOLh1e1AX7P7WA%40mail.gmail.com.

Alexandre B A Villares

unread,
Aug 10, 2020, 11:18:37 AM8/10/20
to Sergio Venancio, processing-brasil
Salve Guilherme!

É um pouco confuso, o tradicional é usar uma função que é chamada por um call-back.
Você define uma função funcaoSalvar que realmente vai salvar o arquivo (ela recebe o nome do arquivo a ser salvo como parâmetro, ou null/None se foi cancelada a janela), e você chama ela indiretamente com   selectOutput("Salvar como:", "funcaoSalvar")

Tenho um exemplo em Processing Python aqui mas posso converter pra Java se você quiser:

Abraços,
Alexandre

Alexandre B A Villares

unread,
Aug 10, 2020, 12:35:37 PM8/10/20
to Sergio Venancio, processing-brasil
Fiz aqui um exemplo mínimo no Java:

import processing.svg.*;
boolean saveFrame = false;
PGraphics output;
float fatorEscala = 3;

void setup() {
  size(400, 400);
}

void draw() {
  if (saveFrame) {
    beginRecord(output);
    output.scale(fatorEscala);
  }
 
  // Desenho aqui
  background(200, 255, 255);
  rect(100, 100, 100, 100);

  if (saveFrame) {
    endRecord();
    saveFrame = false;
  }
}

void salvaSVG(File selection) {
   if (selection == null) {
    println("Salvar cancelado.");
  } else {
    println("Salvando em: " + selection.getAbsolutePath());
    output =  createGraphics(int(width * fatorEscala),
                                int(height * fatorEscala),
                                SVG, selection.getAbsolutePath());
    saveFrame = true;
  }
}

void keyPressed() {
  if (key == 's') {
    selectOutput("Salvar:", "salvaSVG");
  }
}

Sergio Venancio

unread,
Aug 10, 2020, 1:05:11 PM8/10/20
to Alexandre B A Villares, processing-brasil
Boa Alexandre!

Eu tinha entendido que o Guilherme queria já abrir o dialog com o nome do arquivo pronto, só escolher a pasta. Parece que o selectOutput tem mais parâmetros além desses dois, mas não está documentado... um deles é do tipo File, será que é isso?

Alexandre Villares

unread,
Aug 10, 2020, 1:56:51 PM8/10/20
to processing-brasil
Verdade, tem sim esses parâmetros mal documentados.
Eu nunca consegui fazer funciona até hoje! Com o incentivo de vocês eu fucei mais um pouquinho e lá vai:


void keyPressed() {
  if (key == 's') {
    File sugestao = new File("teste.svg");
    selectOutput("Salvar:", "salvaSVG", sugestao);
  }
}


Só para ficar completo, o exemplo no Modo Python, o lance da sugestão eu nunca tinha conseguido pq precisa importar a classe File do Java :O

add_library('svg')

save_frame = False
fator_escala = 3

def setup():
    size(400, 400)

def draw():
    global save_frame
    if (save_frame):
        beginRecord(output)
        output.scale(fator_escala)    
   
    # Desenho aqui

    background(200, 255, 255)
    rect(100, 100, 100, 100)

    if save_frame:
        endRecord()
        save_frame = False

def salvaSVG(selection, ):
     if selection == None:

        println("Salvar cancelado.")
     else:
        println("Salvando em: " + selection.getAbsolutePath())
        output = createGraphics(int(width * fator_escala),
                                int(height * fator_escala),
                                SVG, selection.getAbsolutePath())
        save_frame = True
   
def keyPressed():
    if key == 's':
        from java.io import File
        sugestao = File("exemplo.svg")

Alexandre Villares

unread,
Aug 10, 2020, 4:01:57 PM8/10/20
to processing-brasil
Faltou a última linha do exemplo em Python...

def keyPressed():
    if key == 's':
        from java.io import File
        sugestao = File("exemplo.svg")

Guilherme Vieira

unread,
Aug 10, 2020, 6:36:40 PM8/10/20
to Alexandre Villares, processing-brasil
Fala pessoal, tudo certo?

Sergio, obrigado pelo link! Sempre esqueço de consultar a própria do Java quando estou no Processing!

Alexandre, teu código ajudou muito! Só tive que fazer algumas modificações por que estou gerando um SVG a partir de um desenho 3D, e ai tenho que usar o beginRaw() ao invés do beginRecord.

Não sei se fiz da melhor maneira, mas basicamente criei uma variável global pra guardar o caminho escolhido pelo usuário e uso ela na hora de começar a gravar com o beginRaw().

Segue minha adaptação:

import processing.svg.*;
boolean saveFrame = false;
PGraphics output;
String caminhoSaida;

void setup() {
  size(400, 400, P3D);
}

void draw() {
  if (saveFrame) {
    beginRaw(SVG, caminhoSaida);
  }

  // Desenho aqui
  background(200, 255, 255);
  translate(width/2, height/2);
  rotateX(0.6);
  box(50);

  if (saveFrame) {
    endRaw();

    saveFrame = false;
  }
}

void salvaSVG(File selection) {
  if (selection == null) {
    println("Salvar cancelado.");
  } else {
    println("Salvando em: " + selection.getAbsolutePath());
    caminhoSaida = selection.getAbsolutePath();
    saveFrame = true;

  }
}

void keyPressed() {
  if (key == 's') {
    File sugestao = new File("teste.svg");
    selectOutput("Salvar:", "salvaSVG", sugestao);
  }
}

Abraços!

Guilherme Vieira
guilhermevieira.info
55 11 97590 9639

--
Você recebeu essa mensagem porque está inscrito no grupo "processing-brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para processing-bra...@googlegroups.com.

Alexandre B A Villares

unread,
Aug 10, 2020, 8:40:06 PM8/10/20
to Guilherme Vieira, processing-brasil
Show! Muito bom!

Rola normal o beginRaw endRaw com o PGraphic como saída também viu, testei aqui.
3D é uma pena que tem limitações chatas né? Comento aqui ó:

Alexandre B A Villares

unread,
Aug 14, 2020, 4:24:24 PM8/14/20
to Guilherme Vieira, processing-brasil
Gente,

Lembrei de comentar uma coisa, em todas essas funções de consulta do usuário pra escolher um arquivo ou pasta (para ler ou escrever), que usam essa estratégia "call back", o Processing roda um fio de execução separado (thread), o que permite que alguma animação continue acontecendo no draw, por exemplo (eu comento sobre isso aqui: https://abav.lugaralgum.com/material-aulas/Processing-Python/imagens_externas_pasta.html)

Mas *fiquem atentos*  que erros durante a execução nessas funções são silenciados!
Não sei os detalhes, mas parece ser alguma captura de exceções especial (acho que é para evitar que apareçam erro de File IO, tipo disco cheio, falta de permissões, essas coisas...). Então fiquem espertos, a função para, mas não aparece mensagem de erro!

Abraços,
Alexandre

---



Reply all
Reply to author
Forward
0 new messages