pessoal estou precisando ler um dxf e montar ele em algo visual. Escolhi o java 2D mas não sei nada dele alguem pode me ajudar?
como fazer um quadrado no java 2D? Ele é em applet? alguma luz,dicas obrigado.
[RESOLVIDO]Java 2D ------> HTML5
36 Respostas
Veja os seguintes artigos do ponto V!
Escolhendo onde desenhar
Conhecendo o JFrame
Uma visão rápida sobre o Java 2D
Pintando no java 2D
O fantasma do Pacman
Trabalhando com imagens
Se precisar fazer algo animado, veja também:
O loop de animação
A primeira animação
Desenho direto - Active Rendering
Outra boa fonte é o livro Killer Game Programming in Java, disponível online em:
http://fivedots.coe.psu.ac.th/~ad/jg/
vlw @ViniGodoy
vou querer usar em applet mesmo tem algum exemplo tbm de applet?
Sim, no primeiro artigo “escolhendo onde desenhar”.
O resto é tudo igual.
Basta sobrescrever o paint do JApplet, ao invés do paint do JFrame. Mas tudo que funciona pra um, funciona também para o outro.
Veja os seguintes artigos do ponto V!
O fantasma do Pacman
Se eu tivesse lido esse artigo a uns 2 anos atrás meu fantasma do pacman não seria uma bola vermelha horrorosa…
Até o pacman desenhei bonitinho, usei coordenadas polares pra definir os pontos, tudo ficou desenhado bonitinhamente… mas o fantasma ficou uma bola mesmo UHAUHAuhahuAuhA
Sim, no primeiro artigo “escolhendo onde desenhar”.
O resto é tudo igual.
Basta sobrescrever o paint do JApplet, ao invés do paint do JFrame. Mas tudo que funciona pra um, funciona também para o outro.
nesse artigo não possui “como” no netbeans crio uma aplicaçaõ web e crio a classe de applet ou crio um projeto separado para o applet e depois importo ele em um outro projeto?
Não. Os artigos referem-se à linguagem Java, não à IDEs específicas.
Mas isso não deve ser muito difícil de descobrir.
tem como vc me dar um exemplo de um applet que apenas desenha 1 linha reta?
eu tive olhando o .class da applet tem que estar na mesmo diretorio do jsp mas como fazer ele pegar o .class em outro diretorio pois na programação mesmo é feita no .java que esta em um pacote
Cara, segue um tutorial de como fazer um applet primeiro, depois tente com Java2D.
é porque eu uso netbeans e não da pra por uma classe no diretorio do html ele cai para o pacote padrão. ao rodar a aplicação web da erro no applet e fica tudo preto porque na verdade o .class gerado fica em
eu estou com um html de teste com o <applet e um projeto no netbeans basico apenas com classes ao dar F9 pego o .class e jogo na pasta do html e ta funcionando o problema é demora para testar todo hora mas vamos lá…
estou tendo problemas em antalias o 2D ja tem? eu vi uma classe de terceiro que cria até 4 niveis de antialias
por exemplo
g.drawLine(10,10,300,0);//geraria uma linha cerrilhada pois não é reta. Como posso aplicar antialias nessa linha?
em qual ambiente de desenvolvimento vocês usam para programar os applets e testar no browser ou em algum visualizador?
isso meu ajudou muito
Eu programo no Eclipse. Ele te um visualizador (usa o do próprio java).
E as vezes ponho no browser também para ver como está ficando.
ja estou avançado na leitura do arquivo DXF agora é so por pra desenhar no metodo paint
@Override
public void paint(Graphics g) {
List<ArrayList> a = lista;
for (int i = 0; i < a.size(); i++) {
if (a.get(i).get(0).toString().equals("LINE")) {
g.drawLine(Integer.parseInt(a.get(i).get(1).toString()),
Integer.parseInt(a.get(i).get(2).toString()),
Integer.parseInt(a.get(i).get(3).toString()),
Integer.parseInt(a.get(i).get(4).toString()));
}
}
}
pergunto:
o dxf trabalha com valores flutuantes exemplo 0.00000000000000
a maiorira dos metodos que eu vi do draw recebe int!! qual metodo devo trabalhar para montar uma linha,circulo etc… com valores flutuantes?
Você leu os artigos que te indiquei?
Pelo visto não, pois dá para ver que você ainda nem sequer está fazendo a cópia do contexto gráfico.
O java 2D fornece um método chamado draw(Shape). Ele permite que você desenhe uma forma.
Entre essas formas está a classe Line2D. Que pode ser instanciada com precisão de Double ou Float:
Line2D linha = new Line2D.Float(10.2f, 11.5f, 15.2f, -11.5f);
graphics.draw(linha);
Recomendo fortemente que você leia os artigos e dê uma boa estudada no funcionamento do Java2D, antes de sair desenhando. É uma boa prática conhecer a API que você usa.
Os artigos que te enviei explicam como usar essas classes. Há exemplos no artigo do fantasma do pacman.
opa deu certo
public void paint(Graphics g) {
List<ArrayList> a = lista;
for (int i = 0; i < a.size(); i++) {
if (a.get(i).get(0).toString().equals("LINE")) {
Graphics2D g2d = (Graphics2D) g.create();
Line2D linha = new Line2D.Float(Float.parseFloat(a.get(i).get(1).toString()),
Float.parseFloat(a.get(i).get(2).toString()),
Float.parseFloat(a.get(i).get(3).toString()),
Float.parseFloat(a.get(i).get(4).toString()));
g2d.draw(linha);
g2d.dispose();
}
}
}
Melhor fazer uma cópia só:
public void paint(Graphics g) {
List<ArrayList> a = lista;
Graphics2D g2d = (Graphics2D) g.create();
for (int i = 0; i < a.size(); i++) {
if (a.get(i).get(0).toString().equals("LINE")) {
Line2D linha = new Line2D.Float(Float.parseFloat(a.get(i).get(1).toString()),
Float.parseFloat(a.get(i).get(2).toString()),
Float.parseFloat(a.get(i).get(3).toString()),
Float.parseFloat(a.get(i).get(4).toString()));
g2d.draw(linha);
}
}
g2d.dispose();
}
Por que sua lista não é de floats? Não é ruim ficar fazendo parse a cada iteração do loop?
porque na 1° posição eu tenho uma string com o tipo de objeto (linha, arco etc…)
deixa eu te perguntar.
por exemplo no dxf tem uma linha que vai de 0 a 800 mas como definir isso no palco do applet
como definir o tamnho do palco do applet para poder calcular (ajustar) porque vai ter que redimencionar
para poder caber . alguma dica?
da uma ollhada tbm no anti alias
@Override
public void paint(Graphics g) {
List<ArrayList> a = lista;
Graphics2D g2d = (Graphics2D) g.create();
for (int i = 0; i < a.size(); i++) {
if (a.get(i).get(0).toString().equals("LINE")) {
Line2D linha = new Line2D.Double(Double.parseDouble(a.get(i).get(1).toString())/2,
Double.parseDouble(a.get(i).get(2).toString())/2,
Double.parseDouble(a.get(i).get(3).toString())/2,
Double.parseDouble(a.get(i).get(4).toString())/2);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.draw(linha);
}
}
g2d.dispose();
}
me ajuda a definir a scala da imagem
por exemplo se eu tenho um pauco de 593x567
e recebo uma imagem de 1200x900
vou ter que calcular tudo
será que não tem como eu receber o valor normal desenhar e depois tipo dar um zoom afastando os elementos?
Eu ainda criaria uma classe para armazenar isso.
Com um enum para o tipo do objeto.
E uma lista com as coordenadas.
Evitar casts e conversões assim é sempre uma boa política. Se você for desenhar muitos pontos, isso vai acabar com sua performance. Faça a conversão uma vez só, na hora da leitura.
O applet tem os métodos getWidth() e getHeigth(). O objeto Graphics() também tem o método getClipRect(). Eles te retornam as dimensões da área de pintura.
E a dica que eu dou é que vc leia os artigos que te passei com cuidado, pq isso também está explicado por lá.
Use para isso a classe AffineTransform. Ela pode fazer o zoom para você.
ok parece que deu certo
@Override
public void paint(Graphics g) {
List<ArrayList> a = lista;
Graphics2D g2d = (Graphics2D) g.create();
//Scala de zoom out
AffineTransform af = new AffineTransform();
af.scale(3,3);
try {
af.invert();
} catch (NoninvertibleTransformException ex) {
Logger.getLogger(ViewerApplet.class.getName()).log(Level.SEVERE, null, ex);
}
for (int i = 0; i < a.size(); i++) {
if (a.get(i).get(0).toString().equals("LINE")) {
Line2D linha = new Line2D.Double((Double.parseDouble(a.get(i).get(1).toString()) +10),
(Double.parseDouble(a.get(i).get(2).toString()) +10),
(Double.parseDouble(a.get(i).get(4).toString()) +10),
(Double.parseDouble(a.get(i).get(5).toString()) +10));
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setTransform(af);
g2d.draw(linha);
}
}
g2d.dispose();
}
Você também pode setar os rendering hints uma única vez, logo depois de usar o create().
vlw coloquei la em cima
qual melhor compoenete para fazer um arco de meu dxf
ele vem com os seguintes atributos
1-ponto central x
2-ponto central y
3-raio
4-anglo inicial
5-anglo final
sei que tem o Arc2D arco = new Arc2D.Double
mas não consegui montalo pois os parametros é diferente como por exemplo Arc2D.OPEN que vc explicou no tutorial
esse componente mesmo qeu devo usar ou outro?
a documentação dele é boa
http://java.sun.com/j2se/1.4/pdf/j2d-book.pdf
vi que o arc do java 2d é bem parecido só que ele não recebe como parametro o raio e sim width e height
como posso calcular então?
Arc2D arco = new Arc2D.Double((Double.parseDouble(a.get(i).get(1).toString())),//StartX,
(Double.parseDouble(a.get(i).get(2).toString())),//StartY,
(50),//Width //<--------- eu tenho o raio
(50),//Height, //<--------- eu tenho o raio
(Double.parseDouble(a.get(i).get(5).toString())),//startAngle
(Double.parseDouble(a.get(i).get(6).toString())),//endAngle
Arc2D.OPEN);

