0

我有一个计算图形界面位置的计算,它是完全动态的,需要将每个项目放在不同的位置。计算和分配一次完美地工作,但我遇到的问题是我需要将计算出的 x 和 y 轴数永久分配给每个项目,以便我可以在项目之间创建链接。

这个公式最初可以分配计算并确保每个项目都有 ax 和 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

好的,所以在图形 gui 上,我将通过这样的计算来创建预先绘制的位置。

    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;

请注意,这不是完整的脚本,所以如果你尝试一下,它不会打印出适当的 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 和 Storeroom one 之间创建一个链接,它应该知道这条线是从 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 连接并具有正确的坐标。

4

1 回答 1

0

看看 Perl 的“记忆”函数,例如http://perldoc.perl.org/Memoize.html 它们以内存换取更快的执行速度。

于 2013-05-16T08:32:09.107 回答