Расчет местоположения, а затем навсегда назначить элемент в Perl
У меня есть этот расчет, который вычисляет местоположение для графического интерфейса, он полностью динамический и должен поместить каждый элемент в другое место. Расчет и один раз назначения работают отлично, но проблема, с которой я столкнулся, заключается в том, что мне нужно постоянно назначать вычисленные числа осей x и y каждому элементу, чтобы я мог создавать связи между элементами.
Эта формула может изначально назначить вычисление и обеспечить, чтобы у каждого элемента были координаты топора и координаты y, проблема в том, что я хочу установить для каждого элемента заданные оси x и y, чтобы, если я захочу продолжить, создать ссылку, чтобы элемент1 соединялся с item2, он должен создать связь с линией между item1 и item2, часть строки, которую я могу сделать, просто хочу найти способ сохранить каждую первоначально назначенную ось x и y для каждого элемента.
Вот как это работает. У меня есть база данных, которая сообщает мне, какой предмет связан с другими предметами, а также где они находятся.
Item1..........Item1_location....Item2..........Item2_location
Router.........Storeroom1........Switch.........2nd_floor_west
WiFi_route.....Reception.........switch.........Storeroom1
Итак, в графическом интерфейсе я создам предварительно построенные местоположения, выполняя вычисления следующим образом.
open (MYFILE, '>>Output.xml');
$book = ReadData ("INPUT.xlsx");
@rows = Spreadsheet::Read::rows ($book->[1]);
my $X_initial = "160"; #specify the initial x axes
my $Y_initial = "80"; #specify initial y axes
my $MAX_X = 1120; #maximum pixels allowed for x axes.
my ($cur_x, $cur_y) = ($X_initial, $Y_initial);
foreach my $tab(@rows) {
my @row = Spreadsheet::Read::cellrow ($book->[1], $count);
$count++;
push @array, $row[1], $row[3];
}
my %precious = (); # this section will deduplicate the locations
# in order for each location to be created
# once only, the underlying items will be assigned
foreach (@array) # below them.
{
$precious{$_} = 1;
}
my @deduped = keys %precious;
chomp(@deduped);
foreach my $country(@deduped) {
if($country ne '') {
if ($cur_x > $MAX_X) {
$cur_x = $X_initial;
$cur_y += $Y_initial;
}
if ($location =~ m/NONE/i) {
}
else {
push @fixed_location, $location;
push @location_clause, ("<icon name=\"$location\" label=\"$location\" x=\"$cur_x\" y=\"$cur_y\" image="\devices.png>");
}
$cur_y += $Y_initial;
}
}
$count = 1;
my $start2;
foreach $start(@location_clause) {
my @row = Spreadsheet::Read::cellrow ($book->[1], $count);
$count++;
push @array, $row[3];
print MYFILE $start;
обратите внимание, что это не полный сценарий, поэтому, если вы попробуете его, он не будет печатать propar xml. но вот как будет выглядеть вывод.
<methodCall>
<method methodName="map.createOrReplaceMapVisual">
<map name="NSA-South-Africa">
<icon name="Storeroom1" label="Storeroom1" x="160" y="80" image="Devices.png"/>
<icon name="2nd_floor_west" label="2nd_floor_west" x="320" y="80" image="Devices.png"/>
<icon name="Reception" label="Reception" x="480" y="80" image="Devices.png"/>
<map>
</method>
</methodCall>
Как видите, он дедуплицирует выходные данные, чтобы не создавать местоположение более одного раза, он также проверяет оба устройства. X и Y создаются хорошо.
Но теперь я хочу позже создать ссылки между Storeroom1 и 2nd floor west. Если я выполню тот же расчет, он создаст местоположения в указанном порядке, добавленные новые устройства также изменят его порядок. Поэтому я хочу назначить каждому местоположению X и Y, на которые можно ссылаться позже, поэтому оно должно храниться как-то так, чтобы, если я скажу создать связь между Reception и Storageroom 1, он должен знать, что линия проведена от x480 y80 до x160 и y80,
Я попытался назначить их в массив и выдвинуть массив, но он может только случайным образом выбирать из массива, также мне нужно сделать foreach для другого массива, а затем вызвать из массива местоположения, это не сработало.
Любая помощь будет оценена.
Вот простая распечатка того же вычисления, что и выше, для которой не нужны никакие файлы, она просто печатается на экране.
my $X_initial = "160";
my $Y_initial = "80";
my $MAX_X = 1120;
my ($cur_x, $cur_y) = ($X_initial, $Y_initial);
for (0 .. 20) {
if ($cur_x > $MAX_X) {
$cur_x = $X_initial;
$cur_y += $Y_initial;
print "\n";
}
print " \t$_:$cur_x/$cur_y";
$cur_x += $X_initial;
}
print "\n";
РЕДАКТИРОВАТЬ!!!!
Хорошо, мне удалось получить заранее назначенный метод, но все еще есть проблема.
Что я сделал, так это изменил последний раздел.
push @test_loc, "$location, $cur_x, $cur_y";
$cur_x += $X_initial;
}
}
}
foreach $getit(@test_loc) {
@new_array = split /, /, $getit;
print "Location: $new_array[0]\n X: $new_array[1]\n Y: $new_array[2]\n";
Теперь проблема остается, мне нужно сопоставить location1 с location2, чтобы указать сценарию соединить item1 с item2 и получить правильные координаты.
1 ответ
Взгляните на функции "запоминания" Perl, такие как http://perldoc.perl.org/Memoize.html Они обменивают память на более быстрое выполнение.