outra duvida seria que o dxf ler e monta o x e y de baixo pra cima e o applet de cima pra baixo daí tudo fica inverso no meu desenho. temo como espelhar esse desenho ou fazer com que o applet leia de baixo pra cima?
} else if (a.get(i).get(0).toString().equals("ARC")) {//<---------- o arco que ta me dando dor de cabeça
Arc2D arco = new Arc2D.Double((Double.parseDouble(a.get(i).get(1).toString()) +10),//StartX,
(Double.parseDouble(a.get(i).get(2).toString()) +10),//StartY,
(Double.parseDouble(a.get(i).get(4).toString())*2),//Width raio*2 //na especificação diz que tem que passar o tamanho daí tenho o raio 2 vezes que é width!
(Double.parseDouble(a.get(i).get(4).toString())*2),//Height, raio*2
(Double.parseDouble(a.get(i).get(5).toString())),//startAngle //-<<<<< aqui que parece que ta doido
(Double.parseDouble(a.get(i).get(6).toString())),//endAngle
Arc2D.OPEN);////vi outros tipo também aqui o melhor que ficou foi o Open
//g2d.setTransform(af);
//g2d.setStroke(bsThick);
g2d.setPaint(Color.red);
g2d.draw(arco);
} else if (a.get(i).get(0).toString().equals("CIRCLE")) {//<----------circulo e linha ta beleza
Ellipse2D.Double circle = new Ellipse2D.Double((Double.parseDouble(a.get(i).get(1).toString()) +10),
(Double.parseDouble(a.get(i).get(2).toString()) +10),
(Double.parseDouble(a.get(i).get(4).toString()))*2, // <--------- calculei que o raio é 5 então o width dele é 2 x o raio
(Double.parseDouble(a.get(i).get(4).toString()))*2);<--------- calculei que o raio é 5 então o height dele é 2 x o raio
//g2d.setTransform(af);
//g2d.setStroke(bsThick);
g2d.setPaint(Color.BLUE);
g2d.draw(circle);
}
@ViniGodoy tem como me ajudar a fechar aquele arco igual da primeira figura?
Cara, tenho que pedir para você ler de novo os artigos que te passei? Você chegou a ler?
Leia a parte “Definindo a forma do corpo”.
http://www.pontov.com.br/site/index.php/java/48-java2d/107-o-fantasma-do-pacman
Aliás, aproveita e lê o artigo todo, e os outros também.
ok
como minha aplicação é web optei por usar HTML é bem mais facil e adaptou muito bem pra ler DXF visto que as funções são bem iguais
http://srcware.com/programacao/html-5-introducao-a-tag-canvas/
no html 5 usei igual eu estava usando no applet java2D e no html5 funcionou (Math.PI/180)* angloinicial e (Math.PI/180)* anglofinal mas no java2D é diferente o ARC. que pena.
mas no html5 da pra fazer de tudo que preciso. inclusive scale, rotate, zoom, etc…
no html 5 usei igual eu estava usando no applet java2D e no html5 funcionou (Math.PI/180)* angloinicial e (Math.PI/180)* anglofinal mas no java2D é diferente o ARC. que pena.
mas no html5 da pra fazer de tudo que preciso. inclusive scale, rotate, zoom, etc…
É pq vc devia ter usado a função Curve, não a Arc. Como explicam os tutoriais.
Essa história de tentar programar por tentativa e erro não dá certo mesmo.
É pq vc devia ter usado a função Curve, não a Arc. Como explicam os tutoriais.
obrigado!!!
Essa história de tentar programar por tentativa e erro não dá certo mesmo.
eu li bastante coisa e li os tutoriais mas uma coisa que é simples para você para mim não seja
concordo que brutalforce não é viavel mas estou sem tempo e o HTML5 foi bastante intuitivo e eficaz
incusive é bem parecido com api java2D
obrigado por todas as ajudas! 
