Poniższy program w języku Perl posłużył do wygenerowania obrazków obecnych w tabelach z opisem związków chemicznych. Program wymaga obecości modułu "Encode" ( powinien być dołączony do dystrybucji perla ) i "Image::Magick" ( może wymagać instalacji pakietu ImageMagick ). Do poprawnego działania skryptu, należy też skopiować do katalogu w którym się on znajduje dwa pliki z czcionką Arial ( arialbd.ttf i arialbi.ttf ), plik z danymi, oraz obrazki znajdujące się w tabelce poniżej.

 Szablon Tabelki:  grafika:Szablon-TableImage.png
 Brak struktury krystalicznej: 
 Struktura heksagonalna: 
 Struktura jednoskośna: 
 Struktura tetragonalna: 
 Struktura trójskośna: 

Program uruchamiamy wydając polecenie ./nazwa_programu. Gotowe obrazki zostaną zapisane w podkatalogu obrazki.

#!/usr/bin/perl

use Encode;
use Image::Magick;

local $la;
local $name;
local $short;
local $u;
local $crystal;
local $type;
local $image;
local $mesh;
local $filename;
#katalog na obrazki
local $dir="obrazki";
#tablica asocjacyjna typów struktury krystalicznej
local %cstruct=('hex'=>'Heksagonalna.png',
                'jed'=>'Jednoskosna.png',
                'rpc'=>'Regularna_przestrzennie_centrowana.png',
                'rsc'=>'Regularna_sciennie_centrowana.png',
                'reg'=>'Regularna.png',
                'rom'=>'Rombowa.png',
                'tet'=>'Tetragonalna.png',
                'tro'=>'Trojskosna.png',
                'brk'=>'Brak.png'
);
#tablica asocjacyna typów związków
local %tstruct=('mal'=>'#FF6666',  #metal alkaliczny
                'mza'=>'#FFDEAD',  #metal ziem alkalicznych
                'lan'=>'#FFBFFF',  #lantanowiec
                'akt'=>'#FF99CC',  #aktynowiec
                'mpz'=>'#FFC0C0',  #metal przejściowy
                'mgg'=>'#CCCCCC',  #metal grup głównych
                'mtd'=>'#CCCC99',  #metaloid
                'nie'=>'#A0FFA0',  #niemetal
                'hal'=>'#FFFF99',  #halogen
                'szl'=>'#A0FFFF'   #gaz szlachetny
);

sub DrawSelection{
  local $startx,$starty;
  local $points;
  #określamy lewy górny róg ramki na podstawie l.a.
  #pierwszy okres
  if ($la==1){
    $startx=0;
    $starty=0;
  }#if
  elsif($la==2){
    $startx=248;
    $starty=0;
  }#elsif
  #drugi okres
  elsif(($la==3)||($la==4)){
    $startx=($la-3)*8;
    $starty=11;
  }#elsif
  elsif(($la>=5)&&($la<=10)){
    $startx=($la-5)*8+208;
    $starty=11;
  }#elsif
  #trzeci okres
  elsif(($la==11)||($la==12)){
    $startx=($la-11)*8;
    $starty=22;
  }#elsif
  elsif(($la>=13)&&($la<=18)){
    $startx=($la-13)*8+208;
    $starty=22;
  }#elsif
  #czwarty okres
  elsif(($la==19)||($la==20)){
    $startx=($la-19)*8;
    $starty=33;
  }#elsif
  elsif(($la>=21)&&($la<=36)){
    $startx=($la-21)*8+128;
    $starty=33;
  }#elsif
  #piąty okres
  elsif(($la==37)||($la==38)){
    $startx=($la-37)*8;
    $starty=44;
  }#elsif
  elsif(($la>=39)&&($la<=54)){
    $startx=($la-39)*8+128;
    $starty=44;
  }#elsif
  #szósty okres
  elsif(($la>=55)&&($la<=86)){
    $startx=($la-55)*8;
    $starty=55;
  }#elsif
  #siódmy okres
  elsif(($la>=87)&&($la<=118)){
    $startx=($la-87)*8;
    $starty=66;
  }#elsif
  #tworzymy ciąg współrzędnych
  $points=sprintf("%i,%i %i,%i %i,%i %i,%i %i,%i",$startx,$starty,$startx+8,
                  $starty,$startx+8,$starty+11,$startx,$starty+11,$startx,
                  $starty);
  $image->Draw(primitive=>'polyline',bordercolor=>'black',points=>$points,
               antialias=>'false');
}#DrawSelection


mkdir("$dir");
open(FILE,'data.txt');
$line=readline(FILE);
while ($line!=""){
  #usuwamy spacje i znak końca linii
  $line=~s/\ //g;
  $line=~s/\n//g;
  #wydobywamy dane
  ($la,$name,$short,$u,$crystal,$type)=split('-',$line);
  #tworzymy nowy obrazek z szablonu
  $image=Image::Magick->new;
  $image->ReadImage('Szablon-TableImage.png');
  #rysujemy ramkę
  DrawSelection();
  #wypisujemy nazw
  $name=decode("iso-8859-2",$name);
  $image->Annotate(font=>'arialbi.ttf',pointsize=>15,fill=>'black',
                   text=>$name,align=>'Center',x=>163,y=>25);
  #dodajemy obrazek z typem struktury krystalicznej
  $mesh=Image::Magick->new;
  $mesh->ReadImage($cstruct{$crystal});
  $image->Composite(image=>$mesh,compose=>'Over',x=>18,y=>(54-$mesh->Get('height')));
  undef $mesh;
  #dodajemy opis związku w prostokącie
  $image->Draw(primitive=>'rectangle',bordercolor=>'black',fill=>'black',
               points=>'72,4 111,51',antialias=>'false');
  $image->Draw(primitive=>'rectangle',bordercolor=>$tstruct{$type},
               fill=>$tstruct{$type},points=>'73,5 110,50',
               antialias=>'false');
  #symbol
  if (length($short)<=2){
    $image->Annotate(font=>'arialbd.ttf',pointsize=>22,fill=>'black',
                     text=>$short,align=>'Right',x=>106,y=>37);
  }#if
  else{
    $image->Annotate(font=>'arialbd.ttf',pointsize=>18,fill=>'black',
                     text=>$short,align=>'Right',x=>109,y=>35);
  }#else
  #l.a.
  $image->Annotate(font=>'arialbd.ttf',pointsize=>10,fill=>'black',
                   text=>$la,align=>'Left',x=>76,y=>48);
  #masa atomowa
  $image->Annotate(font=>'arialbd.ttf',pointsize=>10,fill=>'black',
                   text=>$u,align=>'Center',x=>93,y=>16);
  #zapisujemy nowy obrazek
  $filename=sprintf("%s/%s-TableImage.png",$dir,$short);
  printf("Tworzę %s\n",$filename);
  $image->Write(filename=>$filename);
  undef $image;
  $line=readline(FILE);
}#while
close(FILE);


Witaj

Uczę się języka hebrajskiego. Tutaj go sobie utrwalam.

Źródło

Zawartość tej strony pochodzi stąd.

Odsyłacze

Generator Margonem

Podziel się