• Publicidad

Dibujar con GD::Simple array multidimensional

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-03-18 11:49 @534

Hola, compañeros Perleros, ¿qué tal? Pues nuevamente con un problema de programación (¡ja, ja, ja!) Les platico un poco, ya que no he encontrado la manera de hacer esto.

Tengo un script que me genera una imagen de una tabla con una lista de números y la dibujo con GD::Simple.

Lo que quiero hacer es ordenar estos datos de manera que el primer grupo se escriba en forma de lista y al terminar ese grupo de datos escriba el siguiente a su lado derecho en forma de lista también.

Les pongo un ejemplo:

Este es el array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @noSerie = (['6764A10','6765A10','6766A10', '6767A10'],['6854B01','6855B01','6856B01']);
  2.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

y quiero mostrarlo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Tabla1

Dato1            Dato2

6764A10       6854B01
6765A10       6855B01
6766A10       6856B01
6767A10
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Cuando es un array de una sola dimensión no tengo problemas en enlistar. El problema es cuando es multidimensional ya que primero quiero escribir en "y" y luego en "x" siguiendo "y".

Utilizo lo siguiente para arrays de una dimensión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ini = 100;
  2. my @Prod = ('Tornillos', 'Clavos');
  3.  foreach(@Prod){
  4.     $img->moveTo($ini, 25); #(x,y)
  5.     $img->string($_);
  6.     $ini= $ini+50;
  7.  }
  8.  
  9. my $ini2 = 40;
  10. my @item = (1..5);
  11.  foreach(@item){
  12.     $img->moveTo(20, $ini2); #(x,y)
  13.     $img->string($_);
  14.     $ini2= $ini2+20;
  15.  }
  16.  
  17. open my $fh, ">listaProductos.png";
  18. binmode $fh;
  19. print $fh $img->png;
  20. close $fh;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y el resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
       Tornillos           Clavos

1

2

3

4

5
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sé que parece un poco confusa mi manera de explicar (incluso para mi misma :oops: ) pero básicamente es el problema que tengo... Lo hice de está manera y no con un módulo para generar tablas porque lo necesito así con GD. Y que la salida sea una imagen png.

Espero que puedan ayudarme.

Saludos.
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Publicidad

Re: Dibujar con GD::Simple array multidimensional

Notapor explorer » 2015-03-18 14:38 @651

Bueno, no veo problemas en leer por filas o por columnas, e ir colocando los elementos en la posición donde corresponde.

Quiero decir, que si estamos en el elemento (i,j), la posición que ocupará en el gráfico será

x = baseX + i * w;
y = baseY + j * h;

siendo

baseX = desplazamiento horizontal en pixel de la primera columna
baseY = desplazamiento vertical en pixel de la primera fila
w = pixel de separación entre columnas
h = pixel de separación entre filas
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-03-18 15:09 @673

Ok, entiendo el análisis que hace, pero no veo cómo aplicarlo a la programación, puesto que los movimientos los realizo con un foreach.
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Dibujar con GD::Simple array multidimensional

Notapor explorer » 2015-03-18 16:15 @718

