#!/usr/bin/perl # shapemagick host.shape use XML::TreePP; use Data::Dumper; use Image::Magick; $Data::Dumper::Indent=1; my $tpp = XML::TreePP->new(); my $tree = $tpp->parsefile( shift ); my $point = {}; my $lineprim=[]; my $scale=".10"; my $render=1; my $object= { 'height' => 3 }; # M0 568 L617 0 L6231 0 L5613 568 L0 568 Z # M29 542 L594 21 L6209 21 L5613 568 L29 568 L29 542 Z # M0 568 L5658 568 L5658 4993 L0 4993 Z # M29 568 L5656 568 L5656 4991 L29 4991 L29 568 Z # M5613 4950 L6231 4336 L6231 0 L5613 568 L5613 4950 Z # M5613 4950 L6231 4336 L6231 21 L6209 21 L5613 568 L5613 4950 L5613 4950 Z $point->{'current'} = { 'x' => 0, 'y' => 0 }; $point->{'previous'} = { 'x' => 0, 'y' => 0 }; $point->{'max_x'}=0; $point->{'max_y'}=0; $point->{'border'}=100; foreach my $line (@{ $tree->{'shape'}->{'svg:svg'}->{'svg:path'} }){ my $svgseg=$line->{'-d'}; while(length($svgseg)>0){ if($svgseg=~m/^(M([0-9]+)\s+([0-9]+)).*/){ if($2>$point->{'max_x'}){ $point->{'max_x'} = $2 }; if($3>$point->{'max_y'}){ $point->{'max_y'} = $3 }; my $bordered_x=($2*$scale)+$point->{'border'}; my $bordered_y=($3*$scale)+$point->{'border'}; $point->{'current'} = { 'x' => $bordered_x, 'y' => $bordered_y }; $point->{'previous'} = $point->{'current'}; $svgseg=~s/^$1//; }elsif($svgseg=~m/^(L([0-9]+)\s+([0-9]+)).*/){ my $bordered_x=($2*$scale)+$point->{'border'}; my $bordered_y=($3*$scale)+$point->{'border'}; $point->{'current'} = { 'x' => $bordered_x, 'y' => $bordered_y }; push( @{ $lineprim }, { 'points'=> $point->{'previous'}->{'x'}.",".$point->{'previous'}->{'y'}." ". $point->{'current'}->{'x'}.",".$point->{'current'}->{'y'} } ); #print "Line from $point->{'previous'}->{'x'}, $point->{'previous'}->{'y'} to $point->{'current'}->{'x'}, $point->{'current'}->{'y'}\n"; $point->{'previous'} = $point->{'current'}; if($2>$point->{'max_x'}){ $point->{'max_x'} = $2 }; if($3>$point->{'max_y'}){ $point->{'max_y'} = $3 }; $svgseg=~s/^$1//; }elsif($svgseg=~m/^Z/){ #print "Close Segment.\n"; $svgseg=""; }else{ print "I don't know what to do with $svgseg:\n"; $svgseg=""; } } #print "$svgseg\n"; } if($point->{'max_x'} > $point->{'max_y'}){ print "x:y ratio: ".(int(($point->{'max_x'}/$point->{'max_y'})*10000)/10000).":".$point->{'max_y'}/$point->{'max_y'}."\n"; }else{ print "x:y ratio: ".(int(($point->{'max_x'}/$point->{'max_x'})*10000)/10000).":".$point->{'max_y'}/$point->{'max_x'}."\n"; } my $cmperpixel= $object->{'height'} / $point->{'max_y'}; $object->{'width'}=$point->{'max_x'}*$cmperpixel; print "rectangle: from 0,0 to $point->{'max_x'},$point->{'max_y'}\n"; my $counter=0; foreach my $conn (@{ $tree->{'shape'}->{'connections'}->{'point'} }){ my $con_x=($conn->{'-x'}/$point->{'max_x'})*$object->{'width'}; my $con_y=($conn->{'-y'}/$point->{'max_y'})*$object->{'height'}; my $conpt=$con_x.",".$con_y; print "$conpt\n"; my $textpoint="X".$counter; $counter++; } if($render != 0){ $point->{'max_x'} = ($point->{'max_x'}*$scale)+($point->{'border'}*2); $point->{'max_y'} = ($point->{'max_y'}*$scale)+($point->{'border'}*2); my $area = $point->{'max_x'}."x".$point->{'max_y'}; my $image = Image::Magick->new(size=> $area , bordercolor => 'white'); $image->Read('xc:white'); foreach my $pt ( @{ $lineprim }){ $image->Draw(stroke=>'black',strokewidth=>1,primitive=>'line', points=>$pt->{'points'}); } my $counter=0; foreach my $conn (@{ $tree->{'shape'}->{'connections'}->{'point'} }){ my $con_x=($conn->{'-x'}*$scale) + $point->{'border'}; my $con_y=($conn->{'-y'}*$scale) + $point->{'border'}; my $conpt=$con_x.",".$con_y; my $textpoint="X".$counter; $image->Draw( primitive=>'point', stroke => 'none', fill=>'red', pointsize=>10, stroke=> 'red', points=>$conpt); $image->Draw( primitive=>'text', stroke => 'none', fill=>'none', text => $textpoint, pointsize => '20', stroke=> 'red', points=>$conpt); $counter++; #print "$conpt\n"; } my $status=$image->Write("png:svgshape.png"); }