Расчет местоположения, а затем постоянное назначение элемента в perl

У меня есть этот расчет, который вычисляет местоположение для графического интерфейса, он полностью динамичен и должен помещать каждый элемент в другое место. Вычисление и один раз присваивания работают отлично, проблема, с которой я столкнулся, заключается в том, что мне нужно постоянно назначать рассчитанные числа осей x и y каждому элементу, чтобы я мог создавать связи между элементами.

Эта формула может изначально назначать расчет и обеспечивать, чтобы каждый элемент имел местоположение x и y, проблема в том, что я хочу установить каждый элемент на заданную ось x и y, чтобы, если я хочу дальше, создать ссылку, чтобы сказать, что item1 соединяется с 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 и 2-м этажом на запад. Если я запущу тот же расчет, он создаст местоположения в заданном порядке, добавленные новые устройства также изменят его порядок. Поэтому я хочу присвоить каждому местоположению X и Y, на которые можно будет сослаться позже, поэтому оно должно каким-то образом храниться, чтобы, если я скажу создать связь между приемной и кладовой, он должен знать, что линия рисуется от 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";

Теперь проблема все еще остается, мне нужно сопоставить местоположение1 с местоположением2, чтобы указать скрипту соединить элемент1 с элементом2 и иметь правильные координаты.


person Community    schedule 16.05.2013    source источник


Ответы (1)


Взгляните на функции «запоминания» Perl, такие как http://perldoc.perl.org/Memoize.html Они обменивают память на более быстрое выполнение.

person AdrianHHH    schedule 16.05.2013
comment
спасибо за ссылку. Однако я нашел один способ, см. Редактирование фактической проблемы. - person ; 16.05.2013
comment
Решил пойти на написание и хранение конфигурационного файла ini. таким образом, я все равно не храню все в памяти. Спасибо. - person ; 16.05.2013