Puedes recorrer la estructura bidimensional por medio de coordenadas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3.  
  4. my @noSerie = (
  5.     ['6764A10','6765A10','6766A10','6767A10'],
  6.     ['6854B01','6855B01','6856B01'],
  7. );
  8.  
  9. my $Dato = 'Dato1';
  10.  
  11. ## Averiguar el número de filas a pintar (ver el máximo de datos por columna)
  12. my $maxFilas = 0;
  13.  
  14. for my $columna (@noSerie) {
  15.     if ($maxFilas < @$columna) {
  16.         $maxFilas = @$columna;
  17.     }
  18. }
  19.  
  20. #print "Número máximo de filas: $maxFilas\n";
  21.  
  22. ## Salida de la tabla
  23. print " Tabla1\n";
  24.  
  25. printf "%-10s", $Dato++ for @noSerie;
  26. print "\n\n";
  27.  
  28. for my $fila (0 .. $maxFilas-1) {
  29.  
  30.     for my $columna (0 .. @noSerie-1) {
  31.  
  32.         printf "%-10s", $noSerie[$columna][$fila];
  33.     }
  34.     print "\n";
  35. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En este caso, hay un doble bucle de $fila y $columna (que van de 0 al valor máximo de cada fila y columna). Con esas coordenadas ya puedes colocar los elementos en su posición.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-03-18 17:42 @779

Ok, pero si los datos resultantes quiero ponerlos como $img->string() y no mostrar en printf.
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Dibujar con GD::Simple array multidimensional

Notapor explorer » 2015-03-18 21:02 @918

Calcula las posiciones que darás a moveTo() a partir de los datos de $fila y $columna...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-03-24 09:21 @431

¡Cierto! funciona correctamente :oops:

Ahora tengo un inconveniente, ya que no he logrado crear otro array multidimensional de manera dinámica.

Lo que busco es crear varios arrays donde algunos de sus elementos sean iguales y crear otro array de esos arrays.

Tengo el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  
  2. my @array = ('64A10|F/I','65A10|F/I','66A10|B/A','67A10|B/A','54B01|C/I');
  3.  
  4. foreach(@array){
  5.     @row = split(/\|/, $_ );
  6.     push(@table, [@row]);            
  7. }
  8.  
  9. my @Series;
  10. my %hash;
  11. my @filas = @table;  
  12. foreach my $a (@filas) {
  13.     $hash{$a->[1]}++;          
  14.     push(@Series, [$a->[0]]);
  15. }
  16.  
  17. #Verificar ocurrencias
  18. foreach my $a (keys %hash) {
  19.     print "$a aparece $hash{$a} veces\n";
  20. }
  21.  
  22.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


A lo que me da la siguiente información:

C/I aparece 1 veces
B/A aparece 2 veces
F/I aparece 2 veces

pero ¡no estoy agrupando correctamente los datos! :(

Y quiero que mi estructura o array quede así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = [
          '64A10',
          '65A10'
        ];
$VAR2 = [
          '66A10',
          '67A10'
        ];
$VAR3 = [
          '54B01'
        ];
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-03-24 13:24 @600

Bueno, ya logré agrupar los datos, ahora cada grupo quiero ponerlo en un array multidimensional, o sea que cada grupo sea un array y todos estos arrays ponerlos en un array.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dato;
  2. foreach(@table){
  3.     push(@{$dato->{descripcion}->{$_->[1]}}, $_->[0]);
  4. }
  5.  
  6. # Lo pasó a un array pero no como grupos
  7. my @SeriesEmb = values %$dato;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-03-24 13:34 @607

¡Listo! pude asignar de la siguiente manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @SeriesEmb = sort(values %{$dato->{descripcion}});
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-03-24 15:50 @701

Una última duda.... ¿Cómo puedo hacerle para que al momento de posicionar o dibujar no me quite el primer elemento del primer array?

Hago esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @array = ( '64A10|F/I', '65A10|F/I', '66A10|B/A', '67A10|B/A', '54B01|C/I' );
  2.  
  3. foreach (@array) {
  4.     @row = split( /\|/, $_ );
  5.     push( @table, [@row] );
  6. }
  7.  
  8. my $dato;
  9. foreach (@table) {
  10.     push( @{ $dato->{descripcion}->{ $_->[1] } }, $_->[0] );
  11. }
  12. my @noSerie = sort( values %{ $dato->{descripcion} } );
  13.  
  14. ###dibujo los números de serie
  15.  
  16. my $img = GD::Simple->new( 800, 1308 );
  17.  
  18. my $maxFilas = 0;
  19.  
  20. for my $columna (@noSerie) {
  21.     if ( $maxFilas < @$columna ) {
  22.         $maxFilas = @$columna;
  23.     }
  24. }
  25. my $initY = 122;
  26. my $initX = 65;
  27. my ( $x, $y );
  28. for my $fila ( 0 .. $maxFilas - 1 ) {
  29.     for my $columna ( 0 .. @noSerie - 1 ) {
  30.         $img->moveTo( $x, $y );                #(x,y)
  31.         $img->string( $noSerie[$columna][$fila] );
  32.         $x = $initX + $columna * 100;
  33.         $y = $initY + $fila * 20;
  34.     }
  35. }
  36.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero siempre me quita el primer elemento, ¿cómo hago para que respete todos los datos, o bien agregar un elemento vacío al inicio del array y así no afecte el primer elemento?
Última edición por explorer el 2015-03-24 15:58 @707, editado 2 veces en total
Razón: Como => Cómo; como => ¿cómo; Formateado con perltidy;
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados